diff --git a/plugins/woocommerce-admin/.github/PULL_REQUEST_TEMPLATE.md b/plugins/woocommerce-admin/.github/PULL_REQUEST_TEMPLATE.md index edae405dfde..da85cf681a2 100644 --- a/plugins/woocommerce-admin/.github/PULL_REQUEST_TEMPLATE.md +++ b/plugins/woocommerce-admin/.github/PULL_REQUEST_TEMPLATE.md @@ -6,5 +6,5 @@ _Replace this with a good description of your changes & reasoning._ ### Detailed test instructions: - - Ex: Open page `url` - - Click XYZ… +- Ex: Open page `url` +- Click XYZ… diff --git a/plugins/woocommerce-admin/.stylelintrc.json b/plugins/woocommerce-admin/.stylelintrc.json index 648e2272055..d474b1568d3 100644 --- a/plugins/woocommerce-admin/.stylelintrc.json +++ b/plugins/woocommerce-admin/.stylelintrc.json @@ -5,6 +5,7 @@ "at-rule-no-unknown": null, "comment-empty-line-before": null, "declaration-block-no-duplicate-properties": null, + "declaration-colon-newline-after": null, "declaration-property-unit-whitelist": null, "font-weight-notation": null, "max-line-length": null, @@ -12,6 +13,8 @@ "no-duplicate-selectors": null, "rule-empty-line-before": null, "selector-class-pattern": null, - "value-keyword-case": null + "string-quotes": "single", + "value-keyword-case": null, + "value-list-comma-newline-after": null } -} \ No newline at end of file +} diff --git a/plugins/woocommerce-admin/.travis.yml b/plugins/woocommerce-admin/.travis.yml index ac23a3e30a3..cb1fed0c8d2 100755 --- a/plugins/woocommerce-admin/.travis.yml +++ b/plugins/woocommerce-admin/.travis.yml @@ -1,33 +1,36 @@ sudo: required language: php -php: - - 7.1 -env: - - WP_VERSION=latest WP_MULTISITE=0 RUN_PHPCS=1 WP_CORE_DIR=/tmp/wordpress NODE_RELEASE=8.x +matrix: + include: + - name: "PHP 7.2 unit tests, PHP Coding standards check and JS tests" + php: 7.2 + env: WP_VERSION=latest WP_MULTISITE=0 WP_CORE_DIR=/tmp/wordpress NODE_RELEASE=8.x RUN_PHPCS=1 RUN_JS=1 + - name: "PHP 7.1 unit tests" + php: 7.1 + env: WP_VERSION=latest WP_MULTISITE=0 WP_CORE_DIR=/tmp/wordpress NODE_RELEASE=8.x + - name: "PHP 7.0 unit tests" + php: 7.0 + env: WP_VERSION=latest WP_MULTISITE=0 WP_CORE_DIR=/tmp/wordpress NODE_RELEASE=8.x + - name: "PHP 5.6 unit tests" + php: 5.6 + env: WP_VERSION=latest WP_MULTISITE=0 WP_CORE_DIR=/tmp/wordpress NODE_RELEASE=8.x -before_script: - - phpenv config-rm xdebug.ini - - export PATH="$HOME/.composer/vendor/bin:$PATH" - - bash bin/install-wp-tests.sh wc_admin_test root '' localhost $WP_VERSION - - bash bin/travis.sh before - - sudo rm -rf ~/.nvm - - curl -sL "https://deb.nodesource.com/setup_${NODE_RELEASE}" | sudo -E bash - - - sudo apt-get install -y nodejs - - node --version - - npm --version - - -install: - - npm install node_js: - "8" +before_script: + - phpenv config-rm xdebug.ini + - export PATH="$WP_CORE_DIR/wp-content/plugins/wc-admin/vendor/bin:$PATH" + - bash bin/install-wp-tests.sh wc_admin_test root '' localhost $WP_VERSION + - bash bin/travis.sh before + - node --version + - npm --version + - timedatectl + script: - - npm run lint - - npm run build - - npm test + - bash bin/js_lint_test.sh - bash bin/phpunit.sh - bash bin/phpcs.sh diff --git a/plugins/woocommerce-admin/CONTRIBUTING.md b/plugins/woocommerce-admin/CONTRIBUTING.md new file mode 100644 index 00000000000..75bdbcc67b1 --- /dev/null +++ b/plugins/woocommerce-admin/CONTRIBUTING.md @@ -0,0 +1,24 @@ +# Contributing to WooCommerce Admin + +Hi! Thank you for your interest in contributing to WooCommerce Admin. We appreciate it. + +There are many ways to contribute – reporting bugs, feature suggestions, and fixing bugs. + +## Reporting Bugs, Asking Questions, Sending Suggestions + +Open [a GitHub issue](https://github.com/woocommerce/wc-admin/issues/new/choose), that's all. If you have write access, add any appropriate labels. + +If you're filing a bug, specific steps to reproduce are always helpful. Please include what you expected to see and what happened instead. + +## We're Here To Help + +We encourage you to ask for help. We want your first experience with WooCommerce Admin to be a good one, so don't be shy. If you're wondering why something is the way it is, or how a decision was made, you can tag issues with [Type] Question or prefix them with “Question:” + +## License + +WooCommerce Admin is licensed under [GNU General Public License v2 (or later)](/LICENSE.md). + +All materials contributed should be compatible with the GPLv2. This means that if you own the material, you agree to license it under the GPLv2 license. If you are contributing code that is not your own, such as adding a component from another Open Source project, or adding an `npm` package, you need to make sure you follow these steps: + +1. Check that the code has a license. If you can't find one, you can try to contact the original author and get permission to use, or ask them to release under a compatible Open Source license. +2. Check the license is compatible with [GPLv2](http://www.gnu.org/licenses/license-list.en.html#GPLCompatibleLicenses), note that the Apache 2.0 license is *not* compatible. diff --git a/plugins/woocommerce-admin/README.md b/plugins/woocommerce-admin/README.md index 79240743f41..b2f805cbe49 100644 --- a/plugins/woocommerce-admin/README.md +++ b/plugins/woocommerce-admin/README.md @@ -20,6 +20,7 @@ After cloning the repo, install dependencies with `npm install`. Now you can bui - `npm run build` : Build a production version - `npm start` : Build a development version, watch files for changes + - `npm run build:release` : Build a WordPress plugin ZIP file (`wc-admin.zip` will be created in the repository root) There are also some helper scripts: @@ -29,3 +30,7 @@ There are also some helper scripts: ## Privacy If you have enabled WooCommerce usage tracking ( option `woocommerce_allow_tracking` ) then, in addition to the tracking described in https://woocommerce.com/usage-tracking/, this plugin also sends information about the actions that site administrators perform to Automattic - see https://automattic.com/privacy/#information-we-collect-automatically for more information. + +## Contributing + +There are many ways to contribute – reporting bugs, feature suggestions and fixing bugs. For full details, please see [CONTRIBUTING.md](./CONTRIBUTING.md) diff --git a/plugins/woocommerce-admin/bin/build-plugin-zip.sh b/plugins/woocommerce-admin/bin/build-plugin-zip.sh new file mode 100755 index 00000000000..aab03d165aa --- /dev/null +++ b/plugins/woocommerce-admin/bin/build-plugin-zip.sh @@ -0,0 +1,84 @@ +#!/bin/bash + +# Exit if any command fails. +set -e + +# Change to the expected directory. +cd "$(dirname "$0")" +cd .. + +# Enable nicer messaging for build status. +BLUE_BOLD='\033[1;34m'; +GREEN_BOLD='\033[1;32m'; +RED_BOLD='\033[1;31m'; +YELLOW_BOLD='\033[1;33m'; +COLOR_RESET='\033[0m'; +error () { + echo -e "\n${RED_BOLD}$1${COLOR_RESET}\n" +} +status () { + echo -e "\n${BLUE_BOLD}$1${COLOR_RESET}\n" +} +success () { + echo -e "\n${GREEN_BOLD}$1${COLOR_RESET}\n" +} +warning () { + echo -e "\n${YELLOW_BOLD}$1${COLOR_RESET}\n" +} + +status "💃 Time to release WooCommerce Admin 🕺" + +# Make sure there are no changes in the working tree. Release builds should be +# traceable to a particular commit and reliably reproducible. (This is not +# totally true at the moment because we download nightly vendor scripts). +changed= +if ! git diff --exit-code > /dev/null; then + changed="file(s) modified" +elif ! git diff --cached --exit-code > /dev/null; then + changed="file(s) staged" +fi +if [ ! -z "$changed" ]; then + git status + error "ERROR: Cannot build plugin zip with dirty working tree. ☝️ + Commit your changes and try again." + exit 1 +fi + +# Do a dry run of the repository reset. Prompting the user for a list of all +# files that will be removed should prevent them from losing important files! +status "Resetting the repository to pristine condition. ✨" +git clean -xdf --dry-run +warning "🚨 About to delete everything above! Is this okay? 🚨" +echo -n "[y]es/[N]o: " +read answer +if [ "$answer" != "${answer#[Yy]}" ]; then + # Remove ignored files to reset repository to pristine condition. Previous + # test ensures that changed files abort the plugin build. + status "Cleaning working directory... 🛀" + git clean -xdf +else + error "Fair enough; aborting. Tidy up your repo and try again. 🙂" + exit 1 +fi + +# Run the build. +status "Generating build... 👷‍♀️" +npm run build +npm run docs + +build_files=$(ls dist/*/*.{js,css}) + +# Generate the plugin zip file. +status "Creating archive... 🎁" +zip -r wc-admin.zip \ + wc-admin.php \ + lib/*.php \ + includes/*.php \ + includes/**/*.php \ + images/* \ + $build_files \ + languages/wc-admin.pot \ + languages/wc-admin.php \ + README.md + +success "Done. You've built WooCommerce Admin! 🎉 " diff --git a/plugins/woocommerce-admin/bin/generate-docs/index.js b/plugins/woocommerce-admin/bin/generate-docs/index.js index 68ae0133123..217d00483b1 100755 --- a/plugins/woocommerce-admin/bin/generate-docs/index.js +++ b/plugins/woocommerce-admin/bin/generate-docs/index.js @@ -13,6 +13,7 @@ const { parse, resolver } = require( 'react-docgen' ); const { getDescription, getProps, getTitle } = require( './lib/formatting' ); const { COMPONENTS_FOLDER, + PACKAGES_FOLDER, deleteExistingDocs, getExportedFileList, getMdFileName, @@ -20,13 +21,14 @@ const { writeTableOfContents, } = require( './lib/file-system' ); -const filePath = path.resolve( COMPONENTS_FOLDER, 'index.js' ); - // Start by wiping the existing docs. **Change this if we end up manually editing docs** deleteExistingDocs(); // Read components file to get a list of exported files, convert that to a list of absolute paths to public components. -const files = getRealFilePaths( getExportedFileList( filePath ) ); +const files = [ + ...getRealFilePaths( getExportedFileList( path.resolve( COMPONENTS_FOLDER, 'index.js' ) ) ), + ...getRealFilePaths( getExportedFileList( path.resolve( PACKAGES_FOLDER, 'index.js' ) ), PACKAGES_FOLDER ), +]; // Build the documentation by reading each file. files.forEach( file => { diff --git a/plugins/woocommerce-admin/bin/generate-docs/lib/file-system.js b/plugins/woocommerce-admin/bin/generate-docs/lib/file-system.js index ec9d423eb95..9071a971d61 100644 --- a/plugins/woocommerce-admin/bin/generate-docs/lib/file-system.js +++ b/plugins/woocommerce-admin/bin/generate-docs/lib/file-system.js @@ -15,6 +15,7 @@ const { namedTypes } = types; const { camelCaseDash } = require( './formatting' ); const COMPONENTS_FOLDER = path.resolve( __dirname, '../../../client/components/' ); +const PACKAGES_FOLDER = path.resolve( __dirname, '../../../packages/components/src/' ); const DOCS_FOLDER = path.resolve( __dirname, '../../../docs/components/' ); /** @@ -78,7 +79,7 @@ function getMdFileName( filepath, absolute = true ) { if ( ! fileParts || ! fileParts[ 1 ] ) { return; } - const name = fileParts[ 1 ].split( '/' )[ 0 ]; + const name = fileParts[ 1 ].replace( 'src/', '' ).split( '/' )[ 0 ]; if ( ! absolute ) { return name + '.md'; } @@ -148,7 +149,7 @@ function isFile( file ) { * @param { array } files A list of readme files. */ function writeTableOfContents( files ) { - const mdFiles = files.map( f => getMdFileName( f, false ) ); + const mdFiles = files.map( f => getMdFileName( f, false ) ).sort(); const TOC = uniq( mdFiles ).map( doc => { const name = camelCaseDash( doc.replace( '.md', '' ) ); return ` * [${ name }](components/${ doc })`; @@ -161,6 +162,7 @@ function writeTableOfContents( files ) { module.exports = { COMPONENTS_FOLDER, DOCS_FOLDER, + PACKAGES_FOLDER, deleteExistingDocs, getExportedFileList, getMdFileName, diff --git a/plugins/woocommerce-admin/bin/install-wp-tests.sh b/plugins/woocommerce-admin/bin/install-wp-tests.sh index 5169d483650..2f4867f336e 100755 --- a/plugins/woocommerce-admin/bin/install-wp-tests.sh +++ b/plugins/woocommerce-admin/bin/install-wp-tests.sh @@ -174,12 +174,14 @@ install_deps() { # Install WooCommerce cd "wp-content/plugins/" # As zip file does not include tests, we have to get it from git repo. - git clone https://github.com/woocommerce/woocommerce.git + git clone --depth 1 https://github.com/woocommerce/woocommerce.git cd "$WP_CORE_DIR" php wp-cli.phar plugin activate woocommerce - # Install wc-admin, the correct branch - php wp-cli.phar plugin install https://github.com/$REPO/archive/$BRANCH.zip --activate + if [ "$TRAVIS_PULL_REQUEST_BRANCH" != "" ]; then + # Install wc-admin, the correct branch, if running from Travis CI. + php wp-cli.phar plugin install https://github.com/$REPO/archive/$BRANCH.zip --activate + fi # Back to original dir cd "$WORKING_DIR" diff --git a/plugins/woocommerce-admin/bin/js_lint_test.sh b/plugins/woocommerce-admin/bin/js_lint_test.sh new file mode 100644 index 00000000000..9f8e4af3b04 --- /dev/null +++ b/plugins/woocommerce-admin/bin/js_lint_test.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash + +if [[ ${RUN_JS} == 1 ]]; then + npm run lint + npm run build + npm test +fi diff --git a/plugins/woocommerce-admin/bin/packages/build.js b/plugins/woocommerce-admin/bin/packages/build.js index 1fbb2fba613..071701b8b86 100755 --- a/plugins/woocommerce-admin/bin/packages/build.js +++ b/plugins/woocommerce-admin/bin/packages/build.js @@ -121,16 +121,14 @@ function buildScssFile( styleFile ) { mkdirp.sync( path.dirname( outputFile ) ); const builtSass = sass.renderSync( { file: styleFile, - includePaths: [ path.resolve( __dirname, '../../assets/stylesheets' ) ], + includePaths: [ path.resolve( __dirname, '../../client/stylesheets/abstracts' ) ], data: ( [ 'colors', - 'breakpoints', 'variables', + 'breakpoints', 'mixins', - 'animations', - 'z-index', - ].map( ( imported ) => `@import "${ imported }";` ).join( ' ' ) + + ].map( ( imported ) => `@import "_${ imported }";` ).join( ' ' ) + fs.readFileSync( styleFile, 'utf8' ) ), } ); diff --git a/plugins/woocommerce-admin/bin/packages/post-css-config.js b/plugins/woocommerce-admin/bin/packages/post-css-config.js index 71e579cac76..073cb000156 100644 --- a/plugins/woocommerce-admin/bin/packages/post-css-config.js +++ b/plugins/woocommerce-admin/bin/packages/post-css-config.js @@ -1,5 +1,5 @@ module.exports = [ - require( './node_modules/@wordpress/postcss-themes' )( { + require( '@wordpress/postcss-themes' )( { defaults: { primary: '#0085ba', secondary: '#11a0d2', diff --git a/plugins/woocommerce-admin/bin/phpcs.sh b/plugins/woocommerce-admin/bin/phpcs.sh index 177f57b81fb..3305e94edbb 100755 --- a/plugins/woocommerce-admin/bin/phpcs.sh +++ b/plugins/woocommerce-admin/bin/phpcs.sh @@ -5,6 +5,7 @@ if [[ ${RUN_PHPCS} == 1 ]]; then if [ "$CHANGED_FILES" != "" ]; then echo "Running Code Sniffer." + cd "$WP_CORE_DIR/wp-content/plugins/wc-admin/" ./vendor/bin/phpcs --encoding=utf-8 -n -p $CHANGED_FILES fi fi diff --git a/plugins/woocommerce-admin/bin/phpunit.sh b/plugins/woocommerce-admin/bin/phpunit.sh index 1b183e06978..60ce13df983 100755 --- a/plugins/woocommerce-admin/bin/phpunit.sh +++ b/plugins/woocommerce-admin/bin/phpunit.sh @@ -1,5 +1,8 @@ #!/usr/bin/env bash WORKING_DIR="$PWD" -cd "/tmp/wordpress/wp-content/plugins/wc-admin/" +cd "$WP_CORE_DIR/wp-content/plugins/wc-admin/" +phpunit --version phpunit -c phpunit.xml.dist +TEST_RESULT=$? cd "$WORKING_DIR" +exit $TEST_RESULT diff --git a/plugins/woocommerce-admin/bin/travis.sh b/plugins/woocommerce-admin/bin/travis.sh index c0411113220..e44023807d8 100755 --- a/plugins/woocommerce-admin/bin/travis.sh +++ b/plugins/woocommerce-admin/bin/travis.sh @@ -3,9 +3,9 @@ if [ $1 == 'before' ]; then - composer global require "phpunit/phpunit=6.*" - if [[ ${RUN_PHPCS} == 1 ]]; then + cd "$WP_CORE_DIR/wp-content/plugins/wc-admin/" + # This can (currently) only run for PHP 7.1+ composer install fi diff --git a/plugins/woocommerce-admin/client/analytics/components/report-chart/index.js b/plugins/woocommerce-admin/client/analytics/components/report-chart/index.js index a983e95b55e..1be79ccd34b 100644 --- a/plugins/woocommerce-admin/client/analytics/components/report-chart/index.js +++ b/plugins/woocommerce-admin/client/analytics/components/report-chart/index.js @@ -12,7 +12,6 @@ import PropTypes from 'prop-types'; /** * WooCommerce dependencies */ -import { Chart, ChartPlaceholder } from '@woocommerce/components'; import { getAllowedIntervalsForQuery, getCurrentDates, @@ -24,12 +23,21 @@ import { /** * Internal dependencies */ +import { Chart, ChartPlaceholder } from 'components'; import { getReportChartData } from 'store/reports/utils'; import ReportError from 'analytics/components/report-error'; class ReportChart extends Component { render() { - const { path, primaryData, secondaryData, selectedChart, query } = this.props; + const { + comparisonChart, + query, + itemsLabel, + path, + primaryData, + secondaryData, + selectedChart, + } = this.props; if ( primaryData.isError || secondaryData.isError ) { return ; @@ -84,7 +92,9 @@ class ReportChart extends Component { title={ selectedChart.label } interval={ currentInterval } allowedIntervals={ allowedIntervals } - mode="time-comparison" + itemsLabel={ itemsLabel } + layout={ comparisonChart ? 'comparison' : 'standard' } + mode={ comparisonChart ? 'item-comparison' : 'time-comparison' } pointLabelFormat={ formats.pointLabelFormat } tooltipTitle={ selectedChart.label } xFormat={ formats.xFormat } @@ -97,6 +107,8 @@ class ReportChart extends Component { } ReportChart.propTypes = { + comparisonChart: PropTypes.bool, + itemsLabel: PropTypes.string, path: PropTypes.string.isRequired, primaryData: PropTypes.object.isRequired, query: PropTypes.object.isRequired, diff --git a/plugins/woocommerce-admin/client/analytics/components/report-error/index.js b/plugins/woocommerce-admin/client/analytics/components/report-error/index.js index 594bceb8b27..ea17d7438c2 100644 --- a/plugins/woocommerce-admin/client/analytics/components/report-error/index.js +++ b/plugins/woocommerce-admin/client/analytics/components/report-error/index.js @@ -7,14 +7,14 @@ import { Component } from '@wordpress/element'; import PropTypes from 'prop-types'; /** - * Internal dependencies + * WooCommerce dependencies */ import { EmptyContent } from '@woocommerce/components'; -import { getAdminLink } from 'lib/nav-utils'; +import { getAdminLink } from '@woocommerce/navigation'; class ReportError extends Component { render() { - const { isError, isEmpty } = this.props; + const { className, isError, isEmpty } = this.props; let title, actionLabel, actionURL, actionCallback; if ( isError ) { @@ -31,6 +31,7 @@ class ReportError extends Component { } return ( + ); } diff --git a/plugins/woocommerce-admin/client/analytics/report/coupons/table.js b/plugins/woocommerce-admin/client/analytics/report/coupons/table.js new file mode 100644 index 00000000000..9b8bd1ae7eb --- /dev/null +++ b/plugins/woocommerce-admin/client/analytics/report/coupons/table.js @@ -0,0 +1,223 @@ +/** @format */ +/** + * External dependencies + */ +import { __, _n } from '@wordpress/i18n'; +import { Component } from '@wordpress/element'; +import { format as formatDate } from '@wordpress/date'; +import { compose } from '@wordpress/compose'; +import { withSelect } from '@wordpress/data'; +import { get, map, orderBy } from 'lodash'; + +/** + * WooCommerce dependencies + */ +import { + appendTimestamp, + getCurrentDates, + getIntervalForQuery, + getDateFormatsForInterval, +} from '@woocommerce/date'; +import { Link, TableCard } from '@woocommerce/components'; +import { formatCurrency, getCurrencyFormatDecimal } from '@woocommerce/currency'; +import { onQueryChange } from '@woocommerce/navigation'; + +/** + * Internal dependencies + */ +import ReportError from 'analytics/components/report-error'; +import { QUERY_DEFAULTS } from 'store/constants'; +import { getReportChartData, getFilterQuery } from 'store/reports/utils'; + +class CouponsReportTable extends Component { + getHeadersContent() { + return [ + { + label: __( 'Coupon Code', 'wc-admin' ), + // @TODO it should be the coupon code, not the coupon ID + key: 'coupon_id', + required: true, + isLeftAligned: true, + isSortable: true, + }, + { + label: __( 'Orders', 'wc-admin' ), + key: 'orders_count', + required: true, + defaultSort: true, + isSortable: true, + isNumeric: true, + }, + { + label: __( 'G. Discounted', 'wc-admin' ), + key: 'gross_discount', + isSortable: true, + isNumeric: true, + }, + { + label: __( 'Created', 'wc-admin' ), + key: 'created', + isSortable: true, + }, + { + label: __( 'Expires', 'wc-admin' ), + key: 'expires', + isSortable: true, + }, + { + label: __( 'Type', 'wc-admin' ), + key: 'type', + isSortable: false, + }, + ]; + } + + getRowsContent( coupons ) { + const { query } = this.props; + const currentInterval = getIntervalForQuery( query ); + const { tableFormat } = getDateFormatsForInterval( currentInterval ); + + return map( coupons, coupon => { + const { coupon_id, gross_discount, orders_count } = coupon; + + // @TODO must link to the coupon detail report + const couponLink = ( + + { coupon_id } + + ); + + const ordersLink = ( + + { orders_count } + + ); + + return [ + // @TODO it should be the coupon code, not the coupon ID + { + display: couponLink, + value: coupon_id, + }, + { + display: ordersLink, + value: orders_count, + }, + { + display: formatCurrency( gross_discount ), + value: getCurrencyFormatDecimal( gross_discount ), + }, + { + // @TODO + display: formatDate( tableFormat, '' ), + value: '', + }, + { + // @TODO + display: formatDate( tableFormat, '' ), + value: '', + }, + { + // @TODO + display: '', + value: '', + }, + ]; + } ); + } + + getSummary( totals ) { + if ( ! totals ) { + return []; + } + return [ + { + label: _n( 'coupon', 'coupons', totals.coupons_count, 'wc-admin' ), + value: totals.coupons_count, + }, + { + label: _n( 'order', 'orders', totals.orders_count, 'wc-admin' ), + value: totals.orders_count, + }, + { + label: __( 'gross discounted', 'wc-admin' ), + value: formatCurrency( totals.gross_discount ), + }, + ]; + } + + render() { + const { coupons, isTableDataError, isTableDataRequesting, primaryData, query } = this.props; + + const isError = isTableDataError || primaryData.isError; + + if ( isError ) { + return ; + } + + const isRequesting = isTableDataRequesting || primaryData.isRequesting; + + const tableQuery = { + ...query, + orderby: query.orderby || 'date', + order: query.order || 'asc', + }; + + const headers = this.getHeadersContent(); + const orderedCoupons = orderBy( coupons, tableQuery.orderby, tableQuery.order ); + const rows = this.getRowsContent( orderedCoupons ); + const rowsPerPage = parseInt( tableQuery.per_page ) || QUERY_DEFAULTS.pageSize; + const totalRows = get( primaryData, [ 'data', 'totals', 'coupons_count' ], coupons.length ); + const summary = primaryData.data.totals ? this.getSummary( primaryData.data.totals ) : null; + + return ( + coupon.coupon_id ) } + rows={ rows } + totalRows={ totalRows } + rowsPerPage={ rowsPerPage } + headers={ headers } + isLoading={ isRequesting } + onQueryChange={ onQueryChange } + query={ tableQuery } + summary={ summary } + downloadable + /> + ); + } +} + +export default compose( + withSelect( ( select, props ) => { + const { query } = props; + const datesFromQuery = getCurrentDates( query ); + const primaryData = getReportChartData( 'coupons', 'primary', query, select ); + const filterQuery = getFilterQuery( 'coupons', query ); + + const { getCoupons, isGetCouponsError, isGetCouponsRequesting } = select( 'wc-admin' ); + const tableQuery = { + orderby: query.orderby || 'date', + order: query.order || 'asc', + page: query.page || 1, + per_page: query.per_page || QUERY_DEFAULTS.pageSize, + after: appendTimestamp( datesFromQuery.primary.after, 'start' ), + before: appendTimestamp( datesFromQuery.primary.before, 'end' ), + ...filterQuery, + }; + const coupons = getCoupons( tableQuery ); + const isTableDataError = isGetCouponsError( tableQuery ); + const isTableDataRequesting = isGetCouponsRequesting( tableQuery ); + + return { + isTableDataError, + isTableDataRequesting, + coupons, + primaryData, + }; + } ) +)( CouponsReportTable ); diff --git a/plugins/woocommerce-admin/client/analytics/report/index.js b/plugins/woocommerce-admin/client/analytics/report/index.js index 4858e7e671c..104ed74000c 100644 --- a/plugins/woocommerce-admin/client/analytics/report/index.js +++ b/plugins/woocommerce-admin/client/analytics/report/index.js @@ -8,6 +8,11 @@ import { Component, Fragment } from '@wordpress/element'; import PropTypes from 'prop-types'; import { find } from 'lodash'; +/** + * WooCommerce dependencies + */ +import { useFilters } from '@woocommerce/components'; + /** * Internal dependencies */ @@ -17,7 +22,7 @@ import OrdersReport from './orders'; import ProductsReport from './products'; import RevenueReport from './revenue'; import CouponsReport from './coupons'; -import useFilters from 'components/higher-order/use-filters'; +import TaxesReport from './taxes'; const REPORTS_FILTER = 'woocommerce-reports-list'; @@ -43,6 +48,11 @@ const getReports = () => { title: __( 'Coupons', 'wc-admin' ), component: CouponsReport, }, + { + report: 'taxes', + title: __( 'Taxes', 'wc-admin' ), + component: TaxesReport, + }, ] ); return reports; diff --git a/plugins/woocommerce-admin/client/analytics/report/orders/chart.js b/plugins/woocommerce-admin/client/analytics/report/orders/chart.js deleted file mode 100644 index 37c23409123..00000000000 --- a/plugins/woocommerce-admin/client/analytics/report/orders/chart.js +++ /dev/null @@ -1,80 +0,0 @@ -/** @format */ -/** - * External dependencies - */ -import { __ } from '@wordpress/i18n'; -import { Component, Fragment } from '@wordpress/element'; -import { find } from 'lodash'; -import PropTypes from 'prop-types'; - -/** - * Internal dependencies - */ -import ReportChart from 'analytics/components/report-chart'; -import ReportSummary from 'analytics/components/report-summary'; - -class OrdersReportChart extends Component { - getCharts() { - return [ - { - key: 'orders_count', - label: __( 'Orders Count', 'wc-admin' ), - type: 'number', - }, - { - key: 'net_revenue', - label: __( 'Net Revenue', 'wc-admin' ), - type: 'currency', - }, - { - key: 'avg_order_value', - label: __( 'Average Order Value', 'wc-admin' ), - type: 'currency', - }, - { - key: 'avg_items_per_order', - label: __( 'Average Items Per Order', 'wc-admin' ), - type: 'average', - }, - ]; - } - - getSelectedChart() { - const { query } = this.props; - const charts = this.getCharts(); - const chart = find( charts, { key: query.chart } ); - if ( chart ) { - return chart; - } - - return charts[ 0 ]; - } - - render() { - const { path, query } = this.props; - return ( - - - - - ); - } -} - -OrdersReportChart.propTypes = { - path: PropTypes.string.isRequired, - query: PropTypes.object.isRequired, -}; - -export default OrdersReportChart; diff --git a/plugins/woocommerce-admin/client/analytics/report/orders/config.js b/plugins/woocommerce-admin/client/analytics/report/orders/config.js index c70b86cbdb1..65f1ab01850 100644 --- a/plugins/woocommerce-admin/client/analytics/report/orders/config.js +++ b/plugins/woocommerce-admin/client/analytics/report/orders/config.js @@ -12,6 +12,29 @@ import { NAMESPACE } from 'store/constants'; const { orderStatuses } = wcSettings; +export const charts = [ + { + key: 'orders_count', + label: __( 'Orders Count', 'wc-admin' ), + type: 'number', + }, + { + key: 'net_revenue', + label: __( 'Net Revenue', 'wc-admin' ), + type: 'currency', + }, + { + key: 'avg_order_value', + label: __( 'Average Order Value', 'wc-admin' ), + type: 'currency', + }, + { + key: 'avg_items_per_order', + label: __( 'Average Items Per Order', 'wc-admin' ), + type: 'average', + }, +]; + export const filters = [ { label: __( 'Show', 'wc-admin' ), diff --git a/plugins/woocommerce-admin/client/analytics/report/orders/index.js b/plugins/woocommerce-admin/client/analytics/report/orders/index.js index 0091ac66cb9..84d6946fae2 100644 --- a/plugins/woocommerce-admin/client/analytics/report/orders/index.js +++ b/plugins/woocommerce-admin/client/analytics/report/orders/index.js @@ -13,9 +13,11 @@ import { ReportFilters } from '@woocommerce/components'; /** * Internal dependencies */ -import { advancedFilters, filters } from './config'; -import OrdersReportChart from './chart'; +import { advancedFilters, charts, filters } from './config'; +import getSelectedChart from 'lib/get-selected-chart'; import OrdersReportTable from './table'; +import ReportChart from 'analytics/components/report-chart'; +import ReportSummary from 'analytics/components/report-summary'; export default class OrdersReport extends Component { render() { @@ -29,7 +31,19 @@ export default class OrdersReport extends Component { filters={ filters } advancedFilters={ advancedFilters } /> - + + ); diff --git a/plugins/woocommerce-admin/client/analytics/report/orders/table.js b/plugins/woocommerce-admin/client/analytics/report/orders/table.js index 913f90ed7af..416ebf631c8 100644 --- a/plugins/woocommerce-admin/client/analytics/report/orders/table.js +++ b/plugins/woocommerce-admin/client/analytics/report/orders/table.js @@ -12,29 +12,25 @@ import { get, map, orderBy } from 'lodash'; /** * WooCommerce dependencies */ -import { Link, OrderStatus, TableCard, ViewMoreList } from '@woocommerce/components'; -import { formatCurrency, getCurrencyFormatDecimal } from '@woocommerce/currency'; import { appendTimestamp, getCurrentDates, getIntervalForQuery, getDateFormatsForInterval, } from '@woocommerce/date'; +import { Link, OrderStatus, TableCard, ViewMoreList } from '@woocommerce/components'; +import { formatCurrency, getCurrencyFormatDecimal } from '@woocommerce/currency'; +import { getAdminLink, onQueryChange } from '@woocommerce/navigation'; /** * Internal dependencies */ -import { getAdminLink, onQueryChange } from 'lib/nav-utils'; import ReportError from 'analytics/components/report-error'; import { QUERY_DEFAULTS } from 'store/constants'; import { getReportChartData, getFilterQuery } from 'store/reports/utils'; import './style.scss'; class OrdersReportTable extends Component { - constructor( props ) { - super( props ); - } - getHeadersContent() { return [ { diff --git a/plugins/woocommerce-admin/client/analytics/report/products/chart.js b/plugins/woocommerce-admin/client/analytics/report/products/chart.js deleted file mode 100644 index c7d17dfd07f..00000000000 --- a/plugins/woocommerce-admin/client/analytics/report/products/chart.js +++ /dev/null @@ -1,75 +0,0 @@ -/** @format */ -/** - * External dependencies - */ -import { __ } from '@wordpress/i18n'; -import { Component, Fragment } from '@wordpress/element'; -import { find } from 'lodash'; -import PropTypes from 'prop-types'; - -/** - * Internal dependencies - */ -import ReportChart from 'analytics/components/report-chart'; -import ReportSummary from 'analytics/components/report-summary'; - -class ProductsReportChart extends Component { - getCharts() { - return [ - { - key: 'items_sold', - label: __( 'Items Sold', 'wc-admin' ), - type: 'number', - }, - { - key: 'gross_revenue', - label: __( 'Gross Revenue', 'wc-admin' ), - type: 'currency', - }, - { - key: 'orders_count', - label: __( 'Orders Count', 'wc-admin' ), - type: 'number', - }, - ]; - } - - getSelectedChart() { - const { query } = this.props; - const charts = this.getCharts(); - const chart = find( charts, { key: query.chart } ); - if ( chart ) { - return chart; - } - - return charts[ 0 ]; - } - - render() { - const { path, query } = this.props; - return ( - - - - - ); - } -} - -ProductsReportChart.propTypes = { - path: PropTypes.string.isRequired, - query: PropTypes.object.isRequired, -}; - -export default ProductsReportChart; diff --git a/plugins/woocommerce-admin/client/analytics/report/products/config.js b/plugins/woocommerce-admin/client/analytics/report/products/config.js index 1e6a3b7cb93..a71127e56dc 100644 --- a/plugins/woocommerce-admin/client/analytics/report/products/config.js +++ b/plugins/woocommerce-admin/client/analytics/report/products/config.js @@ -10,6 +10,24 @@ import { __ } from '@wordpress/i18n'; import { getRequestByIdString } from 'lib/async-requests'; import { NAMESPACE } from 'store/constants'; +export const charts = [ + { + key: 'items_sold', + label: __( 'Items Sold', 'wc-admin' ), + type: 'number', + }, + { + key: 'gross_revenue', + label: __( 'Gross Revenue', 'wc-admin' ), + type: 'currency', + }, + { + key: 'orders_count', + label: __( 'Orders Count', 'wc-admin' ), + type: 'number', + }, +]; + const filterConfig = { label: __( 'Show', 'wc-admin' ), staticParams: [ 'chart' ], @@ -42,7 +60,7 @@ const filterConfig = { }, { label: __( 'Product Comparison', 'wc-admin' ), - value: 'compare-product', + value: 'compare-products', settings: { type: 'products', param: 'products', @@ -60,7 +78,7 @@ const filterConfig = { }, { label: __( 'Product Category Comparison', 'wc-admin' ), - value: 'compare-product_cat', + value: 'compare-product_cats', settings: { type: 'product_cats', param: 'categories', @@ -99,13 +117,21 @@ const variationsConfig = { label: __( 'Comparison', 'wc-admin' ), value: 'compare', settings: { - // @TODO create a variations autocompleter - type: 'products', + type: 'variations', param: 'variations', - getLabels: getRequestByIdString( NAMESPACE + 'products', product => ( { - id: product.id, - label: product.name, - } ) ), + getLabels: getRequestByIdString( + query => NAMESPACE + `products/${ query.products }/variations`, + variation => { + return { + id: variation.id, + label: variation.attributes.reduce( + ( desc, attribute, index, arr ) => + desc + `${ attribute.option }${ arr.length === index + 1 ? '' : ', ' }`, + '' + ), + }; + } + ), labels: { helpText: __( 'Select at least two variations to compare', 'wc-admin' ), placeholder: __( 'Search for variations to compare', 'wc-admin' ), diff --git a/plugins/woocommerce-admin/client/analytics/report/products/index.js b/plugins/woocommerce-admin/client/analytics/report/products/index.js index e1782462fef..24b94ddbf9b 100644 --- a/plugins/woocommerce-admin/client/analytics/report/products/index.js +++ b/plugins/woocommerce-admin/client/analytics/report/products/index.js @@ -2,6 +2,7 @@ /** * External dependencies */ +import { __ } from '@wordpress/i18n'; import { Component, Fragment } from '@wordpress/element'; import PropTypes from 'prop-types'; @@ -13,18 +14,39 @@ import { ReportFilters } from '@woocommerce/components'; /** * Internal dependencies */ -import { filters } from './config'; -import ProductsReportChart from './chart'; +import { charts, filters } from './config'; +import getSelectedChart from 'lib/get-selected-chart'; import ProductsReportTable from './table'; +import ReportChart from 'analytics/components/report-chart'; +import ReportSummary from 'analytics/components/report-summary'; export default class ProductsReport extends Component { render() { const { path, query } = this.props; + const itemsLabel = + 'single_product' === query.filter && !! query.products + ? __( '%s variations', 'wc-admin' ) + : __( '%s products', 'wc-admin' ); + return ( - + + ); diff --git a/plugins/woocommerce-admin/client/analytics/report/products/table.js b/plugins/woocommerce-admin/client/analytics/report/products/table.js index 8d5f275b751..a4bf5b894b9 100644 --- a/plugins/woocommerce-admin/client/analytics/report/products/table.js +++ b/plugins/woocommerce-admin/client/analytics/report/products/table.js @@ -11,14 +11,14 @@ import { get, map, orderBy } from 'lodash'; /** * WooCommerce dependencies */ +import { appendTimestamp, getCurrentDates } from '@woocommerce/date'; import { Link, TableCard } from '@woocommerce/components'; import { formatCurrency, getCurrencyFormatDecimal } from '@woocommerce/currency'; -import { appendTimestamp, getCurrentDates } from '@woocommerce/date'; +import { getNewPath, getTimeRelatedQuery, onQueryChange } from '@woocommerce/navigation'; /** * Internal dependencies */ -import { getNewPath, getTimeRelatedQuery, onQueryChange } from 'lib/nav-utils'; import ReportError from 'analytics/components/report-error'; import { getFilterQuery, getReportChartData } from 'store/reports/utils'; import { QUERY_DEFAULTS } from 'store/constants'; @@ -183,7 +183,7 @@ class ProductsReportTable extends Component { labels={ labels } ids={ orderedProducts.map( p => p.product_id ) } isLoading={ isRequesting } - compareBy={ 'product' } + compareBy={ 'products' } onQueryChange={ onQueryChange } query={ tableQuery } summary={ null } // @TODO diff --git a/plugins/woocommerce-admin/client/analytics/report/revenue/chart.js b/plugins/woocommerce-admin/client/analytics/report/revenue/chart.js deleted file mode 100644 index 6c603d729d2..00000000000 --- a/plugins/woocommerce-admin/client/analytics/report/revenue/chart.js +++ /dev/null @@ -1,90 +0,0 @@ -/** @format */ -/** - * External dependencies - */ -import { __ } from '@wordpress/i18n'; -import { Component, Fragment } from '@wordpress/element'; -import { find } from 'lodash'; -import PropTypes from 'prop-types'; - -/** - * Internal dependencies - */ -import ReportChart from 'analytics/components/report-chart'; -import ReportSummary from 'analytics/components/report-summary'; - -class RevenueReportChart extends Component { - getCharts() { - return [ - { - key: 'gross_revenue', - label: __( 'Gross Revenue', 'wc-admin' ), - type: 'currency', - }, - { - key: 'refunds', - label: __( 'Refunds', 'wc-admin' ), - type: 'currency', - }, - { - key: 'coupons', - label: __( 'Coupons', 'wc-admin' ), - type: 'currency', - }, - { - key: 'taxes', - label: __( 'Taxes', 'wc-admin' ), - type: 'currency', - }, - { - key: 'shipping', - label: __( 'Shipping', 'wc-admin' ), - type: 'currency', - }, - { - key: 'net_revenue', - label: __( 'Net Revenue', 'wc-admin' ), - type: 'currency', - }, - ]; - } - - getSelectedChart() { - const { query } = this.props; - const charts = this.getCharts(); - const chart = find( charts, { key: query.chart } ); - if ( chart ) { - return chart; - } - - return charts[ 0 ]; - } - - render() { - const { path, query } = this.props; - return ( - - - - - ); - } -} - -RevenueReportChart.propTypes = { - path: PropTypes.string.isRequired, - query: PropTypes.object.isRequired, -}; - -export default RevenueReportChart; diff --git a/plugins/woocommerce-admin/client/analytics/report/revenue/config.js b/plugins/woocommerce-admin/client/analytics/report/revenue/config.js new file mode 100644 index 00000000000..d5288929b14 --- /dev/null +++ b/plugins/woocommerce-admin/client/analytics/report/revenue/config.js @@ -0,0 +1,38 @@ +/** @format */ +/** + * External dependencies + */ +import { __ } from '@wordpress/i18n'; + +export const charts = [ + { + key: 'gross_revenue', + label: __( 'Gross Revenue', 'wc-admin' ), + type: 'currency', + }, + { + key: 'refunds', + label: __( 'Refunds', 'wc-admin' ), + type: 'currency', + }, + { + key: 'coupons', + label: __( 'Coupons', 'wc-admin' ), + type: 'currency', + }, + { + key: 'taxes', + label: __( 'Taxes', 'wc-admin' ), + type: 'currency', + }, + { + key: 'shipping', + label: __( 'Shipping', 'wc-admin' ), + type: 'currency', + }, + { + key: 'net_revenue', + label: __( 'Net Revenue', 'wc-admin' ), + type: 'currency', + }, +]; diff --git a/plugins/woocommerce-admin/client/analytics/report/revenue/index.js b/plugins/woocommerce-admin/client/analytics/report/revenue/index.js index 9ca1a0ffc33..d5e70212068 100644 --- a/plugins/woocommerce-admin/client/analytics/report/revenue/index.js +++ b/plugins/woocommerce-admin/client/analytics/report/revenue/index.js @@ -13,7 +13,10 @@ import { ReportFilters } from '@woocommerce/components'; /** * Internal dependencies */ -import RevenueReportChart from './chart'; +import { charts } from './config'; +import getSelectedChart from 'lib/get-selected-chart'; +import ReportChart from 'analytics/components/report-chart'; +import ReportSummary from 'analytics/components/report-summary'; import RevenueReportTable from './table'; export default class RevenueReport extends Component { @@ -23,7 +26,19 @@ export default class RevenueReport extends Component { return ( - + + ); diff --git a/plugins/woocommerce-admin/client/analytics/report/revenue/table.js b/plugins/woocommerce-admin/client/analytics/report/revenue/table.js index bebd8aabcaa..7f913d23e3a 100644 --- a/plugins/woocommerce-admin/client/analytics/report/revenue/table.js +++ b/plugins/woocommerce-admin/client/analytics/report/revenue/table.js @@ -12,19 +12,19 @@ import { get, map } from 'lodash'; /** * WooCommerce dependencies */ -import { Link, TableCard } from '@woocommerce/components'; -import { formatCurrency, getCurrencyFormatDecimal } from '@woocommerce/currency'; import { appendTimestamp, getCurrentDates, getDateFormatsForInterval, getIntervalForQuery, } from '@woocommerce/date'; +import { Link, TableCard } from '@woocommerce/components'; +import { formatCurrency, getCurrencyFormatDecimal } from '@woocommerce/currency'; +import { onQueryChange } from '@woocommerce/navigation'; /** * Internal dependencies */ -import { onQueryChange } from 'lib/nav-utils'; import ReportError from 'analytics/components/report-error'; import { QUERY_DEFAULTS } from 'store/constants'; diff --git a/plugins/woocommerce-admin/client/analytics/report/taxes/config.js b/plugins/woocommerce-admin/client/analytics/report/taxes/config.js new file mode 100644 index 00000000000..27d79fd9e3f --- /dev/null +++ b/plugins/woocommerce-admin/client/analytics/report/taxes/config.js @@ -0,0 +1,41 @@ +/** @format */ +/** + * External dependencies + */ +import { __ } from '@wordpress/i18n'; +/** + * Internal dependencies + */ + +export const charts = [ + { + key: 'order_tax', + label: __( 'Order Tax', 'wc-admin' ), + type: 'currency', + }, + { + key: 'total_tax', + label: __( 'Total Tax', 'wc-admin' ), + type: 'currency', + }, + { + key: 'shipping_tax', + label: __( 'Shipping Tax', 'wc-admin' ), + type: 'currency', + }, + { + key: 'orders_count', + label: __( 'Orders Count', 'wc-admin' ), + type: 'number', + }, +]; + +export const filters = [ + { + label: __( 'Show', 'wc-admin' ), + staticParams: [ 'chart' ], + param: 'filter', + showFilters: () => true, + filters: [ { label: __( 'All Taxes', 'wc-admin' ), value: 'all' } ], + }, +]; diff --git a/plugins/woocommerce-admin/client/analytics/report/taxes/index.js b/plugins/woocommerce-admin/client/analytics/report/taxes/index.js new file mode 100644 index 00000000000..d5520f4e2c6 --- /dev/null +++ b/plugins/woocommerce-admin/client/analytics/report/taxes/index.js @@ -0,0 +1,45 @@ +/** @format */ +/** + * External dependencies + */ +import { Component, Fragment } from '@wordpress/element'; +import PropTypes from 'prop-types'; + +/** + * WooCommerce dependencies + */ +import { ReportFilters } from '@woocommerce/components'; + +/** + * Internal dependencies + */ +import { charts, filters } from './config'; +import getSelectedChart from 'lib/get-selected-chart'; +import ReportChart from 'analytics/components/report-chart'; +import ReportSummary from 'analytics/components/report-summary'; +export default class TaxesReport extends Component { + render() { + const { query, path } = this.props; + return ( + + + + + + ); + } +} +TaxesReport.propTypes = { + query: PropTypes.object.isRequired, +}; diff --git a/plugins/woocommerce-admin/client/components/chart/charts.js b/plugins/woocommerce-admin/client/components/chart/charts.js index 2d86f82ef33..58dcc7b44a6 100644 --- a/plugins/woocommerce-admin/client/components/chart/charts.js +++ b/plugins/woocommerce-admin/client/components/chart/charts.js @@ -105,6 +105,7 @@ class D3Chart extends Component { mode, orderedKeys, pointLabelFormat, + tooltipPosition, tooltipFormat, tooltipTitle, type, @@ -116,7 +117,6 @@ class D3Chart extends Component { const { width } = this.state; const calculatedWidth = width || node.offsetWidth; const calculatedHeight = height || node.offsetHeight; - const scale = width / node.offsetWidth; const adjHeight = calculatedHeight - margin.top - margin.bottom; const adjWidth = calculatedWidth - margin.left - margin.right; const uniqueKeys = getUniqueKeys( data ); @@ -140,7 +140,7 @@ class D3Chart extends Component { orderedKeys: newOrderedKeys, pointLabelFormat, parseDate, - scale, + tooltipPosition, tooltipFormat: d3TimeFormat( tooltipFormat ), tooltipTitle, type, @@ -155,7 +155,7 @@ class D3Chart extends Component { xScale, yMax, yScale, - yTickOffset: getYTickOffset( adjHeight, scale, yMax ), + yTickOffset: getYTickOffset( adjHeight, yMax ), yFormat, valueType, }; @@ -241,6 +241,10 @@ D3Chart.propTypes = { * if `tooltipTitle` is missing, passed to d3TimeFormat. */ tooltipFormat: PropTypes.string, + /** + * The position where to render the tooltip can be `over` the chart or `below` the chart. + */ + tooltipPosition: PropTypes.oneOf( [ 'below', 'over' ] ), /** * A string to use as a title for the tooltip. Takes preference over `tooltipFormat`. */ @@ -280,6 +284,7 @@ D3Chart.defaultProps = { layout: 'standard', mode: 'item-comparison', tooltipFormat: '%B %d, %Y', + tooltipPosition: 'over', type: 'line', width: 600, xFormat: '%Y-%m-%d', diff --git a/plugins/woocommerce-admin/client/components/chart/d3-base/index.js b/plugins/woocommerce-admin/client/components/chart/d3-base/index.js index 6b5c5047428..e83dad949a0 100644 --- a/plugins/woocommerce-admin/client/components/chart/d3-base/index.js +++ b/plugins/woocommerce-admin/client/components/chart/d3-base/index.js @@ -32,7 +32,6 @@ export default class D3Base extends Component { drawChart: PropTypes.func.isRequired, getParams: PropTypes.func.isRequired, type: PropTypes.string, - width: PropTypes.number, }; state = { @@ -41,7 +40,6 @@ export default class D3Base extends Component { drawChart: null, getParams: null, type: null, - width: null, }; chartRef = createRef(); @@ -61,10 +59,6 @@ export default class D3Base extends Component { state = { ...state, getParams: nextProps.getParams }; } - if ( nextProps.width !== prevState.width ) { - state = { ...state, width: nextProps.width }; - } - if ( nextProps.type !== prevState.type ) { state = { ...state, type: nextProps.type }; } @@ -86,7 +80,6 @@ export default class D3Base extends Component { return ( ( nextState.params !== null && ! isEqual( this.state.params, nextState.params ) ) || ! isEqual( this.state.data, nextState.data ) || - this.state.width !== nextState.width || this.state.type !== nextState.type ); } @@ -129,6 +122,8 @@ export default class D3Base extends Component { const svg = d3Select( this.chartRef.current ) .append( 'svg' ) .attr( 'viewBox', `0 0 ${ width } ${ height }` ) + .attr( 'height', height ) + .attr( 'width', width ) .attr( 'preserveAspectRatio', 'xMidYMid meet' ); if ( className ) { diff --git a/plugins/woocommerce-admin/client/components/chart/example-hour.js b/plugins/woocommerce-admin/client/components/chart/example-hour.js index 5fbf30ae281..aad75ab511f 100644 --- a/plugins/woocommerce-admin/client/components/chart/example-hour.js +++ b/plugins/woocommerce-admin/client/components/chart/example-hour.js @@ -5,10 +5,14 @@ import { __ } from '@wordpress/i18n'; import { Component } from '@wordpress/element'; +/** + * WooCommerce dependencies + */ +import { Card } from '@woocommerce/components'; + /** * Internal dependencies */ -import Card from 'components/card'; import Chart from './index'; import dummyOrders from './test/fixtures/dummy-hour'; diff --git a/plugins/woocommerce-admin/client/components/chart/example.js b/plugins/woocommerce-admin/client/components/chart/example.js index 4f891c5cc68..8dfc3747559 100644 --- a/plugins/woocommerce-admin/client/components/chart/example.js +++ b/plugins/woocommerce-admin/client/components/chart/example.js @@ -5,10 +5,14 @@ import { __ } from '@wordpress/i18n'; import { Component, Fragment } from '@wordpress/element'; +/** + * WooCommerce dependencies + */ +import { Card } from '@woocommerce/components'; + /** * Internal dependencies */ -import Card from 'components/card'; import Chart from './index'; import dummyOrders from './test/fixtures/dummy'; diff --git a/plugins/woocommerce-admin/client/components/chart/example.md b/plugins/woocommerce-admin/client/components/chart/example.md index 29278bcad63..6dc1784ac57 100644 --- a/plugins/woocommerce-admin/client/components/chart/example.md +++ b/plugins/woocommerce-admin/client/components/chart/example.md @@ -1,5 +1,5 @@ ```jsx -import { D3Chart, Legend } from '@woocommerce/components'; +import { D3Chart, Legend } from 'components'; const noop = () => {}; diff --git a/plugins/woocommerce-admin/client/components/chart/index.js b/plugins/woocommerce-admin/client/components/chart/index.js index 4cf29bc12d0..2e48dcd66f2 100644 --- a/plugins/woocommerce-admin/client/components/chart/index.js +++ b/plugins/woocommerce-admin/client/components/chart/index.js @@ -2,27 +2,29 @@ /** * External dependencies */ - -import { decodeEntities } from '@wordpress/html-entities'; import { __ } from '@wordpress/i18n'; import classNames from 'classnames'; -import { get, isEqual, partial } from 'lodash'; import { Component, createRef } from '@wordpress/element'; -import { IconButton, NavigableMenu, SelectControl } from '@wordpress/components'; -import PropTypes from 'prop-types'; -import { interpolateViridis as d3InterpolateViridis } from 'd3-scale-chromatic'; +import { decodeEntities } from '@wordpress/html-entities'; import { formatDefaultLocale as d3FormatDefaultLocale } from 'd3-format'; +import { get, isEqual, partial } from 'lodash'; import Gridicon from 'gridicons'; +import { IconButton, NavigableMenu, SelectControl } from '@wordpress/components'; +import { interpolateViridis as d3InterpolateViridis } from 'd3-scale-chromatic'; +import PropTypes from 'prop-types'; +import { withViewportMatch } from '@wordpress/viewport'; + +/** + * WooCommerce dependencies + */ +import { updateQueryString } from '@woocommerce/navigation'; +import { H, Section } from '@woocommerce/components'; /** * Internal dependencies */ import D3Chart from './charts'; import Legend from './legend'; -import { WIDE_BREAKPOINT } from './utils'; -import { H, Section } from 'components/section'; -import { gap, gaplarge } from 'stylesheets/abstracts/_variables.scss'; -import { updateQueryString } from 'lib/nav-utils'; d3FormatDefaultLocale( { decimal: '.', @@ -57,16 +59,13 @@ function getOrderedKeys( props ) { class Chart extends Component { constructor( props ) { super( props ); - this.chartRef = createRef(); - const wpBody = document.getElementById( 'wpbody' ).getBoundingClientRect().width; - const wpWrap = document.getElementById( 'wpwrap' ).getBoundingClientRect().width; - const calcGap = wpWrap > 782 ? gaplarge.match( /\d+/ )[ 0 ] : gap.match( /\d+/ )[ 0 ]; + this.chartBodyRef = createRef(); this.state = { data: props.data, orderedKeys: getOrderedKeys( props ), type: props.type, visibleData: [ ...props.data ], - width: wpBody - 2 * calcGap, + width: 0, }; this.handleTypeToggle = this.handleTypeToggle.bind( this ); this.handleLegendToggle = this.handleLegendToggle.bind( this ); @@ -90,6 +89,7 @@ class Chart extends Component { } componentDidMount() { + this.updateDimensions(); window.addEventListener( 'resize', this.updateDimensions ); } @@ -137,7 +137,7 @@ class Chart extends Component { updateDimensions() { this.setState( { - width: this.chartRef.current.offsetWidth, + width: this.chartBodyRef.current.offsetWidth, } ); } @@ -185,13 +185,30 @@ class Chart extends Component { ); } + getChartHeight() { + const { isViewportLarge, isViewportMobile } = this.props; + + if ( isViewportMobile ) { + return 180; + } + + if ( isViewportLarge ) { + return 300; + } + + return 220; + } + render() { const { orderedKeys, type, visibleData, width } = this.state; const { dateParser, + itemsLabel, layout, mode, pointLabelFormat, + isViewportLarge, + isViewportWide, title, tooltipFormat, tooltipTitle, @@ -201,19 +218,17 @@ class Chart extends Component { valueType, } = this.props; let { yFormat } = this.props; - const legendDirection = layout === 'standard' && width >= WIDE_BREAKPOINT ? 'row' : 'column'; - const chartDirection = layout === 'comparison' && width >= WIDE_BREAKPOINT ? 'row' : 'column'; - let chartHeight = width > 1329 ? 300 : 220; - chartHeight = width <= 1329 && width > 783 ? 220 : chartHeight; - chartHeight = width <= 783 ? 180 : chartHeight; + const legendDirection = layout === 'standard' && isViewportWide ? 'row' : 'column'; + const chartDirection = layout === 'comparison' && isViewportWide ? 'row' : 'column'; + const chartHeight = this.getChartHeight(); const legend = ( ); @@ -236,10 +251,10 @@ class Chart extends Component { break; } return ( -
+
{ title } - { width >= WIDE_BREAKPOINT && legendDirection === 'row' && legend } + { isViewportWide && legendDirection === 'row' && legend } { this.renderIntervalSelector() } - { width >= WIDE_BREAKPOINT && legendDirection === 'column' && legend } - + { isViewportWide && legendDirection === 'column' && legend } + { width > 0 && ( + + ) }
- { width < WIDE_BREAKPOINT &&
{ legend }
} + { ! isViewportWide &&
{ legend }
}
); @@ -396,4 +415,8 @@ Chart.defaultProps = { interval: 'day', }; -export default Chart; +export default withViewportMatch( { + isViewportMobile: '< medium', + isViewportLarge: '>= large', + isViewportWide: '>= wide', +} )( Chart ); diff --git a/plugins/woocommerce-admin/client/components/chart/legend.js b/plugins/woocommerce-admin/client/components/chart/legend.js index 8db8e9248ec..feab9362b93 100644 --- a/plugins/woocommerce-admin/client/components/chart/legend.js +++ b/plugins/woocommerce-admin/client/components/chart/legend.js @@ -3,8 +3,9 @@ * External dependencies */ import classNames from 'classnames'; -import { Component } from '@wordpress/element'; +import { Component, createRef } from '@wordpress/element'; import PropTypes from 'prop-types'; +import { sprintf } from '@wordpress/i18n'; /** * WooCommerce dependencies @@ -14,7 +15,7 @@ import { formatCurrency } from '@woocommerce/currency'; /** * Internal dependencies */ -import './style.scss'; +import './legend.scss'; import { getColor } from './utils'; function getFormatedTotal( total, valueType ) { @@ -36,65 +37,108 @@ function getFormatedTotal( total, valueType ) { * A legend specifically designed for the WooCommerce admin charts. */ class Legend extends Component { + constructor() { + super(); + + this.listRef = createRef(); + + this.state = { + isScrollable: false, + }; + } + + componentDidMount() { + this.updateListScroll(); + window.addEventListener( 'resize', this.updateListScroll ); + } + + componentWillUnmount() { + window.removeEventListener( 'resize', this.updateListScroll ); + } + + updateListScroll = () => { + const list = this.listRef.current; + const scrolledToEnd = list.scrollHeight - list.scrollTop <= list.offsetHeight; + this.setState( { + isScrollable: ! scrolledToEnd, + } ); + }; + render() { const { colorScheme, data, handleLegendHover, handleLegendToggle, + itemsLabel, legendDirection, valueType, } = this.props; + const { isScrollable } = this.state; const colorParams = { orderedKeys: data, colorScheme, }; const numberOfRowsVisible = data.filter( row => row.visible ).length; + const showTotalLabel = legendDirection === 'column' && data.length > 5 && itemsLabel; return ( -
    - { data.map( row => ( -
  • - -
  • - ) ) } -
+ + + ) ) } + + { showTotalLabel && ( +
{ sprintf( itemsLabel, data.length ) }
+ ) } +
); } } @@ -124,6 +168,11 @@ Legend.propTypes = { * Display legend items as a `row` or `column` inside a flex-box. */ legendDirection: PropTypes.oneOf( [ 'row', 'column' ] ), + /** + * Label to describe the legend items. It will be displayed in the legend of + * comparison charts when there are many. + */ + itemsLabel: PropTypes.string, /** * What type of data is to be displayed? Number, Average, String? */ diff --git a/plugins/woocommerce-admin/client/components/chart/legend.scss b/plugins/woocommerce-admin/client/components/chart/legend.scss new file mode 100644 index 00000000000..1d574a3a91c --- /dev/null +++ b/plugins/woocommerce-admin/client/components/chart/legend.scss @@ -0,0 +1,214 @@ +/** @format */ + +.woocommerce-legend { + &.has-total { + padding-bottom: 50px; + position: relative; + } + + &.woocommerce-legend__direction-column { + border-right: 1px solid $core-grey-light-700; + min-width: 320px; + + .woocommerce-chart__footer & { + border-right: none; + } + } +} + +.woocommerce-legend__list { + color: $black; + display: flex; + height: 100%; + margin: 0; + + .woocommerce-legend__direction-column & { + flex-direction: column; + height: 300px; + overflow: auto; + + .woocommerce-chart__footer & { + border-top: 1px solid $core-grey-light-700; + height: 100%; + max-height: none; + min-height: none; + } + } + + .has-total.woocommerce-legend__direction-column & { + height: 250px; + + .woocommerce-chart__footer & { + height: auto; + max-height: 220px; + min-height: none; + } + } + + .woocommerce-legend__direction-row & { + flex-direction: row; + } +} + +.woocommerce-legend__item { + & > button { + display: flex; + justify-content: center; + align-items: center; + background-color: $white; + color: $core-grey-dark-500; + display: inline-flex; + flex-direction: row; + flex-wrap: nowrap; + justify-content: space-between; + width: 100%; + border: none; + padding: 0; + + .woocommerce-legend__item-container { + display: flex; + flex-direction: row; + flex-wrap: nowrap; + justify-content: space-between; + position: relative; + padding: 3px 0 3px 24px; + cursor: pointer; + font-size: 13px; + user-select: none; + width: 100%; + + &:hover { + input { + ~ .woocommerce-legend__item-checkmark { + background-color: $core-grey-light-200; + } + } + } + + .woocommerce-legend__item-checkmark { + border: 1px solid $core-grey-light-900; + position: absolute; + top: 4px; + left: 0; + height: 16px; + width: 16px; + background-color: $white; + + &::after { + content: ''; + position: absolute; + display: none; + } + + &.woocommerce-legend__item-checkmark-checked { + background-color: currentColor; + border-color: currentColor; + + &::after { + display: block; + left: 5px; + top: 2px; + width: 3px; + height: 6px; + border: solid $white; + border-width: 0 2px 2px 0; + transform: rotate(45deg); + } + } + } + + .woocommerce-legend__item-total { + font-weight: bold; + } + } + + &:focus { + outline: none; + + .woocommerce-legend__item-container { + .woocommerce-legend__item-checkmark { + outline: 2px solid $core-grey-light-900; + } + } + } + + &:hover { + background-color: $core-grey-light-100; + } + } + + .woocommerce-legend__direction-column & { + margin: 2px 0; + padding: 0; + + & > button { + height: 32px; + padding: 0 17px; + } + + &:first-child { + margin-top: $gap-small; + } + + &:last-child::after { + content: ''; + display: block; + height: $gap-small; + width: 100%; + } + } + + .woocommerce-legend__direction-row & { + padding: 0; + margin: 0; + + & > button { + padding: 0 17px; + + .woocommerce-legend__item-container { + height: 50px; + align-items: center; + + .woocommerce-legend__item-checkmark { + top: 17px; + } + + .woocommerce-legend__item-title { + margin-right: 17px; + } + } + } + } +} + +.woocommerce-legend__total { + align-items: center; + background: $white; + border-top: 1px solid $core-grey-light-700; + bottom: 0; + color: $core-grey-dark-500; + display: flex; + height: 50px; + justify-content: center; + left: 0; + position: absolute; + right: 0; + text-transform: uppercase; + + &::before { + background: linear-gradient(180deg, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.2)); + bottom: 100%; + content: ''; + height: 20px; + left: 0; + opacity: 0; + pointer-events: none; + position: absolute; + right: 0; + transition: opacity 0.3s; + } + + .is-scrollable &::before { + opacity: 1; + } +} diff --git a/plugins/woocommerce-admin/client/components/chart/style.scss b/plugins/woocommerce-admin/client/components/chart/style.scss index c563f0d3546..4ce6fda52f9 100644 --- a/plugins/woocommerce-admin/client/components/chart/style.scss +++ b/plugins/woocommerce-admin/client/components/chart/style.scss @@ -2,7 +2,7 @@ .woocommerce-chart { margin-top: -$gap; margin-bottom: $gap-large; - background: white; + background: $white; border: 1px solid $core-grey-light-700; border-top: 0; @@ -61,15 +61,6 @@ .woocommerce-chart__footer { width: 100%; - - .woocommerce-legend { - &.woocommerce-legend__direction-column { - height: 100%; - min-height: none; - border-right: none; - margin-bottom: $gap; - } - } } svg { @@ -185,6 +176,12 @@ } } } + .y-axis, + .axis-month { + .tick text { + font-size: 10px; + } + } .focus-grid { line { @@ -252,146 +249,3 @@ position: absolute; } } - -.woocommerce-legend { - color: $black; - display: flex; - height: 100%; - margin: 0; - - &.woocommerce-legend__direction-column { - flex-direction: column; - border-right: 1px solid $core-grey-light-700; - height: 300px; - min-width: 320px; - - li { - margin: 0; - padding: 0; - - button { - height: 32px; - padding: 0 17px; - } - - &:first-child { - margin-top: 17px; - } - } - } - - &.woocommerce-legend__direction-row { - flex-direction: row; - - li { - padding: 0; - margin: 0; - - button { - padding: 0 17px; - - .woocommerce-legend__item-container { - height: 50px; - align-items: center; - - .woocommerce-legend__item-checkmark { - top: 17px; - } - - .woocommerce-legend__item-title { - margin-right: 17px; - } - } - } - } - } - - li { - &.woocommerce-legend__item { - button { - &:hover { - background-color: $core-grey-light-100; - } - } - } - - button { - background-color: $white; - color: $core-grey-dark-500; - display: inline-flex; - flex-direction: row; - flex-wrap: nowrap; - justify-content: space-between; - width: 100%; - border: none; - padding: 0; - - .woocommerce-legend__item-container { - display: flex; - flex-direction: row; - flex-wrap: nowrap; - justify-content: space-between; - position: relative; - padding: 3px 0 3px 24px; - cursor: pointer; - font-size: 13px; - user-select: none; - width: 100%; - - &:hover { - input { - ~ .woocommerce-legend__item-checkmark { - background-color: $core-grey-light-200; - } - } - } - - .woocommerce-legend__item-checkmark { - border: 1px solid $core-grey-light-900; - position: absolute; - top: 2px; - left: 0; - height: 16px; - width: 16px; - background-color: $white; - - &::after { - content: ''; - position: absolute; - display: none; - } - - &.woocommerce-legend__item-checkmark-checked { - background-color: currentColor; - border-color: currentColor; - - &::after { - display: block; - left: 5px; - top: 2px; - width: 3px; - height: 6px; - border: solid $white; - border-width: 0 2px 2px 0; - transform: rotate(45deg); - } - } - } - - .woocommerce-legend__item-total { - font-weight: bold; - } - } - - &:focus { - outline: none; - - .woocommerce-legend__item-container { - .woocommerce-legend__item-checkmark { - outline: 2px solid $core-grey-light-900; - } - } - } - } - } -} diff --git a/plugins/woocommerce-admin/client/components/chart/test/legend.js b/plugins/woocommerce-admin/client/components/chart/test/legend.js index 9be1db292ac..e072fd0dfc6 100644 --- a/plugins/woocommerce-admin/client/components/chart/test/legend.js +++ b/plugins/woocommerce-admin/client/components/chart/test/legend.js @@ -3,7 +3,7 @@ * * @format */ -import { shallow } from 'enzyme'; +import { mount } from 'enzyme'; /** * Internal dependencies @@ -26,7 +26,7 @@ const data = [ describe( 'Legend', () => { test( 'should not disable any button if more than one is active', () => { - const topSellingProducts = shallow( ); + const topSellingProducts = mount( ); expect( topSellingProducts.find( 'button' ).get( 0 ).props.disabled ).toBeFalsy(); expect( topSellingProducts.find( 'button' ).get( 1 ).props.disabled ).toBeFalsy(); @@ -35,7 +35,7 @@ describe( 'Legend', () => { test( 'should disable the last active button', () => { data[ 1 ].visible = false; - const topSellingProducts = shallow( ); + const topSellingProducts = mount( ); expect( topSellingProducts.find( 'button' ).get( 0 ).props.disabled ).toBeTruthy(); expect( topSellingProducts.find( 'button' ).get( 1 ).props.disabled ).toBeFalsy(); diff --git a/plugins/woocommerce-admin/client/components/chart/test/utils.js b/plugins/woocommerce-admin/client/components/chart/test/utils.js index 1371a6660c3..9ad96abfc11 100644 --- a/plugins/woocommerce-admin/client/components/chart/test/utils.js +++ b/plugins/woocommerce-admin/client/components/chart/test/utils.js @@ -172,12 +172,9 @@ describe( 'getYScale', () => { describe( 'getYTickOffset', () => { it( 'properly scale the y values for the y-axis ticks given the height and maximum y value', () => { - const testYTickOffset1 = getYTickOffset( 100, 1, testYMax ); + const testYTickOffset1 = getYTickOffset( 100, testYMax ); expect( testYTickOffset1( 0 ) ).toEqual( 112 ); expect( testYTickOffset1( testYMax ) ).toEqual( 12 ); - const testYTickOffset2 = getYTickOffset( 100, 2, testYMax ); - expect( testYTickOffset2( 0 ) ).toEqual( 124 ); - expect( testYTickOffset2( testYMax ) ).toEqual( 24 ); } ); } ); diff --git a/plugins/woocommerce-admin/client/components/chart/utils.js b/plugins/woocommerce-admin/client/components/chart/utils.js index 92bfa934a94..a2051385364 100644 --- a/plugins/woocommerce-admin/client/components/chart/utils.js +++ b/plugins/woocommerce-admin/client/components/chart/utils.js @@ -19,7 +19,7 @@ import { format as formatDate } from '@wordpress/date'; /** * WooCommerce dependencies */ -import { dayTicksThreshold } from '@woocommerce/date'; +import { dayTicksThreshold, weekTicksThreshold } from '@woocommerce/date'; import { formatCurrency } from '@woocommerce/currency'; /** @@ -188,14 +188,13 @@ export const getYScale = ( height, yMax ) => /** * Describes getyTickOffset * @param {number} height - calculated height of the charting space - * @param {number} scale - ratio of the expected width to calculated width (given the viewbox) * @param {number} yMax - from `getYMax` * @returns {function} the D3 linear scale from 0 to the value from `getYMax`, offset by 12 pixels down */ -export const getYTickOffset = ( height, scale, yMax ) => +export const getYTickOffset = ( height, yMax ) => d3ScaleLinear() .domain( [ 0, yMax ] ) - .rangeRound( [ height + scale * 12, scale * 12 ] ); + .rangeRound( [ height + 12, 12 ] ); /** * Describes getyTickOffset @@ -303,7 +302,10 @@ const calculateXTicksIncrementFactor = ( uniqueDates, maxTicks ) => { export const getXTicks = ( uniqueDates, width, layout, interval ) => { const maxTicks = calculateMaxXTicks( width, layout ); - if ( uniqueDates.length >= dayTicksThreshold && interval === 'day' ) { + if ( + ( uniqueDates.length >= dayTicksThreshold && interval === 'day' ) || + ( uniqueDates.length >= weekTicksThreshold && interval === 'week' ) + ) { uniqueDates = getFirstDatePerMonth( uniqueDates ); } if ( uniqueDates.length <= maxTicks ) { @@ -374,6 +376,14 @@ export const compareStrings = ( s1, s2, splitChar = ' ' ) => { export const drawAxis = ( node, params ) => { const xScale = params.type === 'line' ? params.xLineScale : params.xScale; + const removeDuplicateDates = ( d, i, ticks, formatter ) => { + const monthDate = d instanceof Date ? d : new Date( d ); + let prevMonth = i !== 0 ? ticks[ i - 1 ] : ticks[ i ]; + prevMonth = prevMonth instanceof Date ? prevMonth : new Date( prevMonth ); + return i === 0 + ? formatter( monthDate ) + : compareStrings( formatter( prevMonth ), formatter( monthDate ) ).join( ' ' ); + }; const yGrids = []; for ( let i = 0; i < 4; i++ ) { @@ -390,7 +400,7 @@ export const drawAxis = ( node, params ) => { .call( d3AxisBottom( xScale ) .tickValues( ticks ) - .tickFormat( d => params.xFormat( d instanceof Date ? d : new Date( d ) ) ) + .tickFormat( ( d, i ) => removeDuplicateDates( d, i, ticks, params.xFormat ) ) ); node @@ -401,23 +411,10 @@ export const drawAxis = ( node, params ) => { .call( d3AxisBottom( xScale ) .tickValues( ticks ) - .tickFormat( ( d, i ) => { - const monthDate = d instanceof Date ? d : new Date( d ); - let prevMonth = i !== 0 ? ticks[ i - 1 ] : ticks[ i ]; - prevMonth = prevMonth instanceof Date ? prevMonth : new Date( prevMonth ); - return i === 0 - ? params.x2Format( monthDate ) - : compareStrings( params.x2Format( prevMonth ), params.x2Format( monthDate ) ).join( - ' ' - ); - } ) + .tickFormat( ( d, i ) => removeDuplicateDates( d, i, ticks, params.x2Format ) ) ) .call( g => g.select( '.domain' ).remove() ); - node - .selectAll( '.axis-month .tick text' ) - .style( 'font-size', `${ Math.round( params.scale * 10 ) }px` ); - node .append( 'g' ) .attr( 'class', 'pipes' ) @@ -453,10 +450,6 @@ export const drawAxis = ( node, params ) => { .tickFormat( d => d3Format( params.yFormat )( d !== 0 ? d : 0 ) ) ); - node - .selectAll( '.y-axis .tick text' ) - .style( 'font-size', `${ Math.round( params.scale * 10 ) }px` ); - node.selectAll( '.domain' ).remove(); node .selectAll( '.axis' ) @@ -541,19 +534,18 @@ const handleMouseOutLineChart = ( parentNode, params ) => { params.tooltip.style( 'visibility', 'hidden' ); }; -export const WIDE_BREAKPOINT = 1100; - const calculateTooltipXPosition = ( elementCoords, chartCoords, tooltipSize, tooltipMargin, - elementWidthRatio + elementWidthRatio, + tooltipPosition ) => { const xPosition = elementCoords.left + elementCoords.width * elementWidthRatio + tooltipMargin - chartCoords.left; - if ( chartCoords.width < WIDE_BREAKPOINT ) { + if ( tooltipPosition === 'below' ) { return Math.max( tooltipMargin, Math.min( @@ -577,8 +569,14 @@ const calculateTooltipXPosition = ( return xPosition; }; -const calculateTooltipYPosition = ( elementCoords, chartCoords, tooltipSize, tooltipMargin ) => { - if ( chartCoords.width < WIDE_BREAKPOINT ) { +const calculateTooltipYPosition = ( + elementCoords, + chartCoords, + tooltipSize, + tooltipMargin, + tooltipPosition +) => { + if ( tooltipPosition === 'below' ) { return chartCoords.height; } @@ -590,7 +588,7 @@ const calculateTooltipYPosition = ( elementCoords, chartCoords, tooltipSize, too return yPosition; }; -const calculateTooltipPosition = ( element, chart, elementWidthRatio = 1 ) => { +const calculateTooltipPosition = ( element, chart, tooltipPosition, elementWidthRatio = 1 ) => { const elementCoords = element.getBoundingClientRect(); const chartCoords = chart.getBoundingClientRect(); const tooltipSize = d3Select( '.tooltip' ) @@ -598,7 +596,7 @@ const calculateTooltipPosition = ( element, chart, elementWidthRatio = 1 ) => { .getBoundingClientRect(); const tooltipMargin = 24; - if ( chartCoords.width < WIDE_BREAKPOINT ) { + if ( tooltipPosition === 'below' ) { elementWidthRatio = 0; } @@ -608,9 +606,16 @@ const calculateTooltipPosition = ( element, chart, elementWidthRatio = 1 ) => { chartCoords, tooltipSize, tooltipMargin, - elementWidthRatio + elementWidthRatio, + tooltipPosition + ), + y: calculateTooltipYPosition( + elementCoords, + chartCoords, + tooltipSize, + tooltipMargin, + tooltipPosition ), - y: calculateTooltipYPosition( elementCoords, chartCoords, tooltipSize, tooltipMargin ), }; }; @@ -667,7 +672,11 @@ export const drawLines = ( node, data, params ) => { return `${ label } ${ formatCurrency( d.value ) }`; } ) .on( 'focus', ( d, i, nodes ) => { - const position = calculateTooltipPosition( d3Event.target, node.node() ); + const position = calculateTooltipPosition( + d3Event.target, + node.node(), + params.tooltipPosition + ); handleMouseOverLineChart( d.date, nodes[ i ].parentNode, node, data, params, position ); } ) .on( 'blur', ( d, i, nodes ) => handleMouseOutLineChart( nodes[ i ].parentNode, params ) ); @@ -715,7 +724,12 @@ export const drawLines = ( node, data, params ) => { .attr( 'opacity', 0 ) .on( 'mouseover', ( d, i, nodes ) => { const elementWidthRatio = i === 0 || i === params.dateSpaces.length - 1 ? 0 : 0.5; - const position = calculateTooltipPosition( d3Event.target, node.node(), elementWidthRatio ); + const position = calculateTooltipPosition( + d3Event.target, + node.node(), + params.tooltipPosition, + elementWidthRatio + ); handleMouseOverLineChart( d.date, nodes[ i ].parentNode, node, data, params, position ); } ) .on( 'mouseout', ( d, i, nodes ) => handleMouseOutLineChart( nodes[ i ].parentNode, params ) ); @@ -780,7 +794,7 @@ export const drawBars = ( node, data, params ) => { } ) .on( 'focus', ( d, i, nodes ) => { const targetNode = d.value > 0 ? d3Event.target : d3Event.target.parentNode; - const position = calculateTooltipPosition( targetNode, node.node() ); + const position = calculateTooltipPosition( targetNode, node.node(), params.tooltipPosition ); handleMouseOverBarChart( d.date, nodes[ i ].parentNode, node, data, params, position ); } ) .on( 'blur', ( d, i, nodes ) => handleMouseOutBarChart( nodes[ i ].parentNode, params ) ); @@ -794,7 +808,11 @@ export const drawBars = ( node, data, params ) => { .attr( 'height', params.height ) .attr( 'opacity', '0' ) .on( 'mouseover', ( d, i, nodes ) => { - const position = calculateTooltipPosition( d3Event.target, node.node() ); + const position = calculateTooltipPosition( + d3Event.target, + node.node(), + params.tooltipPosition + ); handleMouseOverBarChart( d.date, nodes[ i ].parentNode, node, data, params, position ); } ) .on( 'mouseout', ( d, i, nodes ) => handleMouseOutBarChart( nodes[ i ].parentNode, params ) ); diff --git a/plugins/woocommerce-admin/client/components/filters/filter/utils.js b/plugins/woocommerce-admin/client/components/filters/filter/utils.js deleted file mode 100644 index 78c0235a70e..00000000000 --- a/plugins/woocommerce-admin/client/components/filters/filter/utils.js +++ /dev/null @@ -1,19 +0,0 @@ -/** @format */ -/** - * External dependencies - */ -import { omit } from 'lodash'; - -export function flatenFilters( filters ) { - const allFilters = []; - filters.forEach( f => { - if ( ! f.subFilters ) { - allFilters.push( f ); - } else { - allFilters.push( omit( f, 'subFilters' ) ); - const subFilters = flatenFilters( f.subFilters ); - allFilters.push( ...subFilters ); - } - } ); - return allFilters; -} diff --git a/plugins/woocommerce-admin/client/components/index.js b/plugins/woocommerce-admin/client/components/index.js index 59461163b5d..e2291a03243 100644 --- a/plugins/woocommerce-admin/client/components/index.js +++ b/plugins/woocommerce-admin/client/components/index.js @@ -1,52 +1,6 @@ /** @format */ -/** - * External Dependencies - */ -// Turn on react-dates classes/styles, see https://github.com/airbnb/react-dates#initialize -import 'react-dates/initialize'; - -export { default as AdvancedFilters } from './filters/advanced'; -export { default as AnimationSlider } from './animation-slider'; -export { default as Card } from './card'; export { default as Chart } from './chart'; export { default as ChartLegend } from './chart/legend'; export { default as ChartPlaceholder } from './chart/placeholder'; -export { default as Count } from './count'; -export { default as CompareFilter } from './filters/compare'; export { default as D3Chart } from './chart/charts'; -export { default as DatePicker } from './filters/date'; -export { default as DateRange } from './calendar'; -export { default as DropdownButton } from './dropdown-button'; -export { default as EllipsisMenu } from './ellipsis-menu'; -export { default as EmptyContent } from './empty-content'; -export { default as Flag } from './flag'; -export { default as FilterPicker } from './filters/filter'; -export { default as Gravatar } from './gravatar'; -export { H, Section } from './section'; -export { default as ImageAsset } from './image-asset'; -export { default as Link } from './link'; -export { default as MenuItem } from './ellipsis-menu/menu-item'; -export { default as MenuTitle } from './ellipsis-menu/menu-title'; -export { default as OrderStatus } from './order-status'; -export { default as Pagination } from './pagination'; -export { default as ProductImage } from './product-image'; -export { default as ProductRating } from './rating/product'; -export { default as Rating } from './rating'; -export { default as ReportFilters } from './filters'; -export { default as ReviewRating } from './rating/review'; -export { default as Search } from './search'; -export { default as SectionHeader } from './section-header'; -export { default as SegmentedSelection } from './segmented-selection'; -export { default as SplitButton } from './split-button'; -export { default as SummaryList } from './summary'; -export { default as SummaryListPlaceholder } from './summary/placeholder'; -export { default as SummaryNumber } from './summary/item'; -export { default as Table } from './table/table'; -export { default as TableCard } from './table'; -export { default as EmptyTable } from './table/empty'; -export { default as TablePlaceholder } from './table/placeholder'; -export { default as TableSummary } from './table/summary'; -export { default as Tag } from './tag'; -export { default as useFilters } from './higher-order/use-filters'; -export { default as ViewMoreList } from './view-more-list'; diff --git a/plugins/woocommerce-admin/client/dashboard/style.scss b/plugins/woocommerce-admin/client/dashboard/style.scss index f196920df7f..b55c4093a3d 100644 --- a/plugins/woocommerce-admin/client/dashboard/style.scss +++ b/plugins/woocommerce-admin/client/dashboard/style.scss @@ -5,7 +5,7 @@ grid-template-columns: 1fr 1fr; grid-column-gap: $gap-large; - @include breakpoint( '<1100px' ) { + @include breakpoint( '<960px' ) { grid-template-columns: 1fr; } } diff --git a/plugins/woocommerce-admin/client/dashboard/top-selling-products/index.js b/plugins/woocommerce-admin/client/dashboard/top-selling-products/index.js index bb0c5fa7882..9704576ea71 100644 --- a/plugins/woocommerce-admin/client/dashboard/top-selling-products/index.js +++ b/plugins/woocommerce-admin/client/dashboard/top-selling-products/index.js @@ -13,12 +13,13 @@ import { withSelect } from '@wordpress/data'; */ import { Card, EmptyTable, TableCard } from '@woocommerce/components'; import { formatCurrency, getCurrencyFormatDecimal } from '@woocommerce/currency'; +import { getAdminLink } from '@woocommerce/navigation'; /** * Internal dependencies */ -import { getAdminLink } from 'lib/nav-utils'; import { numberFormat } from 'lib/number'; +import ReportError from 'analytics/components/report-error'; import { NAMESPACE } from 'store/constants'; import './style.scss'; @@ -91,7 +92,7 @@ export class TopSellingProducts extends Component { const title = __( 'Top Selling Products', 'wc-admin' ); if ( isError ) { - // @TODO An error notice should be displayed when there is an error + return ; } if ( ! isRequesting && rows.length === 0 ) { diff --git a/plugins/woocommerce-admin/client/dashboard/top-selling-products/style.scss b/plugins/woocommerce-admin/client/dashboard/top-selling-products/style.scss index 0591b7c8bd4..58719f3ece0 100644 --- a/plugins/woocommerce-admin/client/dashboard/top-selling-products/style.scss +++ b/plugins/woocommerce-admin/client/dashboard/top-selling-products/style.scss @@ -1,5 +1,9 @@ /** @format */ .woocommerce-top-selling-products { + &.woocommerce-empty-content { + margin-bottom: $gap-large; + } + .woocommerce-card__body { padding: 0; } diff --git a/plugins/woocommerce-admin/client/devdocs/example.js b/plugins/woocommerce-admin/client/devdocs/example.js index 2c9e2c8f460..7fcf375b19e 100755 --- a/plugins/woocommerce-admin/client/devdocs/example.js +++ b/plugins/woocommerce-admin/client/devdocs/example.js @@ -16,7 +16,8 @@ import PropTypes from 'prop-types'; /** * Internal dependencies */ -import * as components from '@woocommerce/components'; +import * as components from 'components'; +import * as pkgComponents from '@woocommerce/components'; class Example extends Component { state = { @@ -28,7 +29,15 @@ class Example extends Component { } async getCode() { - const readme = require( `components/${ this.props.filePath }/example.md` ); + let readme; + try { + readme = require( `components/src/${ this.props.filePath }/example.md` ); + } catch ( e ) { + readme = require( `components/${ this.props.filePath }/example.md` ); + } + if ( ! readme ) { + return; + } // Example to render is the first jsx code block that appears in the readme let code = codeBlocks( readme ).find( block => 'jsx' === block.lang ).code; @@ -47,6 +56,7 @@ class Example extends Component { const scope = { ...wpComponents, ...components, + ...pkgComponents, Component, withState, getSettings, diff --git a/plugins/woocommerce-admin/client/devdocs/style.scss b/plugins/woocommerce-admin/client/devdocs/style.scss index 6e499f07b97..ab4a509f86f 100644 --- a/plugins/woocommerce-admin/client/devdocs/style.scss +++ b/plugins/woocommerce-admin/client/devdocs/style.scss @@ -1,7 +1,7 @@ /** @format */ .woocommerce_devdocs { - @include breakpoint( '>1100px' ) { + @include breakpoint( '>1280px' ) { &.is-list { column-gap: $gap-large; columns: 2; diff --git a/plugins/woocommerce-admin/client/header/activity-panel/style.scss b/plugins/woocommerce-admin/client/header/activity-panel/style.scss index e484927c772..d47963a8f88 100644 --- a/plugins/woocommerce-admin/client/header/activity-panel/style.scss +++ b/plugins/woocommerce-admin/client/header/activity-panel/style.scss @@ -10,7 +10,7 @@ @include breakpoint( '<782px' ) { position: relative; - background: #fff; + background: $white; margin: 0; padding: 0; top: -3px; @@ -20,12 +20,12 @@ flex: 1 100%; } - @include breakpoint( '782px-1100px' ) { + @include breakpoint( '782px-960px' ) { max-width: 280px; height: 60px; } - @include breakpoint( '>1100px' ) { + @include breakpoint( '>960px' ) { max-width: 400px; } @@ -40,7 +40,7 @@ height: 60px; justify-content: flex-end; - @include breakpoint( '>1100px' ) { + @include breakpoint( '>960px' ) { height: 80px; } @@ -53,7 +53,7 @@ width: 18px; height: 18px; - @include breakpoint( '>1100px' ) { + @include breakpoint( '>960px' ) { width: 24px; height: 24px; } @@ -80,7 +80,7 @@ height: 60px; border-bottom: 3px solid $white; - @include breakpoint( '>1100px' ) { + @include breakpoint( '>960px' ) { height: 80px; } @@ -91,7 +91,7 @@ } font-size: 11px; - @include breakpoint( '>1100px' ) { + @include breakpoint( '>960px' ) { font-size: 13px; } @@ -109,14 +109,14 @@ top: 10px; left: 50%; - @include breakpoint( '782px-1100px' ) { + @include breakpoint( '782px-960px' ) { top: 8px; right: 18px; left: initial; margin-left: 0; } - @include breakpoint( '>1100px' ) { + @include breakpoint( '>960px' ) { top: 16px; right: 28px; left: initial; @@ -167,7 +167,7 @@ position: absolute; padding: 1px; background: $core-orange; - border: 2px solid white; + border: 2px solid $white; width: 4px; height: 4px; display: inline-block; @@ -209,10 +209,10 @@ // Extra padding is needed at the bottom of the wrapper because of our positioning, height, and overflow rules. Otherwise, some content can get cut off. padding-bottom: $gap-small * 6; - @include breakpoint( '782px-1100px' ) { + @include breakpoint( '782px-960px' ) { padding-bottom: $gap-small; } - @include breakpoint( '>1100px' ) { + @include breakpoint( '>960px' ) { top: 112px; padding-bottom: $gap * 2; } diff --git a/plugins/woocommerce-admin/client/header/index.js b/plugins/woocommerce-admin/client/header/index.js index 59631af733c..858f1c49250 100644 --- a/plugins/woocommerce-admin/client/header/index.js +++ b/plugins/woocommerce-admin/client/header/index.js @@ -3,19 +3,23 @@ * External dependencies */ import { __, sprintf } from '@wordpress/i18n'; -import { Component } from '@wordpress/element'; +import { Component, findDOMNode } from '@wordpress/element'; import classnames from 'classnames'; import { decodeEntities } from '@wordpress/html-entities'; import { Fill } from 'react-slot-fill'; import PropTypes from 'prop-types'; -import ReactDom from 'react-dom'; + +/** + * WooCommerce dependencies + */ +import { getNewPath, getTimeRelatedQuery } from '@woocommerce/navigation'; +import { Link } from '@woocommerce/components'; /** * Internal dependencies */ import './style.scss'; import ActivityPanel from './activity-panel'; -import { Link } from '@woocommerce/components'; class Header extends Component { constructor() { @@ -29,7 +33,7 @@ class Header extends Component { } componentDidMount() { - this.threshold = ReactDom.findDOMNode( this ).offsetTop; + this.threshold = findDOMNode( this ).offsetTop; window.addEventListener( 'scroll', this.onWindowScroll ); this.updateIsScrolled(); } @@ -84,7 +88,10 @@ class Header extends Component { { _sections.map( ( section, i ) => { const sectionPiece = Array.isArray( section ) ? ( - + { section[ 1 ] } ) : ( diff --git a/plugins/woocommerce-admin/client/header/style.scss b/plugins/woocommerce-admin/client/header/style.scss index 46bfb4b9fb2..9960c970e5f 100644 --- a/plugins/woocommerce-admin/client/header/style.scss +++ b/plugins/woocommerce-admin/client/header/style.scss @@ -24,7 +24,7 @@ flex-flow: row wrap; } - @include breakpoint( '782px-1100px' ) { + @include breakpoint( '782px-960px' ) { height: 60px; } @@ -38,12 +38,12 @@ line-height: 50px; background: $white; - @include breakpoint( '782px-1100px' ) { + @include breakpoint( '782px-960px' ) { height: 60px; line-height: 60px; } - @include breakpoint( '>1100px' ) { + @include breakpoint( '>960px' ) { height: 80px; line-height: 80px; } diff --git a/plugins/woocommerce-admin/client/layout/controller.js b/plugins/woocommerce-admin/client/layout/controller.js index 48bfdde3010..024ea1138ff 100644 --- a/plugins/woocommerce-admin/client/layout/controller.js +++ b/plugins/woocommerce-admin/client/layout/controller.js @@ -6,6 +6,11 @@ import { Component, createElement } from '@wordpress/element'; import { parse } from 'qs'; import { find, last } from 'lodash'; +/** + * WooCommerce dependencies + */ +import { getTimeRelatedQuery, stringifyQuery } from '@woocommerce/navigation'; + /** * Internal dependencies */ @@ -13,7 +18,6 @@ import Analytics from 'analytics'; import AnalyticsReport from 'analytics/report'; import Dashboard from 'dashboard'; import DevDocs from 'devdocs'; -import { getTimeRelatedQuery, stringifyQuery } from 'lib/nav-utils'; const getPages = () => { const pages = [ diff --git a/plugins/woocommerce-admin/client/layout/index.js b/plugins/woocommerce-admin/client/layout/index.js index 697c540d756..9862c2029b8 100644 --- a/plugins/woocommerce-admin/client/layout/index.js +++ b/plugins/woocommerce-admin/client/layout/index.js @@ -8,13 +8,17 @@ import { Slot } from 'react-slot-fill'; import PropTypes from 'prop-types'; import { get } from 'lodash'; +/** + * WooCommerce dependencies + */ +import { history } from '@woocommerce/navigation'; + /** * Internal dependencies */ import './style.scss'; import { Controller, getPages } from './controller'; import Header from 'header'; -import history from 'lib/history'; import Notices from './notices'; import { recordPageView } from 'lib/tracks'; diff --git a/plugins/woocommerce-admin/client/layout/style.scss b/plugins/woocommerce-admin/client/layout/style.scss index 5dd157e2dd0..120189e20bd 100644 --- a/plugins/woocommerce-admin/client/layout/style.scss +++ b/plugins/woocommerce-admin/client/layout/style.scss @@ -8,7 +8,7 @@ margin: 80px 0 0 $fallback-gutter-large; margin: 80px 0 0 $gutter-large; - @include breakpoint( '>1100px' ) { + @include breakpoint( '>960px' ) { margin-top: 100px; } } diff --git a/plugins/woocommerce-admin/client/lib/async-requests/index.js b/plugins/woocommerce-admin/client/lib/async-requests/index.js index 8c417db50f4..ea9aed49b5f 100644 --- a/plugins/woocommerce-admin/client/lib/async-requests/index.js +++ b/plugins/woocommerce-admin/client/lib/async-requests/index.js @@ -6,20 +6,21 @@ import apiFetch from '@wordpress/api-fetch'; import { identity } from 'lodash'; /** - * Internal dependencies + * WooCommerce dependencies */ -import { getIdsFromQuery, stringifyQuery } from 'lib/nav-utils'; +import { getIdsFromQuery, stringifyQuery } from '@woocommerce/navigation'; /** * Get a function that accepts ids as they are found in url parameter and * returns a promise with an optional method applied to results * - * @param {string} path - api path + * @param {string|function} path - api path string or a function of the query returning api path string * @param {Function} [handleData] - function applied to each iteration of data * @returns {Function} - a function of ids returning a promise */ export function getRequestByIdString( path, handleData = identity ) { - return function( queryString = '' ) { + return function( queryString = '', query ) { + const pathString = 'function' === typeof path ? path( query ) : path; const idList = getIdsFromQuery( queryString ); if ( idList.length < 1 ) { return Promise.resolve( [] ); @@ -28,6 +29,6 @@ export function getRequestByIdString( path, handleData = identity ) { include: idList.join( ',' ), per_page: idList.length, } ); - return apiFetch( { path: path + payload } ).then( data => data.map( handleData ) ); + return apiFetch( { path: pathString + payload } ).then( data => data.map( handleData ) ); }; } diff --git a/plugins/woocommerce-admin/client/lib/get-selected-chart/index.js b/plugins/woocommerce-admin/client/lib/get-selected-chart/index.js new file mode 100644 index 00000000000..4fe6d998c64 --- /dev/null +++ b/plugins/woocommerce-admin/client/lib/get-selected-chart/index.js @@ -0,0 +1,22 @@ +/** @format */ + +/** + * External dependencies + */ +import { find } from 'lodash'; + +/** + * Takes a chart name returns the configuration for that chart from and array + * of charts. If the chart is not found it will return the first chart. + * + * @param {string} chartName - the name of the chart to get configuration for + * @param {array} charts - list of charts for a particular report + * @returns {object} - chart configuration object + */ +export default function getSelectedChart( chartName, charts = [] ) { + const chart = find( charts, { key: chartName } ); + if ( chart ) { + return chart; + } + return charts[ 0 ]; +} diff --git a/plugins/woocommerce-admin/client/lib/nav-utils/README.md b/plugins/woocommerce-admin/client/lib/nav-utils/README.md deleted file mode 100644 index 035b18ed7ce..00000000000 --- a/plugins/woocommerce-admin/client/lib/nav-utils/README.md +++ /dev/null @@ -1,24 +0,0 @@ -Nav Utils -========= - -This is a library of functions used in navigation. - -## `getPath()` - -Get the current path from history. - -## `getQuery()` - -Get the current query string, parsed into an object, from history. - -## `getAdminLink( string: path )` - -JS version of `admin_url`. Returns the full URL for a page in wp-admin. - -## `getNewPath( object: query, string: path, object: currentQuery )` - -Return a URL with set query parameters. Optional `path`, `currentQuery`, both will default to the current value fetched from `history` if not provided. - -## `updateQueryString( object: query )` - -Updates the query parameters of the current page. diff --git a/plugins/woocommerce-admin/client/lib/ui.js b/plugins/woocommerce-admin/client/lib/ui.js deleted file mode 100644 index d9102d6c429..00000000000 --- a/plugins/woocommerce-admin/client/lib/ui.js +++ /dev/null @@ -1,12 +0,0 @@ -/** @format */ - -// 782px is the width designated by Gutenberg's `` component. -// * https://github.com/WordPress/gutenberg/blob/c8f8806d4465a83c1a0bc62d5c61377b56fa7214/components/popover/utils.js#L6 -export function isMobileViewport() { - return window.innerWidth <= 782; -} - -// Most screens at 1100px or lower are tablets -export function isTabletViewport() { - return window.innerWidth > 782 && window.innerWidth <= 1100; -} diff --git a/plugins/woocommerce-admin/client/store/constants.js b/plugins/woocommerce-admin/client/store/constants.js index ff0e0aa95b1..0876fd31aa9 100644 --- a/plugins/woocommerce-admin/client/store/constants.js +++ b/plugins/woocommerce-admin/client/store/constants.js @@ -3,6 +3,7 @@ */ export const NAMESPACE = '/wc/v3/'; +export const SWAGGERNAMESPACE = 'https://virtserver.swaggerhub.com/peterfabian/wc-v3-api/1.0.0/'; export const ERROR = 'ERROR'; // WordPress & WooCommerce both set a hard limit of 100 for the per_page parameter diff --git a/plugins/woocommerce-admin/client/store/coupons/actions.js b/plugins/woocommerce-admin/client/store/coupons/actions.js new file mode 100644 index 00000000000..80420215b2a --- /dev/null +++ b/plugins/woocommerce-admin/client/store/coupons/actions.js @@ -0,0 +1,17 @@ +/** @format */ + +export default { + setCoupons( coupons, query ) { + return { + type: 'SET_COUPONS', + coupons, + query: query || {}, + }; + }, + setCouponsError( query ) { + return { + type: 'SET_COUPONS_ERROR', + query: query || {}, + }; + }, +}; diff --git a/plugins/woocommerce-admin/client/store/coupons/index.js b/plugins/woocommerce-admin/client/store/coupons/index.js new file mode 100644 index 00000000000..5d2b89160cc --- /dev/null +++ b/plugins/woocommerce-admin/client/store/coupons/index.js @@ -0,0 +1,15 @@ +/** @format */ +/** + * Internal dependencies + */ +import actions from './actions'; +import reducer from './reducer'; +import resolvers from './resolvers'; +import selectors from './selectors'; + +export default { + actions, + reducer, + resolvers, + selectors, +}; diff --git a/plugins/woocommerce-admin/client/store/coupons/reducer.js b/plugins/woocommerce-admin/client/store/coupons/reducer.js new file mode 100644 index 00000000000..f062b81e52b --- /dev/null +++ b/plugins/woocommerce-admin/client/store/coupons/reducer.js @@ -0,0 +1,32 @@ +/** @format */ + +/** + * External dependencies + */ +import { merge } from 'lodash'; + +/** + * Internal dependencies + */ +import { ERROR } from 'store/constants'; +import { getJsonString } from 'store/utils'; + +const DEFAULT_STATE = {}; + +export default function couponsReducer( state = DEFAULT_STATE, action ) { + const queryKey = getJsonString( action.query ); + + switch ( action.type ) { + case 'SET_COUPONS': + return merge( {}, state, { + [ queryKey ]: action.coupons, + } ); + + case 'SET_COUPONS_ERROR': + return merge( {}, state, { + [ queryKey ]: ERROR, + } ); + } + + return state; +} diff --git a/plugins/woocommerce-admin/client/store/coupons/resolvers.js b/plugins/woocommerce-admin/client/store/coupons/resolvers.js new file mode 100644 index 00000000000..48ecd0e3431 --- /dev/null +++ b/plugins/woocommerce-admin/client/store/coupons/resolvers.js @@ -0,0 +1,35 @@ +/** @format */ +/** + * External dependencies + */ +import { dispatch } from '@wordpress/data'; +// import apiFetch from '@wordpress/api-fetch'; + +/** + * WooCommerce dependencies + */ +import { stringifyQuery } from '@woocommerce/navigation'; + +/** + * Internal dependencies + */ +// import { NAMESPACE } from 'store/constants'; +import { SWAGGERNAMESPACE } from 'store/constants'; + +export default { + async getCoupons( ...args ) { + const query = args.length === 1 ? args[ 0 ] : args[ 1 ]; + + try { + // @TODO update the API endpoint once it's ready + // const coupons = await apiFetch( { path: NAMESPACE + 'reports/coupons' + stringifyQuery( query ) } ); + const response = await fetch( + SWAGGERNAMESPACE + 'reports/coupons' + stringifyQuery( query ) + ); + const coupons = await response.json(); + dispatch( 'wc-admin' ).setCoupons( coupons, query ); + } catch ( error ) { + dispatch( 'wc-admin' ).setCouponsError( query ); + } + }, +}; diff --git a/plugins/woocommerce-admin/client/store/coupons/selectors.js b/plugins/woocommerce-admin/client/store/coupons/selectors.js new file mode 100644 index 00000000000..11600c85a95 --- /dev/null +++ b/plugins/woocommerce-admin/client/store/coupons/selectors.js @@ -0,0 +1,49 @@ +/** @format */ + +/** + * External dependencies + */ +import { get } from 'lodash'; +import { select } from '@wordpress/data'; + +/** + * Internal dependencies + */ +import { getJsonString } from 'store/utils'; +import { ERROR } from 'store/constants'; + +/** + * Returns coupons for a specific query. + * + * @param {Object} state Current state + * @param {Object} query Report query parameters + * @return {Array} Report details + */ +function getCoupons( state, query = {} ) { + return get( state, [ 'coupons', getJsonString( query ) ], [] ); +} + +export default { + getCoupons, + + /** + * Returns true if a getCoupons request is pending. + * + * @param {Object} state Current state + * @return {Boolean} True if the `getCoupons` request is pending, false otherwise + */ + isGetCouponsRequesting( state, ...args ) { + return select( 'core/data' ).isResolving( 'wc-admin', 'getCoupons', args ); + }, + + /** + * Returns true if a getCoupons request has returned an error. + * + * @param {Object} state Current state + * @param {Object} query Query parameters + * @return {Boolean} True if the `getCoupons` request has failed, false otherwise + */ + isGetCouponsError( state, query ) { + return ERROR === getCoupons( state, query ); + }, +}; diff --git a/plugins/woocommerce-admin/client/store/coupons/test/reducer.js b/plugins/woocommerce-admin/client/store/coupons/test/reducer.js new file mode 100644 index 00000000000..d79e1761dbb --- /dev/null +++ b/plugins/woocommerce-admin/client/store/coupons/test/reducer.js @@ -0,0 +1,80 @@ +/** + * @format + */ + +/** + * External dependencies + */ +import deepFreeze from 'deep-freeze'; + +/** + * Internal dependencies + */ +import { ERROR } from 'store/constants'; +import couponsReducer from '../reducer'; +import { getJsonString } from 'store/utils'; + +describe( 'couponsReducer()', () => { + it( 'returns an empty data object by default', () => { + const state = couponsReducer( undefined, {} ); + expect( state ).toEqual( {} ); + } ); + + it( 'returns with received coupons data', () => { + const originalState = deepFreeze( {} ); + const query = { + orderby: 'orders_count', + }; + const coupons = [ { coupon_id: 1214 }, { coupon_id: 1215 }, { coupon_id: 1216 } ]; + + const state = couponsReducer( originalState, { + type: 'SET_COUPONS', + query, + coupons, + } ); + + const queryKey = getJsonString( query ); + expect( state[ queryKey ] ).toEqual( coupons ); + } ); + + it( 'tracks multiple queries in coupons data', () => { + const otherQuery = { + orderby: 'coupon_id', + }; + const otherQueryKey = getJsonString( otherQuery ); + const otherCoupons = [ { coupon_id: 1 }, { coupon_id: 2 }, { coupon_id: 3 } ]; + const otherQueryState = { + [ otherQueryKey ]: otherCoupons, + }; + const originalState = deepFreeze( otherQueryState ); + const query = { + orderby: 'orders_count', + }; + const coupons = [ { coupon_id: 1214 }, { coupon_id: 1215 }, { coupon_id: 1216 } ]; + + const state = couponsReducer( originalState, { + type: 'SET_COUPONS', + query, + coupons, + } ); + + const queryKey = getJsonString( query ); + expect( state[ queryKey ] ).toEqual( coupons ); + expect( state[ otherQueryKey ] ).toEqual( otherCoupons ); + } ); + + it( 'returns with received error data', () => { + const originalState = deepFreeze( {} ); + const query = { + orderby: 'orders_count', + }; + + const state = couponsReducer( originalState, { + type: 'SET_COUPONS_ERROR', + query, + } ); + + const queryKey = getJsonString( query ); + expect( state[ queryKey ] ).toEqual( ERROR ); + } ); +} ); diff --git a/plugins/woocommerce-admin/client/store/coupons/test/resolvers.js b/plugins/woocommerce-admin/client/store/coupons/test/resolvers.js new file mode 100644 index 00000000000..e5d6eead07d --- /dev/null +++ b/plugins/woocommerce-admin/client/store/coupons/test/resolvers.js @@ -0,0 +1,53 @@ +/* +* @format +*/ + +/** + * External dependencies + */ +import apiFetch from '@wordpress/api-fetch'; +import { dispatch } from '@wordpress/data'; + +/** + * Internal dependencies + */ +import resolvers from '../resolvers'; + +const { getCoupons } = resolvers; + +jest.mock( '@wordpress/data', () => ( { + dispatch: jest.fn().mockReturnValue( { + setCoupons: jest.fn(), + } ), +} ) ); +jest.mock( '@wordpress/api-fetch', () => jest.fn() ); + +// @TODO reactivate tests when we use the correct API routes instead of swaggerhub +xdescribe( 'getCoupons', () => { + const COUPONS_1 = [ { coupon_id: 1214 }, { coupon_id: 1215 }, { coupon_id: 1216 } ]; + + const COUPONS_2 = [ { coupon_id: 1 }, { coupon_id: 2 }, { coupon_id: 3 } ]; + + beforeAll( () => { + apiFetch.mockImplementation( options => { + if ( options.path === '/wc/v3/reports/coupons' ) { + return Promise.resolve( COUPONS_1 ); + } + if ( options.path === '/wc/v3/reports/coupons?orderby=coupon_id' ) { + return Promise.resolve( COUPONS_2 ); + } + } ); + } ); + + it( 'returns requested report data', async () => { + expect.assertions( 1 ); + await getCoupons(); + expect( dispatch().setCoupons ).toHaveBeenCalledWith( COUPONS_1, undefined ); + } ); + + it( 'returns requested report data for a specific query', async () => { + expect.assertions( 1 ); + await getCoupons( { orderby: 'coupon_id' } ); + expect( dispatch().setCoupons ).toHaveBeenCalledWith( COUPONS_2, { orderby: 'coupon_id' } ); + } ); +} ); diff --git a/plugins/woocommerce-admin/client/store/coupons/test/selectors.js b/plugins/woocommerce-admin/client/store/coupons/test/selectors.js new file mode 100644 index 00000000000..38f00c45659 --- /dev/null +++ b/plugins/woocommerce-admin/client/store/coupons/test/selectors.js @@ -0,0 +1,92 @@ +/* +* @format +*/ + +/** + * External dependencies + */ +import deepFreeze from 'deep-freeze'; +import { select } from '@wordpress/data'; + +/** + * Internal dependencies + */ +import { ERROR } from 'store/constants'; +import { getJsonString } from 'store/utils'; +import selectors from '../selectors'; + +const { getCoupons, isGetCouponsRequesting, isGetCouponsError } = selectors; +jest.mock( '@wordpress/data', () => ( { + ...require.requireActual( '@wordpress/data' ), + select: jest.fn().mockReturnValue( {} ), +} ) ); + +const query = { orderby: 'date' }; +const queryKey = getJsonString( query ); + +describe( 'getCoupons()', () => { + it( 'returns an empty array when no coupons are available', () => { + const state = deepFreeze( {} ); + expect( getCoupons( state, query ) ).toEqual( [] ); + } ); + + it( 'returns stored coupons for current query', () => { + const coupons = [ { coupon_id: 1214 }, { coupon_id: 1215 }, { coupon_id: 1216 } ]; + const state = deepFreeze( { + coupons: { + [ queryKey ]: coupons, + }, + } ); + expect( getCoupons( state, query ) ).toEqual( coupons ); + } ); +} ); + +describe( 'isGetCouponsRequesting()', () => { + beforeAll( () => { + select( 'core/data' ).isResolving = jest.fn().mockReturnValue( false ); + } ); + + afterAll( () => { + select( 'core/data' ).isResolving.mockRestore(); + } ); + + function setIsResolving( isResolving ) { + select( 'core/data' ).isResolving.mockImplementation( + ( reducerKey, selectorName ) => + isResolving && reducerKey === 'wc-admin' && selectorName === 'getCoupons' + ); + } + + it( 'returns false if never requested', () => { + const result = isGetCouponsRequesting( query ); + expect( result ).toBe( false ); + } ); + + it( 'returns false if request finished', () => { + setIsResolving( false ); + const result = isGetCouponsRequesting( query ); + expect( result ).toBe( false ); + } ); + + it( 'returns true if requesting', () => { + setIsResolving( true ); + const result = isGetCouponsRequesting( query ); + expect( result ).toBe( true ); + } ); +} ); + +describe( 'isGetCouponsError()', () => { + it( 'returns false by default', () => { + const state = deepFreeze( {} ); + expect( isGetCouponsError( state, query ) ).toEqual( false ); + } ); + + it( 'returns true if ERROR constant is found', () => { + const state = deepFreeze( { + coupons: { + [ queryKey ]: ERROR, + }, + } ); + expect( isGetCouponsError( state, query ) ).toEqual( true ); + } ); +} ); diff --git a/plugins/woocommerce-admin/client/store/index.js b/plugins/woocommerce-admin/client/store/index.js index 1c51fcb403c..a5b4c6b27fd 100644 --- a/plugins/woocommerce-admin/client/store/index.js +++ b/plugins/woocommerce-admin/client/store/index.js @@ -2,13 +2,13 @@ /** * External dependencies */ -import { registerStore } from '@wordpress/data'; -import { combineReducers } from 'redux'; +import { combineReducers, registerStore } from '@wordpress/data'; /** * Internal dependencies */ import { applyMiddleware, addThunks } from './middleware'; +import coupons from 'store/coupons'; import orders from 'store/orders'; import products from 'store/products'; import reports from 'store/reports'; @@ -16,6 +16,7 @@ import notes from 'store/notes'; const store = registerStore( 'wc-admin', { reducer: combineReducers( { + coupons: coupons.reducer, orders: orders.reducer, products: products.reducer, reports: reports.reducer, @@ -23,6 +24,7 @@ const store = registerStore( 'wc-admin', { } ), actions: { + ...coupons.actions, ...orders.actions, ...products.actions, ...reports.actions, @@ -30,6 +32,7 @@ const store = registerStore( 'wc-admin', { }, selectors: { + ...coupons.selectors, ...orders.selectors, ...products.selectors, ...reports.selectors, @@ -37,6 +40,7 @@ const store = registerStore( 'wc-admin', { }, resolvers: { + ...coupons.resolvers, ...orders.resolvers, ...products.resolvers, ...reports.resolvers, diff --git a/plugins/woocommerce-admin/client/store/notes/resolvers.js b/plugins/woocommerce-admin/client/store/notes/resolvers.js index 82a97f2b1b4..93b0c619408 100644 --- a/plugins/woocommerce-admin/client/store/notes/resolvers.js +++ b/plugins/woocommerce-admin/client/store/notes/resolvers.js @@ -1,19 +1,27 @@ /** @format */ - /** * External dependencies */ import { dispatch } from '@wordpress/data'; import apiFetch from '@wordpress/api-fetch'; +/** + * WooCommerce dependencies + */ +import { stringifyQuery } from '@woocommerce/navigation'; + /** * Internal dependencies */ -import { stringifyQuery } from 'lib/nav-utils'; import { NAMESPACE } from 'store/constants'; export default { - async getNotes( state, query ) { + // TODO: Use controls data plugin or fresh-data instead of async + async getNotes( ...args ) { + // This is interim code to work with either 2.x or 3.x version of @wordpress/data + // TODO: Change to just `getNotes( query )` after Gutenberg plugin uses @wordpress/data 3+ + const query = args.length === 1 ? args[ 0 ] : args[ 1 ]; + try { const notes = await apiFetch( { path: NAMESPACE + 'admin/notes' + stringifyQuery( query ) } ); dispatch( 'wc-admin' ).setNotes( notes, query ); diff --git a/plugins/woocommerce-admin/client/store/notes/test/resolvers.js b/plugins/woocommerce-admin/client/store/notes/test/resolvers.js index a653db725a5..7b4ad06ac8d 100644 --- a/plugins/woocommerce-admin/client/store/notes/test/resolvers.js +++ b/plugins/woocommerce-admin/client/store/notes/test/resolvers.js @@ -40,13 +40,13 @@ describe( 'getNotes', () => { it( 'returns requested data', async () => { expect.assertions( 1 ); - await getNotes( {} ); + await getNotes(); expect( dispatch().setNotes ).toHaveBeenCalledWith( NOTES_1, undefined ); } ); it( 'returns requested data for a specific query', async () => { expect.assertions( 1 ); - await getNotes( {}, { page: 2 } ); + await getNotes( { page: 2 } ); expect( dispatch().setNotes ).toHaveBeenCalledWith( NOTES_2, { page: 2 } ); } ); } ); diff --git a/plugins/woocommerce-admin/client/store/orders/index.js b/plugins/woocommerce-admin/client/store/orders/index.js index f72278ea5e2..5d2b89160cc 100644 --- a/plugins/woocommerce-admin/client/store/orders/index.js +++ b/plugins/woocommerce-admin/client/store/orders/index.js @@ -2,15 +2,14 @@ /** * Internal dependencies */ - -import reducer from './reducer'; import actions from './actions'; -import selectors from './selectors'; +import reducer from './reducer'; import resolvers from './resolvers'; +import selectors from './selectors'; export default { - reducer, actions, - selectors, + reducer, resolvers, + selectors, }; diff --git a/plugins/woocommerce-admin/client/store/orders/resolvers.js b/plugins/woocommerce-admin/client/store/orders/resolvers.js index 5be6c64a206..8eac9d8f493 100644 --- a/plugins/woocommerce-admin/client/store/orders/resolvers.js +++ b/plugins/woocommerce-admin/client/store/orders/resolvers.js @@ -5,14 +5,23 @@ import { dispatch } from '@wordpress/data'; import apiFetch from '@wordpress/api-fetch'; +/** + * WooCommerce dependencies + */ +import { stringifyQuery } from '@woocommerce/navigation'; + /** * Internal dependencies */ -import { stringifyQuery } from 'lib/nav-utils'; import { NAMESPACE } from 'store/constants'; export default { - async getOrders( state, query ) { + // TODO: Use controls data plugin or fresh-data instead of async + async getOrders( ...args ) { + // This is interim code to work with either 2.x or 3.x version of @wordpress/data + // TODO: Change to just `getNotes( query )` after Gutenberg plugin uses @wordpress/data 3+ + const query = args.length === 1 ? args[ 0 ] : args[ 1 ]; + try { const orders = await apiFetch( { path: NAMESPACE + 'orders' + stringifyQuery( query ) } ); dispatch( 'wc-admin' ).setOrders( orders, query ); diff --git a/plugins/woocommerce-admin/client/store/orders/selectors.js b/plugins/woocommerce-admin/client/store/orders/selectors.js index 9fc9b3542d0..25eec87f802 100644 --- a/plugins/woocommerce-admin/client/store/orders/selectors.js +++ b/plugins/woocommerce-admin/client/store/orders/selectors.js @@ -16,7 +16,7 @@ import { ERROR } from 'store/constants'; * Returns orders for a specific query. * * @param {Object} state Current state - * @param {Object} query Report query paremters + * @param {Object} query Report query parameters * @return {Array} Report details */ function getOrders( state, query = {} ) { @@ -27,7 +27,7 @@ export default { getOrders, /** - * Returns true if a query is pending. + * Returns true if a getOrders request is pending. * * @param {Object} state Current state * @return {Boolean} True if the `getOrders` request is pending, false otherwise @@ -37,7 +37,7 @@ export default { }, /** - * Returns true if a get orders request has returned an error. + * Returns true if a getOrders request has returned an error. * * @param {Object} state Current state * @param {Object} query Query parameters diff --git a/plugins/woocommerce-admin/client/store/orders/test/resolvers.js b/plugins/woocommerce-admin/client/store/orders/test/resolvers.js index c87911ebc24..77a4a7d3a78 100644 --- a/plugins/woocommerce-admin/client/store/orders/test/resolvers.js +++ b/plugins/woocommerce-admin/client/store/orders/test/resolvers.js @@ -40,13 +40,13 @@ describe( 'getOrders', () => { it( 'returns requested report data', async () => { expect.assertions( 1 ); - await getOrders( {} ); + await getOrders(); expect( dispatch().setOrders ).toHaveBeenCalledWith( ORDERS_1, undefined ); } ); it( 'returns requested report data for a specific query', async () => { expect.assertions( 1 ); - await getOrders( {}, { orderby: 'id' } ); + await getOrders( { orderby: 'id' } ); expect( dispatch().setOrders ).toHaveBeenCalledWith( ORDERS_2, { orderby: 'id' } ); } ); } ); diff --git a/plugins/woocommerce-admin/client/store/orders/test/selectors.js b/plugins/woocommerce-admin/client/store/orders/test/selectors.js index cb4649c9746..93737096e7f 100644 --- a/plugins/woocommerce-admin/client/store/orders/test/selectors.js +++ b/plugins/woocommerce-admin/client/store/orders/test/selectors.js @@ -6,13 +6,13 @@ * External dependencies */ import deepFreeze from 'deep-freeze'; +import { select } from '@wordpress/data'; /** * Internal dependencies */ import { ERROR } from 'store/constants'; import selectors from '../selectors'; -import { select } from '@wordpress/data'; import { getJsonString } from 'store/utils'; const { getOrders, isGetOrdersRequesting, isGetOrdersError } = selectors; diff --git a/plugins/woocommerce-admin/client/store/products/resolvers.js b/plugins/woocommerce-admin/client/store/products/resolvers.js index 8a7251f49cd..9f843330dfd 100644 --- a/plugins/woocommerce-admin/client/store/products/resolvers.js +++ b/plugins/woocommerce-admin/client/store/products/resolvers.js @@ -6,11 +6,21 @@ import apiFetch from '@wordpress/api-fetch'; import { dispatch } from '@wordpress/data'; import { stringify } from 'qs'; +/** + * Internal dependencies + */ +import { NAMESPACE } from 'store/constants'; + export default { - async getProducts( state, query ) { + // TODO: Use controls data plugin or fresh-data instead of async + async getProducts( ...args ) { + // This is interim code to work with either 2.x or 3.x version of @wordpress/data + // TODO: Change to just `getNotes( query )` after Gutenberg plugin uses @wordpress/data 3+ + const query = args.length === 1 ? args[ 0 ] : args[ 1 ]; + try { const params = query ? '?' + stringify( query ) : ''; - const products = await apiFetch( { path: '/wc/v3/reports/products' + params } ); + const products = await apiFetch( { path: NAMESPACE + 'reports/products' + params } ); dispatch( 'wc-admin' ).setProducts( products, query ); } catch ( error ) { dispatch( 'wc-admin' ).setProductsError( query ); diff --git a/plugins/woocommerce-admin/client/store/products/selectors.js b/plugins/woocommerce-admin/client/store/products/selectors.js index cab0d0a685e..3990874cbd9 100644 --- a/plugins/woocommerce-admin/client/store/products/selectors.js +++ b/plugins/woocommerce-admin/client/store/products/selectors.js @@ -16,7 +16,7 @@ import { getJsonString } from 'store/utils'; * Returns products report details for a specific report query. * * @param {Object} state Current state - * @param {Object} query Report query paremters + * @param {Object} query Report query parameters * @return {Object} Report details */ function getProducts( state, query = {} ) { @@ -27,21 +27,21 @@ export default { getProducts, /** - * Returns true if a products request is pending. + * Returns true if a getProducts request is pending. * * @param {Object} state Current state - * @return {Object} True if the `getProducts` request is pending, false otherwise + * @return {Boolean} True if the `getProducts` request is pending, false otherwise */ isGetProductsRequesting( state, ...args ) { return select( 'core/data' ).isResolving( 'wc-admin', 'getProducts', args ); }, /** - * Returns true if a products request has returned an error. + * Returns true if a getProducts request has returned an error. * * @param {Object} state Current state - * @param {Object} query Report query paremters - * @return {Object} True if the `getProducts` request has failed, false otherwise + * @param {Object} query Report query parameters + * @return {Boolean} True if the `getProducts` request has failed, false otherwise */ isGetProductsError( state, query ) { return ERROR === getProducts( state, query ); diff --git a/plugins/woocommerce-admin/client/store/products/test/resolvers.js b/plugins/woocommerce-admin/client/store/products/test/resolvers.js index 696ebab0338..72dea92f7a1 100644 --- a/plugins/woocommerce-admin/client/store/products/test/resolvers.js +++ b/plugins/woocommerce-admin/client/store/products/test/resolvers.js @@ -57,13 +57,13 @@ describe( 'getProducts', () => { it( 'returns requested products', async () => { expect.assertions( 1 ); - await getProducts( {} ); + await getProducts(); expect( dispatch().setProducts ).toHaveBeenCalledWith( PRODUCTS_1, undefined ); } ); it( 'returns requested products for a specific query', async () => { expect.assertions( 1 ); - await getProducts( {}, { orderby: 'date' } ); + await getProducts( { orderby: 'date' } ); expect( dispatch().setProducts ).toHaveBeenCalledWith( PRODUCTS_2, { orderby: 'date' } ); } ); } ); diff --git a/plugins/woocommerce-admin/client/store/products/test/selectors.js b/plugins/woocommerce-admin/client/store/products/test/selectors.js index d11df15467a..15918dc7cd7 100644 --- a/plugins/woocommerce-admin/client/store/products/test/selectors.js +++ b/plugins/woocommerce-admin/client/store/products/test/selectors.js @@ -6,13 +6,13 @@ * External dependencies */ import deepFreeze from 'deep-freeze'; +import { select } from '@wordpress/data'; /** * Internal dependencies */ import { ERROR } from 'store/constants'; import selectors from '../selectors'; -import { select } from '@wordpress/data'; import { getJsonString } from 'store/utils'; const { getProducts, isGetProductsRequesting, isGetProductsError } = selectors; diff --git a/plugins/woocommerce-admin/client/store/reports/index.js b/plugins/woocommerce-admin/client/store/reports/index.js index fa2274dc99e..b6858bb0638 100644 --- a/plugins/woocommerce-admin/client/store/reports/index.js +++ b/plugins/woocommerce-admin/client/store/reports/index.js @@ -3,7 +3,7 @@ /** * External dependencies */ -import { combineReducers } from 'redux'; +import { combineReducers } from '@wordpress/data'; /** * Internal dependencies diff --git a/plugins/woocommerce-admin/client/store/reports/stats/index.js b/plugins/woocommerce-admin/client/store/reports/stats/index.js index de1aa68045e..2f5bda3abaa 100644 --- a/plugins/woocommerce-admin/client/store/reports/stats/index.js +++ b/plugins/woocommerce-admin/client/store/reports/stats/index.js @@ -4,13 +4,13 @@ * Internal dependencies */ import actions from './actions'; -import selectors from './selectors'; import reducer from './reducer'; import resolvers from './resolvers'; +import selectors from './selectors'; export default { actions, - selectors, reducer, resolvers, + selectors, }; diff --git a/plugins/woocommerce-admin/client/store/reports/stats/resolvers.js b/plugins/woocommerce-admin/client/store/reports/stats/resolvers.js index d03cb2a3793..a0068211661 100644 --- a/plugins/woocommerce-admin/client/store/reports/stats/resolvers.js +++ b/plugins/woocommerce-admin/client/store/reports/stats/resolvers.js @@ -6,17 +6,42 @@ import apiFetch from '@wordpress/api-fetch'; import { dispatch } from '@wordpress/data'; +/** + * WooCommerce dependencies + */ +import { stringifyQuery } from '@woocommerce/navigation'; + /** * Internal dependencies */ -import { stringifyQuery } from 'lib/nav-utils'; -import { NAMESPACE } from 'store/constants'; +import { NAMESPACE, SWAGGERNAMESPACE } from 'store/constants'; export default { - async getReportStats( state, endpoint, query ) { + // TODO: Use controls data plugin or fresh-data instead of async + async getReportStats( ...args ) { + // This is interim code to work with either 2.x or 3.x version of @wordpress/data + // TODO: Change to just `getNotes( endpoint, query )` + // after Gutenberg plugin uses @wordpress/data 3+ + const [ endpoint, query ] = args.length === 2 ? args : args.slice( 1, 3 ); const statEndpoints = [ 'orders', 'revenue', 'products' ]; + let apiPath = endpoint + stringifyQuery( query ); + // TODO: Remove once swagger endpoints are phased out. + const swaggerEndpoints = [ 'coupons', 'taxes' ]; + if ( swaggerEndpoints.indexOf( endpoint ) >= 0 ) { + apiPath = SWAGGERNAMESPACE + 'reports/' + endpoint + '/stats' + stringifyQuery( query ); + try { + const response = await fetch( apiPath ); + + const report = await response.json(); + dispatch( 'wc-admin' ).setReportStats( endpoint, report, query ); + } catch ( error ) { + dispatch( 'wc-admin' ).setReportStatsError( endpoint, query ); + } + return; + } + if ( statEndpoints.indexOf( endpoint ) >= 0 ) { apiPath = NAMESPACE + 'reports/' + endpoint + '/stats' + stringifyQuery( query ); } diff --git a/plugins/woocommerce-admin/client/store/reports/stats/selectors.js b/plugins/woocommerce-admin/client/store/reports/stats/selectors.js index 7549aeb707a..ceafee3390f 100644 --- a/plugins/woocommerce-admin/client/store/reports/stats/selectors.js +++ b/plugins/woocommerce-admin/client/store/reports/stats/selectors.js @@ -17,7 +17,7 @@ import { getJsonString } from 'store/utils'; * * @param {Object} state Current state * @param {String} endpoint Stats endpoint - * @param {Object} query Report query paremters + * @param {Object} query Report query parameters * @return {Object} Report details */ function getReportStats( state, endpoint, query = {} ) { @@ -29,7 +29,7 @@ export default { getReportStats, /** - * Returns true if a stat query is pending. + * Returns true if a stats query is pending. * * @param {Object} state Current state * @return {Boolean} True if the `getReportRevenueStats` request is pending, false otherwise diff --git a/plugins/woocommerce-admin/client/store/reports/stats/test/selectors.js b/plugins/woocommerce-admin/client/store/reports/stats/test/selectors.js index abb2f91f359..b48d4e75c74 100644 --- a/plugins/woocommerce-admin/client/store/reports/stats/test/selectors.js +++ b/plugins/woocommerce-admin/client/store/reports/stats/test/selectors.js @@ -6,13 +6,13 @@ * External dependencies */ import deepFreeze from 'deep-freeze'; +import { select } from '@wordpress/data'; /** * Internal dependencies */ import { ERROR } from 'store/constants'; import selectors from '../selectors'; -import { select } from '@wordpress/data'; const { getReportStats, isReportStatsRequesting, isReportStatsError } = selectors; jest.mock( '@wordpress/data', () => ( { diff --git a/plugins/woocommerce-admin/client/store/reports/utils.js b/plugins/woocommerce-admin/client/store/reports/utils.js index 10803df511d..8d1a572cfea 100644 --- a/plugins/woocommerce-admin/client/store/reports/utils.js +++ b/plugins/woocommerce-admin/client/store/reports/utils.js @@ -9,21 +9,22 @@ import { find, forEach, isNull } from 'lodash'; * WooCommerce dependencies */ import { appendTimestamp, getCurrentDates, getIntervalForQuery } from '@woocommerce/date'; +import { flattenFilters, getActiveFiltersFromQuery, getUrlKey } from '@woocommerce/navigation'; /** * Internal dependencies */ import { MAX_PER_PAGE } from 'store/constants'; -import { getActiveFiltersFromQuery, getUrlKey } from 'components/filters/advanced/utils'; -import { flatenFilters } from 'components/filters/filter/utils'; import * as couponsConfig from 'analytics/report/coupons/config'; import * as ordersConfig from 'analytics/report/orders/config'; import * as productsConfig from 'analytics/report/products/config'; +import * as taxesConfig from 'analytics/report/taxes/config'; const reportConfigs = { coupons: couponsConfig, orders: ordersConfig, products: productsConfig, + taxes: taxesConfig, }; export function getFilterQuery( endpoint, query ) { @@ -60,7 +61,7 @@ export function getQueryFromConfig( config, advancedFilters, query ) { ); } - const filter = find( flatenFilters( config.filters ), { value: queryValue } ); + const filter = find( flattenFilters( config.filters ), { value: queryValue } ); if ( ! filter ) { return {}; diff --git a/plugins/woocommerce-admin/client/stylesheets/abstracts/_breakpoints.scss b/plugins/woocommerce-admin/client/stylesheets/abstracts/_breakpoints.scss index 145f8768eab..763010dbd9c 100644 --- a/plugins/woocommerce-admin/client/stylesheets/abstracts/_breakpoints.scss +++ b/plugins/woocommerce-admin/client/stylesheets/abstracts/_breakpoints.scss @@ -1,11 +1,13 @@ /** @format */ +/* stylelint-disable block-closing-brace-newline-after */ + // Breakpoints // Forked from https://github.com/Automattic/wp-calypso/blob/46ae24d8800fb85da6acf057a640e60dac988a38/assets/stylesheets/shared/mixins/_breakpoints.scss // Think very carefully before adding a new breakpoint. // The list below is based on wp-admin's main breakpoints -$breakpoints: 320px, 400px, 600px, 782px, 960px, 1100px, 1365px; +$breakpoints: 320px, 400px, 600px, 782px, 960px, 1280px, 1440px; @mixin breakpoint( $sizes... ) { @each $size in $sizes { @@ -44,14 +46,16 @@ $breakpoints: 320px, 400px, 600px, 782px, 960px, 1100px, 1365px; @each $breakpoint in $breakpoints { $sizes: $sizes + ' ' + $breakpoint; } - @warn "ERROR in breakpoint( #{ $size } ) : You can only use these sizes[ #{$sizes} ] using the following syntax [ <#{ nth( $breakpoints, 1 ) } >#{ nth( $breakpoints, 1 ) } #{ nth( $breakpoints, 1 ) }-#{ nth( $breakpoints, 2 ) } ]"; + @warn 'ERROR in breakpoint( #{ $size } ) : You can only use these sizes[ #{$sizes} ] using the following syntax [ <#{ nth( $breakpoints, 1 ) } >#{ nth( $breakpoints, 1 ) } #{ nth( $breakpoints, 1 ) }-#{ nth( $breakpoints, 2 ) } ]'; } } @else { $sizes: ''; @each $breakpoint in $breakpoints { $sizes: $sizes + ' ' + $breakpoint; } - @error "ERROR in breakpoint( #{ $size } ) : Please wrap the breakpoint $size in parenthesis. You can use these sizes[ #{$sizes} ] using the following syntax [ <#{ nth( $breakpoints, 1 ) } >#{ nth( $breakpoints, 1 ) } #{ nth( $breakpoints, 1 ) }-#{ nth( $breakpoints, 2 ) } ]"; + @error 'ERROR in breakpoint( #{ $size } ) : Please wrap the breakpoint $size in parenthesis. You can use these sizes[ #{$sizes} ] using the following syntax [ <#{ nth( $breakpoints, 1 ) } >#{ nth( $breakpoints, 1 ) } #{ nth( $breakpoints, 1 ) }-#{ nth( $breakpoints, 2 ) } ]'; } } } + +/* stylelint-enable */ diff --git a/plugins/woocommerce-admin/client/stylesheets/abstracts/_variables.scss b/plugins/woocommerce-admin/client/stylesheets/abstracts/_variables.scss index 1dc88782b44..e0cce4b67ff 100644 --- a/plugins/woocommerce-admin/client/stylesheets/abstracts/_variables.scss +++ b/plugins/woocommerce-admin/client/stylesheets/abstracts/_variables.scss @@ -23,8 +23,3 @@ $light-gray-500: $core-grey-light-500; $dark-gray-300: $core-grey-dark-300; $dark-gray-900: $core-grey-dark-900; $alert-red: $error-red; - -:export { - gaplarge: $gap-large; - gap: $gap; -} diff --git a/plugins/woocommerce-admin/client/stylesheets/shared/_embed.scss b/plugins/woocommerce-admin/client/stylesheets/shared/_embed.scss index 61a0fb83f7e..1facd9b3c4e 100644 --- a/plugins/woocommerce-admin/client/stylesheets/shared/_embed.scss +++ b/plugins/woocommerce-admin/client/stylesheets/shared/_embed.scss @@ -48,7 +48,7 @@ margin: 0; padding-top: 80px; - @include breakpoint( '782px-1100px' ) { + @include breakpoint( '782px-960px' ) { padding-top: 60px; } } diff --git a/plugins/woocommerce-admin/client/stylesheets/shared/_global.scss b/plugins/woocommerce-admin/client/stylesheets/shared/_global.scss index 4c77c243bda..754121d1873 100644 --- a/plugins/woocommerce-admin/client/stylesheets/shared/_global.scss +++ b/plugins/woocommerce-admin/client/stylesheets/shared/_global.scss @@ -5,7 +5,7 @@ --large-gap: 40px; --main-gap: 24px; } -@media (max-width: 1100px) { +@media (max-width: 960px) { :root { --large-gap: 24px; } diff --git a/plugins/woocommerce-admin/composer.json b/plugins/woocommerce-admin/composer.json index eee2d70365a..520ead00c47 100644 --- a/plugins/woocommerce-admin/composer.json +++ b/plugins/woocommerce-admin/composer.json @@ -11,8 +11,8 @@ }, "require-dev": { "squizlabs/php_codesniffer": "*", - "wp-coding-standards/wpcs": "1.1.0", - "phpunit/phpunit": "7.4.3", + "wp-coding-standards/wpcs": "1.2.0", + "phpunit/phpunit": "6.5.13", "woocommerce/woocommerce-sniffs": "*", "wimg/php-compatibility": "9.0.0", "dealerdirect/phpcodesniffer-composer-installer": "0.5.0" diff --git a/plugins/woocommerce-admin/composer.lock b/plugins/woocommerce-admin/composer.lock index 5276ef27075..9606855898e 100644 --- a/plugins/woocommerce-admin/composer.lock +++ b/plugins/woocommerce-admin/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "97ef081df4492fe71d877ad105e1709b", + "content-hash": "8c25f2e044c24bd6ee6900e7bcbe3c0c", "packages": [ { "name": "composer/installers", @@ -298,22 +298,22 @@ }, { "name": "phar-io/manifest", - "version": "1.0.3", + "version": "1.0.1", "source": { "type": "git", "url": "https://github.com/phar-io/manifest.git", - "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4" + "reference": "2df402786ab5368a0169091f61a7c1e0eb6852d0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phar-io/manifest/zipball/7761fcacf03b4d4f16e7ccb606d4879ca431fcf4", - "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/2df402786ab5368a0169091f61a7c1e0eb6852d0", + "reference": "2df402786ab5368a0169091f61a7c1e0eb6852d0", "shasum": "" }, "require": { "ext-dom": "*", "ext-phar": "*", - "phar-io/version": "^2.0", + "phar-io/version": "^1.0.1", "php": "^5.6 || ^7.0" }, "type": "library", @@ -349,20 +349,20 @@ } ], "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", - "time": "2018-07-08T19:23:20+00:00" + "time": "2017-03-05T18:14:27+00:00" }, { "name": "phar-io/version", - "version": "2.0.1", + "version": "1.0.1", "source": { "type": "git", "url": "https://github.com/phar-io/version.git", - "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6" + "reference": "a70c0ced4be299a63d32fa96d9281d03e94041df" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phar-io/version/zipball/45a2ec53a73c70ce41d55cedef9063630abaf1b6", - "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6", + "url": "https://api.github.com/repos/phar-io/version/zipball/a70c0ced4be299a63d32fa96d9281d03e94041df", + "reference": "a70c0ced4be299a63d32fa96d9281d03e94041df", "shasum": "" }, "require": { @@ -396,7 +396,7 @@ } ], "description": "Library for handling version information and constraints", - "time": "2018-07-08T19:19:57+00:00" + "time": "2017-03-05T17:38:23+00:00" }, { "name": "phpdocumentor/reflection-common", @@ -615,40 +615,40 @@ }, { "name": "phpunit/php-code-coverage", - "version": "6.1.3", + "version": "5.3.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "4d3ae9b21a7d7e440bd0cf65565533117976859f" + "reference": "c89677919c5dd6d3b3852f230a663118762218ac" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/4d3ae9b21a7d7e440bd0cf65565533117976859f", - "reference": "4d3ae9b21a7d7e440bd0cf65565533117976859f", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/c89677919c5dd6d3b3852f230a663118762218ac", + "reference": "c89677919c5dd6d3b3852f230a663118762218ac", "shasum": "" }, "require": { "ext-dom": "*", "ext-xmlwriter": "*", - "php": "^7.1", - "phpunit/php-file-iterator": "^2.0", + "php": "^7.0", + "phpunit/php-file-iterator": "^1.4.2", "phpunit/php-text-template": "^1.2.1", - "phpunit/php-token-stream": "^3.0", + "phpunit/php-token-stream": "^2.0.1", "sebastian/code-unit-reverse-lookup": "^1.0.1", - "sebastian/environment": "^3.1 || ^4.0", + "sebastian/environment": "^3.0", "sebastian/version": "^2.0.1", "theseer/tokenizer": "^1.1" }, "require-dev": { - "phpunit/phpunit": "^7.0" + "phpunit/phpunit": "^6.0" }, "suggest": { - "ext-xdebug": "^2.6.0" + "ext-xdebug": "^2.5.5" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "6.1-dev" + "dev-master": "5.3.x-dev" } }, "autoload": { @@ -674,32 +674,29 @@ "testing", "xunit" ], - "time": "2018-10-23T05:59:32+00:00" + "time": "2018-04-06T15:36:58+00:00" }, { "name": "phpunit/php-file-iterator", - "version": "2.0.2", + "version": "1.4.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "050bedf145a257b1ff02746c31894800e5122946" + "reference": "730b01bc3e867237eaac355e06a36b85dd93a8b4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/050bedf145a257b1ff02746c31894800e5122946", - "reference": "050bedf145a257b1ff02746c31894800e5122946", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/730b01bc3e867237eaac355e06a36b85dd93a8b4", + "reference": "730b01bc3e867237eaac355e06a36b85dd93a8b4", "shasum": "" }, "require": { - "php": "^7.1" - }, - "require-dev": { - "phpunit/phpunit": "^7.1" + "php": ">=5.3.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0.x-dev" + "dev-master": "1.4.x-dev" } }, "autoload": { @@ -714,7 +711,7 @@ "authors": [ { "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", + "email": "sb@sebastian-bergmann.de", "role": "lead" } ], @@ -724,7 +721,7 @@ "filesystem", "iterator" ], - "time": "2018-09-13T20:33:42+00:00" + "time": "2017-11-27T13:52:08+00:00" }, { "name": "phpunit/php-text-template", @@ -769,28 +766,28 @@ }, { "name": "phpunit/php-timer", - "version": "2.0.0", + "version": "1.0.9", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "8b8454ea6958c3dee38453d3bd571e023108c91f" + "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/8b8454ea6958c3dee38453d3bd571e023108c91f", - "reference": "8b8454ea6958c3dee38453d3bd571e023108c91f", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3dcf38ca72b158baf0bc245e9184d3fdffa9c46f", + "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f", "shasum": "" }, "require": { - "php": "^7.1" + "php": "^5.3.3 || ^7.0" }, "require-dev": { - "phpunit/phpunit": "^7.0" + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0-dev" + "dev-master": "1.0-dev" } }, "autoload": { @@ -805,7 +802,7 @@ "authors": [ { "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", + "email": "sb@sebastian-bergmann.de", "role": "lead" } ], @@ -814,33 +811,33 @@ "keywords": [ "timer" ], - "time": "2018-02-01T13:07:23+00:00" + "time": "2017-02-26T11:10:40+00:00" }, { "name": "phpunit/php-token-stream", - "version": "3.0.0", + "version": "2.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-token-stream.git", - "reference": "21ad88bbba7c3d93530d93994e0a33cd45f02ace" + "reference": "791198a2c6254db10131eecfe8c06670700904db" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/21ad88bbba7c3d93530d93994e0a33cd45f02ace", - "reference": "21ad88bbba7c3d93530d93994e0a33cd45f02ace", + "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/791198a2c6254db10131eecfe8c06670700904db", + "reference": "791198a2c6254db10131eecfe8c06670700904db", "shasum": "" }, "require": { "ext-tokenizer": "*", - "php": "^7.1" + "php": "^7.0" }, "require-dev": { - "phpunit/phpunit": "^7.0" + "phpunit/phpunit": "^6.2.4" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "2.0-dev" } }, "autoload": { @@ -863,57 +860,57 @@ "keywords": [ "tokenizer" ], - "time": "2018-02-01T13:16:43+00:00" + "time": "2017-11-27T05:48:46+00:00" }, { "name": "phpunit/phpunit", - "version": "7.4.3", + "version": "6.5.13", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "c151651fb6ed264038d486ea262e243af72e5e64" + "reference": "0973426fb012359b2f18d3bd1e90ef1172839693" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/c151651fb6ed264038d486ea262e243af72e5e64", - "reference": "c151651fb6ed264038d486ea262e243af72e5e64", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/0973426fb012359b2f18d3bd1e90ef1172839693", + "reference": "0973426fb012359b2f18d3bd1e90ef1172839693", "shasum": "" }, "require": { - "doctrine/instantiator": "^1.1", "ext-dom": "*", "ext-json": "*", "ext-libxml": "*", "ext-mbstring": "*", "ext-xml": "*", - "myclabs/deep-copy": "^1.7", - "phar-io/manifest": "^1.0.2", - "phar-io/version": "^2.0", - "php": "^7.1", + "myclabs/deep-copy": "^1.6.1", + "phar-io/manifest": "^1.0.1", + "phar-io/version": "^1.0", + "php": "^7.0", "phpspec/prophecy": "^1.7", - "phpunit/php-code-coverage": "^6.0.7", - "phpunit/php-file-iterator": "^2.0.1", + "phpunit/php-code-coverage": "^5.3", + "phpunit/php-file-iterator": "^1.4.3", "phpunit/php-text-template": "^1.2.1", - "phpunit/php-timer": "^2.0", - "sebastian/comparator": "^3.0", - "sebastian/diff": "^3.0", - "sebastian/environment": "^3.1 || ^4.0", + "phpunit/php-timer": "^1.0.9", + "phpunit/phpunit-mock-objects": "^5.0.9", + "sebastian/comparator": "^2.1", + "sebastian/diff": "^2.0", + "sebastian/environment": "^3.1", "sebastian/exporter": "^3.1", "sebastian/global-state": "^2.0", "sebastian/object-enumerator": "^3.0.3", - "sebastian/resource-operations": "^2.0", + "sebastian/resource-operations": "^1.0", "sebastian/version": "^2.0.1" }, "conflict": { - "phpunit/phpunit-mock-objects": "*" + "phpdocumentor/reflection-docblock": "3.0.2", + "phpunit/dbunit": "<3.0" }, "require-dev": { "ext-pdo": "*" }, "suggest": { - "ext-soap": "*", "ext-xdebug": "*", - "phpunit/php-invoker": "^2.0" + "phpunit/php-invoker": "^1.1" }, "bin": [ "phpunit" @@ -921,7 +918,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "7.4-dev" + "dev-master": "6.5.x-dev" } }, "autoload": { @@ -947,7 +944,66 @@ "testing", "xunit" ], - "time": "2018-10-23T05:57:41+00:00" + "time": "2018-09-08T15:10:43+00:00" + }, + { + "name": "phpunit/phpunit-mock-objects", + "version": "5.0.10", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", + "reference": "cd1cf05c553ecfec36b170070573e540b67d3f1f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/cd1cf05c553ecfec36b170070573e540b67d3f1f", + "reference": "cd1cf05c553ecfec36b170070573e540b67d3f1f", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.0.5", + "php": "^7.0", + "phpunit/php-text-template": "^1.2.1", + "sebastian/exporter": "^3.1" + }, + "conflict": { + "phpunit/phpunit": "<6.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.5.11" + }, + "suggest": { + "ext-soap": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Mock Object library for PHPUnit", + "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/", + "keywords": [ + "mock", + "xunit" + ], + "time": "2018-08-09T05:50:03+00:00" }, { "name": "sebastian/code-unit-reverse-lookup", @@ -996,30 +1052,30 @@ }, { "name": "sebastian/comparator", - "version": "3.0.2", + "version": "2.1.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da" + "reference": "34369daee48eafb2651bea869b4b15d75ccc35f9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/5de4fc177adf9bce8df98d8d141a7559d7ccf6da", - "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/34369daee48eafb2651bea869b4b15d75ccc35f9", + "reference": "34369daee48eafb2651bea869b4b15d75ccc35f9", "shasum": "" }, "require": { - "php": "^7.1", - "sebastian/diff": "^3.0", + "php": "^7.0", + "sebastian/diff": "^2.0 || ^3.0", "sebastian/exporter": "^3.1" }, "require-dev": { - "phpunit/phpunit": "^7.1" + "phpunit/phpunit": "^6.4" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "2.1.x-dev" } }, "autoload": { @@ -1056,33 +1112,32 @@ "compare", "equality" ], - "time": "2018-07-12T15:12:46+00:00" + "time": "2018-02-01T13:46:46+00:00" }, { "name": "sebastian/diff", - "version": "3.0.1", + "version": "2.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "366541b989927187c4ca70490a35615d3fef2dce" + "reference": "347c1d8b49c5c3ee30c7040ea6fc446790e6bddd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/366541b989927187c4ca70490a35615d3fef2dce", - "reference": "366541b989927187c4ca70490a35615d3fef2dce", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/347c1d8b49c5c3ee30c7040ea6fc446790e6bddd", + "reference": "347c1d8b49c5c3ee30c7040ea6fc446790e6bddd", "shasum": "" }, "require": { - "php": "^7.1" + "php": "^7.0" }, "require-dev": { - "phpunit/phpunit": "^7.0", - "symfony/process": "^2 || ^3.3 || ^4" + "phpunit/phpunit": "^6.2" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "2.0-dev" } }, "autoload": { @@ -1107,12 +1162,9 @@ "description": "Diff implementation", "homepage": "https://github.com/sebastianbergmann/diff", "keywords": [ - "diff", - "udiff", - "unidiff", - "unified diff" + "diff" ], - "time": "2018-06-10T07:54:39+00:00" + "time": "2017-08-03T08:09:46+00:00" }, { "name": "sebastian/environment", @@ -1429,25 +1481,25 @@ }, { "name": "sebastian/resource-operations", - "version": "2.0.1", + "version": "1.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/resource-operations.git", - "reference": "4d7a795d35b889bf80a0cc04e08d77cedfa917a9" + "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/4d7a795d35b889bf80a0cc04e08d77cedfa917a9", - "reference": "4d7a795d35b889bf80a0cc04e08d77cedfa917a9", + "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/ce990bb21759f94aeafd30209e8cfcdfa8bc3f52", + "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52", "shasum": "" }, "require": { - "php": "^7.1" + "php": ">=5.6.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0-dev" + "dev-master": "1.0.x-dev" } }, "autoload": { @@ -1467,7 +1519,7 @@ ], "description": "Provides a list of PHP built-in functions that operate on resources", "homepage": "https://www.github.com/sebastianbergmann/resource-operations", - "time": "2018-10-04T04:07:39+00:00" + "time": "2015-07-28T20:34:47+00:00" }, { "name": "sebastian/version", @@ -1713,24 +1765,23 @@ }, { "name": "woocommerce/woocommerce-sniffs", - "version": "0.0.2", + "version": "0.0.3", "source": { "type": "git", "url": "https://github.com/woocommerce/woocommerce-sniffs.git", - "reference": "2890fd5d98b318f62acb42f2b5cd6d02627cfd82" + "reference": "c7e6e641e47b397ee64eb52a762c265cf476495a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/woocommerce/woocommerce-sniffs/zipball/2890fd5d98b318f62acb42f2b5cd6d02627cfd82", - "reference": "2890fd5d98b318f62acb42f2b5cd6d02627cfd82", + "url": "https://api.github.com/repos/woocommerce/woocommerce-sniffs/zipball/c7e6e641e47b397ee64eb52a762c265cf476495a", + "reference": "c7e6e641e47b397ee64eb52a762c265cf476495a", "shasum": "" }, "require": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.5.0", "php": ">=7.0", - "squizlabs/php_codesniffer": "^3.0.2" - }, - "suggest": { - "dealerdirect/phpcodesniffer-composer-installer": "^0.4.3" + "wimg/php-compatibility": "^9.0", + "wp-coding-standards/wpcs": "^1.1" }, "type": "phpcodesniffer-standard", "notification-url": "https://packagist.org/downloads/", @@ -1750,20 +1801,20 @@ "woocommerce", "wordpress" ], - "time": "2018-03-22T18:39:19+00:00" + "time": "2018-11-06T22:51:50+00:00" }, { "name": "wp-coding-standards/wpcs", - "version": "1.1.0", + "version": "1.2.0", "source": { "type": "git", "url": "https://github.com/WordPress-Coding-Standards/WordPress-Coding-Standards.git", - "reference": "46d42828ce7355d8b3776e3171f2bda892d179b4" + "reference": "7aa217ab38156c5cb4eae0f04ae376027c407a9b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/WordPress-Coding-Standards/WordPress-Coding-Standards/zipball/46d42828ce7355d8b3776e3171f2bda892d179b4", - "reference": "46d42828ce7355d8b3776e3171f2bda892d179b4", + "url": "https://api.github.com/repos/WordPress-Coding-Standards/WordPress-Coding-Standards/zipball/7aa217ab38156c5cb4eae0f04ae376027c407a9b", + "reference": "7aa217ab38156c5cb4eae0f04ae376027c407a9b", "shasum": "" }, "require": { @@ -1771,7 +1822,7 @@ "squizlabs/php_codesniffer": "^2.9.0 || ^3.0.2" }, "require-dev": { - "phpcompatibility/php-compatibility": "*" + "phpcompatibility/php-compatibility": "^9.0" }, "suggest": { "dealerdirect/phpcodesniffer-composer-installer": "^0.4.3 || This Composer plugin will sort out the PHPCS 'installed_paths' automatically." @@ -1793,7 +1844,7 @@ "standards", "wordpress" ], - "time": "2018-09-10T17:04:05+00:00" + "time": "2018-11-12T10:13:12+00:00" } ], "aliases": [], diff --git a/plugins/woocommerce-admin/docs/_sidebar.md b/plugins/woocommerce-admin/docs/_sidebar.md index 1810cc6a01e..0b9b51a228e 100644 --- a/plugins/woocommerce-admin/docs/_sidebar.md +++ b/plugins/woocommerce-admin/docs/_sidebar.md @@ -3,3 +3,4 @@ * [Data](data) * [Layout](layout) * [CSS Structure](stylesheets) +* [Examples](examples/) diff --git a/plugins/woocommerce-admin/docs/components/_sidebar.md b/plugins/woocommerce-admin/docs/components/_sidebar.md index 54a9beaf23b..e37928e624c 100644 --- a/plugins/woocommerce-admin/docs/components/_sidebar.md +++ b/plugins/woocommerce-admin/docs/components/_sidebar.md @@ -20,9 +20,11 @@ * [ProductImage](components/product-image.md) * [Rating](components/rating.md) * [Search](components/search.md) + * [SectionHeader](components/section-header.md) * [Section](components/section.md) * [SegmentedSelection](components/segmented-selection.md) * [SplitButton](components/split-button.md) * [Summary](components/summary.md) * [Table](components/table.md) * [Tag](components/tag.md) + * [ViewMoreList](components/view-more-list.md) diff --git a/plugins/woocommerce-admin/docs/components/card.md b/plugins/woocommerce-admin/docs/components/card.md index 4544a033467..c6ca8b79ad9 100644 --- a/plugins/woocommerce-admin/docs/components/card.md +++ b/plugins/woocommerce-admin/docs/components/card.md @@ -29,7 +29,6 @@ An `EllipsisMenu`, with filters used to control the content visible in this card ### `title` -- **Required** - Type: One of type: string, node - Default: null diff --git a/plugins/woocommerce-admin/docs/components/chart.md b/plugins/woocommerce-admin/docs/components/chart.md index 7cbb34571ea..83814d5dc54 100644 --- a/plugins/woocommerce-admin/docs/components/chart.md +++ b/plugins/woocommerce-admin/docs/components/chart.md @@ -20,6 +20,13 @@ An array of data. Format to parse dates into d3 time format +### `path` + +- Type: String +- Default: null + +Current path + ### `pointLabelFormat` - Type: String @@ -27,6 +34,13 @@ Format to parse dates into d3 time format Date format of the point labels (might be used in tooltips and ARIA properties). +### `query` + +- Type: Object +- Default: null + +The query string represented in object form + ### `tooltipFormat` - Type: String @@ -114,6 +128,13 @@ Interval specification (hourly, daily, weekly etc). Allowed intervals to show in a dropdown. +### `valueType` + +- Type: String +- Default: null + +What type of data is to be displayed? Number, Average, String? + `D3Chart` (component) ===================== @@ -218,6 +239,13 @@ The list of labels for this chart. A datetime formatting string to format the date displayed as the title of the toolip if `tooltipTitle` is missing, passed to d3TimeFormat. +### `tooltipPosition` + +- Type: String +- Default: `'over'` + +The position where to render the tooltip can be `over` the chart or `below` the chart. + ### `tooltipTitle` - Type: String @@ -311,6 +339,21 @@ Handles `onMouseEnter`/`onMouseLeave` events. Display legend items as a `row` or `column` inside a flex-box. +### `itemsLabel` + +- Type: String +- Default: null + +Label to describe the legend items. It will be displayed in the legend of +comparison charts when there are many. + +### `valueType` + +- Type: String +- Default: null + +What type of data is to be displayed? Number, Average, String? + `ChartPlaceholder` (component) ============================== diff --git a/plugins/woocommerce-admin/docs/components/dropdown-button.md b/plugins/woocommerce-admin/docs/components/dropdown-button.md index ae1432e5277..7a060cc4770 100644 --- a/plugins/woocommerce-admin/docs/components/dropdown-button.md +++ b/plugins/woocommerce-admin/docs/components/dropdown-button.md @@ -12,6 +12,7 @@ Props ### `labels` +- **Required** - Type: Array - Default: null diff --git a/plugins/woocommerce-admin/docs/components/filters.md b/plugins/woocommerce-admin/docs/components/filters.md index 7071bf827f6..f1afd75a3ed 100644 --- a/plugins/woocommerce-admin/docs/components/filters.md +++ b/plugins/woocommerce-admin/docs/components/filters.md @@ -9,7 +9,7 @@ or a comparison card if "advanced" or "compare" are picked from `FilterPicker`. Props ----- -### `advancedConfig` +### `advancedFilters` - Type: Object - Default: `{}` @@ -50,11 +50,14 @@ Props - **Required** - Type: Object + - title: String + - filters: Object - labels: Object - add: String - - placeholder: String - remove: String + - rule: String - title: String + - filter: String - rules: Array Object - input: Object @@ -62,21 +65,13 @@ Object The configuration object required to render filters. -### `filterTitle` - -- **Required** -- Type: String -- Default: null - -Name of this filter, used in translations. - ### `path` - **Required** - Type: String - Default: null -The `path` parameter supplied by React-Router. +Name of this filter, used in translations. ### `query` @@ -174,10 +169,15 @@ This component manipulates the `filter` query parameter. Props ----- -### `filters` +### `config` - **Required** -- Type: Array +- Type: Object + - label: String - A label above the filter selector. + - staticParams: Array - Url parameters to persist when selecting a new filter. + - param: String - The url paramter this filter will modify. + - showFilters: Function - Determine if the filter should be shown. Supply a function with the query object as an argument returning a boolean. + - filters: Array - component: String - A custom component used instead of a button, might have special handling for filtering. TBD, not yet implemented. - label: String - The label for this filter. Optional only for custom component filters. - path: String - An array representing the "path" to this filter, if nested. diff --git a/plugins/woocommerce-admin/docs/components/product-image.md b/plugins/woocommerce-admin/docs/components/product-image.md index 90adcf3b11c..95110491732 100644 --- a/plugins/woocommerce-admin/docs/components/product-image.md +++ b/plugins/woocommerce-admin/docs/components/product-image.md @@ -1,7 +1,8 @@ `ProductImage` (component) ========================== -Use `ProductImage` to display a product's featured image. If no image can be found, a placeholder matching the front-end image +Use `ProductImage` to display a product's or variation's featured image. +If no image can be found, a placeholder matching the front-end image placeholder will be displayed. @@ -35,8 +36,10 @@ Additional CSS classes. - Type: Object - Default: null -Product object. The image to display will be pulled from `product.images`. +Product or variation object. The image to display will be pulled from +`product.images` or `variation.image`. See https://woocommerce.github.io/woocommerce-rest-api-docs/#product-properties +and https://woocommerce.github.io/woocommerce-rest-api-docs/#product-variation-properties ### `alt` diff --git a/plugins/woocommerce-admin/docs/components/search.md b/plugins/woocommerce-admin/docs/components/search.md index e9c20a195d5..77d2a402b61 100644 --- a/plugins/woocommerce-admin/docs/components/search.md +++ b/plugins/woocommerce-admin/docs/components/search.md @@ -7,6 +7,13 @@ A search box which autocompletes results while typing, allowing for the user to Props ----- +### `className` + +- Type: String +- Default: null + +Class name applied to parent div. + ### `onChange` - Type: Function @@ -17,7 +24,7 @@ Function called when selected results change, passed result list. ### `type` - **Required** -- Type: One of: 'products', 'product_cats', 'orders', 'customers', 'coupons' +- Type: One of: 'products', 'product_cats', 'orders', 'customers', 'coupons', 'variations' - Default: null The object type to be used in searching. diff --git a/plugins/woocommerce-admin/docs/components/section-header.md b/plugins/woocommerce-admin/docs/components/section-header.md new file mode 100644 index 00000000000..db04c9d5630 --- /dev/null +++ b/plugins/woocommerce-admin/docs/components/section-header.md @@ -0,0 +1,30 @@ +`SectionHeader` (component) +=========================== + +A header component. The header can contain a title, actions via children, and an `EllipsisMenu` menu. + +Props +----- + +### `className` + +- Type: String +- Default: null + +Additional CSS classes. + +### `menu` + +- Type: (custom validator) +- Default: null + +An `EllipsisMenu`, with filters used to control the content visible in this card + +### `title` + +- **Required** +- Type: One of type: string, node +- Default: null + +The title to use for this card. + diff --git a/plugins/woocommerce-admin/docs/components/table.md b/plugins/woocommerce-admin/docs/components/table.md index 6aad970d102..0548e2da201 100644 --- a/plugins/woocommerce-admin/docs/components/table.md +++ b/plugins/woocommerce-admin/docs/components/table.md @@ -21,6 +21,7 @@ The string to use as a query parameter when comparing row items. ### `headers` - Type: Array + - hiddenByDefault: Boolean - defaultSort: Boolean - isSortable: Boolean - key: String @@ -49,6 +50,14 @@ Number A list of IDs, matching to the row list so that ids[ 0 ] contains the object ID for the object displayed in row[ 0 ]. +### `isLoading` + +- Type: Boolean +- Default: `false` + +Defines if the table contents are loading. +It will display `TablePlaceholder` component instead of `Table` if that's the case. + ### `onQueryChange` - Type: Function @@ -56,12 +65,19 @@ A list of IDs, matching to the row list so that ids[ 0 ] contains the object ID A function which returns a callback function to update the query string for a given `param`. +### `downloadable` + +- Type: Boolean +- Default: `false` + +Whether the table must be downloadable. If true, the download button will appear. + ### `onClickDownload` - Type: Function - Default: null -A callback function which handles then "download" button press. Optional, if not used, the button won't appear. +A callback function called when the "download" button is pressed. Optional, if used, the download button will appear. ### `query` @@ -121,6 +137,32 @@ The title used in the card header, also used as the caption for the content in t The total number of rows (across all pages). +### `compareParam` + +- Type: String +- Default: `'filter'` + +Url query parameter compare function operates on + +`EmptyTable` (component) +======================== + +`EmptyTable` displays a blank space with an optional message passed as a children node +with the purpose of replacing a table with no rows. +It mimics the same height a table would have according to the `numberOfRows` prop. + + + +Props +----- + +### `numberOfRows` + +- Type: Number +- Default: `5` + +An integer with the number of rows the box should occupy. + `TablePlaceholder` (component) ============================== @@ -147,10 +189,11 @@ A label for the content in this table. ### `headers` - Type: Array + - hiddenByDefault: Boolean - defaultSort: Boolean - isSortable: Boolean - key: String - - label: String + - label: ReactNode - required: Boolean - Default: null @@ -246,6 +289,7 @@ Additional CSS classes. - Type: Array - defaultSort: Boolean - Boolean, true if this column is the default for sorting. Only one column should have this set. + - isLeftAligned: Boolean - Boolean, true if this column should be aligned to the left. - isNumeric: Boolean - Boolean, true if this column is a number value. - isSortable: Boolean - Boolean, true if this column is sortable. - key: String - The API parameter name for this column, passed to `orderby` when sorting via API. diff --git a/plugins/woocommerce-admin/docs/components/tag.md b/plugins/woocommerce-admin/docs/components/tag.md index 7ee673bb8b8..f11fd5a67ab 100644 --- a/plugins/woocommerce-admin/docs/components/tag.md +++ b/plugins/woocommerce-admin/docs/components/tag.md @@ -1,8 +1,8 @@ `Tag` (component) ================= -This component can be used to show an item styled as a "tag", optionally with an `X` + "remove". -Generally this is used in a collection of selected items, see the Search component. +This component can be used to show an item styled as a "tag", optionally with an `X` + "remove" +or with a popover that is shown on click. @@ -11,7 +11,6 @@ Props ### `id` -- **Required** - Type: Number - Default: null @@ -25,6 +24,13 @@ The ID for this item, used in the remove function. The name for this item, displayed as the tag's text. +### `popoverContents` + +- Type: ReactNode +- Default: null + +Contents to display on click in a popover + ### `remove` - Type: Function @@ -32,13 +38,6 @@ The name for this item, displayed as the tag's text. A function called when the remove X is clicked. If not used, no X icon will display. -### `removeLabel` - -- Type: String -- Default: `__( 'Remove tag', 'wc-admin' )` - -The label for removing this item (shown when hovering on X, or read to screen reader users). Defaults to "Remove tag". - ### `screenReaderLabel` - Type: String diff --git a/plugins/woocommerce-admin/docs/examples/README.md b/plugins/woocommerce-admin/docs/examples/README.md new file mode 100644 index 00000000000..be60a9aecaf --- /dev/null +++ b/plugins/woocommerce-admin/docs/examples/README.md @@ -0,0 +1,4 @@ +Examples +========== + +This folder contains examples of extending various parts of WooCommerce Admin. diff --git a/plugins/woocommerce-admin/docs/examples/_sidebar.md b/plugins/woocommerce-admin/docs/examples/_sidebar.md new file mode 100644 index 00000000000..f4b7a7ef134 --- /dev/null +++ b/plugins/woocommerce-admin/docs/examples/_sidebar.md @@ -0,0 +1,5 @@ +* [Home](/) + +* [Examples](examples/) + + * [Activity Panel Inbox](examples/activity-panel-inbox.md) diff --git a/plugins/woocommerce-admin/docs/examples/activity-panel-inbox.md b/plugins/woocommerce-admin/docs/examples/activity-panel-inbox.md new file mode 100644 index 00000000000..ce26a4e4068 --- /dev/null +++ b/plugins/woocommerce-admin/docs/examples/activity-panel-inbox.md @@ -0,0 +1,240 @@ +Activity Panel Inbox +==================== + +Right now, installing and activating WooCommerce and a few extensions quickly results in a cascade of notices vying for the store administrator’s attention (and pushing whatever wp-admin content they were trying to get to on a page down, way down.) + +As part of the Dashboard and Analytics improvements coming to WooCommerce, we’re going to do something a bit dramatic to try and clean up this notice-palooza. + +First, we’re splitting up notices into two broad categories. + +## Category 1: Store Alerts + +The first category is what we’re calling “Store Alerts” - similar to the notices you have today, these notices are present at the top of administration pages and will look something like this: + +![Store Alerts](images/activity-panel-store-alerts.png) + +But unlike today’s notices, this part of the UI will be reserved for “priority” messages to the administrator - things like version and security updates and critical errors. What sort of errors are “critical errors”? Well, things like a payment gateway that has stopped working because its connection is down, or when the store is set for physical product support but no shipping methods are defined. + +## Category 2: Activity Panel Inbox + +The second category is what we’re focusing on in this example - and what we expect the vast majority of extension developers will want to extend - we call it the “Activity Panel Inbox.” It will look something like this: + +![Activity Panel Inbox](images/activity-panel-inbox.png) + +This section is dedicated to informational content coming from multiple sources such as WooCommerce core, WooCommerce.com Subscription management, extensions activity and store achievements. This section was also envisioned to display more insightful content in the future, e.g. content that could help with the day to day tasks of managing and optimizing a store. + +Each notice or “note” has a type represented by an icon (Gridicon), a title, content, a timestamp and one or two actions (action title + link). + +### Inbox Design Constraints and Best Practices +Extensions can add their own notes via the data stores we’ll be covering below, but first... some constraints... + +There are some constraints extensions should follow when working with the inbox: + +1. Generally speaking, don’t change the order of items. It is OK for an extension to occasionally “bump” a note to the top of the inbox by deleting a note and adding a new note with similar content, but bumping should be done sparingly. For example, subscription notes will be bumped at 45, 20, 7, and 1 days before the corresponding subscription expires. +1. Generally speaking, don’t delete notes. There are a few situations where deleting notes makes sense, like after the user has corrected a bad connection, but again, generally, don’t delete notes. +1. That said, it is OK to change note content. This can be useful after the user has taken an action (e.g. renewed an expiring subscription). Changing the message after they do something like that makes it easy for the user to see a chronology of things they’ve done. +1. Don’t add UI components. Focus on the PHP API. +1. Be aware that notes are stored in the database using the locale in effect when the note was added to the inbox. Also be aware that you can use content_data property of a note in a hook context to “re-localize” notes on the fly into new locales. +1. Feel free to use the content_data property to store other things too - it isn’t just limited to things needed for “re-localization” - and it is backed by a longtext column in the database. +1. Notes can have 0, 1, or 2 action buttons. Action buttons have URLs. They can either be complete URLs (like in the case of an external link) or partial URLs (like in the case of an admin page on the site) - in the case of partial URLs you’ll want to give a string that is the same as what you’d supply to WordPress core’s admin_url function. You can even include query parameters in that string. +1. You should store your extension’s name (slug) in the source property of the note. WooCommerce will store ‘woocommerce’ there. For example, the “Panda Payments” extension could use a name like “panda-payments” - this makes it easier to use built in functions to get (or delete) all notes with a certain name. +1. You can use the name property of a note to store a sub-type of note. For example, if the Panda Payments extension generates notes for both connection problems AND for new features, they might both have ‘panda-payments’ in the source property but then use ‘connection-problem’ and ‘new-feature’ in the name property to distinguish between the two types of notes. +1. Icons are Gridicons. You can find a gallery [here](https://automattic.github.io/gridicons/) +1. As a best practice, have your extension remove its notes on deactivation or at least uninstall. + +So, enough rules - let’s get into how to code this up. And surprise, no JavaScript is necessary - you can work with the inbox exclusively through PHP -- the inbox front-end is React based, sure, but it draws all its data from a couple of new database tables and the PHP based REST API (and that’s where you can work with notes). + +### Adding and Removing Inbox Items + +Here’s a short example plugin that adds a new activity panel inbox note on plugin activation, and removes it on deactivation: + +``` +get_notes_with_name( self::NOTE_NAME ); + foreach( (array) $note_ids as $note_id ) { + $note = WC_Admin_Notes::get_note( $note_id ); + $content_data = $note->get_content_data(); + if ( property_exists( $content_data, 'getting_started' ) ) { + return; + } + } + + // Otherwise, add the note + $activated_time = current_time( 'timestamp', 0 ); + $activated_time_formatted = date( 'F jS', $activated_time ); + $note = new WC_Admin_Note(); + $note->set_title( __( 'Getting Started', 'wapi-example-plugin-one' ) ); + $note->set_content( + sprintf( + /* translators: a date, e.g. November 1st */ + __( 'Plugin activated on %s.', 'wapi-example-plugin-one' ), + $activated_time_formatted + ) + ); + $note->set_content_data( (object) array( + 'getting_started' => true, + 'activated' => $activated_time, + 'activated_formatted' => $activated_time_formatted, + ) ); + $note->set_type( WC_Admin_Note::E_WC_ADMIN_NOTE_INFORMATIONAL ); + // See https://automattic.github.io/gridicons/ for icon names. + // Don't include the gridicons- part of the name. + $note->set_icon( 'info' ); + $note->set_name( self::NOTE_NAME ); + $note->set_source( 'wapi-example-plugin-one' ); + // This example has two actions. A note can have 0 or 1 as well. + $note->add_action( + 'settings', + __( 'Open Settings', 'wapi-example-plugin-one' ), + '?page=wc-settings&tab=general' + ); + $note->add_action( + 'settings', + __( 'Learn More', 'wapi-example-plugin-one' ), + 'https://github.com/woocommerce/wc-admin/tree/master/docs' + ); + $note->save(); + } + + /** + * Removes any notes this plugin created. + */ + public static function remove_activity_panel_inbox_notes() { + if ( ! class_exists( 'WC_Admin_Notes' ) ) { + return; + } + + WC_Admin_Notes::delete_notes_with_name( self::NOTE_NAME ); + } +} + +function wapi_example_one_activate() { + WooCommerce_Activity_Panel_Inbox_Example_Plugin_One::add_activity_panel_inbox_welcome_note(); +} +register_activation_hook( __FILE__, 'wapi_example_one_activate' ); + +function wapi_example_one_deactivate() { + WooCommerce_Activity_Panel_Inbox_Example_Plugin_One::remove_activity_panel_inbox_notes(); +} +register_deactivation_hook( __FILE__, 'wapi_example_one_deactivate' ); +``` + +### Updating Inbox Items + +Here’s a short example plugin that updates an activity panel inbox note: + +``` +get_notes_with_name( self::NOTE_NAME ); + if ( empty( $note_ids ) ) { + $note = new WC_Admin_Note(); + $note->set_title( __( 'Domain Renewal Coming Up', 'wapi-example-plugin-two' ) ); + } else { + $note = WC_Admin_Notes::get_note( $note_ids[0] ); + } + + $expires_in_days = rand( 2, 365 ); + $note->set_content( + sprintf( + /* translators: a number of days, e.g. 100 */ + __( 'Your domain expires in %d days.', 'wapi-example-plugin-wto' ), + $expires_in_days + ) + ); + $note->set_content_data( (object) array( + 'expires_in_days' => $expires_in_days, + ) ); + + $note->set_type( WC_Admin_Note::E_WC_ADMIN_NOTE_INFORMATIONAL ); + // See https://automattic.github.io/gridicons/ for icon names. + // Don't include the gridicons- part of the name. + $note->set_icon( 'info' ); + $note->set_name( self::NOTE_NAME ); + $note->set_source( 'wapi-example-plugin-two' ); + // This example has no actions. A note can have 1 or 2 as well. + $note->save(); + } + + /** + * Removes any notes this plugin created. + */ + public static function remove_activity_panel_inbox_notes() { + if ( ! class_exists( 'WC_Admin_Notes' ) ) { + return; + } + + WC_Admin_Notes::delete_notes_with_name( self::NOTE_NAME ); + } +} + +function admin_init() { + WooCommerce_Activity_Panel_Inbox_Example_Plugin_Two::add_or_update_activity_panel_inbox_note(); +} +add_action( 'admin_init', 'admin_init' ); + +function wapi_example_two_deactivate() { + WooCommerce_Activity_Panel_Inbox_Example_Plugin_Two::remove_activity_panel_inbox_notes(); +} +register_deactivation_hook( __FILE__, 'wapi_example_two_deactivate' ); +``` + +## Questions? + +This is just the tip of the iceberg for possibilities for your own extensions to WooCommerce. Check +out the new [sales record notes](https://github.com/woocommerce/wc-admin/blob/master/includes/class-wc-admin-notes-new-sales-record.php) and the [settings notes](https://github.com/woocommerce/wc-admin/blob/master/includes/class-wc-admin-notes-settings-notes.php) for in the wc-admin code itself for other examples of working with this fun new feature. diff --git a/plugins/woocommerce-admin/docs/examples/images/activity-panel-inbox.png b/plugins/woocommerce-admin/docs/examples/images/activity-panel-inbox.png new file mode 100644 index 00000000000..a827db86a8e Binary files /dev/null and b/plugins/woocommerce-admin/docs/examples/images/activity-panel-inbox.png differ diff --git a/plugins/woocommerce-admin/docs/examples/images/activity-panel-store-alerts.png b/plugins/woocommerce-admin/docs/examples/images/activity-panel-store-alerts.png new file mode 100644 index 00000000000..140d6f7918c Binary files /dev/null and b/plugins/woocommerce-admin/docs/examples/images/activity-panel-store-alerts.png differ diff --git a/plugins/woocommerce-admin/includes/class-wc-admin-note.php b/plugins/woocommerce-admin/includes/class-wc-admin-note.php index 00cc427e515..422b70e197b 100644 --- a/plugins/woocommerce-admin/includes/class-wc-admin-note.php +++ b/plugins/woocommerce-admin/includes/class-wc-admin-note.php @@ -437,6 +437,13 @@ class WC_Admin_Note extends WC_Data { $this->set_date_prop( 'date_reminder', $date ); } + /** + * Clear actions from a note. + */ + public function clear_actions() { + $this->set_prop( 'actions', array() ); + } + /** * Add an action to the note * diff --git a/plugins/woocommerce-admin/includes/class-wc-admin-notes-new-sales-record.php b/plugins/woocommerce-admin/includes/class-wc-admin-notes-new-sales-record.php index 5360ce1085c..924af710a3f 100644 --- a/plugins/woocommerce-admin/includes/class-wc-admin-notes-new-sales-record.php +++ b/plugins/woocommerce-admin/includes/class-wc-admin-notes-new-sales-record.php @@ -63,9 +63,9 @@ class WC_Admin_Notes_New_Sales_Record { update_option( self::RECORD_AMOUNT_OPTION_KEY, $total ); $formatted_yesterday = date( 'F jS', strtotime( $yesterday ) ); - $formatted_total = html_entity_decode( strip_tags( wc_price( $total ) ) ); + $formatted_total = html_entity_decode( wp_strip_all_tags( wc_price( $total ) ) ); $formatted_record_date = date( 'F jS', strtotime( $record_date ) ); - $formatted_record_amt = html_entity_decode( strip_tags( wc_price( $record_amt ) ) ); + $formatted_record_amt = html_entity_decode( wp_strip_all_tags( wc_price( $record_amt ) ) ); $content = sprintf( /* translators: 1 and 4: Date (e.g. October 16th), 2 and 3: Amount (e.g. $160.00) */ diff --git a/plugins/woocommerce-admin/includes/class-wc-admin-notes-woo-subscriptions-notes.php b/plugins/woocommerce-admin/includes/class-wc-admin-notes-woo-subscriptions-notes.php new file mode 100644 index 00000000000..8d9bb58f919 --- /dev/null +++ b/plugins/woocommerce-admin/includes/class-wc-admin-notes-woo-subscriptions-notes.php @@ -0,0 +1,433 @@ +remove_notes(); + $this->add_no_connection_note(); + return; + } + + // The site just connected. + if ( empty( $old_token ) && ! empty( $new_token ) ) { + $this->remove_notes(); + $this->refresh_subscription_notes(); + return; + } + } + + /** + * Things to do on admin_init. + */ + public function admin_init() { + $this->check_connection(); + + if ( $this->is_connected() ) { + $refresh_notes = false; + + // Did the user just do something on the helper page?. + if ( isset( $_GET['wc-helper-status'] ) ) { + $refresh_notes = true; + } + + // Has it been more than a day since we last checked? + // Note: We do it this way and not wp_scheduled_task since WC_Helper_Options is not loaded for cron. + $time_now_gmt = current_time( 'timestamp', 0 ); + $last_refresh = intval( get_option( self::LAST_REFRESH_OPTION_KEY, 0 ) ); + if ( $last_refresh + DAY_IN_SECONDS <= $time_now_gmt ) { + update_option( self::LAST_REFRESH_OPTION_KEY, $time_now_gmt ); + $refresh_notes = true; + } + + if ( $refresh_notes ) { + $this->refresh_subscription_notes(); + } + } + } + + /** + * Checks the connection. Adds a note (as necessary) if there is no connection. + */ + public function check_connection() { + if ( ! $this->is_connected() ) { + $data_store = WC_Data_Store::load( 'admin-note' ); + $note_ids = $data_store->get_notes_with_name( self::CONNECTION_NOTE_NAME ); + if ( ! empty( $note_ids ) ) { + // We already have a connection note. Exit early. + return; + } + + $this->remove_notes(); + $this->add_no_connection_note(); + } + } + + /** + * Whether or not we think the site is currently connected to WooCommerce.com. + * + * @return bool + */ + public function is_connected() { + $auth = WC_Helper_Options::get( 'auth' ); + return ( ! empty( $auth['access_token'] ) ); + } + + /** + * Returns the WooCommerce.com provided site ID for this site. + * + * @return int|false + */ + public function get_connected_site_id() { + if ( ! $this->is_connected() ) { + return false; + } + + $auth = WC_Helper_Options::get( 'auth' ); + return absint( $auth['site_id'] ); + } + + /** + * Returns an array of product_ids whose subscriptions are active on this site. + * + * @return array + */ + public function get_subscription_active_product_ids() { + $site_id = $this->get_connected_site_id(); + if ( ! $site_id ) { + return array(); + } + + $product_ids = array(); + + if ( $this->is_connected() ) { + $subscriptions = WC_Helper::get_subscriptions(); + + foreach ( (array) $subscriptions as $subscription ) { + if ( in_array( $site_id, $subscription['connections'], true ) ) { + $product_ids[] = $subscription['product_id']; + } + } + } + + return $product_ids; + } + + /** + * Clears all connection or subscription notes. + */ + public function remove_notes() { + WC_Admin_Notes::delete_notes_with_name( self::CONNECTION_NOTE_NAME ); + WC_Admin_Notes::delete_notes_with_name( self::SUBSCRIPTION_NOTE_NAME ); + } + + /** + * Adds a note prompting to connect to WooCommerce.com. + */ + public function add_no_connection_note() { + $note = new WC_Admin_Note(); + $note->set_title( __( 'Connect to WooCommerce.com', 'wc-admin' ) ); + $note->set_content( __( 'Connect to get important product notifications and updates.', 'wc-admin' ) ); + $note->set_content_data( (object) array() ); + $note->set_type( WC_Admin_Note::E_WC_ADMIN_NOTE_INFORMATIONAL ); + $note->set_icon( 'info' ); + $note->set_name( self::CONNECTION_NOTE_NAME ); + $note->set_source( 'wc-admin' ); + $note->add_action( + 'connect', + __( 'Connect', 'wc-admin' ), + '?page=wc-addons§ion=helper' + ); + $note->save(); + } + + /** + * Gets the product_id (if any) associated with a note. + * + * @param WC_Admin_Note $note The note object to interrogate. + * @return int|false + */ + public function get_product_id_from_subscription_note( &$note ) { + $content_data = $note->get_content_data(); + + if ( property_exists( $content_data, 'product_id' ) ) { + return intval( $content_data->product_id ); + } + + return false; + } + + /** + * Removes notes for product_ids no longer active on this site. + */ + public function prune_inactive_subscription_notes() { + $active_product_ids = $this->get_subscription_active_product_ids(); + + $data_store = WC_Data_Store::load( 'admin-note' ); + $note_ids = $data_store->get_notes_with_name( self::SUBSCRIPTION_NOTE_NAME ); + + foreach ( (array) $note_ids as $note_id ) { + $note = WC_Admin_Notes::get_note( $note_id ); + $product_id = $this->get_product_id_from_subscription_note( $note ); + if ( ! empty( $product_id ) ) { + if ( ! in_array( $product_id, $active_product_ids, true ) ) { + $note->delete(); + } + } + } + } + + /** + * Finds a note for a given product ID, if the note exists at all. + * + * @param int $product_id The product ID to search for. + * @return WC_Admin_Note|false + */ + public function find_note_for_product_id( $product_id ) { + $product_id = intval( $product_id ); + + $data_store = WC_Data_Store::load( 'admin-note' ); + $note_ids = $data_store->get_notes_with_name( self::SUBSCRIPTION_NOTE_NAME ); + foreach ( (array) $note_ids as $note_id ) { + $note = WC_Admin_Notes::get_note( $note_id ); + $found_product_id = $this->get_product_id_from_subscription_note( $note ); + + if ( $product_id === $found_product_id ) { + return $note; + } + } + + return false; + } + + /** + * Deletes a note for a given product ID, if the note exists at all. + * + * @param int $product_id The product ID to search for. + */ + public function delete_any_note_for_product_id( $product_id ) { + $product_id = intval( $product_id ); + + $note = $this->find_note_for_product_id( $product_id ); + if ( $note ) { + $note->delete(); + } + } + + /** + * Adds or updates a note for an expiring subscription. + * + * @param array $subscription The subscription to work with. + */ + public function add_or_update_subscription_expiring( $subscription ) { + $product_id = $subscription['product_id']; + $product_name = $subscription['product_name']; + $expires = intval( $subscription['expires'] ); + $time_now_gmt = current_time( 'timestamp', 0 ); + $days_until_expiration = intval( ceil( ( $expires - $time_now_gmt ) / DAY_IN_SECONDS ) ); + + $note = $this->find_note_for_product_id( $product_id ); + + if ( $note ) { + $content_data = $note->get_content_data(); + if ( property_exists( $content_data, 'days_until_expiration' ) ) { + $note_days_until_expiration = intval( $content_data->days_until_expiration ); + if ( $days_until_expiration === $note_days_until_expiration ) { + // Note is already up to date. Bail. + return; + } + } + } + + $note_title = sprintf( + /* translators: name of the extension subscription expiring soon */ + __( '%s subscription expiring soon', 'wc-admin' ), + $product_name + ); + + $note_content = sprintf( + /* translators: number of days until the subscription expires */ + __( 'Your subscription expires in %d days. Enable autorenew to avoid losing updates and access to support.', 'wc-admin' ), + $days_until_expiration + ); + + $note_content_data = (object) array( + 'product_id' => $product_id, + 'product_name' => $product_name, + 'expired' => false, + 'days_until_expiration' => $days_until_expiration, + ); + + if ( ! $note ) { + $note = new WC_Admin_Note(); + } + + // Reset everything in case we are repurposing an expired note as an expiring note. + $note->set_title( $note_title ); + $note->set_type( WC_Admin_Note::E_WC_ADMIN_NOTE_WARNING ); + $note->set_icon( 'notice' ); + $note->set_name( self::SUBSCRIPTION_NOTE_NAME ); + $note->set_source( 'wc-admin' ); + $note->clear_actions(); + $note->add_action( + 'enable-autorenew', + __( 'Enable Autorenew', 'wc-admin' ), + 'https://woocommerce.com/my-account/my-subscriptions/' + ); + $note->set_content( $note_content ); + $note->set_content_data( $note_content_data ); + $note->save(); + } + + /** + * Adds a note for an expired subscription, or updates an expiring note to expired. + * + * @param array $subscription The subscription to work with. + */ + public function add_or_update_subscription_expired( $subscription ) { + $product_id = $subscription['product_id']; + $product_name = $subscription['product_name']; + $product_page = $subscription['product_url']; + $expires = intval( $subscription['expires'] ); + $expires_date = date( 'F jS', $expires ); + + $note = $this->find_note_for_product_id( $product_id ); + if ( $note ) { + $note_content_data = $note->get_content_data(); + if ( $note_content_data->expired ) { + // We've already got a full fledged expired note for this. Bail. + // Expired notes' content don't change with time. + return; + } + } + + $note_title = sprintf( + /* translators: name of the extension subscription that expired */ + __( '%s subscription expired', 'wc-admin' ), + $product_name + ); + + $note_content = sprintf( + /* translators: date the subscription expired, e.g. Jun 7th 2018 */ + __( 'Your subscription expired on %s. Get a new subscription to continue receiving updates and access to support.', 'wc-admin' ), + $expires_date + ); + + $note_content_data = (object) array( + 'product_id' => $product_id, + 'product_name' => $product_name, + 'expired' => true, + 'expires' => $expires, + 'expires_date' => $expires_date, + ); + + if ( ! $note ) { + $note = new WC_Admin_Note(); + } + + $note->set_title( $note_title ); + $note->set_content( $note_content ); + $note->set_content_data( $note_content_data ); + $note->set_type( WC_Admin_Note::E_WC_ADMIN_NOTE_WARNING ); + $note->set_icon( 'notice' ); + $note->set_name( self::SUBSCRIPTION_NOTE_NAME ); + $note->set_source( 'wc-admin' ); + $note->clear_actions(); + $note->add_action( + 'renew-subscription', + __( 'Renew Subscription', 'wc-admin' ), + $product_page + ); + $note->save(); + } + + /** + * For each active subscription on this site, checks the expiration date and creates/updates/deletes notes. + */ + public function refresh_subscription_notes() { + if ( ! $this->is_connected() ) { + return; + } + + $this->prune_inactive_subscription_notes(); + + $subscriptions = WC_Helper::get_subscriptions(); + $active_product_ids = $this->get_subscription_active_product_ids(); + + foreach ( (array) $subscriptions as $subscription ) { + // Only concern ourselves with active products. + $product_id = $subscription['product_id']; + if ( ! in_array( $product_id, $active_product_ids, true ) ) { + continue; + } + + // If the subscription will auto-renew, clean up and exit. + if ( $subscription['autorenew'] ) { + $this->delete_any_note_for_product_id( $product_id ); + continue; + } + + // If the subscription is not expiring soon, clean up and exit. + $expires = intval( $subscription['expires'] ); + $time_now_gmt = current_time( 'timestamp', 0 ); + if ( $expires > $time_now_gmt + self::NOTIFY_WHEN_DAYS_LEFT * DAY_IN_SECONDS ) { + $this->delete_any_note_for_product_id( $product_id ); + continue; + } + + // Otherwise, if the subscription can still have auto-renew enabled, let them know that now. + if ( $expires > $time_now_gmt ) { + $this->add_or_update_subscription_expiring( $subscription ); + continue; + } + + // If we got this far, the subscription has completely expired, let them know. + $this->add_or_update_subscription_expired( $subscription ); + } + } +} + +new WC_Admin_Notes_Woo_Subscriptions_Notes(); diff --git a/plugins/woocommerce-admin/includes/data-stores/class-wc-admin-notes-data-store.php b/plugins/woocommerce-admin/includes/data-stores/class-wc-admin-notes-data-store.php index 3e3779717ea..5995534ea01 100644 --- a/plugins/woocommerce-admin/includes/data-stores/class-wc-admin-notes-data-store.php +++ b/plugins/woocommerce-admin/includes/data-stores/class-wc-admin-notes-data-store.php @@ -104,6 +104,18 @@ class WC_Admin_Notes_Data_Store extends WC_Data_Store_WP implements WC_Object_Da global $wpdb; if ( $note->get_id() ) { + $date_created = $note->get_date_created(); + $date_created_timestamp = $date_created->getTimestamp(); + $date_created_to_db = gmdate( 'Y-m-d H:i:s', $date_created_timestamp ); + + $date_reminder = $note->get_date_reminder(); + if ( is_null( $date_reminder ) ) { + $date_reminder_to_db = null; + } else { + $date_reminder_timestamp = $date_reminder->getTimestamp(); + $date_reminder_to_db = gmdate( 'Y-m-d H:i:s', $date_reminder_timestamp ); + } + $wpdb->update( $wpdb->prefix . 'woocommerce_admin_notes', array( @@ -116,8 +128,8 @@ class WC_Admin_Notes_Data_Store extends WC_Data_Store_WP implements WC_Object_Da 'content_data' => wp_json_encode( $note->get_content_data() ), 'status' => $note->get_status(), 'source' => $note->get_source(), - 'date_created' => $note->get_date_created(), - 'date_reminder' => $note->get_date_reminder(), + 'date_created' => $date_created_to_db, + 'date_reminder' => $date_reminder_to_db, ), array( 'note_id' => $note->get_id() ) ); diff --git a/plugins/woocommerce-admin/lib/admin.php b/plugins/woocommerce-admin/lib/admin.php index 64493923dc7..90cb5adc5ca 100644 --- a/plugins/woocommerce-admin/lib/admin.php +++ b/plugins/woocommerce-admin/lib/admin.php @@ -109,6 +109,22 @@ function wc_admin_register_pages() { ) ); + wc_admin_register_page( + array( + 'title' => __( 'Coupons', 'wc-admin' ), + 'parent' => '/analytics/revenue', + 'path' => '/analytics/coupons', + ) + ); + + wc_admin_register_page( + array( + 'title' => __( 'Taxes', 'wc-admin' ), + 'parent' => '/analytics/revenue', + 'path' => '/analytics/taxes', + ) + ); + if ( defined( 'WP_DEBUG' ) && WP_DEBUG && defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ) { wc_admin_register_page( array( diff --git a/plugins/woocommerce-admin/lib/client-assets.php b/plugins/woocommerce-admin/lib/client-assets.php index 49160134233..a6ff969275f 100644 --- a/plugins/woocommerce-admin/lib/client-assets.php +++ b/plugins/woocommerce-admin/lib/client-assets.php @@ -18,6 +18,14 @@ function wc_admin_register_script() { $entry = 'app'; } + wp_register_script( + 'wc-csv', + wc_admin_url( 'dist/csv-export/index.js' ), + array(), + filemtime( wc_admin_dir_path( 'dist/csv-export/index.js' ) ), + true + ); + wp_register_script( 'wc-currency', wc_admin_url( 'dist/currency/index.js' ), @@ -26,6 +34,14 @@ function wc_admin_register_script() { true ); + wp_register_script( + 'wc-navigation', + wc_admin_url( 'dist/navigation/index.js' ), + array(), + filemtime( wc_admin_dir_path( 'dist/navigation/index.js' ) ), + true + ); + wp_register_script( 'wc-date', wc_admin_url( 'dist/date/index.js' ), @@ -44,8 +60,10 @@ function wc_admin_register_script() { 'wp-hooks', 'wp-i18n', 'wp-keycodes', + 'wc-csv', 'wc-currency', 'wc-date', + 'wc-navigation', ), filemtime( wc_admin_dir_path( 'dist/components/index.js' ) ), true @@ -54,15 +72,19 @@ function wc_admin_register_script() { wp_register_script( WC_ADMIN_APP, wc_admin_url( "dist/{$entry}/index.js" ), - array( 'wc-components', 'wp-date', 'wp-html-entities', 'wp-keycodes' ), + array( 'wc-components', 'wc-navigation', 'wp-date', 'wp-html-entities', 'wp-keycodes' ), filemtime( wc_admin_dir_path( "dist/{$entry}/index.js" ) ), true ); // Set up the text domain and translations. - $locale_data = gutenberg_get_jed_locale_data( 'wc-admin' ); - $content = 'wp.i18n.setLocaleData( ' . json_encode( $locale_data ) . ', "wc-admin" );'; - wp_add_inline_script( 'wc-components', $content, 'before' ); + if ( function_exists( 'wp_get_jed_locale_data' ) ) { + $locale_data = wp_get_jed_locale_data( 'wc-admin' ); + } else { + $locale_data = gutenberg_get_jed_locale_data( 'wc-admin' ); + } + $content = 'wp.i18n.setLocaleData( ' . json_encode( $locale_data ) . ', "wc-admin" );'; + wp_add_inline_script( 'wp-i18n', $content, 'after' ); // Resets lodash to wp-admin's version of lodash. wp_add_inline_script( diff --git a/plugins/woocommerce-admin/lib/common.php b/plugins/woocommerce-admin/lib/common.php index 75b833b4ba7..63eabfe35eb 100644 --- a/plugins/woocommerce-admin/lib/common.php +++ b/plugins/woocommerce-admin/lib/common.php @@ -66,10 +66,11 @@ function wc_admin_get_embed_breadcrumbs() { 'wc-status' => 'status', ); $tab = ''; - $get_tab = isset( $_GET['tab'] ) && sanitize_text_field( wp_unslash( $_GET['tab'] ) ); + $get_tab = isset( $_GET['tab'] ) ? sanitize_text_field( wp_unslash( $_GET['tab'] ) ) : ''; if ( isset( $_GET['page'] ) ) { - if ( in_array( wp_unslash( $_GET['page'] ), array_keys( $pages_with_tabs ) ) ) { - $tab = ! empty( $get_tab ) ? $get_tab . '-' : $pages_with_tabs[ $get_page ] . '-'; + $page = sanitize_text_field( wp_unslash( $_GET['page'] ) ); + if ( in_array( $page, array_keys( $pages_with_tabs ) ) ) { + $tab = ! empty( $get_tab ) ? $get_tab . '-' : $pages_with_tabs[ $page ] . '-'; } } diff --git a/plugins/woocommerce-admin/package-lock.json b/plugins/woocommerce-admin/package-lock.json index f0c73cf1810..8a9b76a26c2 100644 --- a/plugins/woocommerce-admin/package-lock.json +++ b/plugins/woocommerce-admin/package-lock.json @@ -5,9 +5,9 @@ "requires": true, "dependencies": { "@babel/cli": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.1.2.tgz", - "integrity": "sha512-K3WDlpBPGpoW11SLKFEBhMsITomPovsrZ/wnM3y+WStbytukDXC0OBic3yQp+j058QUw0+R/jfx2obwp1fOzcA==", + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.1.5.tgz", + "integrity": "sha512-zbO/DtTnaDappBflIU3zYEgATLToRDmW5uN/EGH1GXaes7ydfjqmAoK++xmJIA+8HfDw7UyPZNdM8fhGhfmMhw==", "dev": true, "requires": { "chokidar": "^2.0.3", @@ -26,42 +26,103 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", - "dev": true, "requires": { "@babel/highlight": "^7.0.0" } }, "@babel/core": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.1.2.tgz", - "integrity": "sha512-IFeSSnjXdhDaoysIlev//UzHZbdEmm7D0EIH2qtse9xK7mXEZQpYjs2P00XlP1qYsYvid79p+Zgg6tz1mp6iVw==", + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.1.6.tgz", + "integrity": "sha512-Hz6PJT6e44iUNpAn8AoyAs6B3bl60g7MJQaI0rZEar6ECzh6+srYO1xlIdssio34mPaUtAb1y+XlkkSJzok3yw==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@babel/generator": "^7.1.2", - "@babel/helpers": "^7.1.2", - "@babel/parser": "^7.1.2", + "@babel/generator": "^7.1.6", + "@babel/helpers": "^7.1.5", + "@babel/parser": "^7.1.6", "@babel/template": "^7.1.2", - "@babel/traverse": "^7.1.0", - "@babel/types": "^7.1.2", + "@babel/traverse": "^7.1.6", + "@babel/types": "^7.1.6", "convert-source-map": "^1.1.0", - "debug": "^3.1.0", - "json5": "^0.5.0", + "debug": "^4.1.0", + "json5": "^2.1.0", "lodash": "^4.17.10", "resolve": "^1.3.2", "semver": "^5.4.1", "source-map": "^0.5.0" }, "dependencies": { + "@babel/generator": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.1.6.tgz", + "integrity": "sha512-brwPBtVvdYdGxtenbQgfCdDPmtkmUBZPjUoK5SXJEBuHaA5BCubh9ly65fzXz7R6o5rA76Rs22ES8Z+HCc0YIQ==", + "dev": true, + "requires": { + "@babel/types": "^7.1.6", + "jsesc": "^2.5.1", + "lodash": "^4.17.10", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + } + }, + "@babel/parser": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.1.6.tgz", + "integrity": "sha512-dWP6LJm9nKT6ALaa+bnL247GHHMWir3vSlZ2+IHgHgktZQx0L3Uvq2uAWcuzIe+fujRsYWBW2q622C5UvGK9iQ==", + "dev": true + }, + "@babel/traverse": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.1.6.tgz", + "integrity": "sha512-CXedit6GpISz3sC2k2FsGCUpOhUqKdyL0lqNrImQojagnUMXf8hex4AxYFRuMkNGcvJX5QAFGzB5WJQmSv8SiQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/generator": "^7.1.6", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.0.0", + "@babel/parser": "^7.1.6", + "@babel/types": "^7.1.6", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.10" + } + }, + "@babel/types": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.1.6.tgz", + "integrity": "sha512-DMiUzlY9DSjVsOylJssxLHSgj6tWM9PRFJOGW/RaOglVOK9nzTxoOMfTfRQXGUCUQ/HmlG2efwC+XqUEJ5ay4w==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.10", + "to-fast-properties": "^2.0.0" + } + }, "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.0.tgz", + "integrity": "sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg==", "dev": true, "requires": { "ms": "^2.1.1" } }, + "json5": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.0.tgz", + "integrity": "sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, "ms": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", @@ -74,7 +135,6 @@ "version": "7.1.3", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.1.3.tgz", "integrity": "sha512-ZoCZGcfIJFJuZBqxcY9OjC1KW2lWK64qrX1o4UYL3yshVhwKFYgzpWZ0vvtGMNJdTlvkw0W+HR1VnYN8q3QPFQ==", - "dev": true, "requires": { "@babel/types": "^7.1.3", "jsesc": "^2.5.1", @@ -87,7 +147,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz", "integrity": "sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q==", - "dev": true, "requires": { "@babel/types": "^7.0.0" } @@ -96,7 +155,6 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz", "integrity": "sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w==", - "dev": true, "requires": { "@babel/helper-explode-assignable-expression": "^7.1.0", "@babel/types": "^7.0.0" @@ -106,7 +164,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.0.0.tgz", "integrity": "sha512-ebJ2JM6NAKW0fQEqN8hOLxK84RbRz9OkUhGS/Xd5u56ejMfVbayJ4+LykERZCOUM6faa6Fp3SZNX3fcT16MKHw==", - "dev": true, "requires": { "@babel/types": "^7.0.0", "esutils": "^2.0.0" @@ -116,7 +173,6 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.1.0.tgz", "integrity": "sha512-YEtYZrw3GUK6emQHKthltKNZwszBcHK58Ygcis+gVUrF4/FmTVr5CCqQNSfmvg2y+YDEANyYoaLz/SHsnusCwQ==", - "dev": true, "requires": { "@babel/helper-hoist-variables": "^7.0.0", "@babel/traverse": "^7.1.0", @@ -127,7 +183,6 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.1.0.tgz", "integrity": "sha512-yPPcW8dc3gZLN+U1mhYV91QU3n5uTbx7DUdf8NnPbjS0RMwBuHi9Xt2MUgppmNz7CJxTBWsGczTiEp1CSOTPRg==", - "dev": true, "requires": { "@babel/helper-function-name": "^7.1.0", "@babel/types": "^7.0.0", @@ -138,7 +193,6 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz", "integrity": "sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA==", - "dev": true, "requires": { "@babel/traverse": "^7.1.0", "@babel/types": "^7.0.0" @@ -148,7 +202,6 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", - "dev": true, "requires": { "@babel/helper-get-function-arity": "^7.0.0", "@babel/template": "^7.1.0", @@ -159,7 +212,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", - "dev": true, "requires": { "@babel/types": "^7.0.0" } @@ -168,7 +220,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.0.0.tgz", "integrity": "sha512-Ggv5sldXUeSKsuzLkddtyhyHe2YantsxWKNi7A+7LeD12ExRDWTRk29JCXpaHPAbMaIPZSil7n+lq78WY2VY7w==", - "dev": true, "requires": { "@babel/types": "^7.0.0" } @@ -177,7 +228,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.0.0.tgz", "integrity": "sha512-avo+lm/QmZlv27Zsi0xEor2fKcqWG56D5ae9dzklpIaY7cQMK5N8VSpaNVPPagiqmy7LrEjK1IWdGMOqPu5csg==", - "dev": true, "requires": { "@babel/types": "^7.0.0" } @@ -186,7 +236,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz", "integrity": "sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A==", - "dev": true, "requires": { "@babel/types": "^7.0.0" } @@ -195,7 +244,6 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.1.0.tgz", "integrity": "sha512-0JZRd2yhawo79Rcm4w0LwSMILFmFXjugG3yqf+P/UsKsRS1mJCmMwwlHDlMg7Avr9LrvSpp4ZSULO9r8jpCzcw==", - "dev": true, "requires": { "@babel/helper-module-imports": "^7.0.0", "@babel/helper-simple-access": "^7.1.0", @@ -209,7 +257,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz", "integrity": "sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g==", - "dev": true, "requires": { "@babel/types": "^7.0.0" } @@ -217,14 +264,12 @@ "@babel/helper-plugin-utils": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz", - "integrity": "sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA==", - "dev": true + "integrity": "sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA==" }, "@babel/helper-regex": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.0.0.tgz", "integrity": "sha512-TR0/N0NDCcUIUEbqV6dCO+LptmmSQFQ7q70lfcEB4URsjD0E1HzicrwUH+ap6BAQ2jhCX9Q4UqZy4wilujWlkg==", - "dev": true, "requires": { "lodash": "^4.17.10" } @@ -233,7 +278,6 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz", "integrity": "sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg==", - "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.0.0", "@babel/helper-wrap-function": "^7.1.0", @@ -246,7 +290,6 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.1.0.tgz", "integrity": "sha512-BvcDWYZRWVuDeXTYZWxekQNO5D4kO55aArwZOTFXw6rlLQA8ZaDicJR1sO47h+HrnCiDFiww0fSPV0d713KBGQ==", - "dev": true, "requires": { "@babel/helper-member-expression-to-functions": "^7.0.0", "@babel/helper-optimise-call-expression": "^7.0.0", @@ -258,7 +301,6 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz", "integrity": "sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w==", - "dev": true, "requires": { "@babel/template": "^7.1.0", "@babel/types": "^7.0.0" @@ -268,7 +310,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz", "integrity": "sha512-MXkOJqva62dfC0w85mEf/LucPPS/1+04nmmRMPEBUB++hiiThQ2zPtX/mEWQ3mtzCEjIJvPY8nuwxXtQeQwUag==", - "dev": true, "requires": { "@babel/types": "^7.0.0" } @@ -277,7 +318,6 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.1.0.tgz", "integrity": "sha512-R6HU3dete+rwsdAfrOzTlE9Mcpk4RjU3aX3gi9grtmugQY0u79X7eogUvfXA5sI81Mfq1cn6AgxihfN33STjJA==", - "dev": true, "requires": { "@babel/helper-function-name": "^7.1.0", "@babel/template": "^7.1.0", @@ -286,21 +326,84 @@ } }, "@babel/helpers": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.1.2.tgz", - "integrity": "sha512-Myc3pUE8eswD73aWcartxB16K6CGmHDv9KxOmD2CeOs/FaEAQodr3VYGmlvOmog60vNQ2w8QbatuahepZwrHiA==", + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.1.5.tgz", + "integrity": "sha512-2jkcdL02ywNBry1YNFAH/fViq4fXG0vdckHqeJk+75fpQ2OH+Az6076tX/M0835zA45E0Cqa6pV5Kiv9YOqjEg==", "dev": true, "requires": { "@babel/template": "^7.1.2", - "@babel/traverse": "^7.1.0", - "@babel/types": "^7.1.2" + "@babel/traverse": "^7.1.5", + "@babel/types": "^7.1.5" + }, + "dependencies": { + "@babel/generator": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.1.6.tgz", + "integrity": "sha512-brwPBtVvdYdGxtenbQgfCdDPmtkmUBZPjUoK5SXJEBuHaA5BCubh9ly65fzXz7R6o5rA76Rs22ES8Z+HCc0YIQ==", + "dev": true, + "requires": { + "@babel/types": "^7.1.6", + "jsesc": "^2.5.1", + "lodash": "^4.17.10", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + } + }, + "@babel/parser": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.1.6.tgz", + "integrity": "sha512-dWP6LJm9nKT6ALaa+bnL247GHHMWir3vSlZ2+IHgHgktZQx0L3Uvq2uAWcuzIe+fujRsYWBW2q622C5UvGK9iQ==", + "dev": true + }, + "@babel/traverse": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.1.6.tgz", + "integrity": "sha512-CXedit6GpISz3sC2k2FsGCUpOhUqKdyL0lqNrImQojagnUMXf8hex4AxYFRuMkNGcvJX5QAFGzB5WJQmSv8SiQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/generator": "^7.1.6", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.0.0", + "@babel/parser": "^7.1.6", + "@babel/types": "^7.1.6", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.10" + } + }, + "@babel/types": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.1.6.tgz", + "integrity": "sha512-DMiUzlY9DSjVsOylJssxLHSgj6tWM9PRFJOGW/RaOglVOK9nzTxoOMfTfRQXGUCUQ/HmlG2efwC+XqUEJ5ay4w==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.10", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.0.tgz", + "integrity": "sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } } }, "@babel/highlight": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", - "dev": true, "requires": { "chalk": "^2.0.0", "esutils": "^2.0.2", @@ -310,14 +413,12 @@ "@babel/parser": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.1.3.tgz", - "integrity": "sha512-gqmspPZOMW3MIRb9HlrnbZHXI1/KHTOroBwN1NcLL6pWxzqzEKGvRTq0W/PxS45OtQGbaFikSQpkS5zbnsQm2w==", - "dev": true + "integrity": "sha512-gqmspPZOMW3MIRb9HlrnbZHXI1/KHTOroBwN1NcLL6pWxzqzEKGvRTq0W/PxS45OtQGbaFikSQpkS5zbnsQm2w==" }, "@babel/plugin-proposal-async-generator-functions": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.1.0.tgz", "integrity": "sha512-Fq803F3Jcxo20MXUSDdmZZXrPe6BWyGcWBPPNB/M7WaUYESKDeKMOGIxEzQOjGSmW/NWb6UaPZrtTB2ekhB/ew==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", "@babel/helper-remap-async-to-generator": "^7.1.0", @@ -328,7 +429,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.0.0.tgz", "integrity": "sha512-kfVdUkIAGJIVmHmtS/40i/fg/AGnw/rsZBCaapY5yjeO5RA9m165Xbw9KMOu2nqXP5dTFjEjHdfNdoVcHv133Q==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", "@babel/plugin-syntax-json-strings": "^7.0.0" @@ -338,7 +438,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.0.0.tgz", "integrity": "sha512-14fhfoPcNu7itSen7Py1iGN0gEm87hX/B+8nZPqkdmANyyYWYMY2pjA3r8WXbWVKMzfnSNS0xY8GVS0IjXi/iw==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", "@babel/plugin-syntax-object-rest-spread": "^7.0.0" @@ -348,7 +447,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.0.0.tgz", "integrity": "sha512-JPqAvLG1s13B/AuoBjdBYvn38RqW6n1TzrQO839/sIpqLpbnXKacsAgpZHzLD83Sm8SDXMkkrAvEnJ25+0yIpw==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", "@babel/plugin-syntax-optional-catch-binding": "^7.0.0" @@ -358,7 +456,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.0.0.tgz", "integrity": "sha512-tM3icA6GhC3ch2SkmSxv7J/hCWKISzwycub6eGsDrFDgukD4dZ/I+x81XgW0YslS6mzNuQ1Cbzh5osjIMgepPQ==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", "@babel/helper-regex": "^7.0.0", @@ -369,7 +466,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.0.0.tgz", "integrity": "sha512-im7ged00ddGKAjcZgewXmp1vxSZQQywuQXe2B1A7kajjZmDeY/ekMPmWr9zJgveSaQH0k7BcGrojQhcK06l0zA==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" } @@ -378,7 +474,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.0.0.tgz", "integrity": "sha512-UlSfNydC+XLj4bw7ijpldc1uZ/HB84vw+U6BTuqMdIEmz/LDe63w/GHtpQMdXWdqQZFeAI9PjnHe/vDhwirhKA==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" } @@ -387,7 +482,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.0.0.tgz", "integrity": "sha512-PdmL2AoPsCLWxhIr3kG2+F9v4WH06Q3z+NoGVpQgnUNGcagXHq5sB3OXxkSahKq9TLdNMN/AJzFYSOo8UKDMHg==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" } @@ -396,7 +490,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.0.0.tgz", "integrity": "sha512-5A0n4p6bIiVe5OvQPxBnesezsgFJdHhSs3uFSvaPdMqtsovajLZ+G2vZyvNe10EzJBWWo3AcHGKhAFUxqwp2dw==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" } @@ -405,7 +498,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.0.0.tgz", "integrity": "sha512-Wc+HVvwjcq5qBg1w5RG9o9RVzmCaAg/Vp0erHCKpAYV8La6I94o4GQAmFYNmkzoMO6gzoOSulpKeSSz6mPEoZw==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" } @@ -414,7 +506,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.0.0.tgz", "integrity": "sha512-2EZDBl1WIO/q4DIkIp4s86sdp4ZifL51MoIviLY/gG/mLSuOIEg7J8o6mhbxOTvUJkaN50n+8u41FVsr5KLy/w==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" } @@ -423,7 +514,6 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.1.0.tgz", "integrity": "sha512-rNmcmoQ78IrvNCIt/R9U+cixUHeYAzgusTFgIAv+wQb9HJU4szhpDD6e5GCACmj/JP5KxuCwM96bX3L9v4ZN/g==", - "dev": true, "requires": { "@babel/helper-module-imports": "^7.0.0", "@babel/helper-plugin-utils": "^7.0.0", @@ -434,7 +524,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.0.0.tgz", "integrity": "sha512-AOBiyUp7vYTqz2Jibe1UaAWL0Hl9JUXEgjFvvvcSc9MVDItv46ViXFw2F7SVt1B5k+KWjl44eeXOAk3UDEaJjQ==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" } @@ -443,7 +532,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.0.0.tgz", "integrity": "sha512-GWEMCrmHQcYWISilUrk9GDqH4enf3UmhOEbNbNrlNAX1ssH3MsS1xLOS6rdjRVPgA7XXVPn87tRkdTEoA/dxEg==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", "lodash": "^4.17.10" @@ -453,7 +541,6 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.1.0.tgz", "integrity": "sha512-rNaqoD+4OCBZjM7VaskladgqnZ1LO6o2UxuWSDzljzW21pN1KXkB7BstAVweZdxQkHAujps5QMNOTWesBciKFg==", - "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.0.0", "@babel/helper-define-map": "^7.1.0", @@ -469,7 +556,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.0.0.tgz", "integrity": "sha512-ubouZdChNAv4AAWAgU7QKbB93NU5sHwInEWfp+/OzJKA02E6Woh9RVoX4sZrbRwtybky/d7baTUqwFx+HgbvMA==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" } @@ -478,7 +564,6 @@ "version": "7.1.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.1.3.tgz", "integrity": "sha512-Mb9M4DGIOspH1ExHOUnn2UUXFOyVTiX84fXCd+6B5iWrQg/QMeeRmSwpZ9lnjYLSXtZwiw80ytVMr3zue0ucYw==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" } @@ -487,7 +572,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.0.0.tgz", "integrity": "sha512-00THs8eJxOJUFVx1w8i1MBF4XH4PsAjKjQ1eqN/uCH3YKwP21GCKfrn6YZFZswbOk9+0cw1zGQPHVc1KBlSxig==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", "@babel/helper-regex": "^7.0.0", @@ -498,7 +582,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.0.0.tgz", "integrity": "sha512-w2vfPkMqRkdxx+C71ATLJG30PpwtTpW7DDdLqYt2acXU7YjztzeWW2Jk1T6hKqCLYCcEA5UQM/+xTAm+QCSnuQ==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" } @@ -507,7 +590,6 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.1.0.tgz", "integrity": "sha512-uZt9kD1Pp/JubkukOGQml9tqAeI8NkE98oZnHZ2qHRElmeKCodbTZgOEUtujSCSLhHSBWbzNiFSDIMC4/RBTLQ==", - "dev": true, "requires": { "@babel/helper-builder-binary-assignment-operator-visitor": "^7.1.0", "@babel/helper-plugin-utils": "^7.0.0" @@ -517,7 +599,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.0.0.tgz", "integrity": "sha512-TlxKecN20X2tt2UEr2LNE6aqA0oPeMT1Y3cgz8k4Dn1j5ObT8M3nl9aA37LLklx0PBZKETC9ZAf9n/6SujTuXA==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" } @@ -526,7 +607,6 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.1.0.tgz", "integrity": "sha512-VxOa1TMlFMtqPW2IDYZQaHsFrq/dDoIjgN098NowhexhZcz3UGlvPgZXuE1jEvNygyWyxRacqDpCZt+par1FNg==", - "dev": true, "requires": { "@babel/helper-function-name": "^7.1.0", "@babel/helper-plugin-utils": "^7.0.0" @@ -536,7 +616,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.0.0.tgz", "integrity": "sha512-1NTDBWkeNXgpUcyoVFxbr9hS57EpZYXpje92zv0SUzjdu3enaRwF/l3cmyRnXLtIdyJASyiS6PtybK+CgKf7jA==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" } @@ -545,7 +624,6 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.1.0.tgz", "integrity": "sha512-wt8P+xQ85rrnGNr2x1iV3DW32W8zrB6ctuBkYBbf5/ZzJY99Ob4MFgsZDFgczNU76iy9PWsy4EuxOliDjdKw6A==", - "dev": true, "requires": { "@babel/helper-module-transforms": "^7.1.0", "@babel/helper-plugin-utils": "^7.0.0" @@ -555,7 +633,6 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.1.0.tgz", "integrity": "sha512-wtNwtMjn1XGwM0AXPspQgvmE6msSJP15CX2RVfpTSTNPLhKhaOjaIfBaVfj4iUZ/VrFSodcFedwtPg/NxwQlPA==", - "dev": true, "requires": { "@babel/helper-module-transforms": "^7.1.0", "@babel/helper-plugin-utils": "^7.0.0", @@ -566,7 +643,6 @@ "version": "7.1.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.1.3.tgz", "integrity": "sha512-PvTxgjxQAq4pvVUZF3mD5gEtVDuId8NtWkJsZLEJZMZAW3TvgQl1pmydLLN1bM8huHFVVU43lf0uvjQj9FRkKw==", - "dev": true, "requires": { "@babel/helper-hoist-variables": "^7.0.0", "@babel/helper-plugin-utils": "^7.0.0" @@ -576,7 +652,6 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.1.0.tgz", "integrity": "sha512-enrRtn5TfRhMmbRwm7F8qOj0qEYByqUvTttPEGimcBH4CJHphjyK1Vg7sdU7JjeEmgSpM890IT/efS2nMHwYig==", - "dev": true, "requires": { "@babel/helper-module-transforms": "^7.1.0", "@babel/helper-plugin-utils": "^7.0.0" @@ -586,7 +661,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.0.0.tgz", "integrity": "sha512-yin069FYjah+LbqfGeTfzIBODex/e++Yfa0rH0fpfam9uTbuEeEOx5GLGr210ggOV77mVRNoeqSYqeuaqSzVSw==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" } @@ -595,7 +669,6 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.1.0.tgz", "integrity": "sha512-/O02Je1CRTSk2SSJaq0xjwQ8hG4zhZGNjE8psTsSNPXyLRCODv7/PBozqT5AmQMzp7MI3ndvMhGdqp9c96tTEw==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", "@babel/helper-replace-supers": "^7.1.0" @@ -605,7 +678,6 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.1.0.tgz", "integrity": "sha512-vHV7oxkEJ8IHxTfRr3hNGzV446GAb+0hgbA7o/0Jd76s+YzccdWuTU296FOCOl/xweU4t/Ya4g41yWz80RFCRw==", - "dev": true, "requires": { "@babel/helper-call-delegate": "^7.1.0", "@babel/helper-get-function-arity": "^7.0.0", @@ -613,10 +685,9 @@ } }, "@babel/plugin-transform-react-jsx": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.0.0.tgz", - "integrity": "sha512-0TMP21hXsSUjIQJmu/r7RiVxeFrXRcMUigbKu0BLegJK9PkYodHstaszcig7zxXfaBji2LYUdtqIkHs+hgYkJQ==", - "dev": true, + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.1.6.tgz", + "integrity": "sha512-iU/IUlPEYDRwuqLwqVobzPAZkBOQoZ9xRTBmj6ANuk5g/Egn/zdNGnXlSoKeNmKoYVeIRxx5GZhWmMhLik8dag==", "requires": { "@babel/helper-builder-react-jsx": "^7.0.0", "@babel/helper-plugin-utils": "^7.0.0", @@ -627,7 +698,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.0.0.tgz", "integrity": "sha512-sj2qzsEx8KDVv1QuJc/dEfilkg3RRPvPYx/VnKLtItVQRWt1Wqf5eVCOLZm29CiGFfYYsA3VPjfizTCV0S0Dlw==", - "dev": true, "requires": { "regenerator-transform": "^0.13.3" } @@ -636,7 +706,6 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.1.0.tgz", "integrity": "sha512-WFLMgzu5DLQEah0lKTJzYb14vd6UiES7PTnXcvrPZ1VrwFeJ+mTbvr65fFAsXYMt2bIoOoC0jk76zY1S7HZjUg==", - "dev": true, "requires": { "@babel/helper-module-imports": "^7.0.0", "@babel/helper-plugin-utils": "^7.0.0", @@ -648,7 +717,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.0.0.tgz", "integrity": "sha512-g/99LI4vm5iOf5r1Gdxq5Xmu91zvjhEG5+yZDJW268AZELAu4J1EiFLnkSG3yuUsZyOipVOVUKoGPYwfsTymhw==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" } @@ -657,7 +725,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.0.0.tgz", "integrity": "sha512-L702YFy2EvirrR4shTj0g2xQp7aNwZoWNCkNu2mcoU0uyzMl0XRwDSwzB/xp6DSUFiBmEXuyAyEN16LsgVqGGQ==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" } @@ -666,7 +733,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.0.0.tgz", "integrity": "sha512-LFUToxiyS/WD+XEWpkx/XJBrUXKewSZpzX68s+yEOtIbdnsRjpryDw9U06gYc6klYEij/+KQVRnD3nz3AoKmjw==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", "@babel/helper-regex": "^7.0.0" @@ -676,7 +742,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.0.0.tgz", "integrity": "sha512-vA6rkTCabRZu7Nbl9DfLZE1imj4tzdWcg5vtdQGvj+OH9itNNB6hxuRMHuIY8SGnEt1T9g5foqs9LnrHzsqEFg==", - "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.0.0", "@babel/helper-plugin-utils": "^7.0.0" @@ -686,7 +751,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.0.0.tgz", "integrity": "sha512-1r1X5DO78WnaAIvs5uC48t41LLckxsYklJrZjNKcevyz83sF2l4RHbw29qrCPr/6ksFsdfRpT/ZgxNWHXRnffg==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" } @@ -695,7 +759,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.0.0.tgz", "integrity": "sha512-uJBrJhBOEa3D033P95nPHu3nbFwFE9ZgXsfEitzoIXIwqAZWk7uXcg06yFKXz9FSxBH5ucgU/cYdX0IV8ldHKw==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", "@babel/helper-regex": "^7.0.0", @@ -706,7 +769,6 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.1.0.tgz", "integrity": "sha512-ZLVSynfAoDHB/34A17/JCZbyrzbQj59QC1Anyueb4Bwjh373nVPq5/HMph0z+tCmcDjXDe+DlKQq9ywQuvWrQg==", - "dev": true, "requires": { "@babel/helper-module-imports": "^7.0.0", "@babel/helper-plugin-utils": "^7.0.0", @@ -755,15 +817,14 @@ "version": "7.1.2", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.1.2.tgz", "integrity": "sha512-Y3SCjmhSupzFB6wcv1KmmFucH6gDVnI30WjOcicV10ju0cZjak3Jcs67YLIXBrmZYw1xCrVeJPbycFwrqNyxpg==", - "dev": true, "requires": { "regenerator-runtime": "^0.12.0" } }, "@babel/runtime-corejs2": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs2/-/runtime-corejs2-7.1.2.tgz", - "integrity": "sha512-drxaPByExlcRDKW4ZLubUO4ZkI8/8ax9k9wve1aEthdLKFzjB7XRkOQ0xoTIWGxqdDnWDElkjYq77bt7yrcYJQ==", + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs2/-/runtime-corejs2-7.1.5.tgz", + "integrity": "sha512-WsYRwQsFhVmxkAqwypPTZyV9GpkqMEaAr2zOItOmqSX2GBFaI+eq98CN81e13o0zaUKJOQGYyjhNVqj56nnkYg==", "dev": true, "requires": { "core-js": "^2.5.7", @@ -774,7 +835,6 @@ "version": "7.1.2", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.1.2.tgz", "integrity": "sha512-SY1MmplssORfFiLDcOETrW7fCLl+PavlwMh92rrGcikQaRq4iWPVH0MpwPpY3etVMx6RnDjXtr6VZYr/IbP/Ag==", - "dev": true, "requires": { "@babel/code-frame": "^7.0.0", "@babel/parser": "^7.1.2", @@ -785,7 +845,6 @@ "version": "7.1.4", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.1.4.tgz", "integrity": "sha512-my9mdrAIGdDiSVBuMjpn/oXYpva0/EZwWL3sm3Wcy/AVWO2eXnsoZruOT9jOGNRXU8KbCIu5zsKnXcAJ6PcV6Q==", - "dev": true, "requires": { "@babel/code-frame": "^7.0.0", "@babel/generator": "^7.1.3", @@ -802,7 +861,6 @@ "version": "3.2.6", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, "requires": { "ms": "^2.1.1" } @@ -810,8 +868,7 @@ "ms": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" } } }, @@ -819,7 +876,6 @@ "version": "7.1.3", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.1.3.tgz", "integrity": "sha512-RpPOVfK+yatXyn8n4PB1NW6k9qjinrXrRR8ugBN8fD6hCy5RXI6PSbVqpOJBO9oSaY7Nom4ohj35feb0UR9hSA==", - "dev": true, "requires": { "esutils": "^2.0.2", "lodash": "^4.17.10", @@ -2242,178 +2298,177 @@ "@types/node": { "version": "10.12.0", "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.0.tgz", - "integrity": "sha512-3TUHC3jsBAB7qVRGxT6lWyYo2v96BMmD2PTcl47H25Lu7UXtFH/2qqmKiVrnel6Ne//0TFYf6uvNX+HW2FRkLQ==", - "dev": true + "integrity": "sha512-3TUHC3jsBAB7qVRGxT6lWyYo2v96BMmD2PTcl47H25Lu7UXtFH/2qqmKiVrnel6Ne//0TFYf6uvNX+HW2FRkLQ==" }, "@webassemblyjs/ast": { - "version": "1.7.10", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.7.10.tgz", - "integrity": "sha512-wTUeaByYN2EA6qVqhbgavtGc7fLTOx0glG2IBsFlrFG51uXIGlYBTyIZMf4SPLo3v1bgV/7lBN3l7Z0R6Hswew==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.7.11.tgz", + "integrity": "sha512-ZEzy4vjvTzScC+SH8RBssQUawpaInUdMTYwYYLh54/s8TuT0gBLuyUnppKsVyZEi876VmmStKsUs28UxPgdvrA==", "dev": true, "requires": { - "@webassemblyjs/helper-module-context": "1.7.10", - "@webassemblyjs/helper-wasm-bytecode": "1.7.10", - "@webassemblyjs/wast-parser": "1.7.10" + "@webassemblyjs/helper-module-context": "1.7.11", + "@webassemblyjs/helper-wasm-bytecode": "1.7.11", + "@webassemblyjs/wast-parser": "1.7.11" } }, "@webassemblyjs/floating-point-hex-parser": { - "version": "1.7.10", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.7.10.tgz", - "integrity": "sha512-gMsGbI6I3p/P1xL2UxqhNh1ga2HCsx5VBB2i5VvJFAaqAjd2PBTRULc3BpTydabUQEGlaZCzEUQhLoLG7TvEYQ==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.7.11.tgz", + "integrity": "sha512-zY8dSNyYcgzNRNT666/zOoAyImshm3ycKdoLsyDw/Bwo6+/uktb7p4xyApuef1dwEBo/U/SYQzbGBvV+nru2Xg==", "dev": true }, "@webassemblyjs/helper-api-error": { - "version": "1.7.10", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.7.10.tgz", - "integrity": "sha512-DoYRlPWtuw3yd5BOr9XhtrmB6X1enYF0/54yNvQWGXZEPDF5PJVNI7zQ7gkcKfTESzp8bIBWailaFXEK/jjCsw==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.7.11.tgz", + "integrity": "sha512-7r1qXLmiglC+wPNkGuXCvkmalyEstKVwcueZRP2GNC2PAvxbLYwLLPr14rcdJaE4UtHxQKfFkuDFuv91ipqvXg==", "dev": true }, "@webassemblyjs/helper-buffer": { - "version": "1.7.10", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.7.10.tgz", - "integrity": "sha512-+RMU3dt/dPh4EpVX4u5jxsOlw22tp3zjqE0m3ftU2tsYxnPULb4cyHlgaNd2KoWuwasCQqn8Mhr+TTdbtj3LlA==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.7.11.tgz", + "integrity": "sha512-MynuervdylPPh3ix+mKZloTcL06P8tenNH3sx6s0qE8SLR6DdwnfgA7Hc9NSYeob2jrW5Vql6GVlsQzKQCa13w==", "dev": true }, "@webassemblyjs/helper-code-frame": { - "version": "1.7.10", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.7.10.tgz", - "integrity": "sha512-UiytbpKAULOEab2hUZK2ywXen4gWJVrgxtwY3Kn+eZaaSWaRM8z/7dAXRSoamhKFiBh1uaqxzE/XD9BLlug3gw==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.7.11.tgz", + "integrity": "sha512-T8ESC9KMXFTXA5urJcyor5cn6qWeZ4/zLPyWeEXZ03hj/x9weSokGNkVCdnhSabKGYWxElSdgJ+sFa9G/RdHNw==", "dev": true, "requires": { - "@webassemblyjs/wast-printer": "1.7.10" + "@webassemblyjs/wast-printer": "1.7.11" } }, "@webassemblyjs/helper-fsm": { - "version": "1.7.10", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.7.10.tgz", - "integrity": "sha512-w2vDtUK9xeSRtt5+RnnlRCI7wHEvLjF0XdnxJpgx+LJOvklTZPqWkuy/NhwHSLP19sm9H8dWxKeReMR7sCkGZA==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.7.11.tgz", + "integrity": "sha512-nsAQWNP1+8Z6tkzdYlXT0kxfa2Z1tRTARd8wYnc/e3Zv3VydVVnaeePgqUzFrpkGUyhUUxOl5ML7f1NuT+gC0A==", "dev": true }, "@webassemblyjs/helper-module-context": { - "version": "1.7.10", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.7.10.tgz", - "integrity": "sha512-yE5x/LzZ3XdPdREmJijxzfrf+BDRewvO0zl8kvORgSWmxpRrkqY39KZSq6TSgIWBxkK4SrzlS3BsMCv2s1FpsQ==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.7.11.tgz", + "integrity": "sha512-JxfD5DX8Ygq4PvXDucq0M+sbUFA7BJAv/GGl9ITovqE+idGX+J3QSzJYz+LwQmL7fC3Rs+utvWoJxDb6pmC0qg==", "dev": true }, "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.7.10", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.7.10.tgz", - "integrity": "sha512-u5qy4SJ/OrxKxZqJ9N3qH4ZQgHaAzsopsYwLvoWJY6Q33r8PhT3VPyNMaJ7ZFoqzBnZlCcS/0f4Sp8WBxylXfg==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.7.11.tgz", + "integrity": "sha512-cMXeVS9rhoXsI9LLL4tJxBgVD/KMOKXuFqYb5oCJ/opScWpkCMEz9EJtkonaNcnLv2R3K5jIeS4TRj/drde1JQ==", "dev": true }, "@webassemblyjs/helper-wasm-section": { - "version": "1.7.10", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.7.10.tgz", - "integrity": "sha512-Ecvww6sCkcjatcyctUrn22neSJHLN/TTzolMGG/N7S9rpbsTZ8c6Bl98GpSpV77EvzNijiNRHBG0+JO99qKz6g==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.7.11.tgz", + "integrity": "sha512-8ZRY5iZbZdtNFE5UFunB8mmBEAbSI3guwbrsCl4fWdfRiAcvqQpeqd5KHhSWLL5wuxo53zcaGZDBU64qgn4I4Q==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.7.10", - "@webassemblyjs/helper-buffer": "1.7.10", - "@webassemblyjs/helper-wasm-bytecode": "1.7.10", - "@webassemblyjs/wasm-gen": "1.7.10" + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-buffer": "1.7.11", + "@webassemblyjs/helper-wasm-bytecode": "1.7.11", + "@webassemblyjs/wasm-gen": "1.7.11" } }, "@webassemblyjs/ieee754": { - "version": "1.7.10", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.7.10.tgz", - "integrity": "sha512-HRcWcY+YWt4+s/CvQn+vnSPfRaD4KkuzQFt5MNaELXXHSjelHlSEA8ZcqT69q0GTIuLWZ6JaoKar4yWHVpZHsQ==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.7.11.tgz", + "integrity": "sha512-Mmqx/cS68K1tSrvRLtaV/Lp3NZWzXtOHUW2IvDvl2sihAwJh4ACE0eL6A8FvMyDG9abes3saB6dMimLOs+HMoQ==", "dev": true, "requires": { "@xtuc/ieee754": "^1.2.0" } }, "@webassemblyjs/leb128": { - "version": "1.7.10", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.7.10.tgz", - "integrity": "sha512-og8MciYlA8hvzCLR71hCuZKPbVBfLQeHv7ImKZ4nlyxrYbG7uJHYtHiHu6OV9SqrGuD03H/HtXC4Bgdjfm9FHw==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.7.11.tgz", + "integrity": "sha512-vuGmgZjjp3zjcerQg+JA+tGOncOnJLWVkt8Aze5eWQLwTQGNgVLcyOTqgSCxWTR4J42ijHbBxnuRaL1Rv7XMdw==", "dev": true, "requires": { "@xtuc/long": "4.2.1" } }, "@webassemblyjs/utf8": { - "version": "1.7.10", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.7.10.tgz", - "integrity": "sha512-Ng6Pxv6siyZp635xCSnH3mKmIFgqWPCcGdoo0GBYgyGdxu7cUj4agV7Uu1a8REP66UYUFXJLudeGgd4RvuJAnQ==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.7.11.tgz", + "integrity": "sha512-C6GFkc7aErQIAH+BMrIdVSmW+6HSe20wg57HEC1uqJP8E/xpMjXqQUxkQw07MhNDSDcGpxI9G5JSNOQCqJk4sA==", "dev": true }, "@webassemblyjs/wasm-edit": { - "version": "1.7.10", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.7.10.tgz", - "integrity": "sha512-e9RZFQlb+ZuYcKRcW9yl+mqX/Ycj9+3/+ppDI8nEE/NCY6FoK8f3dKBcfubYV/HZn44b+ND4hjh+4BYBt+sDnA==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.7.11.tgz", + "integrity": "sha512-FUd97guNGsCZQgeTPKdgxJhBXkUbMTY6hFPf2Y4OedXd48H97J+sOY2Ltaq6WGVpIH8o/TGOVNiVz/SbpEMJGg==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.7.10", - "@webassemblyjs/helper-buffer": "1.7.10", - "@webassemblyjs/helper-wasm-bytecode": "1.7.10", - "@webassemblyjs/helper-wasm-section": "1.7.10", - "@webassemblyjs/wasm-gen": "1.7.10", - "@webassemblyjs/wasm-opt": "1.7.10", - "@webassemblyjs/wasm-parser": "1.7.10", - "@webassemblyjs/wast-printer": "1.7.10" + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-buffer": "1.7.11", + "@webassemblyjs/helper-wasm-bytecode": "1.7.11", + "@webassemblyjs/helper-wasm-section": "1.7.11", + "@webassemblyjs/wasm-gen": "1.7.11", + "@webassemblyjs/wasm-opt": "1.7.11", + "@webassemblyjs/wasm-parser": "1.7.11", + "@webassemblyjs/wast-printer": "1.7.11" } }, "@webassemblyjs/wasm-gen": { - "version": "1.7.10", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.7.10.tgz", - "integrity": "sha512-M0lb6cO2Y0PzDye/L39PqwV+jvO+2YxEG5ax+7dgq7EwXdAlpOMx1jxyXJTScQoeTpzOPIb+fLgX/IkLF8h2yw==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.7.11.tgz", + "integrity": "sha512-U/KDYp7fgAZX5KPfq4NOupK/BmhDc5Kjy2GIqstMhvvdJRcER/kUsMThpWeRP8BMn4LXaKhSTggIJPOeYHwISA==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.7.10", - "@webassemblyjs/helper-wasm-bytecode": "1.7.10", - "@webassemblyjs/ieee754": "1.7.10", - "@webassemblyjs/leb128": "1.7.10", - "@webassemblyjs/utf8": "1.7.10" + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-wasm-bytecode": "1.7.11", + "@webassemblyjs/ieee754": "1.7.11", + "@webassemblyjs/leb128": "1.7.11", + "@webassemblyjs/utf8": "1.7.11" } }, "@webassemblyjs/wasm-opt": { - "version": "1.7.10", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.7.10.tgz", - "integrity": "sha512-R66IHGCdicgF5ZliN10yn5HaC7vwYAqrSVJGjtJJQp5+QNPBye6heWdVH/at40uh0uoaDN/UVUfXK0gvuUqtVg==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.7.11.tgz", + "integrity": "sha512-XynkOwQyiRidh0GLua7SkeHvAPXQV/RxsUeERILmAInZegApOUAIJfRuPYe2F7RcjOC9tW3Cb9juPvAC/sCqvg==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.7.10", - "@webassemblyjs/helper-buffer": "1.7.10", - "@webassemblyjs/wasm-gen": "1.7.10", - "@webassemblyjs/wasm-parser": "1.7.10" + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-buffer": "1.7.11", + "@webassemblyjs/wasm-gen": "1.7.11", + "@webassemblyjs/wasm-parser": "1.7.11" } }, "@webassemblyjs/wasm-parser": { - "version": "1.7.10", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.7.10.tgz", - "integrity": "sha512-AEv8mkXVK63n/iDR3T693EzoGPnNAwKwT3iHmKJNBrrALAhhEjuPzo/lTE4U7LquEwyvg5nneSNdTdgrBaGJcA==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.7.11.tgz", + "integrity": "sha512-6lmXRTrrZjYD8Ng8xRyvyXQJYUQKYSXhJqXOBLw24rdiXsHAOlvw5PhesjdcaMadU/pyPQOJ5dHreMjBxwnQKg==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.7.10", - "@webassemblyjs/helper-api-error": "1.7.10", - "@webassemblyjs/helper-wasm-bytecode": "1.7.10", - "@webassemblyjs/ieee754": "1.7.10", - "@webassemblyjs/leb128": "1.7.10", - "@webassemblyjs/utf8": "1.7.10" + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-api-error": "1.7.11", + "@webassemblyjs/helper-wasm-bytecode": "1.7.11", + "@webassemblyjs/ieee754": "1.7.11", + "@webassemblyjs/leb128": "1.7.11", + "@webassemblyjs/utf8": "1.7.11" } }, "@webassemblyjs/wast-parser": { - "version": "1.7.10", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.7.10.tgz", - "integrity": "sha512-YTPEtOBljkCL0VjDp4sHe22dAYSm3ZwdJ9+2NTGdtC7ayNvuip1wAhaAS8Zt9Q6SW9E5Jf5PX7YE3XWlrzR9cw==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.7.11.tgz", + "integrity": "sha512-lEyVCg2np15tS+dm7+JJTNhNWq9yTZvi3qEhAIIOaofcYlUp0UR5/tVqOwa/gXYr3gjwSZqw+/lS9dscyLelbQ==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.7.10", - "@webassemblyjs/floating-point-hex-parser": "1.7.10", - "@webassemblyjs/helper-api-error": "1.7.10", - "@webassemblyjs/helper-code-frame": "1.7.10", - "@webassemblyjs/helper-fsm": "1.7.10", + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/floating-point-hex-parser": "1.7.11", + "@webassemblyjs/helper-api-error": "1.7.11", + "@webassemblyjs/helper-code-frame": "1.7.11", + "@webassemblyjs/helper-fsm": "1.7.11", "@xtuc/long": "4.2.1" } }, "@webassemblyjs/wast-printer": { - "version": "1.7.10", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.7.10.tgz", - "integrity": "sha512-mJ3QKWtCchL1vhU/kZlJnLPuQZnlDOdZsyP0bbLWPGdYsQDnSBvyTLhzwBA3QAMlzEL9V4JHygEmK6/OTEyytA==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.7.11.tgz", + "integrity": "sha512-m5vkAsuJ32QpkdkDOUPGSltrg8Cuk3KBx4YrmAGQwCZPRdUHXxG4phIOuuycLemHFr74sWL9Wthqss4fzdzSwg==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.7.10", - "@webassemblyjs/wast-parser": "1.7.10", + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/wast-parser": "1.7.11", "@xtuc/long": "4.2.1" } }, @@ -2421,17 +2476,15 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/@wordpress/a11y/-/a11y-2.0.2.tgz", "integrity": "sha512-YtO4GG5XQX/y+y9/9nnO7IZfyLfgSLXyRgvt9Om4LTUULF4VClol+x00zuQHcHUdQwINMnAkcG51ni9dkXbxgg==", - "dev": true, "requires": { "@babel/runtime": "^7.0.0", "@wordpress/dom-ready": "^2.0.2" } }, "@wordpress/api-fetch": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@wordpress/api-fetch/-/api-fetch-2.2.0.tgz", - "integrity": "sha512-tmN3fneHJsRu4jifPK90e40dsiD9abm5gaZR7MYHCmnlD4WU+Axzhs6Br2PdmaX4QMY1knFCLcu7mcg0B55VCQ==", - "dev": true, + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@wordpress/api-fetch/-/api-fetch-2.2.2.tgz", + "integrity": "sha512-yqJjHR+EjbMZ9BO3DWJqydvlRZoS9M1NvdwXouzkmxCCdVF4JfmWdydfakeXreYH8+T01V/JjP2rZYcQDn36/Q==", "requires": { "@babel/runtime": "^7.0.0", "@wordpress/hooks": "^2.0.3", @@ -2443,7 +2496,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/@wordpress/i18n/-/i18n-3.0.1.tgz", "integrity": "sha512-Ut6ihDjcZ7zpU44/WurZrFxrLcMl3Gq+hW8Hb6MTF6+X6Y2fd7QFu3lMvopYNwF8gxWtjvH5n3NIQ6B9DLt7Ng==", - "dev": true, "requires": { "@babel/runtime": "^7.0.0", "gettext-parser": "^1.3.1", @@ -2456,7 +2508,6 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/@wordpress/url/-/url-2.2.0.tgz", "integrity": "sha512-Y1Vjbvkcfeh9scstzArW0f4G0v1YpevZcjlPvVM77gqXPxKhoBobc/XyErUaqWbozji6L2YE/baP/bYSOaswug==", - "dev": true, "requires": { "@babel/runtime": "^7.0.0", "qs": "^6.5.2" @@ -2503,14 +2554,12 @@ "@wordpress/browserslist-config": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/@wordpress/browserslist-config/-/browserslist-config-2.2.2.tgz", - "integrity": "sha512-RZ9XeDeXTc/l3RdSnfYYwcsylFPouV+2ZpQQaAgALSXthMWJT2wU61zD4mH9aMI5Oo6Z8OUVI2vOZM/7HObPxw==", - "dev": true + "integrity": "sha512-RZ9XeDeXTc/l3RdSnfYYwcsylFPouV+2ZpQQaAgALSXthMWJT2wU61zD4mH9aMI5Oo6Z8OUVI2vOZM/7HObPxw==" }, "@wordpress/components": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@wordpress/components/-/components-3.0.0.tgz", "integrity": "sha512-W0ca62EGf2as+wintOzZP1W4DzKBJmuhSsrbuKLUXMCZPh9x0KIuedlTOrRYh5bkK0mWtQ1DQRwbnh01dYBN2A==", - "dev": true, "requires": { "@babel/runtime": "^7.0.0", "@wordpress/a11y": "^2.0.0", @@ -2541,15 +2590,13 @@ "dependencies": { "hoist-non-react-statics": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-1.2.0.tgz", - "integrity": "sha1-qkSM8JhtVcxAdzsXF0t90GbLfPs=", - "dev": true + "resolved": "http://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-1.2.0.tgz", + "integrity": "sha1-qkSM8JhtVcxAdzsXF0t90GbLfPs=" }, "react-click-outside": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/react-click-outside/-/react-click-outside-2.3.1.tgz", "integrity": "sha1-MYc3698IGko7zUaCVmNnTL6YNus=", - "dev": true, "requires": { "hoist-non-react-statics": "^1.2.0" } @@ -2560,7 +2607,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/@wordpress/compose/-/compose-2.0.5.tgz", "integrity": "sha512-bbf+4nph+/rFBou7PTUyx8rwHVR08ymBgxnmShGTTjuiVxcrz0Gu7Wu2wxulsZobOYaiqvQkCEHKceNsBxJwiA==", - "dev": true, "requires": { "@babel/runtime": "^7.0.0", "@wordpress/element": "^2.1.4", @@ -2572,7 +2618,6 @@ "version": "2.1.4", "resolved": "https://registry.npmjs.org/@wordpress/element/-/element-2.1.4.tgz", "integrity": "sha512-y/RpvYNd2VeLWXemxEXdMOnUa+HUC0sde2o7gEHKud0LB14xFU1ASif/pz/LP+vSvExcvhj8cu4Sq8tKDzRRPw==", - "dev": true, "requires": { "@babel/runtime": "^7.0.0", "@wordpress/escape-html": "^1.0.1", @@ -2583,29 +2628,61 @@ } } }, - "@wordpress/data": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@wordpress/data/-/data-2.1.4.tgz", - "integrity": "sha512-Emfhszi7huasdDhngwk9HvRLUiotCNo9mDDk2Q9VGpGb9SfpQp+84PvenhreiZtezUR+7nUnSQuAJ2d8rUP37Q==", + "@wordpress/custom-templated-path-webpack-plugin": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@wordpress/custom-templated-path-webpack-plugin/-/custom-templated-path-webpack-plugin-1.1.5.tgz", + "integrity": "sha512-CW5riqe6orufjF3NvKZ3N3a4Xx5EwtSvoFlXDeCMM+zeQLJ95mxRQSZZP5vJZ6DgZ29dNc+w3WUQxGWqQWiJbg==", "dev": true, "requires": { "@babel/runtime": "^7.0.0", - "@wordpress/compose": "^2.0.5", - "@wordpress/deprecated": "^2.0.2", - "@wordpress/element": "^2.1.4", + "escape-string-regexp": "^1.0.5" + } + }, + "@wordpress/data": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@wordpress/data/-/data-3.1.0.tgz", + "integrity": "sha512-XQNSOy7xSHVi4KGxOOd6gJJ3+Qq4XWZMK5hMBSEwVCiyIcSbcP6I1AT1NnnPuJeH94BmFCPNADElHB4gazg8xA==", + "requires": { + "@babel/runtime": "^7.0.0", + "@wordpress/compose": "^2.1.0", + "@wordpress/deprecated": "^2.0.3", + "@wordpress/element": "^2.1.5", "@wordpress/is-shallow-equal": "^1.1.4", "@wordpress/redux-routine": "^3.0.3", - "equivalent-key-map": "^0.2.0", + "equivalent-key-map": "^0.2.2", "is-promise": "^2.1.0", "lodash": "^4.17.10", - "redux": "^4.0.0" + "redux": "^4.0.0", + "turbo-combine-reducers": "^1.0.2" + }, + "dependencies": { + "@wordpress/compose": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@wordpress/compose/-/compose-2.1.0.tgz", + "integrity": "sha512-QtjesFxEdLAUoBxFQ7rkpUG5aA4ccRxZI71fz0RkMiBVKoUHIqy+R6VGViL/wkdYigmfD9KU89Rg3Ksk40hVIA==", + "requires": { + "@babel/runtime": "^7.0.0", + "@wordpress/deprecated": "^2.0.3", + "@wordpress/element": "^2.1.5", + "@wordpress/is-shallow-equal": "^1.1.4", + "lodash": "^4.17.10" + } + }, + "@wordpress/deprecated": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@wordpress/deprecated/-/deprecated-2.0.3.tgz", + "integrity": "sha512-5v8h6BJ9xQFTho7ucitshpIahD+rVnAhgc/4juYmPLb9/GJzwY1J91Ve5mcjcjgWhdtjBKO0TCq/S4PCfS812w==", + "requires": { + "@babel/runtime": "^7.0.0", + "@wordpress/hooks": "^2.0.3" + } + } } }, "@wordpress/date": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/@wordpress/date/-/date-2.1.0.tgz", "integrity": "sha512-MMDU2/N0unnwKTmaeCYy4fW/CuyCdM5t+/ANXVigBxY/IiOGeRXnmiU4VHK1BshEnsWRJz687MmEGEkxVpwd8w==", - "dev": true, "requires": { "@babel/runtime": "^7.0.0", "moment": "^2.22.1", @@ -2616,7 +2693,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/@wordpress/deprecated/-/deprecated-2.0.2.tgz", "integrity": "sha512-5qNehHD7/duvouuGjMdGREQORs9LFMVkyFysfWvafZ919zAl0DAKEXsBoxcMSvvqBqCf5MKJBnQBVY4DeS6AEg==", - "dev": true, "requires": { "@babel/runtime": "^7.0.0", "@wordpress/hooks": "^2.0.2" @@ -2626,7 +2702,6 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/@wordpress/dom/-/dom-2.0.4.tgz", "integrity": "sha512-uW/yeWayoSu6uUA+xrM+yCbNJc3oQfga1Y1PUgXvowv0ydn5Qhgh2Dj07ANgg1AncZqFZsObPerBFNloaJhsvQ==", - "dev": true, "requires": { "@babel/runtime": "^7.0.0", "lodash": "^4.17.10" @@ -2636,7 +2711,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/@wordpress/dom-ready/-/dom-ready-2.0.2.tgz", "integrity": "sha512-SENsbiIesC0Oz6qTLHpYxo6aW9/NgFYkXq4TGjUBA5LLNJmBf9AhPKX9rpgh8Y3+DKVobMdX8IKhfRrQYiqRiw==", - "dev": true, "requires": { "@babel/runtime": "^7.0.0" } @@ -2645,7 +2719,6 @@ "version": "2.1.5", "resolved": "https://registry.npmjs.org/@wordpress/element/-/element-2.1.5.tgz", "integrity": "sha512-y567y5SZv3VXDrUw/qpO7ElrTc8/BhumAivVlpAItychfn/PdTxd2l5V1Cc91Uc2/JDoAhPCRIO23UFWX+Ehtw==", - "dev": true, "requires": { "@babel/runtime": "^7.0.0", "@wordpress/escape-html": "^1.0.1", @@ -2658,7 +2731,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/@wordpress/escape-html/-/escape-html-1.0.1.tgz", "integrity": "sha512-ywRXV6WHbUWlqEDXQcWLmyG+/oBw8myTp+KTbkRRF2EJvx/cqL9XF55I2+aeZ5Q0VYRXXGHp6Tp1iRfJjr/rNQ==", - "dev": true, "requires": { "@babel/runtime": "^7.0.0" } @@ -2667,7 +2739,6 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/@wordpress/hooks/-/hooks-2.0.3.tgz", "integrity": "sha512-dMXM8VX1MfMN+vrstOdpCXioo4evtvjTESVnSc+AjKVOAWOCbuT/ci3aDLy8DreyDrWYgUR35Gfh7Y8JJix7vA==", - "dev": true, "requires": { "@babel/runtime": "^7.0.0" } @@ -2676,7 +2747,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/@wordpress/html-entities/-/html-entities-2.0.2.tgz", "integrity": "sha512-cxG7YjH9EMfZyeLJAd/Vc1nFJxitMSzybv71iMPP3Dqqgz3jixX6oSe4ukTqfoOKBaF7pY7LzS6eTKu7KAmyZw==", - "dev": true, "requires": { "@babel/runtime": "^7.0.0" } @@ -2685,7 +2755,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/@wordpress/i18n/-/i18n-2.0.0.tgz", "integrity": "sha512-q8rY7RIkHRmtZpkodk+1WJMwr8r/NIr7oFK67/1+ek1ervp+psSCAPF543m6DzYxCDxDj/m/Q55d31ImpvU/xg==", - "dev": true, "requires": { "@babel/runtime": "^7.0.0", "gettext-parser": "^1.3.1", @@ -2698,7 +2767,6 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/@wordpress/is-shallow-equal/-/is-shallow-equal-1.1.4.tgz", "integrity": "sha512-ihJrYrW+G9GWtQjyB44DVKMCoiTTYPl5T/g1Ix9PMrKl2rk5uVbJw9yMmhik/jTIQqubpzhxGtrqsddwuUH1sw==", - "dev": true, "requires": { "@babel/runtime": "^7.0.0" } @@ -2707,7 +2775,6 @@ "version": "2.0.6", "resolved": "https://registry.npmjs.org/@wordpress/jest-console/-/jest-console-2.0.6.tgz", "integrity": "sha512-WWDhFHljezit3+4QJWy40NufWj2a52264KJ9E0/WZ4IEH2O45q3iu21Ip6ckEfzXVXxnV0vMXrJTLzTXqdsxEA==", - "dev": true, "requires": { "@babel/runtime": "^7.0.0", "jest-matcher-utils": "^22.4.3", @@ -2728,10 +2795,9 @@ } }, "@wordpress/keycodes": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@wordpress/keycodes/-/keycodes-2.0.2.tgz", - "integrity": "sha512-miMB6uvKZzZmgTb7qSr0NBOadWJ9Eb5Tak/+DRsVrgt9RP4zeCh9Le2T7hOWvNPU/54x2v1eHRrU0L+JDm2JAA==", - "dev": true, + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@wordpress/keycodes/-/keycodes-2.0.3.tgz", + "integrity": "sha512-cg4IHxz9BjRHBIhs/e0NwO/snImNqMQLZfduPf6Y+GGlq28BbQuxnucDj0ktYw/4X9jxf6IHzWUq9bkX65QGiA==", "requires": { "@babel/runtime": "^7.0.0", "lodash": "^4.17.10" @@ -2740,8 +2806,7 @@ "@wordpress/npm-package-json-lint-config": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/@wordpress/npm-package-json-lint-config/-/npm-package-json-lint-config-1.1.5.tgz", - "integrity": "sha512-MSdkZ1xi7prwexnn4BTcEWU9zxDD6GS79KnVy8e8+nDUcd2Kqz2wonBG7dLISEmlFbAu/oiDTuKInac0HkSVuA==", - "dev": true + "integrity": "sha512-MSdkZ1xi7prwexnn4BTcEWU9zxDD6GS79KnVy8e8+nDUcd2Kqz2wonBG7dLISEmlFbAu/oiDTuKInac0HkSVuA==" }, "@wordpress/postcss-themes": { "version": "1.0.4", @@ -2757,7 +2822,6 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/@wordpress/redux-routine/-/redux-routine-3.0.3.tgz", "integrity": "sha512-wT8GoG0qtwxq8J5g0uYxZYoNcnhQloFvMTkDQsaWWAvaO1wsTaamYbusHc6q7PS+EsS2TioQkZsxTtei6YwBBg==", - "dev": true, "requires": { "@babel/runtime": "^7.0.0", "is-promise": "^2.1.0", @@ -2765,13 +2829,12 @@ } }, "@wordpress/scripts": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@wordpress/scripts/-/scripts-2.4.0.tgz", - "integrity": "sha512-rPYnNhuEFSOCQ0+iC06zoX5Zw20LAh4buW2Nu8xC8hwAw01ngM8EE9/GLRW4xzKjwFgNecz/w/hfhrrKj6XQzA==", - "dev": true, + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@wordpress/scripts/-/scripts-2.4.1.tgz", + "integrity": "sha512-FXr451wUvVSve7am1lk7CthGJqjiqFMyNBYykQdZQ5OBWhXbvO8zMu5MCkISWOHIXXpJ3hedvrujoBp/psx+Fg==", "requires": { "@wordpress/babel-preset-default": "^3.0.1", - "@wordpress/jest-preset-default": "^2.0.6", + "@wordpress/jest-preset-default": "^3.0.0", "@wordpress/npm-package-json-lint-config": "^1.1.5", "babel-eslint": "8.0.3", "chalk": "^2.4.1", @@ -2787,7 +2850,6 @@ "version": "7.0.0-beta.31", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.31.tgz", "integrity": "sha512-yd7CkUughvHQoEahQqcMdrZw6o/6PwUxiRkfZuVDVHCDe77mysD/suoNyk5mK6phTnRW1kyIbPHyCJgxw++LXg==", - "dev": true, "requires": { "chalk": "^2.0.0", "esutils": "^2.0.2", @@ -2798,7 +2860,6 @@ "version": "7.0.0-beta.31", "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.31.tgz", "integrity": "sha512-c+DAyp8LMm2nzSs2uXEuxp4LYGSUYEyHtU3fU57avFChjsnTmmpWmXj2dv0yUxHTEydgVAv5fIzA+4KJwoqWDA==", - "dev": true, "requires": { "@babel/helper-get-function-arity": "7.0.0-beta.31", "@babel/template": "7.0.0-beta.31", @@ -2810,7 +2871,6 @@ "version": "7.0.0-beta.31", "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.31.tgz", "integrity": "sha512-m7rVVX/dMLbbB9NCzKYRrrFb0qZxgpmQ4Wv6y7zEsB6skoJHRuXVeb/hAFze79vXBbuD63ci7AVHXzAdZSk9KQ==", - "dev": true, "requires": { "@babel/types": "7.0.0-beta.31" } @@ -2819,7 +2879,6 @@ "version": "7.0.0-beta.31", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.0.0-beta.31.tgz", "integrity": "sha512-97IRmLvoDhIDSQkqklVt3UCxJsv0LUEVb/0DzXWtc8Lgiyxj567qZkmTG9aR21CmcJVVIvq2Y/moZj4oEpl5AA==", - "dev": true, "requires": { "@babel/code-frame": "7.0.0-beta.31", "@babel/types": "7.0.0-beta.31", @@ -2831,7 +2890,6 @@ "version": "7.0.0-beta.31", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.0.0-beta.31.tgz", "integrity": "sha512-3N+VJW+KlezEjFBG7WSYeMyC5kIqVLPb/PGSzCDPFcJrnArluD1GIl7Y3xC7cjKiTq2/JohaLWHVPjJWHlo9Gg==", - "dev": true, "requires": { "@babel/code-frame": "7.0.0-beta.31", "@babel/helper-function-name": "7.0.0-beta.31", @@ -2847,7 +2905,6 @@ "version": "7.0.0-beta.31", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0-beta.31.tgz", "integrity": "sha512-exAHB+NeFGxkfQ5dSUD03xl3zYGneeSk2Mw2ldTt/nTvYxuDiuSp3DlxgUBgzbdTFG4fbwPk0WtKWOoTXCmNGg==", - "dev": true, "requires": { "esutils": "^2.0.2", "lodash": "^4.2.0", @@ -2858,7 +2915,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/@wordpress/babel-preset-default/-/babel-preset-default-3.0.1.tgz", "integrity": "sha512-5pbmYh0b4flwyAbuEMTOgTZJ1jqn5iucXhoAESWHZyHCn6D+s36ws0RkFrefz1mYQv4KgIoVpqshDXdN9wR/Bg==", - "dev": true, "requires": { "@babel/plugin-proposal-async-generator-functions": "^7.0.0", "@babel/plugin-proposal-object-rest-spread": "^7.0.0", @@ -2870,11 +2926,22 @@ "babel-core": "^7.0.0-bridge.0" } }, + "@wordpress/jest-preset-default": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@wordpress/jest-preset-default/-/jest-preset-default-3.0.0.tgz", + "integrity": "sha512-INJw7EAD5WLeSiOjOSQM2dZY/kC2/GKewrodCHslF6Ciqg/bGTlqmHoWhcutZ13ef5p5fcSM6pmsBqJbzOGOJA==", + "requires": { + "@wordpress/jest-console": "^2.0.6", + "babel-jest": "^23.4.2", + "enzyme": "^3.3.0", + "enzyme-adapter-react-16": "^1.1.1", + "jest-enzyme": "^6.0.2" + } + }, "babel-eslint": { "version": "8.0.3", "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-8.0.3.tgz", "integrity": "sha512-7D4iUpylEiKJPGbeSAlNddGcmA41PadgZ6UAb6JVyh003h3d0EbZusYFBR/+nBgqtaVJM2J2zUVa3N0hrpMH6g==", - "dev": true, "requires": { "@babel/code-frame": "7.0.0-beta.31", "@babel/traverse": "7.0.0-beta.31", @@ -2885,14 +2952,12 @@ "babylon": { "version": "7.0.0-beta.31", "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.31.tgz", - "integrity": "sha512-6lm2mV3S51yEnKmQQNnswoABL1U1H1KHoCCVwdwI3hvIv+W7ya4ki7Aw4o4KxtUHjNKkK5WpZb22rrMMOcJXJQ==", - "dev": true + "integrity": "sha512-6lm2mV3S51yEnKmQQNnswoABL1U1H1KHoCCVwdwI3hvIv+W7ya4ki7Aw4o4KxtUHjNKkK5WpZb22rrMMOcJXJQ==" }, "debug": { "version": "3.2.6", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, "requires": { "ms": "^2.1.1" } @@ -2901,7 +2966,6 @@ "version": "4.19.1", "resolved": "http://registry.npmjs.org/eslint/-/eslint-4.19.1.tgz", "integrity": "sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ==", - "dev": true, "requires": { "ajv": "^5.3.0", "babel-code-frame": "^6.22.0", @@ -2946,34 +3010,29 @@ "globals": { "version": "11.8.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.8.0.tgz", - "integrity": "sha512-io6LkyPVuzCHBSQV9fmOwxZkUk6nIaGmxheLDgmuFv89j0fm2aqDbIXKAGfzCMHqz3HLF2Zf8WSG6VqMh2qFmA==", - "dev": true + "integrity": "sha512-io6LkyPVuzCHBSQV9fmOwxZkUk6nIaGmxheLDgmuFv89j0fm2aqDbIXKAGfzCMHqz3HLF2Zf8WSG6VqMh2qFmA==" } } }, "globals": { "version": "10.4.0", "resolved": "https://registry.npmjs.org/globals/-/globals-10.4.0.tgz", - "integrity": "sha512-uNUtxIZpGyuaq+5BqGGQHsL4wUlJAXRqOm6g3Y48/CWNGTLONgBibI0lh6lGxjR2HljFYUfszb+mk4WkgMntsA==", - "dev": true + "integrity": "sha512-uNUtxIZpGyuaq+5BqGGQHsL4wUlJAXRqOm6g3Y48/CWNGTLONgBibI0lh6lGxjR2HljFYUfszb+mk4WkgMntsA==" }, "js-tokens": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", - "dev": true + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" }, "ms": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" }, "strip-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, "requires": { "ansi-regex": "^3.0.0" } @@ -2984,12 +3043,63 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/@wordpress/url/-/url-2.1.0.tgz", "integrity": "sha512-MPWFszPleQ+ofDE8ZMpVLOwK/yAjf6L9f7F9wxE82rQjRzUSkrs+Z7Q9ShYiD5HT7o4J96PY9S0XnoHW/XKnDg==", - "dev": true, "requires": { "@babel/runtime": "^7.0.0", "qs": "^6.5.2" } }, + "@wordpress/viewport": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@wordpress/viewport/-/viewport-2.0.7.tgz", + "integrity": "sha512-bvJytESuTdoTr5GmLmKlLoWp4WfIsN7Jpe5u+EBrbbWXYlDPMBgEnD83bu8myPmQb56YJPPz561YCeTZMPjhDQ==", + "requires": { + "@babel/runtime": "^7.0.0", + "@wordpress/compose": "^2.1.0", + "@wordpress/data": "^3.0.1", + "@wordpress/element": "^2.1.5", + "lodash": "^4.17.10" + }, + "dependencies": { + "@wordpress/compose": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@wordpress/compose/-/compose-2.1.0.tgz", + "integrity": "sha512-QtjesFxEdLAUoBxFQ7rkpUG5aA4ccRxZI71fz0RkMiBVKoUHIqy+R6VGViL/wkdYigmfD9KU89Rg3Ksk40hVIA==", + "requires": { + "@babel/runtime": "^7.0.0", + "@wordpress/deprecated": "^2.0.3", + "@wordpress/element": "^2.1.5", + "@wordpress/is-shallow-equal": "^1.1.4", + "lodash": "^4.17.10" + } + }, + "@wordpress/data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@wordpress/data/-/data-3.0.1.tgz", + "integrity": "sha512-7sMJ1EhaONY6vT7Miq534xhtKF+J/LecdiyX4r+DLk1Zgeacl48hUwGGvCzJ+CzwJZ06L1F/5lIEAiWM6he77A==", + "requires": { + "@babel/runtime": "^7.0.0", + "@wordpress/compose": "^2.1.0", + "@wordpress/element": "^2.1.5", + "@wordpress/is-shallow-equal": "^1.1.4", + "@wordpress/redux-routine": "^3.0.3", + "equivalent-key-map": "^0.2.2", + "is-promise": "^2.1.0", + "lodash": "^4.17.10", + "redux": "^4.0.0", + "turbo-combine-reducers": "^1.0.2" + } + }, + "@wordpress/deprecated": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@wordpress/deprecated/-/deprecated-2.0.3.tgz", + "integrity": "sha512-5v8h6BJ9xQFTho7ucitshpIahD+rVnAhgc/4juYmPLb9/GJzwY1J91Ve5mcjcjgWhdtjBKO0TCq/S4PCfS812w==", + "requires": { + "@babel/runtime": "^7.0.0", + "@wordpress/hooks": "^2.0.3" + } + } + } + }, "@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", @@ -3015,8 +3125,7 @@ "abab": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.0.tgz", - "integrity": "sha512-sY5AXXVZv4Y1VACTtR11UJCPHHudgY5i26Qj5TypE6DKlIApbwb5uqhXcJ5UUGbvZNRh7EeIoW+LrJumBsKp7w==", - "dev": true + "integrity": "sha512-sY5AXXVZv4Y1VACTtR11UJCPHHudgY5i26Qj5TypE6DKlIApbwb5uqhXcJ5UUGbvZNRh7EeIoW+LrJumBsKp7w==" }, "abbrev": { "version": "1.1.1", @@ -3027,8 +3136,7 @@ "acorn": { "version": "5.7.3", "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", - "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", - "dev": true + "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==" }, "acorn-dynamic-import": { "version": "3.0.0", @@ -3043,7 +3151,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.0.tgz", "integrity": "sha512-hMtHj3s5RnuhvHPowpBYvJVj3rAar82JiDQHvGs1zO0l10ocX/xEdBShNHTJaboucJUsScghp74pH3s7EnHHQw==", - "dev": true, "requires": { "acorn": "^6.0.1", "acorn-walk": "^6.0.1" @@ -3052,8 +3159,7 @@ "acorn": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.0.2.tgz", - "integrity": "sha512-GXmKIvbrN3TV7aVqAzVFaMW8F8wzVX7voEBRO3bDA64+EX37YSayggRJP5Xig6HYHBkWKpFg9W5gg6orklubhg==", - "dev": true + "integrity": "sha512-GXmKIvbrN3TV7aVqAzVFaMW8F8wzVX7voEBRO3bDA64+EX37YSayggRJP5Xig6HYHBkWKpFg9W5gg6orklubhg==" } } }, @@ -3061,7 +3167,6 @@ "version": "3.0.1", "resolved": "http://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", - "dev": true, "requires": { "acorn": "^3.0.4" }, @@ -3069,16 +3174,14 @@ "acorn": { "version": "3.3.0", "resolved": "http://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", - "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", - "dev": true + "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=" } } }, "acorn-walk": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.1.0.tgz", - "integrity": "sha512-ugTb7Lq7u4GfWSqqpwE0bGyoBZNMTok/zDBXxfEG0QM50jNlGhIWjRC1pPN7bvV1anhF+bs+/gNcRw+o55Evbg==", - "dev": true + "integrity": "sha512-ugTb7Lq7u4GfWSqqpwE0bGyoBZNMTok/zDBXxfEG0QM50jNlGhIWjRC1pPN7bvV1anhF+bs+/gNcRw+o55Evbg==" }, "agent-base": { "version": "4.2.1", @@ -3118,7 +3221,6 @@ "version": "5.5.2", "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", - "dev": true, "requires": { "co": "^4.6.0", "fast-deep-equal": "^1.0.0", @@ -3135,8 +3237,7 @@ "ajv-keywords": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", - "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=", - "dev": true + "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=" }, "amdefine": { "version": "1.0.1", @@ -3156,20 +3257,17 @@ "ansi-escapes": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", - "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==", - "dev": true + "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==" }, "ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" }, "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, "requires": { "color-convert": "^1.9.0" } @@ -3178,7 +3276,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, "requires": { "micromatch": "^3.1.4", "normalize-path": "^2.1.1" @@ -3188,7 +3285,6 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz", "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=", - "dev": true, "requires": { "default-require-extensions": "^1.0.0" } @@ -3213,7 +3309,6 @@ "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, "requires": { "sprintf-js": "~1.0.2" } @@ -3231,26 +3326,22 @@ "arity-n": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/arity-n/-/arity-n-1.0.4.tgz", - "integrity": "sha1-2edrEXM+CFacCEeuezmyhgswt0U=", - "dev": true + "integrity": "sha1-2edrEXM+CFacCEeuezmyhgswt0U=" }, "arr-diff": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" }, "arr-flatten": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" }, "arr-union": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" }, "array-differ": { "version": "1.0.0", @@ -3261,14 +3352,12 @@ "array-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", - "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", - "dev": true + "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=" }, "array-find-index": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", - "dev": true + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=" }, "array-ify": { "version": "1.0.0", @@ -3290,7 +3379,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, "requires": { "array-uniq": "^1.0.1" } @@ -3298,14 +3386,12 @@ "array-uniq": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" }, "array-unique": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" }, "array.prototype.find": { "version": "2.0.4", @@ -3329,8 +3415,7 @@ "arrify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" }, "asap": { "version": "2.0.6", @@ -3341,7 +3426,6 @@ "version": "0.2.4", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "dev": true, "requires": { "safer-buffer": "~2.1.0" } @@ -3386,14 +3470,12 @@ "assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" }, "assign-symbols": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" }, "ast-types": { "version": "0.11.6", @@ -3410,14 +3492,12 @@ "astral-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", - "dev": true + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==" }, "async": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", - "dev": true, "requires": { "lodash": "^4.17.10" } @@ -3437,20 +3517,17 @@ "async-limiter": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", - "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==", - "dev": true + "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==" }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, "atob": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" }, "autoprefixer": { "version": "9.3.1", @@ -3520,14 +3597,12 @@ "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" }, "aws4": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", - "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", - "dev": true + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" }, "axobject-query": { "version": "2.0.2", @@ -3542,7 +3617,6 @@ "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "dev": true, "requires": { "chalk": "^1.1.3", "esutils": "^2.0.2", @@ -3552,14 +3626,12 @@ "ansi-styles": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" }, "chalk": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, "requires": { "ansi-styles": "^2.2.1", "escape-string-regexp": "^1.0.2", @@ -3571,22 +3643,19 @@ "js-tokens": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", - "dev": true + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" }, "supports-color": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" } } }, "babel-core": { "version": "7.0.0-bridge.0", "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-7.0.0-bridge.0.tgz", - "integrity": "sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==", - "dev": true + "integrity": "sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==" }, "babel-eslint": { "version": "10.0.1", @@ -3618,7 +3687,6 @@ "version": "6.26.1", "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", - "dev": true, "requires": { "babel-messages": "^6.23.0", "babel-runtime": "^6.26.0", @@ -3633,8 +3701,7 @@ "jsesc": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", - "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", - "dev": true + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=" } } }, @@ -3665,7 +3732,6 @@ "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", - "dev": true, "requires": { "babel-runtime": "^6.22.0", "babel-template": "^6.24.1" @@ -3675,7 +3741,6 @@ "version": "23.6.0", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-23.6.0.tgz", "integrity": "sha512-lqKGG6LYXYu+DQh/slrQ8nxXQkEkhugdXsU6St7GmhVS7Ilc/22ArwqXNJrf0QaOBjZB0360qZMwXqDYQHXaew==", - "dev": true, "requires": { "babel-plugin-istanbul": "^4.1.6", "babel-preset-jest": "^23.2.0" @@ -3697,7 +3762,6 @@ "version": "6.23.0", "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", - "dev": true, "requires": { "babel-runtime": "^6.22.0" } @@ -3706,7 +3770,6 @@ "version": "4.1.6", "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.6.tgz", "integrity": "sha512-PWP9FQ1AhZhS01T/4qLSKoHGY/xvkZdVBGlKM/HuxxS3+sC66HhTNR7+MpbO/so/cz/wY94MeSWJuP1hXIPfwQ==", - "dev": true, "requires": { "babel-plugin-syntax-object-rest-spread": "^6.13.0", "find-up": "^2.1.0", @@ -3717,8 +3780,7 @@ "babel-plugin-jest-hoist": { "version": "23.2.0", "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-23.2.0.tgz", - "integrity": "sha1-5h+uBaHKiAGq3uV6bWa4zvr0QWc=", - "dev": true + "integrity": "sha1-5h+uBaHKiAGq3uV6bWa4zvr0QWc=" }, "babel-plugin-syntax-class-properties": { "version": "6.13.0", @@ -3729,8 +3791,7 @@ "babel-plugin-syntax-object-rest-spread": { "version": "6.13.0", "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", - "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=", - "dev": true + "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=" }, "babel-plugin-transform-class-properties": { "version": "6.24.1", @@ -3767,7 +3828,6 @@ "version": "23.2.0", "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-23.2.0.tgz", "integrity": "sha1-jsegOhOPABoaj7HoETZSvxpV2kY=", - "dev": true, "requires": { "babel-plugin-jest-hoist": "^23.2.0", "babel-plugin-syntax-object-rest-spread": "^6.13.0" @@ -3777,7 +3837,6 @@ "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", - "dev": true, "requires": { "babel-core": "^6.26.0", "babel-runtime": "^6.26.0", @@ -3792,7 +3851,6 @@ "version": "6.26.3", "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", - "dev": true, "requires": { "babel-code-frame": "^6.26.0", "babel-generator": "^6.26.0", @@ -3818,8 +3876,7 @@ "slash": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" } } }, @@ -3827,7 +3884,6 @@ "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dev": true, "requires": { "core-js": "^2.4.0", "regenerator-runtime": "^0.11.0" @@ -3836,8 +3892,7 @@ "regenerator-runtime": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" } } }, @@ -3845,7 +3900,6 @@ "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", - "dev": true, "requires": { "babel-runtime": "^6.26.0", "babel-traverse": "^6.26.0", @@ -3858,7 +3912,6 @@ "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", - "dev": true, "requires": { "babel-code-frame": "^6.26.0", "babel-messages": "^6.23.0", @@ -3874,8 +3927,7 @@ "globals": { "version": "9.18.0", "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", - "dev": true + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==" } } }, @@ -3883,7 +3935,6 @@ "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "dev": true, "requires": { "babel-runtime": "^6.26.0", "esutils": "^2.0.2", @@ -3894,16 +3945,14 @@ "to-fast-properties": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", - "dev": true + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=" } } }, "babylon": { "version": "6.18.0", "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", - "dev": true + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==" }, "bail": { "version": "1.0.3", @@ -3914,14 +3963,12 @@ "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, "base": { "version": "0.11.2", "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, "requires": { "cache-base": "^1.0.1", "class-utils": "^0.3.5", @@ -3936,7 +3983,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, "requires": { "is-descriptor": "^1.0.0" } @@ -3945,7 +3991,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, "requires": { "kind-of": "^6.0.0" } @@ -3954,7 +3999,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, "requires": { "kind-of": "^6.0.0" } @@ -3963,7 +4007,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, "requires": { "is-accessor-descriptor": "^1.0.0", "is-data-descriptor": "^1.0.0", @@ -3982,7 +4025,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, "requires": { "tweetnacl": "^0.14.3" } @@ -4029,8 +4071,7 @@ "boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", - "dev": true + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" }, "boxen": { "version": "1.3.0", @@ -4051,7 +4092,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -4061,7 +4101,6 @@ "version": "2.3.2", "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, "requires": { "arr-flatten": "^1.1.0", "array-unique": "^0.3.2", @@ -4079,7 +4118,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, "requires": { "is-extendable": "^0.1.0" } @@ -4105,14 +4143,12 @@ "browser-process-hrtime": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz", - "integrity": "sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw==", - "dev": true + "integrity": "sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw==" }, "browser-resolve": { "version": "1.11.3", "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", - "dev": true, "requires": { "resolve": "1.1.7" }, @@ -4120,8 +4156,7 @@ "resolve": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", - "dev": true + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=" } } }, @@ -4200,7 +4235,6 @@ "version": "4.2.1", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.2.1.tgz", "integrity": "sha512-1oO0c7Zhejwd+LXihS89WqtKionSbz298rJZKJgfrHIZhrV8AC15gw553VcB0lcEugja7IhWD7iAlrsamfYVPA==", - "dev": true, "requires": { "caniuse-lite": "^1.0.30000890", "electron-to-chromium": "^1.3.79", @@ -4211,42 +4245,27 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/bser/-/bser-2.0.0.tgz", "integrity": "sha1-mseNPtXZFYBP2HrLFYvHlxR6Fxk=", - "dev": true, "requires": { "node-int64": "^0.4.0" } }, "buble": { - "version": "0.19.4", - "resolved": "https://registry.npmjs.org/buble/-/buble-0.19.4.tgz", - "integrity": "sha512-xaTfnWdx80TiajGDZoSYB17nEDqjGnVxeug5W7tvXIAMn61yMa5AfTuWu3F4nLL2Fv/hK8T6GktZvQ6yvPZMpA==", - "dev": true, + "version": "0.19.6", + "resolved": "https://registry.npmjs.org/buble/-/buble-0.19.6.tgz", + "integrity": "sha512-9kViM6nJA1Q548Jrd06x0geh+BG2ru2+RMDkIHHgJY/8AcyCs34lTHwra9BX7YdPrZXd5aarkpr/SY8bmPgPdg==", "requires": { - "acorn": "^5.4.1", - "acorn-dynamic-import": "^3.0.0", - "acorn-jsx": "^4.1.1", - "chalk": "^2.3.1", - "magic-string": "^0.22.4", + "chalk": "^2.4.1", + "magic-string": "^0.25.1", "minimist": "^1.2.0", "os-homedir": "^1.0.1", - "regexpu-core": "^4.1.3", + "regexpu-core": "^4.2.0", "vlq": "^1.0.0" }, "dependencies": { - "acorn-jsx": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-4.1.1.tgz", - "integrity": "sha512-JY+iV6r+cO21KtntVvFkD+iqjtdpRUpGqKWgfkCdZq1R+kbreEl8EcdcJR4SmiIgsIQT33s6QzheQ9a275Q8xw==", - "dev": true, - "requires": { - "acorn": "^5.0.3" - } - }, "minimist": { "version": "1.2.0", "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" } } }, @@ -4264,8 +4283,7 @@ "buffer-from": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" }, "buffer-xor": { "version": "1.0.3", @@ -4276,8 +4294,7 @@ "builtin-modules": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=" }, "builtin-status-codes": { "version": "3.0.0", @@ -4336,7 +4353,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, "requires": { "collection-visit": "^1.0.0", "component-emitter": "^1.2.1", @@ -4359,7 +4375,6 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", - "dev": true, "requires": { "callsites": "^0.2.0" }, @@ -4367,28 +4382,24 @@ "callsites": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", - "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", - "dev": true + "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=" } } }, "callsites": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", - "dev": true + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=" }, "camelcase": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" }, "camelcase-keys": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", - "dev": true, "requires": { "camelcase": "^4.1.0", "map-obj": "^2.0.0", @@ -4398,14 +4409,12 @@ "caniuse-lite": { "version": "1.0.30000893", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000893.tgz", - "integrity": "sha512-kOddHcTEef+NgN/fs0zmX2brHTNATVOWMEIhlZHCuwQRtXobjSw9pAECc44Op4bTBcavRjkLaPrGomknH7+Jvg==", - "dev": true + "integrity": "sha512-kOddHcTEef+NgN/fs0zmX2brHTNATVOWMEIhlZHCuwQRtXobjSw9pAECc44Op4bTBcavRjkLaPrGomknH7+Jvg==" }, "capture-exit": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-1.2.0.tgz", "integrity": "sha1-HF/MSJ/QqwDU8ax64QcuMXP7q28=", - "dev": true, "requires": { "rsvp": "^3.3.3" } @@ -4419,8 +4428,7 @@ "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" }, "ccount": { "version": "1.0.3", @@ -4432,7 +4440,6 @@ "version": "2.4.1", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "dev": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -4466,14 +4473,12 @@ "chardet": { "version": "0.4.2", "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", - "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", - "dev": true + "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=" }, "cheerio": { "version": "1.0.0-rc.2", "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.2.tgz", "integrity": "sha1-S59TqBsn5NXawxwP/Qz6A8xoMNs=", - "dev": true, "requires": { "css-select": "~1.2.0", "dom-serializer": "~0.1.0", @@ -4486,8 +4491,7 @@ "chickencurry": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/chickencurry/-/chickencurry-1.1.1.tgz", - "integrity": "sha1-AmVfKyazvC7hrh5TFoht4463lzg=", - "dev": true + "integrity": "sha1-AmVfKyazvC7hrh5TFoht4463lzg=" }, "chokidar": { "version": "2.0.4", @@ -4528,8 +4532,7 @@ "ci-info": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", - "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", - "dev": true + "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==" }, "cipher-base": { "version": "1.0.4", @@ -4544,14 +4547,12 @@ "circular-json": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", - "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", - "dev": true + "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==" }, "circular-json-es6": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/circular-json-es6/-/circular-json-es6-2.0.2.tgz", - "integrity": "sha512-ODYONMMNb3p658Zv+Pp+/XPa5s6q7afhz3Tzyvo+VRh9WIrJ64J76ZC4GQxnlye/NesTn09jvOiuE8+xxfpwhQ==", - "dev": true + "integrity": "sha512-ODYONMMNb3p658Zv+Pp+/XPa5s6q7afhz3Tzyvo+VRh9WIrJ64J76ZC4GQxnlye/NesTn09jvOiuE8+xxfpwhQ==" }, "cjk-regex": { "version": "1.0.2", @@ -4563,7 +4564,6 @@ "version": "0.3.6", "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, "requires": { "arr-union": "^3.1.0", "define-property": "^0.2.5", @@ -4575,7 +4575,6 @@ "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, "requires": { "is-descriptor": "^0.1.0" } @@ -4597,7 +4596,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "dev": true, "requires": { "restore-cursor": "^2.0.0" } @@ -4605,14 +4603,12 @@ "cli-width": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", - "dev": true + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=" }, "clipboard": { "version": "1.7.1", "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-1.7.1.tgz", "integrity": "sha1-Ng1taUbpmnof7zleQrqStem1oWs=", - "dev": true, "requires": { "good-listener": "^1.2.2", "select": "^1.1.2", @@ -4623,7 +4619,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", - "dev": true, "requires": { "string-width": "^2.1.1", "strip-ansi": "^4.0.0", @@ -4634,7 +4629,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, "requires": { "ansi-regex": "^3.0.0" } @@ -4693,14 +4687,12 @@ "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" }, "code-point-at": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" }, "coffeescript": { "version": "1.10.0", @@ -4718,7 +4710,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, "requires": { "map-visit": "^1.0.0", "object-visit": "^1.0.0" @@ -4739,7 +4730,6 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, "requires": { "color-name": "1.1.3" } @@ -4747,8 +4737,7 @@ "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, "color-string": { "version": "0.3.0", @@ -4762,8 +4751,7 @@ "colors": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/colors/-/colors-0.5.1.tgz", - "integrity": "sha1-fQAj6usVTo7p/Oddy5I9DtFmd3Q=", - "dev": true + "integrity": "sha1-fQAj6usVTo7p/Oddy5I9DtFmd3Q=" }, "columnify": { "version": "1.5.4", @@ -4779,7 +4767,6 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", - "dev": true, "requires": { "delayed-stream": "~1.0.0" } @@ -4820,26 +4807,22 @@ "component-emitter": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" }, "component-props": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/component-props/-/component-props-1.1.1.tgz", - "integrity": "sha1-+bffm5kntubZfJvScqqGdnDzSUQ=", - "dev": true + "integrity": "sha1-+bffm5kntubZfJvScqqGdnDzSUQ=" }, "component-xor": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/component-xor/-/component-xor-0.0.4.tgz", - "integrity": "sha1-xV2DzMG5TNUImk6T+niRxyY+Wao=", - "dev": true + "integrity": "sha1-xV2DzMG5TNUImk6T+niRxyY+Wao=" }, "compose-function": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/compose-function/-/compose-function-2.0.0.tgz", "integrity": "sha1-5kL6fh2iFSlyADFHZ3b8JGkawLA=", - "dev": true, "requires": { "arity-n": "^1.0.4" } @@ -4847,14 +4830,12 @@ "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "concat-stream": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, "requires": { "buffer-from": "^1.0.0", "inherits": "^2.0.3", @@ -5527,7 +5508,6 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", - "dev": true, "requires": { "safe-buffer": "~5.1.1" } @@ -5549,20 +5529,61 @@ "copy-descriptor": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" + }, + "copy-webpack-plugin": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-4.6.0.tgz", + "integrity": "sha512-Y+SQCF+0NoWQryez2zXn5J5knmr9z/9qSQt7fbL78u83rxmigOy8X5+BFn8CFSuX+nKT8gpYwJX68ekqtQt6ZA==", + "dev": true, + "requires": { + "cacache": "^10.0.4", + "find-cache-dir": "^1.0.0", + "globby": "^7.1.1", + "is-glob": "^4.0.0", + "loader-utils": "^1.1.0", + "minimatch": "^3.0.4", + "p-limit": "^1.0.0", + "serialize-javascript": "^1.4.0" + }, + "dependencies": { + "globby": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", + "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "dir-glob": "^2.0.0", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + } + } }, "core-js": { "version": "2.5.7", "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", - "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==", - "dev": true + "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==" }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, "cosmiconfig": { "version": "5.0.6", @@ -5650,7 +5671,6 @@ "version": "0.2.3", "resolved": "https://registry.npmjs.org/create-react-context/-/create-react-context-0.2.3.tgz", "integrity": "sha512-CQBmD0+QGgTaxDL3OX1IDXYqjkp2It4RIbcb99jS6AEg27Ga+a9G3JtK6SIu0HBwPLZlmwt9F7UwWA4Bn92Rag==", - "dev": true, "requires": { "fbjs": "^0.8.0", "gud": "^1.0.0" @@ -5685,7 +5705,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, "requires": { "lru-cache": "^4.0.1", "shebang-command": "^1.2.0", @@ -5776,7 +5795,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", - "dev": true, "requires": { "boolbase": "~1.0.0", "css-what": "2.1", @@ -5832,8 +5850,7 @@ "css-what": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz", - "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0=", - "dev": true + "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0=" }, "cssesc": { "version": "0.1.0", @@ -5844,14 +5861,12 @@ "cssom": { "version": "0.3.4", "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.4.tgz", - "integrity": "sha512-+7prCSORpXNeR4/fUP3rL+TzqtiFfhMvTd7uEqMdgPvLPt4+uzFUeufx5RHjGTACCargg/DiEt/moMQmvnfkog==", - "dev": true + "integrity": "sha512-+7prCSORpXNeR4/fUP3rL+TzqtiFfhMvTd7uEqMdgPvLPt4+uzFUeufx5RHjGTACCargg/DiEt/moMQmvnfkog==" }, "cssstyle": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.1.1.tgz", "integrity": "sha512-364AI1l/M5TYcFH83JnOH/pSqgaNnKmYgKrm0didZMGKWjQB60dymwWy1rKUgL3J1ffdq9xVi2yGLHdSjjSNog==", - "dev": true, "requires": { "cssom": "0.3.x" } @@ -5860,7 +5875,6 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", - "dev": true, "requires": { "array-find-index": "^1.0.1" } @@ -5872,9 +5886,9 @@ "dev": true }, "d3-array": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", - "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.0.0.tgz", + "integrity": "sha512-Biw2t88UArwTQT1YPaG/hx2ftEjl/zP3VWb4wlgG6cs6kANTiSG7VLsIU6jH4c5BrHlZN9auDT218/lySs04zQ==" }, "d3-axis": { "version": "1.0.12", @@ -5920,6 +5934,13 @@ "d3-interpolate": "1", "d3-time": "1", "d3-time-format": "2" + }, + "dependencies": { + "d3-array": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", + "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" + } } }, "d3-scale-chromatic": { @@ -5976,7 +5997,6 @@ "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, "requires": { "assert-plus": "^1.0.0" } @@ -5991,7 +6011,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.0.1.tgz", "integrity": "sha512-0HdcMZzK6ubMUnsMmQmG0AcLQPvbvb47R0+7CCZQCYgcd8OUWG91CG7sM6GoXgjz+WLl4ArFzHtBMy/QqSF4eg==", - "dev": true, "requires": { "abab": "^2.0.0", "whatwg-mimetype": "^2.1.0", @@ -6002,7 +6021,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.0.0.tgz", "integrity": "sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ==", - "dev": true, "requires": { "lodash.sortby": "^4.7.0", "tr46": "^1.0.1", @@ -6116,20 +6134,19 @@ } }, "deasync": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/deasync/-/deasync-0.1.13.tgz", - "integrity": "sha512-/6ngYM7AapueqLtvOzjv9+11N2fHDSrkxeMF1YPE20WIfaaawiBg+HZH1E5lHrcJxlKR42t6XPOEmMmqcAsU1g==", + "version": "0.1.14", + "resolved": "https://registry.npmjs.org/deasync/-/deasync-0.1.14.tgz", + "integrity": "sha512-wN8sIuEqIwyQh72AG7oY6YQODCxIp1eXzEZlZznBuwDF8Q03Tdy9QNp1BNZXeadXoklNrw+Ip1fch+KXo/+ASw==", "dev": true, "requires": { "bindings": "~1.2.1", - "nan": "^2.0.7" + "node-addon-api": "^1.6.0" } }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, "requires": { "ms": "2.0.0" } @@ -6143,14 +6160,12 @@ "decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" }, "decamelize-keys": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", - "dev": true, "requires": { "decamelize": "^1.1.0", "map-obj": "^1.0.0" @@ -6159,16 +6174,14 @@ "map-obj": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" } } }, "decode-uri-component": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" }, "dedent": { "version": "0.7.0", @@ -6180,7 +6193,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/deep-equal-ident/-/deep-equal-ident-1.1.1.tgz", "integrity": "sha1-BvS4nlNxDNbOpKd4HHqVZkLejck=", - "dev": true, "requires": { "lodash.isequal": "^3.0" }, @@ -6189,7 +6201,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-3.0.4.tgz", "integrity": "sha1-HDXrO27wzR/1F0Pj6jz3/f/ay2Q=", - "dev": true, "requires": { "lodash._baseisequal": "^3.0.0", "lodash._bindcallback": "^3.0.0" @@ -6212,8 +6223,7 @@ "deep-is": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" }, "deepmerge": { "version": "1.5.2", @@ -6224,7 +6234,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz", "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=", - "dev": true, "requires": { "strip-bom": "^2.0.0" } @@ -6250,7 +6259,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, "requires": { "is-descriptor": "^1.0.2", "isobject": "^3.0.1" @@ -6260,7 +6268,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, "requires": { "kind-of": "^6.0.0" } @@ -6269,7 +6276,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, "requires": { "kind-of": "^6.0.0" } @@ -6278,7 +6284,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, "requires": { "is-accessor-descriptor": "^1.0.0", "is-data-descriptor": "^1.0.0", @@ -6291,7 +6296,6 @@ "version": "2.2.2", "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", - "dev": true, "requires": { "globby": "^5.0.0", "is-path-cwd": "^1.0.0", @@ -6305,14 +6309,12 @@ "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" }, "delegate": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz", - "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==", - "dev": true + "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==" }, "delegates": { "version": "1.0.0", @@ -6346,7 +6348,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", - "dev": true, "requires": { "repeating": "^2.0.0" } @@ -6354,8 +6355,7 @@ "detect-newline": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", - "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=", - "dev": true + "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=" }, "dezalgo": { "version": "1.0.3", @@ -6370,8 +6370,7 @@ "diff": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "dev": true + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==" }, "diffie-hellman": { "version": "5.0.3", @@ -6419,29 +6418,20 @@ "discontinuous-range": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/discontinuous-range/-/discontinuous-range-1.0.0.tgz", - "integrity": "sha1-44Mx8IRLukm5qctxx3FYWqsbxlo=", - "dev": true + "integrity": "sha1-44Mx8IRLukm5qctxx3FYWqsbxlo=" }, "docsify": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/docsify/-/docsify-4.7.1.tgz", - "integrity": "sha512-RdM4oN9yYNboTlm9JtbTMIqjYjPF7WBF7W37NXCG1fZIBC83Ya8qdH9c1rpPkLYw8HekJzSO2P13f6z/GVKITA==", + "version": "4.8.5", + "resolved": "https://registry.npmjs.org/docsify/-/docsify-4.8.5.tgz", + "integrity": "sha512-uD59aLeDf08CyP+m/iNDLjQUokue+4mPnElAs5KDlcq9CLwg29PV4l3ingYhBqzCps07g4OEAHYRGhTNpwFVIQ==", "dev": true, "requires": { - "marked": "^0.3.12", + "marked": "^0.5.1", "medium-zoom": "^0.4.0", "opencollective": "^1.0.3", - "prismjs": "^1.9.0", + "prismjs": "^1.15.0", "tinydate": "^1.0.0", "tweezer.js": "^1.4.0" - }, - "dependencies": { - "marked": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/marked/-/marked-0.3.19.tgz", - "integrity": "sha512-ea2eGWOqNxPcXv8dyERdSr/6FmzvWwzjMxpfGB/sbMccXoct+xY+YukPD+QTUZwyvK7BZwcr4m21WBOW41pAkg==", - "dev": true - } } }, "docsify-cli": { @@ -6576,12 +6566,13 @@ } }, "docsify-server-renderer": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/docsify-server-renderer/-/docsify-server-renderer-4.7.1.tgz", - "integrity": "sha512-7gWwYlReLu6/z/eixod8ZiepMWdV5TjGsrkDcSTBWvgcjeebgvGIbjpPVH23cvj5f2n+wyZ+fqtQMjw7hK/YyA==", + "version": "4.8.5", + "resolved": "https://registry.npmjs.org/docsify-server-renderer/-/docsify-server-renderer-4.8.5.tgz", + "integrity": "sha512-RkTmKVvHleMA58jvYgJuxvp/yQtYVt/c5MW6mGmrzoc7uIiDvzrTbj0NXxyfLXVcVe/BjC7Ac49Yei8yXDTwqg==", "dev": true, "requires": { "debug": "^2.6.8", + "docsify": "^4.8.0", "node-fetch": "^1.7.0", "resolve-pathname": "^2.1.0" } @@ -6590,7 +6581,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, "requires": { "esutils": "^2.0.2" } @@ -6604,7 +6594,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/dom-iterator/-/dom-iterator-1.0.0.tgz", "integrity": "sha512-7dsMOQI07EMU98gQM8NSB3GsAiIeBYIPKpnxR3c9xOvdvBjChAcOM0iJ222I3p5xyiZO9e5oggkNaCusuTdYig==", - "dev": true, "requires": { "component-props": "1.1.1", "component-xor": "0.0.4" @@ -6613,14 +6602,12 @@ "dom-scroll-into-view": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/dom-scroll-into-view/-/dom-scroll-into-view-1.2.1.tgz", - "integrity": "sha1-6PNnMt0ImwIBqI14Fdw/iObWbH4=", - "dev": true + "integrity": "sha1-6PNnMt0ImwIBqI14Fdw/iObWbH4=" }, "dom-serializer": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", - "dev": true, "requires": { "domelementtype": "~1.1.1", "entities": "~1.1.1" @@ -6629,8 +6616,7 @@ "domelementtype": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", - "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=", - "dev": true + "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=" } } }, @@ -6643,14 +6629,12 @@ "domelementtype": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", - "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=", - "dev": true + "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=" }, "domexception": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", - "dev": true, "requires": { "webidl-conversions": "^4.0.2" } @@ -6659,7 +6643,6 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", - "dev": true, "requires": { "domelementtype": "1" } @@ -6673,7 +6656,6 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", - "dev": true, "requires": { "dom-serializer": "0", "domelementtype": "1" @@ -6716,7 +6698,6 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, "requires": { "jsbn": "~0.1.0", "safer-buffer": "^2.1.0" @@ -6761,14 +6742,12 @@ "electron-to-chromium": { "version": "1.3.80", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.80.tgz", - "integrity": "sha512-WClidEWEUNx7OfwXehB0qaxCuetjbKjev2SmXWgybWPLKAThBiMTF/2Pd8GSUDtoGOavxVzdkKwfFAPRSWlkLw==", - "dev": true + "integrity": "sha512-WClidEWEUNx7OfwXehB0qaxCuetjbKjev2SmXWgybWPLKAThBiMTF/2Pd8GSUDtoGOavxVzdkKwfFAPRSWlkLw==" }, "element-closest": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/element-closest/-/element-closest-2.0.2.tgz", - "integrity": "sha1-cqdAoQdFM4LijfnOXbtajfD5Zuw=", - "dev": true + "integrity": "sha1-cqdAoQdFM4LijfnOXbtajfD5Zuw=" }, "elliptic": { "version": "6.4.1", @@ -6834,14 +6813,12 @@ "entities": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", - "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=", - "dev": true + "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=" }, "enzyme": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/enzyme/-/enzyme-3.7.0.tgz", "integrity": "sha512-QLWx+krGK6iDNyR1KlH5YPZqxZCQaVF6ike1eDJAOg0HvSkSCVImPsdWaNw6v+VrnK92Kg8jIOYhuOSS9sBpyg==", - "dev": true, "requires": { "array.prototype.flat": "^1.2.1", "cheerio": "^1.0.0-rc.2", @@ -6868,7 +6845,6 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.6.0.tgz", "integrity": "sha512-ay9eGFpChyUDnjTFMMJHzrb681LF3hPWJLEA7RoLFG9jSWAdAm2V50pGmFV9dYGJgh5HfdiqM+MNvle41Yf/PA==", - "dev": true, "requires": { "enzyme-adapter-utils": "^1.8.0", "function.prototype.name": "^1.1.0", @@ -6883,7 +6859,6 @@ "version": "1.8.1", "resolved": "https://registry.npmjs.org/enzyme-adapter-utils/-/enzyme-adapter-utils-1.8.1.tgz", "integrity": "sha512-s3QB3xQAowaDS2sHhmEqrT13GJC4+n5bG015ZkLv60n9k5vhxxHTQRIneZmQ4hmdCZEBrvUJ89PG6fRI5OEeuQ==", - "dev": true, "requires": { "function.prototype.name": "^1.1.0", "object.assign": "^4.1.0", @@ -6894,7 +6869,6 @@ "version": "6.1.2", "resolved": "https://registry.npmjs.org/enzyme-matchers/-/enzyme-matchers-6.1.2.tgz", "integrity": "sha512-cP9p+HMOZ1ZXQ+k2H4dCkxmTZzIvpEy5zv0ZjgoBl6D0U43v+bJGH5IeWHdIovCzgJ0dVcMCKJ6lNu83lYUCAA==", - "dev": true, "requires": { "circular-json-es6": "^2.0.1", "deep-equal-ident": "^1.1.1" @@ -6904,7 +6878,6 @@ "version": "3.3.4", "resolved": "https://registry.npmjs.org/enzyme-to-json/-/enzyme-to-json-3.3.4.tgz", "integrity": "sha1-Z8YEDpMRgvGDQYry659DIyWKp38=", - "dev": true, "requires": { "lodash": "^4.17.4" } @@ -6912,8 +6885,7 @@ "equivalent-key-map": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/equivalent-key-map/-/equivalent-key-map-0.2.2.tgz", - "integrity": "sha512-xvHeyCDbZzkpN4VHQj/n+j2lOwL0VWszG30X4cOrc9Y7Tuo2qCdZK/0AMod23Z5dCtNUbaju6p0rwOhHUk05ew==", - "dev": true + "integrity": "sha512-xvHeyCDbZzkpN4VHQj/n+j2lOwL0VWszG30X4cOrc9Y7Tuo2qCdZK/0AMod23Z5dCtNUbaju6p0rwOhHUk05ew==" }, "err-code": { "version": "1.1.2", @@ -6934,7 +6906,6 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, "requires": { "is-arrayish": "^0.2.1" } @@ -6985,14 +6956,12 @@ "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "escodegen": { "version": "1.11.0", "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.11.0.tgz", "integrity": "sha512-IeMV45ReixHS53K/OmfKAIztN/igDHzTJUhZM3k1jMhIZWjk45SMwAtBsEXiJp3vSPmTcu6CXn7mDvFHRN66fw==", - "dev": true, "requires": { "esprima": "^3.1.3", "estraverse": "^4.2.0", @@ -7005,15 +6974,14 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, "optional": true } } }, "eslint": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.8.0.tgz", - "integrity": "sha512-Zok6Bru3y2JprqTNm14mgQ15YQu/SMDkWdnmHfFg770DIUlmMFd/gqqzCHekxzjHZJxXv3tmTpH0C1icaYJsRQ==", + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.9.0.tgz", + "integrity": "sha512-g4KWpPdqN0nth+goDNICNXGfJF7nNnepthp46CAlJoJtC5K/cLu3NgCM3AHu1CkJ5Hzt9V0Y0PBAO6Ay/gGb+w==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", @@ -7057,9 +7025,9 @@ }, "dependencies": { "acorn": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.0.2.tgz", - "integrity": "sha512-GXmKIvbrN3TV7aVqAzVFaMW8F8wzVX7voEBRO3bDA64+EX37YSayggRJP5Xig6HYHBkWKpFg9W5gg6orklubhg==", + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.0.4.tgz", + "integrity": "sha512-VY4i5EKSKkofY2I+6QLTbTTN/UvEQPCo6eiwzzSaSWfpaDhOmStMCMod6wmuPciNq+XS0faCglFu2lHZpdHUtg==", "dev": true }, "acorn-jsx": { @@ -7069,9 +7037,9 @@ "dev": true }, "ajv": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.4.tgz", - "integrity": "sha512-4Wyjt8+t6YszqaXnLDfMmG/8AlO5Zbcsy3ATHncCzjW/NoPzAId8AK6749Ybjmdt+kUY1gP60fCu46oDxPv/mg==", + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.5.tgz", + "integrity": "sha512-7q7gtRQDJSyuEHjuVgHoUa2VuemFiCMrfQc9Tc08XTAc4Zj/5U1buQJ0HU6i7fKjXU09SVgSmxa4sLvuvS8Iyg==", "dev": true, "requires": { "fast-deep-equal": "^2.0.1", @@ -7234,9 +7202,9 @@ } }, "eslint-plugin-jest": { - "version": "21.26.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-21.26.2.tgz", - "integrity": "sha512-SCTBC6q182D4qQlQAN81D351jdte/YwTMo4f+l19Gvh1VemaNZP7ak3MLLvw6xkL9dO2FxVjCLk5DCdl1KfdLw==", + "version": "22.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-22.0.0.tgz", + "integrity": "sha512-YOj8cYI5ZXEZUrX2kUBLachR1ffjQiicIMBoivN7bXXHnxi8RcwNvmVzwlu3nTmjlvk5AP3kIpC5i8HcinmhPA==", "dev": true }, "eslint-plugin-jsx-a11y": { @@ -7281,7 +7249,6 @@ "version": "3.7.3", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.3.tgz", "integrity": "sha512-W+B0SvF4gamyCTmUc+uITPY0989iXVfKvhwtmJocTaYoc/3khEHmEmvfY/Gn9HA9VV75jrQECsHizkNw1b68FA==", - "dev": true, "requires": { "esrecurse": "^4.1.0", "estraverse": "^4.1.1" @@ -7296,14 +7263,12 @@ "eslint-visitor-keys": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", - "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==", - "dev": true + "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==" }, "espree": { "version": "3.5.4", - "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz", + "resolved": "http://registry.npmjs.org/espree/-/espree-3.5.4.tgz", "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==", - "dev": true, "requires": { "acorn": "^5.5.0", "acorn-jsx": "^3.0.0" @@ -7312,14 +7277,12 @@ "esprima": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", - "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", - "dev": true + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=" }, "esquery": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", - "dev": true, "requires": { "estraverse": "^4.0.0" } @@ -7328,7 +7291,6 @@ "version": "4.2.1", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", - "dev": true, "requires": { "estraverse": "^4.1.0" } @@ -7336,14 +7298,12 @@ "estraverse": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", - "dev": true + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=" }, "esutils": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" }, "etag": { "version": "1.8.1", @@ -7377,7 +7337,6 @@ "version": "0.2.2", "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.2.2.tgz", "integrity": "sha512-FIUCJz1RbuS0FKTdaAafAByGS0CPvU3R0MeHxgtl+djzCc//F8HakL8GzmVNZanasTbTAY/3DRFA0KpVqj/eAw==", - "dev": true, "requires": { "merge": "^1.2.0" } @@ -7386,7 +7345,6 @@ "version": "0.7.0", "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "dev": true, "requires": { "cross-spawn": "^5.0.1", "get-stream": "^3.0.0", @@ -7409,14 +7367,12 @@ "exit": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", - "dev": true + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=" }, "expand-brackets": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, "requires": { "debug": "^2.3.3", "define-property": "^0.2.5", @@ -7431,7 +7387,6 @@ "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, "requires": { "is-descriptor": "^0.1.0" } @@ -7440,7 +7395,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, "requires": { "is-extendable": "^0.1.0" } @@ -7451,7 +7405,6 @@ "version": "1.8.2", "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", - "dev": true, "requires": { "fill-range": "^2.1.0" }, @@ -7460,7 +7413,6 @@ "version": "2.2.4", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", - "dev": true, "requires": { "is-number": "^2.1.0", "isobject": "^2.0.0", @@ -7473,7 +7425,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", - "dev": true, "requires": { "kind-of": "^3.0.2" } @@ -7482,7 +7433,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, "requires": { "isarray": "1.0.0" } @@ -7491,7 +7441,6 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, "requires": { "is-buffer": "^1.1.5" } @@ -7511,7 +7460,6 @@ "version": "23.6.0", "resolved": "https://registry.npmjs.org/expect/-/expect-23.6.0.tgz", "integrity": "sha512-dgSoOHgmtn/aDGRVFWclQyPDKl2CQRq0hmIEoUAuQs/2rn2NcvCWcSCovm6BLeuB/7EZuLGu2QfnR+qRt5OM4w==", - "dev": true, "requires": { "ansi-styles": "^3.2.0", "jest-diff": "^23.6.0", @@ -7525,7 +7473,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, "requires": { "arr-flatten": "^1.0.1" } @@ -7533,14 +7480,12 @@ "array-unique": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" }, "braces": { "version": "1.8.5", "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true, "requires": { "expand-range": "^1.8.1", "preserve": "^0.2.0", @@ -7551,7 +7496,6 @@ "version": "0.1.5", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, "requires": { "is-posix-bracket": "^0.1.0" } @@ -7560,7 +7504,6 @@ "version": "0.3.2", "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, "requires": { "is-extglob": "^1.0.0" } @@ -7568,14 +7511,12 @@ "is-extglob": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" }, "is-glob": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, "requires": { "is-extglob": "^1.0.0" } @@ -7584,7 +7525,6 @@ "version": "23.6.0", "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-23.6.0.tgz", "integrity": "sha512-rosyCHQfBcol4NsckTn01cdelzWLU9Cq7aaigDf8VwwpIRvWE/9zLgX2bON+FkEW69/0UuYslUe22SOdEf2nog==", - "dev": true, "requires": { "chalk": "^2.0.1", "jest-get-type": "^22.1.0", @@ -7595,7 +7535,6 @@ "version": "23.4.0", "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-23.4.0.tgz", "integrity": "sha1-F2EMUJQjSVCNAaPR4L2iwHkIap8=", - "dev": true, "requires": { "@babel/code-frame": "^7.0.0-beta.35", "chalk": "^2.0.1", @@ -7608,7 +7547,6 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, "requires": { "is-buffer": "^1.1.5" } @@ -7617,7 +7555,6 @@ "version": "2.3.11", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, "requires": { "arr-diff": "^2.0.0", "array-unique": "^0.2.1", @@ -7638,7 +7575,6 @@ "version": "23.6.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-23.6.0.tgz", "integrity": "sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw==", - "dev": true, "requires": { "ansi-regex": "^3.0.0", "ansi-styles": "^3.2.0" @@ -7647,22 +7583,19 @@ "slash": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" } } }, "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" }, "extend-shallow": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, "requires": { "assign-symbols": "^1.0.0", "is-extendable": "^1.0.1" @@ -7672,7 +7605,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, "requires": { "is-plain-object": "^2.0.4" } @@ -7683,7 +7615,6 @@ "version": "2.2.0", "resolved": "http://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", - "dev": true, "requires": { "chardet": "^0.4.0", "iconv-lite": "^0.4.17", @@ -7694,7 +7625,6 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, "requires": { "array-unique": "^0.3.2", "define-property": "^1.0.0", @@ -7710,7 +7640,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, "requires": { "is-descriptor": "^1.0.0" } @@ -7719,7 +7648,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, "requires": { "is-extendable": "^0.1.0" } @@ -7728,7 +7656,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, "requires": { "kind-of": "^6.0.0" } @@ -7737,7 +7664,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, "requires": { "kind-of": "^6.0.0" } @@ -7746,7 +7672,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, "requires": { "is-accessor-descriptor": "^1.0.0", "is-data-descriptor": "^1.0.0", @@ -7770,14 +7695,12 @@ "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" }, "fast-deep-equal": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", - "dev": true + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=" }, "fast-glob": { "version": "2.2.3", @@ -7796,14 +7719,12 @@ "fast-json-stable-stringify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", - "dev": true + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" }, "fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" }, "fastparse": { "version": "1.1.1", @@ -7824,7 +7745,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.0.tgz", "integrity": "sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg=", - "dev": true, "requires": { "bser": "^2.0.0" } @@ -7866,7 +7786,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "dev": true, "requires": { "escape-string-regexp": "^1.0.5" } @@ -7875,7 +7794,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", - "dev": true, "requires": { "flat-cache": "^1.2.1", "object-assign": "^4.0.1" @@ -7884,14 +7802,12 @@ "filename-regex": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", - "dev": true + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=" }, "fileset": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", - "dev": true, "requires": { "glob": "^7.0.3", "minimatch": "^3.0.3" @@ -7901,7 +7817,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, "requires": { "extend-shallow": "^2.0.1", "is-number": "^3.0.0", @@ -7913,7 +7828,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, "requires": { "is-extendable": "^0.1.0" } @@ -7949,18 +7863,40 @@ "find-parent-dir": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/find-parent-dir/-/find-parent-dir-0.3.0.tgz", - "integrity": "sha1-M8RLQpqysvBkYpnF+fcY83b/jVQ=", - "dev": true + "integrity": "sha1-M8RLQpqysvBkYpnF+fcY83b/jVQ=" }, "find-up": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, "requires": { "locate-path": "^2.0.0" } }, + "findup": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/findup/-/findup-0.1.5.tgz", + "integrity": "sha1-itkpozk7rGJ5V6fl3kYjsGsOLOs=", + "dev": true, + "requires": { + "colors": "~0.6.0-1", + "commander": "~2.1.0" + }, + "dependencies": { + "colors": { + "version": "0.6.2", + "resolved": "http://registry.npmjs.org/colors/-/colors-0.6.2.tgz", + "integrity": "sha1-JCP+ZnisDF2uiFLl0OW+CMmXq8w=", + "dev": true + }, + "commander": { + "version": "2.1.0", + "resolved": "http://registry.npmjs.org/commander/-/commander-2.1.0.tgz", + "integrity": "sha1-0SG7roYNmZKj1Re6lvVliOR8Z4E=", + "dev": true + } + } + }, "findup-sync": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz", @@ -7989,7 +7925,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", - "dev": true, "requires": { "circular-json": "^0.3.1", "del": "^2.0.2", @@ -8022,14 +7957,12 @@ "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" }, "for-own": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", - "dev": true, "requires": { "for-in": "^1.0.1" } @@ -8037,14 +7970,12 @@ "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" }, "form-data": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, "requires": { "asynckit": "^0.4.0", "combined-stream": "^1.0.6", @@ -8061,7 +7992,6 @@ "version": "0.2.1", "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, "requires": { "map-cache": "^0.2.2" } @@ -8122,14 +8052,12 @@ "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "fsevents": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz", "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==", - "dev": true, "optional": true, "requires": { "nan": "^2.9.2", @@ -8140,27 +8068,23 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true, "optional": true }, "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" }, "aproba": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true, "optional": true }, "are-we-there-yet": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", - "dev": true, "optional": true, "requires": { "delegates": "^1.0.0", @@ -8170,14 +8094,12 @@ "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -8187,39 +8109,33 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz", "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=", - "dev": true, "optional": true }, "code-point-at": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "console-control-strings": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true, "optional": true }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, "optional": true, "requires": { "ms": "2.0.0" @@ -8229,28 +8145,24 @@ "version": "0.5.1", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.1.tgz", "integrity": "sha512-N8vBdOa+DF7zkRrDCsaOXoCs/E2fJfx9B9MrKnnSiHNh4ws7eSys6YQE4KvT1cecKmOASYQBhbKjeuDD9lT81w==", - "dev": true, "optional": true }, "delegates": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true, "optional": true }, "detect-libc": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", - "dev": true, "optional": true }, "fs-minipass": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.5.tgz", "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", - "dev": true, "optional": true, "requires": { "minipass": "^2.2.1" @@ -8260,14 +8172,12 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true, "optional": true }, "gauge": { "version": "2.7.4", "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "dev": true, "optional": true, "requires": { "aproba": "^1.0.3", @@ -8284,7 +8194,6 @@ "version": "7.1.2", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, "optional": true, "requires": { "fs.realpath": "^1.0.0", @@ -8299,14 +8208,12 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true, "optional": true }, "iconv-lite": { "version": "0.4.21", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.21.tgz", "integrity": "sha512-En5V9za5mBt2oUA03WGD3TwDv0MKAruqsuxstbMUZaj9W9k/m1CV/9py3l0L5kw9Bln8fdHQmzHSYtvpvTLpKw==", - "dev": true, "optional": true, "requires": { "safer-buffer": "^2.1.0" @@ -8316,7 +8223,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz", "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", - "dev": true, "optional": true, "requires": { "minimatch": "^3.0.4" @@ -8326,7 +8232,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, "optional": true, "requires": { "once": "^1.3.0", @@ -8336,21 +8241,18 @@ "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, "ini": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "dev": true, "optional": true }, "is-fullwidth-code-point": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, "requires": { "number-is-nan": "^1.0.0" } @@ -8359,14 +8261,12 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true, "optional": true }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, "requires": { "brace-expansion": "^1.1.7" } @@ -8374,14 +8274,12 @@ "minimist": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" }, "minipass": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.2.4.tgz", "integrity": "sha512-hzXIWWet/BzWhYs2b+u7dRHlruXhwdgvlTMDKC6Cb1U7ps6Ac6yQlR39xsbjWJE377YTCtKwIXIpJ5oP+j5y8g==", - "dev": true, "requires": { "safe-buffer": "^5.1.1", "yallist": "^3.0.0" @@ -8391,7 +8289,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.1.0.tgz", "integrity": "sha512-4T6Ur/GctZ27nHfpt9THOdRZNgyJ9FZchYO1ceg5S8Q3DNLCKYy44nCZzgCJgcvx2UM8czmqak5BCxJMrq37lA==", - "dev": true, "optional": true, "requires": { "minipass": "^2.2.1" @@ -8401,7 +8298,6 @@ "version": "0.5.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, "requires": { "minimist": "0.0.8" } @@ -8410,14 +8306,12 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true, "optional": true }, "needle": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/needle/-/needle-2.2.0.tgz", "integrity": "sha512-eFagy6c+TYayorXw/qtAdSvaUpEbBsDwDyxYFgLZ0lTojfH7K+OdBqAF7TAFwDokJaGpubpSGG0wO3iC0XPi8w==", - "dev": true, "optional": true, "requires": { "debug": "^2.1.2", @@ -8429,7 +8323,6 @@ "version": "0.10.0", "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.10.0.tgz", "integrity": "sha512-G7kEonQLRbcA/mOoFoxvlMrw6Q6dPf92+t/l0DFSMuSlDoWaI9JWIyPwK0jyE1bph//CUEL65/Fz1m2vJbmjQQ==", - "dev": true, "optional": true, "requires": { "detect-libc": "^1.0.2", @@ -8448,7 +8341,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", - "dev": true, "optional": true, "requires": { "abbrev": "1", @@ -8459,14 +8351,12 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.3.tgz", "integrity": "sha512-ByQ3oJ/5ETLyglU2+8dBObvhfWXX8dtPZDMePCahptliFX2iIuhyEszyFk401PZUNQH20vvdW5MLjJxkwU80Ow==", - "dev": true, "optional": true }, "npm-packlist": { "version": "1.1.10", "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.1.10.tgz", "integrity": "sha512-AQC0Dyhzn4EiYEfIUjCdMl0JJ61I2ER9ukf/sLxJUcZHfo+VyEfz2rMJgLZSS1v30OxPQe1cN0LZA1xbcaVfWA==", - "dev": true, "optional": true, "requires": { "ignore-walk": "^3.0.1", @@ -8477,7 +8367,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "dev": true, "optional": true, "requires": { "are-we-there-yet": "~1.1.2", @@ -8489,21 +8378,18 @@ "number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true, "optional": true }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, "requires": { "wrappy": "1" } @@ -8512,21 +8398,18 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true, "optional": true }, "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true, "optional": true }, "osenv": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "dev": true, "optional": true, "requires": { "os-homedir": "^1.0.0", @@ -8537,21 +8420,18 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true, "optional": true }, "process-nextick-args": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "dev": true, "optional": true }, "rc": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.7.tgz", "integrity": "sha512-LdLD8xD4zzLsAT5xyushXDNscEjB7+2ulnl8+r1pnESlYtlJtVSoCMBGr30eDRJ3+2Gq89jK9P9e4tCEH1+ywA==", - "dev": true, "optional": true, "requires": { "deep-extend": "^0.5.1", @@ -8564,7 +8444,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true, "optional": true } } @@ -8573,7 +8452,6 @@ "version": "2.3.6", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, "optional": true, "requires": { "core-util-is": "~1.0.0", @@ -8589,7 +8467,6 @@ "version": "2.6.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", - "dev": true, "optional": true, "requires": { "glob": "^7.0.5" @@ -8598,49 +8475,42 @@ "safe-buffer": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", - "dev": true + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true, "optional": true }, "sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true, "optional": true }, "semver": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", - "dev": true, "optional": true }, "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true, "optional": true }, "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true, "optional": true }, "string-width": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -8651,7 +8521,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, "optional": true, "requires": { "safe-buffer": "~5.1.0" @@ -8661,7 +8530,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, "requires": { "ansi-regex": "^2.0.0" } @@ -8670,14 +8538,12 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true, "optional": true }, "tar": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.1.tgz", "integrity": "sha512-O+v1r9yN4tOsvl90p5HAP4AEqbYhx4036AGMm075fH9F8Qwi3oJ+v4u50FkT/KkvywNGtwkk0zRI+8eYm1X/xg==", - "dev": true, "optional": true, "requires": { "chownr": "^1.0.1", @@ -8693,14 +8559,12 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true, "optional": true }, "wide-align": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz", "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", - "dev": true, "optional": true, "requires": { "string-width": "^1.0.2" @@ -8709,14 +8573,12 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "yallist": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.2.tgz", - "integrity": "sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k=", - "dev": true + "integrity": "sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k=" } } }, @@ -8750,8 +8612,7 @@ "functional-red-black-tree": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" }, "gauge": { "version": "2.7.4", @@ -8809,8 +8670,7 @@ "get-caller-file": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", - "dev": true + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" }, "get-pkg-repo": { "version": "1.4.0", @@ -8922,14 +8782,12 @@ "get-stream": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" }, "get-value": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" }, "getobject": { "version": "0.1.0", @@ -8941,7 +8799,6 @@ "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, "requires": { "assert-plus": "^1.0.0" } @@ -8950,7 +8807,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/gettext-parser/-/gettext-parser-1.4.0.tgz", "integrity": "sha512-sedZYLHlHeBop/gZ1jdg59hlUEcpcZJofLq2JFwJT1zTqAU3l2wFv6IsuwFHGqbiT9DWzMUW4/em2+hspnmMMA==", - "dev": true, "requires": { "encoding": "^0.1.12", "safe-buffer": "^5.1.1" @@ -8959,14 +8815,12 @@ "gfm-code-block-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/gfm-code-block-regex/-/gfm-code-block-regex-1.0.0.tgz", - "integrity": "sha1-u4PH1ihOa1ty+gIZilisDSViFdI=", - "dev": true + "integrity": "sha1-u4PH1ihOa1ty+gIZilisDSViFdI=" }, "gfm-code-blocks": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/gfm-code-blocks/-/gfm-code-blocks-1.0.0.tgz", "integrity": "sha1-YU0hBZuETGu8nViMCJslxOi8zw0=", - "dev": true, "requires": { "gfm-code-block-regex": "^1.0.0" } @@ -9195,7 +9049,6 @@ "version": "7.1.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -9209,7 +9062,6 @@ "version": "0.3.0", "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", - "dev": true, "requires": { "glob-parent": "^2.0.0", "is-glob": "^2.0.0" @@ -9219,7 +9071,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "dev": true, "requires": { "is-glob": "^2.0.0" } @@ -9227,14 +9078,12 @@ "is-extglob": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" }, "is-glob": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, "requires": { "is-extglob": "^1.0.0" } @@ -9319,14 +9168,12 @@ "globals": { "version": "11.8.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.8.0.tgz", - "integrity": "sha512-io6LkyPVuzCHBSQV9fmOwxZkUk6nIaGmxheLDgmuFv89j0fm2aqDbIXKAGfzCMHqz3HLF2Zf8WSG6VqMh2qFmA==", - "dev": true + "integrity": "sha512-io6LkyPVuzCHBSQV9fmOwxZkUk6nIaGmxheLDgmuFv89j0fm2aqDbIXKAGfzCMHqz3HLF2Zf8WSG6VqMh2qFmA==" }, "globby": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", - "dev": true, "requires": { "array-union": "^1.0.1", "arrify": "^1.0.0", @@ -9374,7 +9221,6 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz", "integrity": "sha1-1TswzfkxPf+33JoNR3CWqm0UXFA=", - "dev": true, "requires": { "delegate": "^3.1.2" } @@ -9401,8 +9247,7 @@ "graceful-fs": { "version": "4.1.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" }, "graphql": { "version": "0.10.5", @@ -9417,7 +9262,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/gridicons/-/gridicons-3.1.1.tgz", "integrity": "sha512-Sec8WviTyXpsSQycju8RlmpN0o8KFSDZQJeVtHjaBT1GJxvS3g1OA9y1XsauNPwNEr9nk4DeLPI4TYnufTqMIg==", - "dev": true, "requires": { "prop-types": "^15.5.7" } @@ -9425,8 +9269,7 @@ "growly": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", - "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", - "dev": true + "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=" }, "grunt": { "version": "1.0.3", @@ -9603,14 +9446,12 @@ "gud": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/gud/-/gud-1.0.0.tgz", - "integrity": "sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw==", - "dev": true + "integrity": "sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw==" }, "handlebars": { "version": "4.0.12", "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.12.tgz", "integrity": "sha512-RhmTekP+FZL+XNhwS1Wf+bTTZpdLougwt5pcgA1tuz6Jcx0fpH/7z0qd71RKnZHBCxIRBHfBOnio4gViPemNzA==", - "dev": true, "requires": { "async": "^2.5.0", "optimist": "^0.6.1", @@ -9621,22 +9462,19 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" } } }, "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" }, "har-validator": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.0.tgz", "integrity": "sha512-+qnmNjI4OfH2ipQ9VQOw23bBd/ibtfbVdK2fYbY4acTDqKTW/YDp9McimZdDbG8iV9fZizUqQMD5xvriB146TA==", - "dev": true, "requires": { "ajv": "^5.3.0", "har-schema": "^2.0.0" @@ -9654,7 +9492,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, "requires": { "ansi-regex": "^2.0.0" }, @@ -9662,8 +9499,7 @@ "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" } } }, @@ -9676,8 +9512,7 @@ "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" }, "has-symbols": { "version": "1.0.0", @@ -9694,7 +9529,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, "requires": { "get-value": "^2.0.6", "has-values": "^1.0.0", @@ -9705,7 +9539,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, "requires": { "is-number": "^3.0.0", "kind-of": "^4.0.0" @@ -9715,7 +9548,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, "requires": { "is-buffer": "^1.1.5" } @@ -9746,7 +9578,6 @@ "version": "4.7.2", "resolved": "https://registry.npmjs.org/history/-/history-4.7.2.tgz", "integrity": "sha512-1zkBRWW6XweO0NBcjiphtVJVsIQ+SXF29z9DVkceeaSLVMFXHool+fdCZD4spDCfZJCILPILc3bm7Bc+HRi0nA==", - "dev": true, "requires": { "invariant": "^2.2.1", "loose-envify": "^1.2.0", @@ -9775,7 +9606,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", - "dev": true, "requires": { "os-homedir": "^1.0.0", "os-tmpdir": "^1.0.1" @@ -9799,14 +9629,12 @@ "hosted-git-info": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", - "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", - "dev": true + "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==" }, "html-encoding-sniffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", - "dev": true, "requires": { "whatwg-encoding": "^1.0.1" } @@ -9821,7 +9649,6 @@ "version": "1.3.3", "resolved": "https://registry.npmjs.org/html-to-react/-/html-to-react-1.3.3.tgz", "integrity": "sha512-4Qi5/t8oBr6c1t1kBJKyxEeJu0lb7ctvq29oFZioiUHH0Wz88VWGwoXuH26HDt9v64bDHA4NMPNTH8bVrcaJWA==", - "dev": true, "requires": { "domhandler": "^2.3.0", "escape-string-regexp": "^1.0.5", @@ -9834,7 +9661,6 @@ "version": "3.9.2", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.9.2.tgz", "integrity": "sha1-G9+HrMoPP55T+k/M6w9LTLsAszg=", - "dev": true, "requires": { "domelementtype": "^1.3.0", "domhandler": "^2.3.0", @@ -9895,7 +9721,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, "requires": { "assert-plus": "^1.0.0", "jsprim": "^1.2.2", @@ -9945,13 +9770,13 @@ } }, "husky": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/husky/-/husky-1.1.2.tgz", - "integrity": "sha512-9TdkUpBeEOjz0AnFdUN4i3w8kEbOsVs9/WSeJqWLq2OO6bcKQhVW64Zi+pVd/AMRLpN3QTINb6ZXiELczvdmqQ==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/husky/-/husky-1.1.4.tgz", + "integrity": "sha512-cZjGpS7qsaBSo3fOMUuR7erQloX3l5XzL1v/RkIqU6zrQImDdU70z5Re9fGDp7+kbYlM2EtS4aYMlahBeiCUGw==", "dev": true, "requires": { "cosmiconfig": "^5.0.6", - "execa": "^0.9.0", + "execa": "^1.0.0", "find-up": "^3.0.0", "get-stdin": "^6.0.0", "is-ci": "^1.2.1", @@ -9962,14 +9787,27 @@ "slash": "^2.0.0" }, "dependencies": { - "execa": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.9.0.tgz", - "integrity": "sha512-BbUMBiX4hqiHZUA5+JujIjNb6TyAlp2D5KLheMjMluwOuzcnylDL4AxZYLLn1n2AGB49eSWwyKvvEQoRpnAtmA==", + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", "dev": true, "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", "is-stream": "^1.1.0", "npm-run-path": "^2.0.0", "p-finally": "^1.0.0", @@ -9992,6 +9830,15 @@ "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", "dev": true }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, "locate-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", @@ -10051,6 +9898,16 @@ "find-up": "^3.0.0" } }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, "read-pkg": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-4.0.1.tgz", @@ -10102,8 +9959,7 @@ "ignore": { "version": "3.3.10", "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", - "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", - "dev": true + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==" }, "ignore-walk": { "version": "3.0.1", @@ -10150,7 +10006,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz", "integrity": "sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==", - "dev": true, "requires": { "pkg-dir": "^2.0.0", "resolve-cwd": "^2.0.0" @@ -10159,8 +10014,7 @@ "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" }, "in-publish": { "version": "2.0.0", @@ -10171,8 +10025,7 @@ "indent-string": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", - "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", - "dev": true + "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=" }, "indexes-of": { "version": "1.0.1", @@ -10190,7 +10043,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" @@ -10199,8 +10051,7 @@ "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, "ini": { "version": "1.3.5", @@ -10228,7 +10079,6 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", - "dev": true, "requires": { "ansi-escapes": "^3.0.0", "chalk": "^2.0.0", @@ -10250,7 +10100,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, "requires": { "ansi-regex": "^3.0.0" } @@ -10261,7 +10110,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/interpolate-components/-/interpolate-components-1.1.1.tgz", "integrity": "sha1-aZ//RdFSXpjHzntxWVkdmStd1t8=", - "dev": true, "requires": { "react": "^0.14.3 || ^15.1.0 || ^16.0.0", "react-addons-create-fragment": "^0.14.3 || ^15.1.0", @@ -10278,7 +10126,6 @@ "version": "2.2.4", "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "dev": true, "requires": { "loose-envify": "^1.0.0" } @@ -10286,8 +10133,7 @@ "invert-kv": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", - "dev": true + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" }, "ip": { "version": "1.1.5", @@ -10298,14 +10144,12 @@ "irregular-plurals": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-2.0.0.tgz", - "integrity": "sha512-Y75zBYLkh0lJ9qxeHlMjQ7bSbyiSqNW/UOPWDmzC7cXskL1hekSITh1Oc6JV0XCWWZ9DE8VYSB71xocLk3gmGw==", - "dev": true + "integrity": "sha512-Y75zBYLkh0lJ9qxeHlMjQ7bSbyiSqNW/UOPWDmzC7cXskL1hekSITh1Oc6JV0XCWWZ9DE8VYSB71xocLk3gmGw==" }, "is-accessor-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, "requires": { "kind-of": "^3.0.2" }, @@ -10314,7 +10158,6 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, "requires": { "is-buffer": "^1.1.5" } @@ -10346,8 +10189,7 @@ "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" }, "is-binary-path": { "version": "1.0.1", @@ -10361,20 +10203,17 @@ "is-boolean-object": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.0.0.tgz", - "integrity": "sha1-mPiygDBoQhmpXzdc+9iM40Bd/5M=", - "dev": true + "integrity": "sha1-mPiygDBoQhmpXzdc+9iM40Bd/5M=" }, "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" }, "is-builtin-module": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", - "dev": true, "requires": { "builtin-modules": "^1.0.0" } @@ -10388,7 +10227,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", - "dev": true, "requires": { "ci-info": "^1.5.0" } @@ -10397,7 +10235,6 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, "requires": { "kind-of": "^3.0.2" }, @@ -10406,7 +10243,6 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, "requires": { "is-buffer": "^1.1.5" } @@ -10428,7 +10264,6 @@ "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, "requires": { "is-accessor-descriptor": "^0.1.6", "is-data-descriptor": "^0.1.4", @@ -10438,8 +10273,7 @@ "kind-of": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" } } }, @@ -10452,14 +10286,12 @@ "is-dotfile": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", - "dev": true + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=" }, "is-equal-shallow": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", - "dev": true, "requires": { "is-primitive": "^2.0.0" } @@ -10467,8 +10299,7 @@ "is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" }, "is-extglob": { "version": "2.1.1", @@ -10480,7 +10311,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", - "dev": true, "requires": { "number-is-nan": "^1.0.0" } @@ -10488,14 +10318,12 @@ "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" }, "is-generator-fn": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-1.0.0.tgz", - "integrity": "sha1-lp1J4bszKfa7fwkIm+JleLLd1Go=", - "dev": true + "integrity": "sha1-lp1J4bszKfa7fwkIm+JleLLd1Go=" }, "is-glob": { "version": "4.0.0", @@ -10532,7 +10360,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, "requires": { "kind-of": "^3.0.2" }, @@ -10541,7 +10368,6 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, "requires": { "is-buffer": "^1.1.5" } @@ -10551,8 +10377,7 @@ "is-number-object": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.3.tgz", - "integrity": "sha1-8mWrian0RQNO9q/xWo8AsA9VF5k=", - "dev": true + "integrity": "sha1-8mWrian0RQNO9q/xWo8AsA9VF5k=" }, "is-obj": { "version": "1.0.1", @@ -10563,14 +10388,12 @@ "is-path-cwd": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", - "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", - "dev": true + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=" }, "is-path-in-cwd": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", - "dev": true, "requires": { "is-path-inside": "^1.0.0" } @@ -10579,7 +10402,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", - "dev": true, "requires": { "path-is-inside": "^1.0.1" } @@ -10587,14 +10409,12 @@ "is-plain-obj": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "dev": true + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" }, "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, "requires": { "isobject": "^3.0.1" } @@ -10602,20 +10422,17 @@ "is-posix-bracket": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", - "dev": true + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=" }, "is-primitive": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", - "dev": true + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=" }, "is-promise": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", - "dev": true + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" }, "is-redirect": { "version": "1.0.0", @@ -10640,8 +10457,7 @@ "is-resolvable": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", - "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", - "dev": true + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==" }, "is-retry-allowed": { "version": "1.1.0", @@ -10657,14 +10473,12 @@ "is-string": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.4.tgz", - "integrity": "sha1-zDqbaYV9Yh6WNyWiTK7shzuCbmQ=", - "dev": true + "integrity": "sha1-zDqbaYV9Yh6WNyWiTK7shzuCbmQ=" }, "is-subset": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-subset/-/is-subset-0.1.1.tgz", - "integrity": "sha1-ilkRfZMt4d4A8kX83TnOQ/HpOaY=", - "dev": true + "integrity": "sha1-ilkRfZMt4d4A8kX83TnOQ/HpOaY=" }, "is-supported-regexp-flag": { "version": "1.0.1", @@ -10697,14 +10511,12 @@ "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" }, "is-utf8": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" }, "is-whitespace-character": { "version": "1.0.2", @@ -10715,8 +10527,7 @@ "is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" }, "is-word-character": { "version": "1.0.2", @@ -10733,20 +10544,17 @@ "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, "isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" }, "isomorphic-fetch": { "version": "2.2.1", @@ -10760,14 +10568,12 @@ "isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" }, "istanbul-api": { "version": "1.3.7", "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.3.7.tgz", "integrity": "sha512-4/ApBnMVeEPG3EkSzcw25wDe4N66wxwn+KKn6b47vyek8Xb3NBAcg4xfuQbS7BqcZuTX4wxfD5lVagdggR3gyA==", - "dev": true, "requires": { "async": "^2.1.4", "fileset": "^2.0.2", @@ -10785,14 +10591,12 @@ "istanbul-lib-coverage": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz", - "integrity": "sha512-PzITeunAgyGbtY1ibVIUiV679EFChHjoMNRibEIobvmrCRaIgwLxNucOSimtNWUhEib/oO7QY2imD75JVgCJWQ==", - "dev": true + "integrity": "sha512-PzITeunAgyGbtY1ibVIUiV679EFChHjoMNRibEIobvmrCRaIgwLxNucOSimtNWUhEib/oO7QY2imD75JVgCJWQ==" }, "istanbul-lib-hook": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.2.2.tgz", "integrity": "sha512-/Jmq7Y1VeHnZEQ3TL10VHyb564mn6VrQXHchON9Jf/AEcmQ3ZIiyD1BVzNOKTZf/G3gE+kiGK6SmpF9y3qGPLw==", - "dev": true, "requires": { "append-transform": "^0.4.0" } @@ -10801,7 +10605,6 @@ "version": "1.10.2", "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.2.tgz", "integrity": "sha512-aWHxfxDqvh/ZlxR8BBaEPVSWDPUkGD63VjGQn3jcw8jCp7sHEMKcrj4xfJn/ABzdMEHiQNyvDQhqm5o8+SQg7A==", - "dev": true, "requires": { "babel-generator": "^6.18.0", "babel-template": "^6.16.0", @@ -10816,7 +10619,6 @@ "version": "1.1.5", "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.5.tgz", "integrity": "sha512-UsYfRMoi6QO/doUshYNqcKJqVmFe9w51GZz8BS3WB0lYxAllQYklka2wP9+dGZeHYaWIdcXUx8JGdbqaoXRXzw==", - "dev": true, "requires": { "istanbul-lib-coverage": "^1.2.1", "mkdirp": "^0.5.1", @@ -10827,14 +10629,12 @@ "has-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "supports-color": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, "requires": { "has-flag": "^1.0.0" } @@ -10845,7 +10645,6 @@ "version": "1.2.6", "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.6.tgz", "integrity": "sha512-TtbsY5GIHgbMsMiRw35YBHGpZ1DVFEO19vxxeiDMYaeOFOCzfnYVxvl6pOUIZR4dtPhAGpSMup8OyF8ubsaqEg==", - "dev": true, "requires": { "debug": "^3.1.0", "istanbul-lib-coverage": "^1.2.1", @@ -10858,7 +10657,6 @@ "version": "3.2.6", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, "requires": { "ms": "^2.1.1" } @@ -10866,8 +10664,7 @@ "ms": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" } } }, @@ -10875,7 +10672,6 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.5.1.tgz", "integrity": "sha512-+cfoZ0UXzWjhAdzosCPP3AN8vvef8XDkWtTfgaN+7L3YTpNYITnCaEkceo5SEYy644VkHka/P1FvkWvrG/rrJw==", - "dev": true, "requires": { "handlebars": "^4.0.3" } @@ -10889,14 +10685,12 @@ "jed": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/jed/-/jed-1.1.1.tgz", - "integrity": "sha1-elSbvZ/+FYWwzQoZHiAwVb7ldLQ=", - "dev": true + "integrity": "sha1-elSbvZ/+FYWwzQoZHiAwVb7ldLQ=" }, "jest": { "version": "23.6.0", "resolved": "https://registry.npmjs.org/jest/-/jest-23.6.0.tgz", "integrity": "sha512-lWzcd+HSiqeuxyhG+EnZds6iO3Y3ZEnMrfZq/OTGvF/C+Z4fPMCdhWTGSAiO2Oym9rbEXfwddHhh6jqrTF3+Lw==", - "dev": true, "requires": { "import-local": "^1.0.0", "jest-cli": "^23.6.0" @@ -10906,7 +10700,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, "requires": { "arr-flatten": "^1.0.1" } @@ -10914,14 +10707,12 @@ "array-unique": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" }, "braces": { "version": "1.8.5", "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true, "requires": { "expand-range": "^1.8.1", "preserve": "^0.2.0", @@ -10932,7 +10723,6 @@ "version": "0.1.5", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, "requires": { "is-posix-bracket": "^0.1.0" } @@ -10941,7 +10731,6 @@ "version": "0.3.2", "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, "requires": { "is-extglob": "^1.0.0" } @@ -10949,14 +10738,12 @@ "is-extglob": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" }, "is-glob": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, "requires": { "is-extglob": "^1.0.0" } @@ -10965,7 +10752,6 @@ "version": "23.6.0", "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-23.6.0.tgz", "integrity": "sha512-hgeD1zRUp1E1zsiyOXjEn4LzRLWdJBV//ukAHGlx6s5mfCNJTbhbHjgxnDUXA8fsKWN/HqFFF6X5XcCwC/IvYQ==", - "dev": true, "requires": { "ansi-escapes": "^3.0.0", "chalk": "^2.0.1", @@ -11009,7 +10795,6 @@ "version": "23.4.0", "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-23.4.0.tgz", "integrity": "sha1-BWp5UrP+pROsYqFAosNox52eYCM=", - "dev": true, "requires": { "jest-mock": "^23.2.0", "jest-util": "^23.4.0", @@ -11020,7 +10805,6 @@ "version": "23.4.0", "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-23.4.0.tgz", "integrity": "sha1-F2EMUJQjSVCNAaPR4L2iwHkIap8=", - "dev": true, "requires": { "@babel/code-frame": "^7.0.0-beta.35", "chalk": "^2.0.1", @@ -11032,14 +10816,12 @@ "jest-mock": { "version": "23.2.0", "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-23.2.0.tgz", - "integrity": "sha1-rRxg8p6HGdR8JuETgJi20YsmETQ=", - "dev": true + "integrity": "sha1-rRxg8p6HGdR8JuETgJi20YsmETQ=" }, "jest-util": { "version": "23.4.0", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-23.4.0.tgz", "integrity": "sha1-TQY8uSe68KI4Mf9hvsLLv0l5NWE=", - "dev": true, "requires": { "callsites": "^2.0.0", "chalk": "^2.0.1", @@ -11055,7 +10837,6 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, "requires": { "is-buffer": "^1.1.5" } @@ -11064,7 +10845,6 @@ "version": "2.3.11", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, "requires": { "arr-diff": "^2.0.0", "array-unique": "^0.2.1", @@ -11084,20 +10864,17 @@ "slash": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" }, "strip-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, "requires": { "ansi-regex": "^3.0.0" } @@ -11108,7 +10885,6 @@ "version": "23.4.2", "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-23.4.2.tgz", "integrity": "sha512-EyNhTAUWEfwnK0Is/09LxoqNDOn7mU7S3EHskG52djOFS/z+IT0jT3h3Ql61+dklcG7bJJitIWEMB4Sp1piHmA==", - "dev": true, "requires": { "throat": "^4.0.0" } @@ -11117,7 +10893,6 @@ "version": "23.6.0", "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-23.6.0.tgz", "integrity": "sha512-i8V7z9BeDXab1+VNo78WM0AtWpBRXJLnkT+lyT+Slx/cbP5sZJ0+NDuLcmBE5hXAoK0aUp7vI+MOxR+R4d8SRQ==", - "dev": true, "requires": { "babel-core": "^6.0.0", "babel-jest": "^23.6.0", @@ -11139,7 +10914,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, "requires": { "arr-flatten": "^1.0.1" } @@ -11147,14 +10921,12 @@ "array-unique": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" }, "babel-core": { "version": "6.26.3", "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", - "dev": true, "requires": { "babel-code-frame": "^6.26.0", "babel-generator": "^6.26.0", @@ -11181,7 +10953,6 @@ "version": "1.8.5", "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true, "requires": { "expand-range": "^1.8.1", "preserve": "^0.2.0", @@ -11192,7 +10963,6 @@ "version": "0.1.5", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, "requires": { "is-posix-bracket": "^0.1.0" } @@ -11201,7 +10971,6 @@ "version": "0.3.2", "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, "requires": { "is-extglob": "^1.0.0" } @@ -11209,14 +10978,12 @@ "is-extglob": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" }, "is-glob": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, "requires": { "is-extglob": "^1.0.0" } @@ -11225,7 +10992,6 @@ "version": "23.4.0", "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-23.4.0.tgz", "integrity": "sha1-BWp5UrP+pROsYqFAosNox52eYCM=", - "dev": true, "requires": { "jest-mock": "^23.2.0", "jest-util": "^23.4.0", @@ -11236,7 +11002,6 @@ "version": "23.4.0", "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-23.4.0.tgz", "integrity": "sha1-F2EMUJQjSVCNAaPR4L2iwHkIap8=", - "dev": true, "requires": { "@babel/code-frame": "^7.0.0-beta.35", "chalk": "^2.0.1", @@ -11248,14 +11013,12 @@ "jest-mock": { "version": "23.2.0", "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-23.2.0.tgz", - "integrity": "sha1-rRxg8p6HGdR8JuETgJi20YsmETQ=", - "dev": true + "integrity": "sha1-rRxg8p6HGdR8JuETgJi20YsmETQ=" }, "jest-util": { "version": "23.4.0", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-23.4.0.tgz", "integrity": "sha1-TQY8uSe68KI4Mf9hvsLLv0l5NWE=", - "dev": true, "requires": { "callsites": "^2.0.0", "chalk": "^2.0.1", @@ -11270,8 +11033,7 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" } } }, @@ -11279,7 +11041,6 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, "requires": { "is-buffer": "^1.1.5" } @@ -11288,7 +11049,6 @@ "version": "2.3.11", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, "requires": { "arr-diff": "^2.0.0", "array-unique": "^0.2.1", @@ -11309,7 +11069,6 @@ "version": "23.6.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-23.6.0.tgz", "integrity": "sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw==", - "dev": true, "requires": { "ansi-regex": "^3.0.0", "ansi-styles": "^3.2.0" @@ -11318,8 +11077,7 @@ "slash": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" } } }, @@ -11327,7 +11085,6 @@ "version": "23.6.0", "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-23.6.0.tgz", "integrity": "sha512-Gz9l5Ov+X3aL5L37IT+8hoCUsof1CVYBb2QEkOupK64XyRR3h+uRpYIm97K7sY8diFxowR8pIGEdyfMKTixo3g==", - "dev": true, "requires": { "chalk": "^2.0.1", "diff": "^3.2.0", @@ -11339,7 +11096,6 @@ "version": "23.6.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-23.6.0.tgz", "integrity": "sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw==", - "dev": true, "requires": { "ansi-regex": "^3.0.0", "ansi-styles": "^3.2.0" @@ -11351,7 +11107,6 @@ "version": "23.2.0", "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-23.2.0.tgz", "integrity": "sha1-8IXh8YVI2Z/dabICB+b9VdkTg6c=", - "dev": true, "requires": { "detect-newline": "^2.1.0" } @@ -11360,7 +11115,6 @@ "version": "23.6.0", "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-23.6.0.tgz", "integrity": "sha512-x7V6M/WGJo6/kLoissORuvLIeAoyo2YqLOoCDkohgJ4XOXSqOtyvr8FbInlAWS77ojBsZrafbozWoKVRdtxFCg==", - "dev": true, "requires": { "chalk": "^2.0.1", "pretty-format": "^23.6.0" @@ -11370,7 +11124,6 @@ "version": "23.6.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-23.6.0.tgz", "integrity": "sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw==", - "dev": true, "requires": { "ansi-regex": "^3.0.0", "ansi-styles": "^3.2.0" @@ -11382,7 +11135,6 @@ "version": "6.1.2", "resolved": "https://registry.npmjs.org/jest-environment-enzyme/-/jest-environment-enzyme-6.1.2.tgz", "integrity": "sha512-WHeBKgBYOdryuOTEoK55lJwjg7Raery1OgXHLwukI3mSYgOkm2UrCDDT+vneqVgy7F8KuRHyStfD+TC/m2b7Kg==", - "dev": true, "requires": { "jest-environment-jsdom": "^22.4.1" } @@ -11391,7 +11143,6 @@ "version": "22.4.3", "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-22.4.3.tgz", "integrity": "sha512-FviwfR+VyT3Datf13+ULjIMO5CSeajlayhhYQwpzgunswoaLIPutdbrnfUHEMyJCwvqQFaVtTmn9+Y8WCt6n1w==", - "dev": true, "requires": { "jest-mock": "^22.4.3", "jest-util": "^22.4.3", @@ -11402,7 +11153,6 @@ "version": "23.4.0", "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-23.4.0.tgz", "integrity": "sha1-V+gO0IQd6jAxZ8zozXlSHeuv3hA=", - "dev": true, "requires": { "jest-mock": "^23.2.0", "jest-util": "^23.4.0" @@ -11412,7 +11162,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, "requires": { "arr-flatten": "^1.0.1" } @@ -11420,14 +11169,12 @@ "array-unique": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" }, "braces": { "version": "1.8.5", "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true, "requires": { "expand-range": "^1.8.1", "preserve": "^0.2.0", @@ -11438,7 +11185,6 @@ "version": "0.1.5", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, "requires": { "is-posix-bracket": "^0.1.0" } @@ -11447,7 +11193,6 @@ "version": "0.3.2", "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, "requires": { "is-extglob": "^1.0.0" } @@ -11455,14 +11200,12 @@ "is-extglob": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" }, "is-glob": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, "requires": { "is-extglob": "^1.0.0" } @@ -11471,7 +11214,6 @@ "version": "23.4.0", "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-23.4.0.tgz", "integrity": "sha1-F2EMUJQjSVCNAaPR4L2iwHkIap8=", - "dev": true, "requires": { "@babel/code-frame": "^7.0.0-beta.35", "chalk": "^2.0.1", @@ -11483,14 +11225,12 @@ "jest-mock": { "version": "23.2.0", "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-23.2.0.tgz", - "integrity": "sha1-rRxg8p6HGdR8JuETgJi20YsmETQ=", - "dev": true + "integrity": "sha1-rRxg8p6HGdR8JuETgJi20YsmETQ=" }, "jest-util": { "version": "23.4.0", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-23.4.0.tgz", "integrity": "sha1-TQY8uSe68KI4Mf9hvsLLv0l5NWE=", - "dev": true, "requires": { "callsites": "^2.0.0", "chalk": "^2.0.1", @@ -11506,7 +11246,6 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, "requires": { "is-buffer": "^1.1.5" } @@ -11515,7 +11254,6 @@ "version": "2.3.11", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, "requires": { "arr-diff": "^2.0.0", "array-unique": "^0.2.1", @@ -11535,14 +11273,12 @@ "slash": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" } } }, @@ -11550,7 +11286,6 @@ "version": "6.1.2", "resolved": "https://registry.npmjs.org/jest-enzyme/-/jest-enzyme-6.1.2.tgz", "integrity": "sha512-+ds7r2ru3QkNJxelQ2tnC6d33pjUSsZHPD3v4TlnHlNMuGX3UKdxm5C46yZBvJICYBvIF+RFKBhLMM4evNM95Q==", - "dev": true, "requires": { "enzyme-matchers": "^6.1.2", "enzyme-to-json": "^3.3.0", @@ -11560,14 +11295,12 @@ "jest-get-type": { "version": "22.4.3", "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-22.4.3.tgz", - "integrity": "sha512-/jsz0Y+V29w1chdXVygEKSz2nBoHoYqNShPe+QgxSNjAuP1i8+k4LbQNrfoliKej0P45sivkSCh7yiD6ubHS3w==", - "dev": true + "integrity": "sha512-/jsz0Y+V29w1chdXVygEKSz2nBoHoYqNShPe+QgxSNjAuP1i8+k4LbQNrfoliKej0P45sivkSCh7yiD6ubHS3w==" }, "jest-haste-map": { "version": "23.6.0", "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-23.6.0.tgz", "integrity": "sha512-uyNhMyl6dr6HaXGHp8VF7cK6KpC6G9z9LiMNsst+rJIZ8l7wY0tk8qwjPmEghczojZ2/ZhtEdIabZ0OQRJSGGg==", - "dev": true, "requires": { "fb-watchman": "^2.0.0", "graceful-fs": "^4.1.11", @@ -11583,7 +11316,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, "requires": { "arr-flatten": "^1.0.1" } @@ -11591,14 +11323,12 @@ "array-unique": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" }, "braces": { "version": "1.8.5", "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true, "requires": { "expand-range": "^1.8.1", "preserve": "^0.2.0", @@ -11609,7 +11339,6 @@ "version": "0.1.5", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, "requires": { "is-posix-bracket": "^0.1.0" } @@ -11618,7 +11347,6 @@ "version": "0.3.2", "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, "requires": { "is-extglob": "^1.0.0" } @@ -11626,14 +11354,12 @@ "is-extglob": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" }, "is-glob": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, "requires": { "is-extglob": "^1.0.0" } @@ -11642,7 +11368,6 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, "requires": { "is-buffer": "^1.1.5" } @@ -11651,7 +11376,6 @@ "version": "2.3.11", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, "requires": { "arr-diff": "^2.0.0", "array-unique": "^0.2.1", @@ -11674,7 +11398,6 @@ "version": "23.6.0", "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-23.6.0.tgz", "integrity": "sha512-pe2Ytgs1nyCs8IvsEJRiRTPC0eVYd8L/dXJGU08GFuBwZ4sYH/lmFDdOL3ZmvJR8QKqV9MFuwlsAi/EWkFUbsQ==", - "dev": true, "requires": { "babel-traverse": "^6.0.0", "chalk": "^2.0.1", @@ -11694,7 +11417,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, "requires": { "arr-flatten": "^1.0.1" } @@ -11702,14 +11424,12 @@ "array-unique": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" }, "braces": { "version": "1.8.5", "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true, "requires": { "expand-range": "^1.8.1", "preserve": "^0.2.0", @@ -11720,7 +11440,6 @@ "version": "0.1.5", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, "requires": { "is-posix-bracket": "^0.1.0" } @@ -11729,7 +11448,6 @@ "version": "0.3.2", "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, "requires": { "is-extglob": "^1.0.0" } @@ -11737,14 +11455,12 @@ "is-extglob": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" }, "is-glob": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, "requires": { "is-extglob": "^1.0.0" } @@ -11753,7 +11469,6 @@ "version": "23.6.0", "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-23.6.0.tgz", "integrity": "sha512-rosyCHQfBcol4NsckTn01cdelzWLU9Cq7aaigDf8VwwpIRvWE/9zLgX2bON+FkEW69/0UuYslUe22SOdEf2nog==", - "dev": true, "requires": { "chalk": "^2.0.1", "jest-get-type": "^22.1.0", @@ -11764,7 +11479,6 @@ "version": "23.4.0", "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-23.4.0.tgz", "integrity": "sha1-F2EMUJQjSVCNAaPR4L2iwHkIap8=", - "dev": true, "requires": { "@babel/code-frame": "^7.0.0-beta.35", "chalk": "^2.0.1", @@ -11777,7 +11491,6 @@ "version": "23.4.0", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-23.4.0.tgz", "integrity": "sha1-TQY8uSe68KI4Mf9hvsLLv0l5NWE=", - "dev": true, "requires": { "callsites": "^2.0.0", "chalk": "^2.0.1", @@ -11793,7 +11506,6 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, "requires": { "is-buffer": "^1.1.5" } @@ -11802,7 +11514,6 @@ "version": "2.3.11", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, "requires": { "arr-diff": "^2.0.0", "array-unique": "^0.2.1", @@ -11823,7 +11534,6 @@ "version": "23.6.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-23.6.0.tgz", "integrity": "sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw==", - "dev": true, "requires": { "ansi-regex": "^3.0.0", "ansi-styles": "^3.2.0" @@ -11832,14 +11542,12 @@ "slash": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" } } }, @@ -11847,7 +11555,6 @@ "version": "23.6.0", "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-23.6.0.tgz", "integrity": "sha512-f/8zA04rsl1Nzj10HIyEsXvYlMpMPcy0QkQilVZDFOaPbv2ur71X5u2+C4ZQJGyV/xvVXtCCZ3wQ99IgQxftCg==", - "dev": true, "requires": { "pretty-format": "^23.6.0" }, @@ -11856,7 +11563,6 @@ "version": "23.6.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-23.6.0.tgz", "integrity": "sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw==", - "dev": true, "requires": { "ansi-regex": "^3.0.0", "ansi-styles": "^3.2.0" @@ -11868,7 +11574,6 @@ "version": "22.4.3", "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-22.4.3.tgz", "integrity": "sha512-lsEHVaTnKzdAPR5t4B6OcxXo9Vy4K+kRRbG5gtddY8lBEC+Mlpvm1CJcsMESRjzUhzkz568exMV1hTB76nAKbA==", - "dev": true, "requires": { "chalk": "^2.0.1", "jest-get-type": "^22.4.3", @@ -11879,7 +11584,6 @@ "version": "22.4.3", "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-22.4.3.tgz", "integrity": "sha512-iAMeKxhB3Se5xkSjU0NndLLCHtP4n+GtCqV0bISKA5dmOXQfEbdEmYiu2qpnWBDCQdEafNDDU6Q+l6oBMd/+BA==", - "dev": true, "requires": { "@babel/code-frame": "^7.0.0-beta.35", "chalk": "^2.0.1", @@ -11892,7 +11596,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, "requires": { "arr-flatten": "^1.0.1" } @@ -11900,14 +11603,12 @@ "array-unique": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" }, "braces": { "version": "1.8.5", "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true, "requires": { "expand-range": "^1.8.1", "preserve": "^0.2.0", @@ -11918,7 +11619,6 @@ "version": "0.1.5", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, "requires": { "is-posix-bracket": "^0.1.0" } @@ -11927,7 +11627,6 @@ "version": "0.3.2", "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, "requires": { "is-extglob": "^1.0.0" } @@ -11935,14 +11634,12 @@ "is-extglob": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" }, "is-glob": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, "requires": { "is-extglob": "^1.0.0" } @@ -11951,7 +11648,6 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, "requires": { "is-buffer": "^1.1.5" } @@ -11960,7 +11656,6 @@ "version": "2.3.11", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, "requires": { "arr-diff": "^2.0.0", "array-unique": "^0.2.1", @@ -11980,28 +11675,24 @@ "slash": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" } } }, "jest-mock": { "version": "22.4.3", "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-22.4.3.tgz", - "integrity": "sha512-+4R6mH5M1G4NK16CKg9N1DtCaFmuxhcIqF4lQK/Q1CIotqMs/XBemfpDPeVZBFow6iyUNu6EBT9ugdNOTT5o5Q==", - "dev": true + "integrity": "sha512-+4R6mH5M1G4NK16CKg9N1DtCaFmuxhcIqF4lQK/Q1CIotqMs/XBemfpDPeVZBFow6iyUNu6EBT9ugdNOTT5o5Q==" }, "jest-regex-util": { "version": "23.3.0", "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-23.3.0.tgz", - "integrity": "sha1-X4ZylUfCeFxAAs6qj4Sf6MpHG8U=", - "dev": true + "integrity": "sha1-X4ZylUfCeFxAAs6qj4Sf6MpHG8U=" }, "jest-resolve": { "version": "23.6.0", "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-23.6.0.tgz", "integrity": "sha512-XyoRxNtO7YGpQDmtQCmZjum1MljDqUCob7XlZ6jy9gsMugHdN2hY4+Acz9Qvjz2mSsOnPSH7skBmDYCHXVZqkA==", - "dev": true, "requires": { "browser-resolve": "^1.11.3", "chalk": "^2.0.1", @@ -12012,7 +11703,6 @@ "version": "23.6.0", "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-23.6.0.tgz", "integrity": "sha512-EkQWkFWjGKwRtRyIwRwI6rtPAEyPWlUC2MpzHissYnzJeHcyCn1Hc8j7Nn1xUVrS5C6W5+ZL37XTem4D4pLZdA==", - "dev": true, "requires": { "jest-regex-util": "^23.3.0", "jest-snapshot": "^23.6.0" @@ -12022,7 +11712,6 @@ "version": "23.6.0", "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-23.6.0.tgz", "integrity": "sha512-kw0+uj710dzSJKU6ygri851CObtCD9cN8aNkg8jWJf4ewFyEa6kwmiH/r/M1Ec5IL/6VFa0wnAk6w+gzUtjJzA==", - "dev": true, "requires": { "exit": "^0.1.2", "graceful-fs": "^4.1.11", @@ -12043,7 +11732,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, "requires": { "arr-flatten": "^1.0.1" } @@ -12051,14 +11739,12 @@ "array-unique": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" }, "braces": { "version": "1.8.5", "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true, "requires": { "expand-range": "^1.8.1", "preserve": "^0.2.0", @@ -12069,7 +11755,6 @@ "version": "0.1.5", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, "requires": { "is-posix-bracket": "^0.1.0" } @@ -12078,7 +11763,6 @@ "version": "0.3.2", "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, "requires": { "is-extglob": "^1.0.0" } @@ -12086,14 +11770,12 @@ "is-extglob": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" }, "is-glob": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, "requires": { "is-extglob": "^1.0.0" } @@ -12102,7 +11784,6 @@ "version": "23.4.0", "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-23.4.0.tgz", "integrity": "sha1-F2EMUJQjSVCNAaPR4L2iwHkIap8=", - "dev": true, "requires": { "@babel/code-frame": "^7.0.0-beta.35", "chalk": "^2.0.1", @@ -12115,7 +11796,6 @@ "version": "23.4.0", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-23.4.0.tgz", "integrity": "sha1-TQY8uSe68KI4Mf9hvsLLv0l5NWE=", - "dev": true, "requires": { "callsites": "^2.0.0", "chalk": "^2.0.1", @@ -12131,7 +11811,6 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, "requires": { "is-buffer": "^1.1.5" } @@ -12140,7 +11819,6 @@ "version": "2.3.11", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, "requires": { "arr-diff": "^2.0.0", "array-unique": "^0.2.1", @@ -12160,20 +11838,17 @@ "slash": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" }, "source-map-support": { "version": "0.5.9", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.9.tgz", "integrity": "sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==", - "dev": true, "requires": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -12185,7 +11860,6 @@ "version": "23.6.0", "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-23.6.0.tgz", "integrity": "sha512-ycnLTNPT2Gv+TRhnAYAQ0B3SryEXhhRj1kA6hBPSeZaNQkJ7GbZsxOLUkwg6YmvWGdX3BB3PYKFLDQCAE1zNOw==", - "dev": true, "requires": { "babel-core": "^6.0.0", "babel-plugin-istanbul": "^4.1.6", @@ -12214,7 +11888,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, "requires": { "arr-flatten": "^1.0.1" } @@ -12222,14 +11895,12 @@ "array-unique": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" }, "babel-core": { "version": "6.26.3", "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", - "dev": true, "requires": { "babel-code-frame": "^6.26.0", "babel-generator": "^6.26.0", @@ -12256,7 +11927,6 @@ "version": "1.8.5", "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true, "requires": { "expand-range": "^1.8.1", "preserve": "^0.2.0", @@ -12267,7 +11937,6 @@ "version": "0.1.5", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, "requires": { "is-posix-bracket": "^0.1.0" } @@ -12276,7 +11945,6 @@ "version": "0.3.2", "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, "requires": { "is-extglob": "^1.0.0" } @@ -12284,14 +11952,12 @@ "is-extglob": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" }, "is-glob": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, "requires": { "is-extglob": "^1.0.0" } @@ -12300,7 +11966,6 @@ "version": "23.4.0", "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-23.4.0.tgz", "integrity": "sha1-F2EMUJQjSVCNAaPR4L2iwHkIap8=", - "dev": true, "requires": { "@babel/code-frame": "^7.0.0-beta.35", "chalk": "^2.0.1", @@ -12313,7 +11978,6 @@ "version": "23.4.0", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-23.4.0.tgz", "integrity": "sha1-TQY8uSe68KI4Mf9hvsLLv0l5NWE=", - "dev": true, "requires": { "callsites": "^2.0.0", "chalk": "^2.0.1", @@ -12328,8 +11992,7 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" } } }, @@ -12337,7 +12000,6 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, "requires": { "is-buffer": "^1.1.5" } @@ -12346,7 +12008,6 @@ "version": "2.3.11", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, "requires": { "arr-diff": "^2.0.0", "array-unique": "^0.2.1", @@ -12366,28 +12027,24 @@ "slash": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" }, "strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" } } }, "jest-serializer": { "version": "23.0.1", "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-23.0.1.tgz", - "integrity": "sha1-o3dq6zEekP6D+rnlM+hRAr0WQWU=", - "dev": true + "integrity": "sha1-o3dq6zEekP6D+rnlM+hRAr0WQWU=" }, "jest-snapshot": { "version": "23.6.0", "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-23.6.0.tgz", "integrity": "sha512-tM7/Bprftun6Cvj2Awh/ikS7zV3pVwjRYU2qNYS51VZHgaAMBs5l4o/69AiDHhQrj5+LA2Lq4VIvK7zYk/bswg==", - "dev": true, "requires": { "babel-types": "^6.0.0", "chalk": "^2.0.1", @@ -12405,7 +12062,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, "requires": { "arr-flatten": "^1.0.1" } @@ -12413,14 +12069,12 @@ "array-unique": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" }, "braces": { "version": "1.8.5", "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true, "requires": { "expand-range": "^1.8.1", "preserve": "^0.2.0", @@ -12431,7 +12085,6 @@ "version": "0.1.5", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, "requires": { "is-posix-bracket": "^0.1.0" } @@ -12440,7 +12093,6 @@ "version": "0.3.2", "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, "requires": { "is-extglob": "^1.0.0" } @@ -12448,14 +12100,12 @@ "is-extglob": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" }, "is-glob": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, "requires": { "is-extglob": "^1.0.0" } @@ -12464,7 +12114,6 @@ "version": "23.6.0", "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-23.6.0.tgz", "integrity": "sha512-rosyCHQfBcol4NsckTn01cdelzWLU9Cq7aaigDf8VwwpIRvWE/9zLgX2bON+FkEW69/0UuYslUe22SOdEf2nog==", - "dev": true, "requires": { "chalk": "^2.0.1", "jest-get-type": "^22.1.0", @@ -12475,7 +12124,6 @@ "version": "23.4.0", "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-23.4.0.tgz", "integrity": "sha1-F2EMUJQjSVCNAaPR4L2iwHkIap8=", - "dev": true, "requires": { "@babel/code-frame": "^7.0.0-beta.35", "chalk": "^2.0.1", @@ -12488,7 +12136,6 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, "requires": { "is-buffer": "^1.1.5" } @@ -12497,7 +12144,6 @@ "version": "2.3.11", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, "requires": { "arr-diff": "^2.0.0", "array-unique": "^0.2.1", @@ -12518,7 +12164,6 @@ "version": "23.6.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-23.6.0.tgz", "integrity": "sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw==", - "dev": true, "requires": { "ansi-regex": "^3.0.0", "ansi-styles": "^3.2.0" @@ -12527,8 +12172,7 @@ "slash": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" } } }, @@ -12536,7 +12180,6 @@ "version": "22.4.3", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-22.4.3.tgz", "integrity": "sha512-rfDfG8wyC5pDPNdcnAlZgwKnzHvZDu8Td2NJI/jAGKEGxJPYiE4F0ss/gSAkG4778Y23Hvbz+0GMrDJTeo7RjQ==", - "dev": true, "requires": { "callsites": "^2.0.0", "chalk": "^2.0.1", @@ -12550,8 +12193,7 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" } } }, @@ -12559,7 +12201,6 @@ "version": "23.6.0", "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-23.6.0.tgz", "integrity": "sha512-OFKapYxe72yz7agrDAWi8v2WL8GIfVqcbKRCLbRG9PAxtzF9b1SEDdTpytNDN12z2fJynoBwpMpvj2R39plI2A==", - "dev": true, "requires": { "chalk": "^2.0.1", "jest-get-type": "^22.1.0", @@ -12571,7 +12212,6 @@ "version": "23.6.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-23.6.0.tgz", "integrity": "sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw==", - "dev": true, "requires": { "ansi-regex": "^3.0.0", "ansi-styles": "^3.2.0" @@ -12583,7 +12223,6 @@ "version": "23.4.0", "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-23.4.0.tgz", "integrity": "sha1-0uKM50+NrWxq/JIrksq+9u0FyRw=", - "dev": true, "requires": { "ansi-escapes": "^3.0.0", "chalk": "^2.0.1", @@ -12594,7 +12233,6 @@ "version": "23.2.0", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-23.2.0.tgz", "integrity": "sha1-+vcGqNo2+uYOsmlXJX+ntdjqArk=", - "dev": true, "requires": { "merge-stream": "^1.0.1" } @@ -12608,8 +12246,7 @@ "js-levenshtein": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.4.tgz", - "integrity": "sha512-PxfGzSs0ztShKrUYPIn5r0MtyAhYcCwmndozzpz8YObbPnD1jFxzlBGbRnX2mIu6Z13xN6+PTu05TQFnZFlzow==", - "dev": true + "integrity": "sha512-PxfGzSs0ztShKrUYPIn5r0MtyAhYcCwmndozzpz8YObbPnD1jFxzlBGbRnX2mIu6Z13xN6+PTu05TQFnZFlzow==" }, "js-tokens": { "version": "4.0.0", @@ -12620,7 +12257,6 @@ "version": "3.12.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", - "dev": true, "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -12629,22 +12265,19 @@ "esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" } } }, "jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" }, "jsdom": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.12.0.tgz", "integrity": "sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw==", - "dev": true, "requires": { "abab": "^2.0.0", "acorn": "^5.5.3", @@ -12677,52 +12310,44 @@ "parse5": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", - "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", - "dev": true + "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==" } } }, "jsesc": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.1.tgz", - "integrity": "sha1-5CGiqOINawgZ3yiQj3glJrlt0f4=", - "dev": true + "integrity": "sha1-5CGiqOINawgZ3yiQj3glJrlt0f4=" }, "json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" }, "json-schema": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" }, "json-schema-traverse": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", - "dev": true + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" }, "json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" }, "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" }, "json5": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", - "dev": true + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" }, "jsonfile": { "version": "2.4.0", @@ -12743,7 +12368,6 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, "requires": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", @@ -12763,14 +12387,12 @@ "kind-of": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" }, "kleur": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/kleur/-/kleur-2.0.2.tgz", - "integrity": "sha512-77XF9iTllATmG9lSlIv0qdQ2BQ/h9t0bJllHlbvsQ0zUWfU7Yi0S8L5JXzPZgkefIiajLmBJJ4BsMJmqcf7oxQ==", - "dev": true + "integrity": "sha512-77XF9iTllATmG9lSlIv0qdQ2BQ/h9t0bJllHlbvsQ0zUWfU7Yi0S8L5JXzPZgkefIiajLmBJJ4BsMJmqcf7oxQ==" }, "known-css-properties": { "version": "0.9.0", @@ -12791,7 +12413,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "dev": true, "requires": { "invert-kv": "^1.0.0" } @@ -12799,8 +12420,7 @@ "left-pad": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", - "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==", - "dev": true + "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==" }, "lerna": { "version": "3.4.3", @@ -12830,14 +12450,12 @@ "leven": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", - "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=", - "dev": true + "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=" }, "levn": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, "requires": { "prelude-ls": "~1.1.2", "type-check": "~0.3.2" @@ -13034,7 +12652,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, "requires": { "graceful-fs": "^4.1.2", "parse-json": "^2.2.0", @@ -13115,7 +12732,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, "requires": { "p-locate": "^2.0.0", "path-exists": "^3.0.0" @@ -13130,7 +12746,6 @@ "version": "3.0.7", "resolved": "https://registry.npmjs.org/lodash._baseisequal/-/lodash._baseisequal-3.0.7.tgz", "integrity": "sha1-2AJfdjOdKTQnZ9zIh85cuVpbUfE=", - "dev": true, "requires": { "lodash.isarray": "^3.0.0", "lodash.istypedarray": "^3.0.0", @@ -13140,14 +12755,12 @@ "lodash._bindcallback": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz", - "integrity": "sha1-5THCdkTPi1epnhftlbNcdIeJOS4=", - "dev": true + "integrity": "sha1-5THCdkTPi1epnhftlbNcdIeJOS4=" }, "lodash._getnative": { "version": "3.9.1", "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", - "dev": true + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=" }, "lodash._reinterpolate": { "version": "3.0.0", @@ -13176,44 +12789,37 @@ "lodash.escape": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-4.0.1.tgz", - "integrity": "sha1-yQRGkMIeBClL6qUXcS/e0fqI3pg=", - "dev": true + "integrity": "sha1-yQRGkMIeBClL6qUXcS/e0fqI3pg=" }, "lodash.flattendeep": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", - "dev": true + "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=" }, "lodash.isarguments": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", - "dev": true + "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=" }, "lodash.isarray": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", - "dev": true + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=" }, "lodash.isequal": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=", - "dev": true + "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=" }, "lodash.istypedarray": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/lodash.istypedarray/-/lodash.istypedarray-3.0.6.tgz", - "integrity": "sha1-yaR3SYYHUB2OhJTSg7h8OSgc72I=", - "dev": true + "integrity": "sha1-yaR3SYYHUB2OhJTSg7h8OSgc72I=" }, "lodash.keys": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", - "dev": true, "requires": { "lodash._getnative": "^3.0.0", "lodash.isarguments": "^3.0.0", @@ -13229,8 +12835,7 @@ "lodash.sortby": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", - "dev": true + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" }, "lodash.tail": { "version": "4.1.1", @@ -13267,7 +12872,6 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", - "dev": true, "requires": { "chalk": "^2.0.1" } @@ -13290,7 +12894,6 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", - "dev": true, "requires": { "currently-unhandled": "^0.4.1", "signal-exit": "^3.0.0" @@ -13306,27 +12909,17 @@ "version": "4.1.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", - "dev": true, "requires": { "pseudomap": "^1.0.2", "yallist": "^2.1.2" } }, "magic-string": { - "version": "0.22.5", - "resolved": "http://registry.npmjs.org/magic-string/-/magic-string-0.22.5.tgz", - "integrity": "sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w==", - "dev": true, + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.1.tgz", + "integrity": "sha512-sCuTz6pYom8Rlt4ISPFn6wuFodbKMIHUMv4Qko9P17dpxb7s52KJTmRuZZqHdGmLCK9AOcDare039nRIcfdkEg==", "requires": { - "vlq": "^0.2.2" - }, - "dependencies": { - "vlq": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/vlq/-/vlq-0.2.3.tgz", - "integrity": "sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow==", - "dev": true - } + "sourcemap-codec": "^1.4.1" } }, "make-dir": { @@ -13436,7 +13029,6 @@ "version": "1.0.11", "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", - "dev": true, "requires": { "tmpl": "1.0.x" } @@ -13453,20 +13045,17 @@ "map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" }, "map-obj": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", - "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=", - "dev": true + "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=" }, "map-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, "requires": { "object-visit": "^1.0.0" } @@ -13486,20 +13075,17 @@ "marked": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/marked/-/marked-0.5.1.tgz", - "integrity": "sha512-iUkBZegCZou4AdwbKTwSW/lNDcz5OuRSl3qdcl31Ia0B2QPG0Jn+tKblh/9/eP9/6+4h27vpoh8wel/vQOV0vw==", - "dev": true + "integrity": "sha512-iUkBZegCZou4AdwbKTwSW/lNDcz5OuRSl3qdcl31Ia0B2QPG0Jn+tKblh/9/eP9/6+4h27vpoh8wel/vQOV0vw==" }, "material-colors": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/material-colors/-/material-colors-1.2.6.tgz", - "integrity": "sha512-6qE4B9deFBIa9YSpOc9O0Sgc43zTeVYbgDT5veRKSlB2+ZuHNoVVxA1L/ckMUayV9Ay9y7Z/SZCLcGteW9i7bg==", - "dev": true + "integrity": "sha512-6qE4B9deFBIa9YSpOc9O0Sgc43zTeVYbgDT5veRKSlB2+ZuHNoVVxA1L/ckMUayV9Ay9y7Z/SZCLcGteW9i7bg==" }, "math-random": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz", - "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=", - "dev": true + "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=" }, "mathml-tag-names": { "version": "2.1.0", @@ -13537,7 +13123,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", - "dev": true, "requires": { "mimic-fn": "^1.0.0" } @@ -13545,8 +13130,7 @@ "memize": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/memize/-/memize-1.0.5.tgz", - "integrity": "sha512-Dm8Jhb5kiC4+ynYsVR4QDXKt+o2dfqGuY4hE2x+XlXZkdndlT80bJxfcMv5QGp/FCy6MhG7f5ElpmKPFKOSEpg==", - "dev": true + "integrity": "sha512-Dm8Jhb5kiC4+ynYsVR4QDXKt+o2dfqGuY4hE2x+XlXZkdndlT80bJxfcMv5QGp/FCy6MhG7f5ElpmKPFKOSEpg==" }, "memory-fs": { "version": "0.4.1", @@ -13562,7 +13146,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/meow/-/meow-5.0.0.tgz", "integrity": "sha512-CbTqYU17ABaLefO8vCU153ZZlprKYWDljcndKKDCFcYQITzWCXZAVk4QMFZPgvzrnUQ3uItnIE/LoUOwrT15Ig==", - "dev": true, "requires": { "camelcase-keys": "^4.0.0", "decamelize-keys": "^1.0.0", @@ -13579,7 +13162,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dev": true, "requires": { "graceful-fs": "^4.1.2", "parse-json": "^4.0.0", @@ -13591,7 +13173,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, "requires": { "error-ex": "^1.3.1", "json-parse-better-errors": "^1.0.1" @@ -13601,7 +13182,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, "requires": { "pify": "^3.0.0" } @@ -13609,14 +13189,12 @@ "pify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" }, "read-pkg": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "dev": true, "requires": { "load-json-file": "^4.0.0", "normalize-package-data": "^2.3.2", @@ -13627,7 +13205,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", - "dev": true, "requires": { "find-up": "^2.0.0", "read-pkg": "^3.0.0" @@ -13636,14 +13213,12 @@ "strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" }, "yargs-parser": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", - "dev": true, "requires": { "camelcase": "^4.1.0" } @@ -13651,16 +13226,14 @@ } }, "merge": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.0.tgz", - "integrity": "sha1-dTHjnUlJwoGma4xabgJl6LBYlNo=", - "dev": true + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.1.tgz", + "integrity": "sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ==" }, "merge-stream": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", - "dev": true, "requires": { "readable-stream": "^2.0.1" } @@ -13675,7 +13248,6 @@ "version": "3.1.10", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, "requires": { "arr-diff": "^4.0.0", "array-unique": "^0.3.2", @@ -13711,14 +13283,12 @@ "mime-db": { "version": "1.36.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.36.0.tgz", - "integrity": "sha512-L+xvyD9MkoYMXb1jAmzI/lWYAxAMCPvIBSWur0PZ5nOf5euahRLVqH//FKW9mWp2lkqUgYiXPgkzfMUFi4zVDw==", - "dev": true + "integrity": "sha512-L+xvyD9MkoYMXb1jAmzI/lWYAxAMCPvIBSWur0PZ5nOf5euahRLVqH//FKW9mWp2lkqUgYiXPgkzfMUFi4zVDw==" }, "mime-types": { "version": "2.1.20", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.20.tgz", "integrity": "sha512-HrkrPaP9vGuWbLK1B1FfgAkbqNjIuy4eHlIYnFi7kamZyLLrGlo2mpcx0bBmNpKqBtYtAfGbodDddIgddSJC2A==", - "dev": true, "requires": { "mime-db": "~1.36.0" } @@ -13726,8 +13296,7 @@ "mimic-fn": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" }, "minimalistic-assert": { "version": "1.0.1", @@ -13745,7 +13314,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, "requires": { "brace-expansion": "^1.1.7" } @@ -13753,14 +13321,12 @@ "minimist": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" }, "minimist-options": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", - "dev": true, "requires": { "arrify": "^1.0.1", "is-plain-obj": "^1.1.0" @@ -13815,7 +13381,6 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", - "dev": true, "requires": { "for-in": "^1.0.2", "is-extendable": "^1.0.1" @@ -13825,7 +13390,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, "requires": { "is-plain-object": "^2.0.4" } @@ -13854,7 +13418,6 @@ "version": "0.5.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, "requires": { "minimist": "0.0.8" } @@ -13874,7 +13437,6 @@ "version": "0.5.23", "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.23.tgz", "integrity": "sha512-WHFH85DkCfiNMDX5D3X7hpNH3/PUhjTGcD0U1SgfBGZxJ3qUmJh5FdvaFjcClxOvB3rzdfj4oRffbI38jEnC1w==", - "dev": true, "requires": { "moment": ">= 2.9.0" } @@ -13882,14 +13444,12 @@ "moo": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/moo/-/moo-0.4.3.tgz", - "integrity": "sha512-gFD2xGCl8YFgGHsqJ9NKRVdwlioeW3mI1iqfLNYQOv0+6JRwG58Zk9DIGQgyIaffSYaO1xsKnMaYzzNr1KyIAw==", - "dev": true + "integrity": "sha512-gFD2xGCl8YFgGHsqJ9NKRVdwlioeW3mI1iqfLNYQOv0+6JRwG58Zk9DIGQgyIaffSYaO1xsKnMaYzzNr1KyIAw==" }, "mousetrap": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/mousetrap/-/mousetrap-1.6.2.tgz", - "integrity": "sha512-jDjhi7wlHwdO6q6DS7YRmSHcuI+RVxadBkLt3KHrhd3C2b+w5pKefg3oj5beTcHZyVFA9Aksf+yEE1y5jxUjVA==", - "dev": true + "integrity": "sha512-jDjhi7wlHwdO6q6DS7YRmSHcuI+RVxadBkLt3KHrhd3C2b+w5pKefg3oj5beTcHZyVFA9Aksf+yEE1y5jxUjVA==" }, "move-concurrently": { "version": "1.0.1", @@ -13908,8 +13468,7 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, "multimatch": { "version": "2.1.0", @@ -13926,20 +13485,17 @@ "mute-stream": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", - "dev": true + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" }, "nan": { "version": "2.11.1", "resolved": "https://registry.npmjs.org/nan/-/nan-2.11.1.tgz", - "integrity": "sha512-iji6k87OSXa0CcrLl9z+ZiYSuR2o+c0bGuNmXdrhTQTakxytAFsC56SArGYoiHlJlFoHSnvmhpceZJaXkVuOtA==", - "dev": true + "integrity": "sha512-iji6k87OSXa0CcrLl9z+ZiYSuR2o+c0bGuNmXdrhTQTakxytAFsC56SArGYoiHlJlFoHSnvmhpceZJaXkVuOtA==" }, "nanomatch": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, "requires": { "arr-diff": "^4.0.0", "array-unique": "^0.3.2", @@ -13957,14 +13513,12 @@ "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" }, "nearley": { "version": "2.15.1", "resolved": "https://registry.npmjs.org/nearley/-/nearley-2.15.1.tgz", "integrity": "sha512-8IUY/rUrKz2mIynUGh8k+tul1awMKEjeHHC5G3FHvvyAW6oq4mQfNp2c0BMea+sYZJvYcrrM6GmZVIle/GRXGw==", - "dev": true, "requires": { "moo": "^0.4.3", "nomnom": "~1.6.2", @@ -13991,6 +13545,12 @@ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, + "node-addon-api": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-1.6.0.tgz", + "integrity": "sha512-HEUPBHfdH4CLR1Qq4/Ek8GT/qFSvpApjJQmcYdLCL51ADU/Y11kMuFAdIevhNrPh3ylqVGA8k6vI/oi4YUAHbA==", + "dev": true + }, "node-dir": { "version": "0.1.17", "resolved": "https://registry.npmjs.org/node-dir/-/node-dir-0.1.17.tgz", @@ -14051,8 +13611,7 @@ "node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", - "dev": true + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=" }, "node-libs-browser": { "version": "2.1.0", @@ -14097,7 +13656,6 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.3.0.tgz", "integrity": "sha512-AhENzCSGZnZJgBARsUjnQ7DnZbzyP+HxlVXuD0xqAnvL8q+OqtSX7lGg9e8nHzwXkMMXNdVeqq4E2M3EUAqX6Q==", - "dev": true, "requires": { "growly": "^1.3.0", "semver": "^5.5.0", @@ -14109,15 +13667,14 @@ "version": "1.0.0-alpha.14", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.0.0-alpha.14.tgz", "integrity": "sha512-G8nnF9cP9QPP/jUmYWw/uUUhumHmkm+X/EarCugYFjYm2uXRMFeOD6CVT3RLdoyCvDUNy51nirGfUItKWs/S1g==", - "dev": true, "requires": { "semver": "^5.3.0" } }, "node-sass": { - "version": "4.9.4", - "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.9.4.tgz", - "integrity": "sha512-MXyurANsUoE4/6KmfMkwGcBzAnJQ5xJBGW7Ei6ea8KnUKuzHr/SguVBIi3uaUAHtZCPUYkvlJ3Ef5T5VAwVpaA==", + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.10.0.tgz", + "integrity": "sha512-fDQJfXszw6vek63Fe/ldkYXmRYK/QS6NbvM3i5oEo9ntPDy4XX7BcKZyTKv+/kSSxRtXXc7l+MSwEmYc0CSy6Q==", "dev": true, "requires": { "async-foreach": "^0.1.3", @@ -14295,7 +13852,6 @@ "version": "1.6.2", "resolved": "https://registry.npmjs.org/nomnom/-/nomnom-1.6.2.tgz", "integrity": "sha1-hKZqJgF0QI/Ft3oY+IjszET7aXE=", - "dev": true, "requires": { "colors": "0.5.x", "underscore": "~1.4.4" @@ -14314,7 +13870,6 @@ "version": "2.4.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", - "dev": true, "requires": { "hosted-git-info": "^2.1.4", "is-builtin-module": "^1.0.0", @@ -14326,7 +13881,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, "requires": { "remove-trailing-separator": "^1.0.1" } @@ -14389,7 +13943,6 @@ "version": "3.4.1", "resolved": "https://registry.npmjs.org/npm-package-json-lint/-/npm-package-json-lint-3.4.1.tgz", "integrity": "sha512-W4xlmeFRAY34GQoHUywqoI3PxVZ0hugjbZLiGnVgFjgmvRRcmxKwwmubMe0lAD78vgOHgJZRGubdVXwkp9d3QA==", - "dev": true, "requires": { "ajv": "^6.5.4", "chalk": "^2.4.1", @@ -14409,7 +13962,6 @@ "version": "6.5.4", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.4.tgz", "integrity": "sha512-4Wyjt8+t6YszqaXnLDfMmG/8AlO5Zbcsy3ATHncCzjW/NoPzAId8AK6749Ybjmdt+kUY1gP60fCu46oDxPv/mg==", - "dev": true, "requires": { "fast-deep-equal": "^2.0.1", "fast-json-stable-stringify": "^2.0.0", @@ -14420,14 +13972,12 @@ "fast-deep-equal": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", - "dev": true + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" }, "is-path-inside": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.0.0.tgz", "integrity": "sha512-OmUXvSq+P7aI/aRbl1dzwdlyLn8vW7Nr2/11S7y/dcLLgnQ89hgYJp7tfc+A5SRid3rNCLpruOp2CAV68/iOcA==", - "dev": true, "requires": { "path-is-inside": "^1.0.2" } @@ -14435,8 +13985,7 @@ "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" } } }, @@ -14478,7 +14027,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, "requires": { "path-key": "^2.0.0" } @@ -14499,7 +14047,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz", "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=", - "dev": true, "requires": { "boolbase": "~1.0.0" } @@ -14513,20 +14060,17 @@ "number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" }, "nwsapi": { "version": "2.0.9", "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.0.9.tgz", - "integrity": "sha512-nlWFSCTYQcHk/6A9FFnfhKc14c3aFhfdNBXgo8Qgi9QTBu/qg3Ww+Uiz9wMzXd1T8GFxPc2QIHB6Qtf2XFryFQ==", - "dev": true + "integrity": "sha512-nlWFSCTYQcHk/6A9FFnfhKc14c3aFhfdNBXgo8Qgi9QTBu/qg3Ww+Uiz9wMzXd1T8GFxPc2QIHB6Qtf2XFryFQ==" }, "oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" }, "object-assign": { "version": "4.1.1", @@ -14537,7 +14081,6 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, "requires": { "copy-descriptor": "^0.1.0", "define-property": "^0.2.5", @@ -14548,7 +14091,6 @@ "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, "requires": { "is-descriptor": "^0.1.0" } @@ -14557,7 +14099,6 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, "requires": { "is-buffer": "^1.1.5" } @@ -14573,8 +14114,7 @@ "object-inspect": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.6.0.tgz", - "integrity": "sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ==", - "dev": true + "integrity": "sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ==" }, "object-is": { "version": "1.0.1", @@ -14590,7 +14130,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, "requires": { "isobject": "^3.0.0" } @@ -14621,7 +14160,6 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", - "dev": true, "requires": { "define-properties": "^1.1.2", "es-abstract": "^1.5.1" @@ -14631,7 +14169,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", - "dev": true, "requires": { "for-own": "^0.1.4", "is-extendable": "^0.1.1" @@ -14641,7 +14178,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, "requires": { "isobject": "^3.0.1" } @@ -14670,7 +14206,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, "requires": { "wrappy": "1" } @@ -14679,7 +14214,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "dev": true, "requires": { "mimic-fn": "^1.0.0" } @@ -14700,7 +14234,7 @@ "dependencies": { "ansi-escapes": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", + "resolved": "http://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", "dev": true }, @@ -14762,7 +14296,7 @@ }, "opn": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/opn/-/opn-4.0.2.tgz", + "resolved": "http://registry.npmjs.org/opn/-/opn-4.0.2.tgz", "integrity": "sha1-erwi5kTf9jsKltWrfyeQwPAavJU=", "dev": true, "requires": { @@ -14791,7 +14325,6 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", - "dev": true, "requires": { "minimist": "~0.0.1", "wordwrap": "~0.0.2" @@ -14800,8 +14333,7 @@ "wordwrap": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", - "dev": true + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=" } } }, @@ -14809,7 +14341,6 @@ "version": "0.8.2", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", - "dev": true, "requires": { "deep-is": "~0.1.3", "fast-levenshtein": "~2.0.4", @@ -14840,14 +14371,12 @@ "os-homedir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" }, "os-locale": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", - "dev": true, "requires": { "execa": "^0.7.0", "lcid": "^1.0.0", @@ -14857,8 +14386,7 @@ "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" }, "osenv": { "version": "0.1.5", @@ -14890,8 +14418,7 @@ "p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" }, "p-is-promise": { "version": "1.1.0", @@ -14903,7 +14430,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, "requires": { "p-try": "^1.0.0" } @@ -14912,7 +14438,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, "requires": { "p-limit": "^1.1.0" } @@ -14947,8 +14472,7 @@ "p-try": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" }, "p-waterfall": { "version": "1.0.0", @@ -15163,7 +14687,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", - "dev": true, "requires": { "glob-base": "^0.3.0", "is-dotfile": "^1.0.0", @@ -15174,14 +14697,12 @@ "is-extglob": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" }, "is-glob": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, "requires": { "is-extglob": "^1.0.0" } @@ -15192,7 +14713,6 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, "requires": { "error-ex": "^1.2.0" } @@ -15207,7 +14727,6 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz", "integrity": "sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==", - "dev": true, "requires": { "@types/node": "*" } @@ -15221,8 +14740,7 @@ "pascalcase": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" }, "path-browserify": { "version": "0.0.0", @@ -15239,32 +14757,27 @@ "path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "path-is-inside": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", - "dev": true + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" }, "path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" }, "path-parse": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", - "dev": true + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" }, "path-root": { "version": "0.1.1", @@ -15285,7 +14798,6 @@ "version": "1.7.0", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=", - "dev": true, "requires": { "isarray": "0.0.1" }, @@ -15293,8 +14805,7 @@ "isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" } } }, @@ -15302,7 +14813,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, "requires": { "graceful-fs": "^4.1.2", "pify": "^2.0.0", @@ -15325,26 +14835,22 @@ "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" }, "pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" }, "pinkie": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" }, "pinkie-promise": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, "requires": { "pinkie": "^2.0.0" } @@ -15353,7 +14859,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", - "dev": true, "requires": { "find-up": "^2.1.0" } @@ -15371,7 +14876,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/plur/-/plur-3.0.1.tgz", "integrity": "sha512-lJl0ojUynAM1BZn58Pas2WT/TXeC1+bS+UqShl0x9+49AtOn7DixRXVzaC8qrDOIxNDmepKnLuMTH7NQmkX0PA==", - "dev": true, "requires": { "irregular-plurals": "^2.0.0" } @@ -15379,26 +14883,22 @@ "pluralize": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", - "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", - "dev": true + "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==" }, "pn": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", - "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==", - "dev": true + "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==" }, "popper.js": { "version": "1.14.4", "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.14.4.tgz", - "integrity": "sha1-juwdj/AqWjoVLdQ0FKFce3n9abY=", - "dev": true + "integrity": "sha1-juwdj/AqWjoVLdQ0FKFce3n9abY=" }, "posix-character-classes": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" }, "postcss": { "version": "6.0.23", @@ -15467,7 +14967,7 @@ }, "chalk": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { @@ -15748,9 +15248,9 @@ } }, "postcss-sass": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/postcss-sass/-/postcss-sass-0.3.3.tgz", - "integrity": "sha512-uoRhfwZJHDRI8p2KQniTx4UwzYwKgQUhmFNJ7aysL3+tgFUfmv5TPX8UPnlE5gfrq6KHUUwPJ/nISFtzwxr7iQ==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/postcss-sass/-/postcss-sass-0.3.5.tgz", + "integrity": "sha512-B5z2Kob4xBxFjcufFnhQ2HqJQ2y/Zs/ic5EZbCywCkxKd756Q40cIQ/veRDwSrw1BF6+4wUgmpm0sBASqVi65A==", "dev": true, "requires": { "gonzales-pe": "^4.2.3", @@ -15828,8 +15328,7 @@ "prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" }, "prepend-http": { "version": "1.0.4", @@ -15840,8 +15339,7 @@ "preserve": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", - "dev": true + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=" }, "prettier": { "version": "github:automattic/calypso-prettier#c56b42511ec98ba6d8f72b6c391e0a626e90f531", @@ -15995,7 +15493,7 @@ }, "minimist": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true }, @@ -16039,7 +15537,6 @@ "version": "22.4.3", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-22.4.3.tgz", "integrity": "sha512-S4oT9/sT6MN7/3COoOy+ZJeA92VmOnveLHgrwBE3Z1W5N9S2A1QGNYiE1z75DAENbJrXXUb+OWXhpJcg05QKQQ==", - "dev": true, "requires": { "ansi-regex": "^3.0.0", "ansi-styles": "^3.2.0" @@ -16071,8 +15568,7 @@ "private": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", - "dev": true + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==" }, "process": { "version": "0.11.10", @@ -16083,14 +15579,12 @@ "process-nextick-args": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "dev": true + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" }, "progress": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.1.tgz", - "integrity": "sha512-OE+a6vzqazc+K6LxJrX5UPyKFvGnL5CYmq2jFGNIBWHpc4QyE49/YOumcrpQFJpfejmvRtbJzgO1zPmMCqlbBg==", - "dev": true + "integrity": "sha512-OE+a6vzqazc+K6LxJrX5UPyKFvGnL5CYmq2jFGNIBWHpc4QyE49/YOumcrpQFJpfejmvRtbJzgO1zPmMCqlbBg==" }, "promise": { "version": "7.3.1", @@ -16120,7 +15614,6 @@ "version": "0.1.14", "resolved": "https://registry.npmjs.org/prompts/-/prompts-0.1.14.tgz", "integrity": "sha512-rxkyiE9YH6zAz/rZpywySLKkpaj0NMVyNw1qhsubdbjjSgcayjTShDreZGlFMcGSu5sab3bAKPfFk78PB90+8w==", - "dev": true, "requires": { "kleur": "^2.0.1", "sisteransi": "^0.1.1" @@ -16178,14 +15671,12 @@ "pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" }, "psl": { "version": "1.1.29", "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.29.tgz", - "integrity": "sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ==", - "dev": true + "integrity": "sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ==" }, "public-encrypt": { "version": "4.0.3", @@ -16225,8 +15716,7 @@ "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" }, "q": { "version": "1.5.1", @@ -16237,8 +15727,7 @@ "qs": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" }, "querystring": { "version": "0.2.0", @@ -16255,14 +15744,12 @@ "quick-lru": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", - "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=", - "dev": true + "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=" }, "raf": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.0.tgz", "integrity": "sha512-pDP/NMRAXoTfrhCfyfSEwJAKLaxBU9eApMeBPB1TkDouZmvPerIClV8lTAd+uF8ZiTaVl69e1FCxQrAd/VTjGw==", - "dev": true, "requires": { "performance-now": "^2.1.0" } @@ -16270,20 +15757,17 @@ "railroad-diagrams": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz", - "integrity": "sha1-635iZ1SN3t+4mcG5Dlc3RVnN234=", - "dev": true + "integrity": "sha1-635iZ1SN3t+4mcG5Dlc3RVnN234=" }, "ramda": { "version": "0.25.0", "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.25.0.tgz", - "integrity": "sha512-GXpfrYVPwx3K7RQ6aYT8KPS8XViSXUVJT1ONhoKPE9VAleW42YE+U+8VEyGWt41EnEQW7gwecYJriTI0pKoecQ==", - "dev": true + "integrity": "sha512-GXpfrYVPwx3K7RQ6aYT8KPS8XViSXUVJT1ONhoKPE9VAleW42YE+U+8VEyGWt41EnEQW7gwecYJriTI0pKoecQ==" }, "randexp": { "version": "0.4.6", "resolved": "https://registry.npmjs.org/randexp/-/randexp-0.4.6.tgz", "integrity": "sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==", - "dev": true, "requires": { "discontinuous-range": "1.0.0", "ret": "~0.1.10" @@ -16293,7 +15777,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.0.tgz", "integrity": "sha512-KnGPVE0lo2WoXxIZ7cPR8YBpiol4gsSuOwDSg410oHh80ZMp5EiypNqL2K4Z77vJn6lB5rap7IkAmcUlalcnBQ==", - "dev": true, "requires": { "is-number": "^4.0.0", "kind-of": "^6.0.0", @@ -16303,8 +15786,7 @@ "is-number": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "dev": true + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==" } } }, @@ -16363,7 +15845,6 @@ "version": "16.6.0", "resolved": "https://registry.npmjs.org/react/-/react-16.6.0.tgz", "integrity": "sha512-zJPnx/jKtuOEXCbQ9BKaxDMxR0001/hzxXwYxG8septeyYGfsgAei6NgfbVgOhbY1WOP2o3VPs/E9HaN+9hV3Q==", - "dev": true, "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1", @@ -16375,7 +15856,6 @@ "version": "15.6.2", "resolved": "https://registry.npmjs.org/react-addons-create-fragment/-/react-addons-create-fragment-15.6.2.tgz", "integrity": "sha1-o5TefCx77Na1R1uhuXrEcs58dPg=", - "dev": true, "requires": { "fbjs": "^0.8.4", "loose-envify": "^1.3.1", @@ -16395,7 +15875,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/react-click-outside/-/react-click-outside-3.0.1.tgz", "integrity": "sha512-d0KWFvBt+esoZUF15rL2UBB7jkeAqLU8L/Ny35oLK6fW6mIbOv/ChD+ExF4sR9PD26kVx+9hNfD0FTIqRZEyRQ==", - "dev": true, "requires": { "hoist-non-react-statics": "^2.1.1" } @@ -16404,7 +15883,6 @@ "version": "2.14.1", "resolved": "https://registry.npmjs.org/react-color/-/react-color-2.14.1.tgz", "integrity": "sha512-ssv2ArSZdhTbIs29hyfw8JW+s3G4BCx/ILkwCajWZzrcx/2ZQfRpsaLVt38LAPbxe50LLszlmGtRerA14JzzRw==", - "dev": true, "requires": { "lodash": "^4.0.1", "material-colors": "^1.2.1", @@ -16417,7 +15895,6 @@ "version": "1.7.0", "resolved": "https://registry.npmjs.org/react-datepicker/-/react-datepicker-1.7.0.tgz", "integrity": "sha512-2cRopX0/V05wMyhAG0JGw2vmYAxDTFJ+gkT8qZ3I1U9+SGrhccdpHF0WgMlcugOL7wT7zsWxMo4tpgHjJFQZ4A==", - "dev": true, "requires": { "classnames": "^2.2.5", "prop-types": "^15.6.0", @@ -16504,7 +15981,6 @@ "version": "16.6.0", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.6.0.tgz", "integrity": "sha512-Stm2D9dXEUUAQdvpvhvFj/DEXwC2PAL/RwEMhoN4dvvD2ikTlJegEXf97xryg88VIAU22ZAP7n842l+9BTz6+w==", - "dev": true, "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1", @@ -16515,8 +15991,7 @@ "react-is": { "version": "16.5.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.5.2.tgz", - "integrity": "sha512-hSl7E6l25GTjNEZATqZIuWOgSnpXb3kD0DVCujmg46K5zLxsbiKaaT6VO9slkSBDPZfYs30lwfJwbOFOnoEnKQ==", - "dev": true + "integrity": "sha512-hSl7E6l25GTjNEZATqZIuWOgSnpXb3kD0DVCujmg46K5zLxsbiKaaT6VO9slkSBDPZfYs30lwfJwbOFOnoEnKQ==" }, "react-lifecycles-compat": { "version": "3.0.4", @@ -16527,7 +16002,6 @@ "version": "1.12.0", "resolved": "https://registry.npmjs.org/react-live/-/react-live-1.12.0.tgz", "integrity": "sha512-zFEpY01fJORF0IiyONqvjwPLBBDp155Ive6tU8ZmetmT2p4XWUKHstnlu4Cayia+n7iu58Owytztu43yvSin8g==", - "dev": true, "requires": { "buble": "^0.19.3", "core-js": "^2.4.1", @@ -16542,7 +16016,6 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.6.0.tgz", "integrity": "sha1-EY2V+3pm26InLjQ7NF9SNmWds2U=", - "dev": true, "requires": { "clipboard": "^1.5.5" } @@ -16560,8 +16033,7 @@ "react-onclickoutside": { "version": "6.7.1", "resolved": "https://registry.npmjs.org/react-onclickoutside/-/react-onclickoutside-6.7.1.tgz", - "integrity": "sha512-p84kBqGaMoa7VYT0vZ/aOYRfJB+gw34yjpda1Z5KeLflg70HipZOT+MXQenEhdkPAABuE2Astq4zEPdMqUQxcg==", - "dev": true + "integrity": "sha512-p84kBqGaMoa7VYT0vZ/aOYRfJB+gw34yjpda1Z5KeLflg70HipZOT+MXQenEhdkPAABuE2Astq4zEPdMqUQxcg==" }, "react-outside-click-handler": { "version": "1.2.2", @@ -16578,7 +16050,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-1.0.2.tgz", "integrity": "sha512-vjZ94ki8sfCAg45MMi4uqnUUWdzbnYkb95sR2+HgiMaAPzQcy4DfDKYtYUOhhE+sdtkufWcUHLv09DmH2Js57w==", - "dev": true, "requires": { "babel-runtime": "6.x.x", "create-react-context": "^0.2.1", @@ -16600,7 +16071,6 @@ "version": "4.3.1", "resolved": "https://registry.npmjs.org/react-router/-/react-router-4.3.1.tgz", "integrity": "sha512-yrvL8AogDh2X42Dt9iknk4wF4V8bWREPirFfS9gLU1huk6qK41sg7Z/1S81jjTrGHxa3B8R3J6xIkDAA6CVarg==", - "dev": true, "requires": { "history": "^4.7.2", "hoist-non-react-statics": "^2.5.0", @@ -16615,7 +16085,6 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.2.tgz", "integrity": "sha512-wbTp09q/9C+jJn4KKJfJfoS6VleK/Dti0yqWSm6KMvJ4MRCXFQNapHuJXutJIrWV0Cf4AhTdeIe4qdKHR1+Hug==", - "dev": true, "requires": { "loose-envify": "^1.0.0" } @@ -16626,7 +16095,6 @@ "version": "4.3.1", "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-4.3.1.tgz", "integrity": "sha512-c/MlywfxDdCp7EnB7YfPMOfMD3tOtIjrQlj/CKfNMBxdmpJP8xcz5P/UAFn3JbnQCNUxsHyVVqllF9LhgVyFCA==", - "dev": true, "requires": { "history": "^4.7.2", "invariant": "^2.2.4", @@ -16640,7 +16108,6 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.2.tgz", "integrity": "sha512-wbTp09q/9C+jJn4KKJfJfoS6VleK/Dti0yqWSm6KMvJ4MRCXFQNapHuJXutJIrWV0Cf4AhTdeIe4qdKHR1+Hug==", - "dev": true, "requires": { "loose-envify": "^1.0.0" } @@ -16656,7 +16123,6 @@ "version": "16.5.2", "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-16.5.2.tgz", "integrity": "sha512-AGbJYbCVx1J6jdUgI4s0hNp+9LxlgzKvXl0ROA3DHTrtjAr00Po1RhDZ/eAq2VC/ww8AHgpDXULh5V2rhEqqJg==", - "dev": true, "requires": { "object-assign": "^4.1.1", "prop-types": "^15.6.2", @@ -16714,7 +16180,6 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/react-world-flags/-/react-world-flags-1.2.4.tgz", "integrity": "sha512-7WVe6w8SsKo3ySnzZHEZaqBogizU/u952YeQF19AyQ2EItxb4xzgBkUaMuSEXa8AxpK0id/hvJslNhSYdIWMMg==", - "dev": true, "requires": { "svg-country-flags": "^1.2.3", "world-countries": "^2.0.0" @@ -16724,7 +16189,6 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/reactcss/-/reactcss-1.2.3.tgz", "integrity": "sha512-KiwVUcFu1RErkI97ywr8nvx8dNOpT03rbnma0SSalTYjkrPYaEajR4a/MRt6DZ46K6arDRbWMNHF+xH7G7n/8A==", - "dev": true, "requires": { "lodash": "^4.0.1" } @@ -16785,7 +16249,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, "requires": { "load-json-file": "^1.0.0", "normalize-package-data": "^2.3.2", @@ -16796,7 +16259,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, "requires": { "find-up": "^1.0.0", "read-pkg": "^1.0.0" @@ -16806,7 +16268,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, "requires": { "path-exists": "^2.0.0", "pinkie-promise": "^2.0.0" @@ -16816,7 +16277,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, "requires": { "pinkie-promise": "^2.0.0" } @@ -16827,7 +16287,6 @@ "version": "2.3.6", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -16871,7 +16330,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.0.2.tgz", "integrity": "sha512-+S3zTvVt9yTntFrBpm7TQmQ3tzpCrnA1a/y+3cUHAc9ZR6aIjG0WNLR+Rj79QpJktY+VeW/TQtFlQ1bzsehI8g==", - "dev": true, "requires": { "util.promisify": "^1.0.0" } @@ -16906,7 +16364,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", - "dev": true, "requires": { "indent-string": "^3.0.0", "strip-indent": "^2.0.0" @@ -16929,14 +16386,12 @@ "regenerate": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", - "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", - "dev": true + "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==" }, "regenerate-unicode-properties": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-7.0.0.tgz", "integrity": "sha512-s5NGghCE4itSlUS+0WUj88G6cfMVMmH8boTPNvABf8od+2dhT9WDlWu8n01raQAJZMOK8Ch6jSexaRO7swd6aw==", - "dev": true, "requires": { "regenerate": "^1.4.0" } @@ -16944,14 +16399,12 @@ "regenerator-runtime": { "version": "0.12.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz", - "integrity": "sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg==", - "dev": true + "integrity": "sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg==" }, "regenerator-transform": { "version": "0.13.3", "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.13.3.tgz", "integrity": "sha512-5ipTrZFSq5vU2YoGoww4uaRVAK4wyYC4TSICibbfEPOruUu8FFP7ErV0BjmbIOEpn3O/k9na9UEdYR/3m7N6uA==", - "dev": true, "requires": { "private": "^0.1.6" } @@ -16960,7 +16413,6 @@ "version": "0.4.4", "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", - "dev": true, "requires": { "is-equal-shallow": "^0.1.3" } @@ -16969,7 +16421,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, "requires": { "extend-shallow": "^3.0.2", "safe-regex": "^1.1.0" @@ -16978,14 +16429,12 @@ "regexpp": { "version": "1.1.0", "resolved": "http://registry.npmjs.org/regexpp/-/regexpp-1.1.0.tgz", - "integrity": "sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw==", - "dev": true + "integrity": "sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw==" }, "regexpu-core": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.2.0.tgz", "integrity": "sha512-Z835VSnJJ46CNBttalHD/dB+Sj2ezmY6Xp38npwU87peK6mqOzOpV8eYktdkLTEkzzD+JsTcxd84ozd8I14+rw==", - "dev": true, "requires": { "regenerate": "^1.4.0", "regenerate-unicode-properties": "^7.0.0", @@ -17017,14 +16466,12 @@ "regjsgen": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.4.0.tgz", - "integrity": "sha512-X51Lte1gCYUdlwhF28+2YMO0U6WeN0GLpgpA7LK7mbdDnkQYiwvEpmpe0F/cv5L14EbxgrdayAG3JETBv0dbXA==", - "dev": true + "integrity": "sha512-X51Lte1gCYUdlwhF28+2YMO0U6WeN0GLpgpA7LK7mbdDnkQYiwvEpmpe0F/cv5L14EbxgrdayAG3JETBv0dbXA==" }, "regjsparser": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.3.0.tgz", "integrity": "sha512-zza72oZBBHzt64G7DxdqrOo/30bhHkwMUoT0WqfGu98XLd7N+1tsy5MJ96Bk4MD0y74n629RhmrGW6XlnLLwCA==", - "dev": true, "requires": { "jsesc": "~0.5.0" }, @@ -17032,8 +16479,7 @@ "jsesc": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" } } }, @@ -17131,32 +16577,27 @@ "rememo": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/rememo/-/rememo-3.0.0.tgz", - "integrity": "sha512-eWtut/7pqMRnSccbexb647iPjN7ir6Tmf4RG92ZVlykFEkHqGYy9tWnpHH3I+FS+WQ6lQ1i1iDgarYzGKgTcRQ==", - "dev": true + "integrity": "sha512-eWtut/7pqMRnSccbexb647iPjN7ir6Tmf4RG92ZVlykFEkHqGYy9tWnpHH3I+FS+WQ6lQ1i1iDgarYzGKgTcRQ==" }, "remove-trailing-separator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" }, "repeat-element": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", - "dev": true + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==" }, "repeat-string": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" }, "repeating": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "dev": true, "requires": { "is-finite": "^1.0.0" } @@ -17171,7 +16612,6 @@ "version": "2.88.0", "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", - "dev": true, "requires": { "aws-sign2": "~0.7.0", "aws4": "^1.8.0", @@ -17199,7 +16639,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.1.tgz", "integrity": "sha1-Pu4AssWqgyOc+wTFcA2jb4HNCLY=", - "dev": true, "requires": { "lodash": "^4.13.1" } @@ -17208,7 +16647,6 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.5.tgz", "integrity": "sha1-UoF3D2jgyXGeUWP9P6tIIhX0/aU=", - "dev": true, "requires": { "request-promise-core": "1.1.1", "stealthy-require": "^1.1.0", @@ -17218,8 +16656,7 @@ "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" }, "require-from-string": { "version": "2.0.2", @@ -17230,14 +16667,12 @@ "require-main-filename": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" }, "require-uncached": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", - "dev": true, "requires": { "caller-path": "^0.1.0", "resolve-from": "^1.0.0" @@ -17253,7 +16688,6 @@ "version": "1.8.1", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz", "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==", - "dev": true, "requires": { "path-parse": "^1.0.5" } @@ -17262,7 +16696,6 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/resolve-bin/-/resolve-bin-0.4.0.tgz", "integrity": "sha1-RxMiSYkRAa+xmZH+k3ywpfBy5dk=", - "dev": true, "requires": { "find-parent-dir": "~0.3.0" } @@ -17271,7 +16704,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", - "dev": true, "requires": { "resolve-from": "^3.0.0" }, @@ -17279,8 +16711,7 @@ "resolve-from": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" } } }, @@ -17297,26 +16728,22 @@ "resolve-from": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", - "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", - "dev": true + "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=" }, "resolve-pathname": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-2.2.0.tgz", - "integrity": "sha512-bAFz9ld18RzJfddgrO2e/0S2O81710++chRMUxHjXOYKF6jTAMrUNZrEZ1PvV0zlhfjidm08iRPdTLPno1FuRg==", - "dev": true + "integrity": "sha512-bAFz9ld18RzJfddgrO2e/0S2O81710++chRMUxHjXOYKF6jTAMrUNZrEZ1PvV0zlhfjidm08iRPdTLPno1FuRg==" }, "resolve-url": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" }, "restore-cursor": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "dev": true, "requires": { "onetime": "^2.0.0", "signal-exit": "^3.0.2" @@ -17325,8 +16752,7 @@ "ret": { "version": "0.1.15", "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" }, "retry": { "version": "0.10.1", @@ -17337,8 +16763,7 @@ "reverse-arguments": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/reverse-arguments/-/reverse-arguments-1.0.0.tgz", - "integrity": "sha1-woCVo6khrHFdYYNN3s6QJ5kmZ80=", - "dev": true + "integrity": "sha1-woCVo6khrHFdYYNN3s6QJ5kmZ80=" }, "rgb": { "version": "0.1.0", @@ -17350,7 +16775,6 @@ "version": "2.6.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", - "dev": true, "requires": { "glob": "^7.0.5" } @@ -17369,7 +16793,6 @@ "version": "2.2.3", "resolved": "https://registry.npmjs.org/rst-selector-parser/-/rst-selector-parser-2.2.3.tgz", "integrity": "sha1-gbIw6i/MYGbInjRy3nlChdmwPZE=", - "dev": true, "requires": { "lodash.flattendeep": "^4.4.0", "nearley": "^2.7.10" @@ -17378,14 +16801,25 @@ "rsvp": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-3.6.2.tgz", - "integrity": "sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw==", - "dev": true + "integrity": "sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw==" + }, + "rtlcss": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-2.4.0.tgz", + "integrity": "sha512-hdjFhZ5FCI0ABOfyXOMOhBtwPWtANLCG7rOiOcRf+yi5eDdxmDjqBruWouEnwVdzfh/TWF6NNncIEsigOCFZOA==", + "dev": true, + "requires": { + "chalk": "^2.3.0", + "findup": "^0.1.5", + "mkdirp": "^0.5.1", + "postcss": "^6.0.14", + "strip-json-comments": "^2.0.0" + } }, "run-async": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", - "dev": true, "requires": { "is-promise": "^2.1.0" } @@ -17408,8 +16842,7 @@ "rungen": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/rungen/-/rungen-0.3.2.tgz", - "integrity": "sha1-QAwJ6+kU57F+C27zJjQA/Cq8fLM=", - "dev": true + "integrity": "sha1-QAwJ6+kU57F+C27zJjQA/Cq8fLM=" }, "rx": { "version": "4.1.0", @@ -17420,14 +16853,12 @@ "rx-lite": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", - "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", - "dev": true + "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=" }, "rx-lite-aggregates": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", - "dev": true, "requires": { "rx-lite": "*" } @@ -17444,14 +16875,12 @@ "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "safe-regex": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, "requires": { "ret": "~0.1.10" } @@ -17465,7 +16894,6 @@ "version": "2.5.2", "resolved": "https://registry.npmjs.org/sane/-/sane-2.5.2.tgz", "integrity": "sha1-tNwYYcIbQn6SlQej51HiosuKs/o=", - "dev": true, "requires": { "anymatch": "^2.0.0", "capture-exit": "^1.2.0", @@ -17481,8 +16909,7 @@ "minimist": { "version": "1.2.0", "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" } } }, @@ -17607,14 +17034,12 @@ "sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" }, "schedule": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/schedule/-/schedule-0.5.0.tgz", "integrity": "sha512-HUcJicG5Ou8xfR//c2rPT0lPIRR09vVvN81T9fqfVgBmhERUbDEQoYKjpBxbueJnCPpSu2ujXzOnRQt6x9o/jw==", - "dev": true, "requires": { "object-assign": "^4.1.1" } @@ -17623,7 +17048,6 @@ "version": "0.10.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.10.0.tgz", "integrity": "sha512-+TSTVTCBAA3h8Anei3haDc1IRwMeDmtI/y/o3iBe3Mjl2vwYF9DtPDt929HyRmV/e7au7CLu8sc4C4W0VOs29w==", - "dev": true, "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1" @@ -17695,14 +17119,12 @@ "select": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz", - "integrity": "sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0=", - "dev": true + "integrity": "sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0=" }, "semver": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", - "dev": true + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==" }, "semver-compare": { "version": "1.0.0", @@ -17769,14 +17191,12 @@ "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" }, "set-value": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", - "dev": true, "requires": { "extend-shallow": "^2.0.1", "is-extendable": "^0.1.1", @@ -17788,7 +17208,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, "requires": { "is-extendable": "^0.1.0" } @@ -17839,7 +17258,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, "requires": { "shebang-regex": "^1.0.0" } @@ -17847,14 +17265,12 @@ "shebang-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" }, "shellwords": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", - "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", - "dev": true + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==" }, "sigmund": { "version": "1.0.1", @@ -17865,14 +17281,12 @@ "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" }, "sisteransi": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-0.1.1.tgz", - "integrity": "sha512-PmGOd02bM9YO5ifxpw36nrNMBTptEtfRl4qUYl9SndkolplkrZZOW7PGHjrZL53QvMVj9nQ+TKqUnRsw4tJa4g==", - "dev": true + "integrity": "sha512-PmGOd02bM9YO5ifxpw36nrNMBTptEtfRl4qUYl9SndkolplkrZZOW7PGHjrZL53QvMVj9nQ+TKqUnRsw4tJa4g==" }, "slash": { "version": "2.0.0", @@ -17884,7 +17298,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", - "dev": true, "requires": { "is-fullwidth-code-point": "^2.0.0" } @@ -17905,7 +17318,6 @@ "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, "requires": { "base": "^0.11.1", "debug": "^2.2.0", @@ -17921,7 +17333,6 @@ "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, "requires": { "is-descriptor": "^0.1.0" } @@ -17930,7 +17341,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, "requires": { "is-extendable": "^0.1.0" } @@ -17941,7 +17351,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, "requires": { "define-property": "^1.0.0", "isobject": "^3.0.0", @@ -17952,7 +17361,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, "requires": { "is-descriptor": "^1.0.0" } @@ -17961,7 +17369,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, "requires": { "kind-of": "^6.0.0" } @@ -17970,7 +17377,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, "requires": { "kind-of": "^6.0.0" } @@ -17979,7 +17385,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, "requires": { "is-accessor-descriptor": "^1.0.0", "is-data-descriptor": "^1.0.0", @@ -17992,7 +17397,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, "requires": { "kind-of": "^3.2.0" }, @@ -18001,7 +17405,6 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, "requires": { "is-buffer": "^1.1.5" } @@ -18046,14 +17449,12 @@ "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" }, "source-map-resolve": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", - "dev": true, "requires": { "atob": "^2.1.1", "decode-uri-component": "^0.2.0", @@ -18066,7 +17467,6 @@ "version": "0.4.18", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", - "dev": true, "requires": { "source-map": "^0.5.6" } @@ -18074,8 +17474,12 @@ "source-map-url": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", - "dev": true + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" + }, + "sourcemap-codec": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.3.tgz", + "integrity": "sha512-vFrY/x/NdsD7Yc8mpTJXuao9S8lq08Z/kOITHz6b7YbfI9xL8Spe5EvSQUHOI7SbpY8bRPr0U3kKSsPuqEGSfA==" }, "spawn-command": { "version": "0.0.2-1", @@ -18087,7 +17491,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.2.tgz", "integrity": "sha512-q9hedtzyXHr5S0A1vEPoK/7l8NpfkFYTq6iCY+Pno2ZbdZR6WexZFtqeVGkGxW3TEJMN914Z55EnAGMmenlIQQ==", - "dev": true, "requires": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" @@ -18096,14 +17499,12 @@ "spdx-exceptions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", - "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", - "dev": true + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==" }, "spdx-expression-parse": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", - "dev": true, "requires": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" @@ -18112,8 +17513,7 @@ "spdx-license-ids": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.1.tgz", - "integrity": "sha512-TfOfPcYGBB5sDuPn3deByxPhmfegAhpDYKSOXZQN81Oyrrif8ZCodOLzK3AesELnCx03kikhyDwh0pfvvQvF8w==", - "dev": true + "integrity": "sha512-TfOfPcYGBB5sDuPn3deByxPhmfegAhpDYKSOXZQN81Oyrrif8ZCodOLzK3AesELnCx03kikhyDwh0pfvvQvF8w==" }, "specificity": { "version": "0.4.1", @@ -18134,7 +17534,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, "requires": { "extend-shallow": "^3.0.0" } @@ -18151,14 +17550,12 @@ "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" }, "sshpk": { "version": "1.15.1", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.15.1.tgz", "integrity": "sha512-mSdgNUaidk+dRU5MhYtN9zebdzF2iG0cNPWy8HG+W8y+fT1JnSkh0fzzpjOa0L7P8i1Rscz38t0h4gPcKz43xA==", - "dev": true, "requires": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", @@ -18183,8 +17580,7 @@ "stack-utils": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.1.tgz", - "integrity": "sha1-1PM6tU6OOHeLDKXP07OvsS22hiA=", - "dev": true + "integrity": "sha1-1PM6tU6OOHeLDKXP07OvsS22hiA=" }, "state-toggle": { "version": "1.0.1", @@ -18196,7 +17592,6 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, "requires": { "define-property": "^0.2.5", "object-copy": "^0.1.0" @@ -18206,7 +17601,6 @@ "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, "requires": { "is-descriptor": "^0.1.0" } @@ -18231,8 +17625,7 @@ "stealthy-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", - "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", - "dev": true + "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=" }, "stream-browserify": { "version": "2.0.1", @@ -18277,7 +17670,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/string-length/-/string-length-2.0.0.tgz", "integrity": "sha1-1A27aGo6zpYMHP/KVivyxF+DY+0=", - "dev": true, "requires": { "astral-regex": "^1.0.0", "strip-ansi": "^4.0.0" @@ -18287,7 +17679,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, "requires": { "ansi-regex": "^3.0.0" } @@ -18298,7 +17689,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, "requires": { "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^4.0.0" @@ -18308,7 +17698,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, "requires": { "ansi-regex": "^3.0.0" } @@ -18319,7 +17708,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.1.2.tgz", "integrity": "sha1-0E3iyJ4Tf019IG8Ia17S+ua+jOo=", - "dev": true, "requires": { "define-properties": "^1.1.2", "es-abstract": "^1.5.0", @@ -18330,7 +17718,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, "requires": { "safe-buffer": "~5.1.0" } @@ -18351,7 +17738,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, "requires": { "ansi-regex": "^2.0.0" }, @@ -18359,8 +17745,7 @@ "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" } } }, @@ -18368,7 +17753,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, "requires": { "is-utf8": "^0.2.0" } @@ -18376,20 +17760,17 @@ "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" }, "strip-indent": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", - "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", - "dev": true + "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=" }, "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" }, "strong-log-transformer": { "version": "2.0.0", @@ -18471,9 +17852,9 @@ "dev": true }, "stylelint": { - "version": "9.7.0", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-9.7.0.tgz", - "integrity": "sha512-3PxEZ/8HKpKvdWWIeFSZ0gdTz1eEHo2IgLcliN7RJtXxCIHdyI44ffaRgxCyQN3sAGWJO41UXOIFyJxfwznIBA==", + "version": "9.8.0", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-9.8.0.tgz", + "integrity": "sha512-qYYgP9UnZ6S4uaXrfEGPIMeNv21gP4t3E7BtnYfJIiHKvz7AbrCP0vj1wPgD6OFyxLT5txQxtoznfSkm2vsUkQ==", "dev": true, "requires": { "autoprefixer": "^9.0.0", @@ -18488,7 +17869,7 @@ "globby": "^8.0.0", "globjoin": "^0.1.4", "html-tags": "^2.0.0", - "ignore": "^4.0.0", + "ignore": "^5.0.4", "import-lazy": "^3.1.0", "imurmurhash": "^0.1.4", "known-css-properties": "^0.9.0", @@ -18497,7 +17878,7 @@ "log-symbols": "^2.0.0", "mathml-tag-names": "^2.0.1", "meow": "^5.0.0", - "micromatch": "^2.3.11", + "micromatch": "^3.1.10", "normalize-selector": "^0.2.0", "pify": "^4.0.0", "postcss": "^7.0.0", @@ -18509,7 +17890,7 @@ "postcss-reporter": "^6.0.0", "postcss-resolve-nested-selector": "^0.1.1", "postcss-safe-parser": "^4.0.0", - "postcss-sass": "^0.3.0", + "postcss-sass": "^0.3.5", "postcss-scss": "^2.0.0", "postcss-selector-parser": "^3.1.0", "postcss-styled": "^0.34.0", @@ -18517,6 +17898,7 @@ "postcss-value-parser": "^3.3.0", "resolve-from": "^4.0.0", "signal-exit": "^3.0.2", + "slash": "^2.0.0", "specificity": "^0.4.1", "string-width": "^2.1.0", "style-search": "^0.1.0", @@ -18526,9 +17908,9 @@ }, "dependencies": { "ajv": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.4.tgz", - "integrity": "sha512-4Wyjt8+t6YszqaXnLDfMmG/8AlO5Zbcsy3ATHncCzjW/NoPzAId8AK6749Ybjmdt+kUY1gP60fCu46oDxPv/mg==", + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.5.tgz", + "integrity": "sha512-7q7gtRQDJSyuEHjuVgHoUa2VuemFiCMrfQc9Tc08XTAc4Zj/5U1buQJ0HU6i7fKjXU09SVgSmxa4sLvuvS8Iyg==", "dev": true, "requires": { "fast-deep-equal": "^2.0.1", @@ -18537,32 +17919,6 @@ "uri-js": "^4.2.2" } }, - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, - "requires": { - "arr-flatten": "^1.0.1" - } - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true - }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true, - "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" - } - }, "debug": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.0.tgz", @@ -18572,24 +17928,6 @@ "ms": "^2.1.1" } }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, - "requires": { - "is-posix-bracket": "^0.1.0" - } - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, "fast-deep-equal": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", @@ -18628,13 +17966,19 @@ "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", "dev": true + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true } } }, "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.0.4.tgz", + "integrity": "sha512-WLsTMEhsQuXpCiG173+f3aymI43SXa+fB1rSfbzyP4GkPP+ZFVuO0/3sFUGNBtifisPeDcl/uD/Y2NxZ7xFq4g==", "dev": true }, "import-lazy": { @@ -18643,57 +17987,12 @@ "integrity": "sha512-8/gvXvX2JMn0F+CDlSC4l6kOmVaLOO3XLkksI7CI3Ud95KDYJuYur2b9P/PUt/i/pDAMd/DulQsNbbbmRRsDIQ==", "dev": true }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, - "requires": { - "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" - } - }, "ms": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", @@ -18752,12 +18051,6 @@ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true - }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -18868,7 +18161,6 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, "requires": { "has-flag": "^3.0.0" } @@ -18876,8 +18168,7 @@ "svg-country-flags": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/svg-country-flags/-/svg-country-flags-1.2.6.tgz", - "integrity": "sha512-loHSF5qIEXoUgcXxLBlGG2eczDvqjzhyjdu2cIxcuHbJDGPUFBIsKnlp3N/+KBhaIZWbpksoczghkJsyJxbSGQ==", - "dev": true + "integrity": "sha512-loHSF5qIEXoUgcXxLBlGG2eczDvqjzhyjdu2cIxcuHbJDGPUFBIsKnlp3N/+KBhaIZWbpksoczghkJsyJxbSGQ==" }, "svg-tags": { "version": "1.0.0", @@ -18893,14 +18184,12 @@ "symbol-tree": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz", - "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=", - "dev": true + "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=" }, "table": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz", "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==", - "dev": true, "requires": { "ajv": "^5.2.3", "ajv-keywords": "^2.1.0", @@ -18968,7 +18257,6 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-4.2.3.tgz", "integrity": "sha512-SYbXgY64PT+4GAL2ocI3HwPa4Q4TBKm0cwAVeKOt/Aoc0gSpNRjJX8w0pA1LMKZ3LBmd8pYBqApFNQLII9kavA==", - "dev": true, "requires": { "arrify": "^1.0.1", "micromatch": "^2.3.11", @@ -18981,7 +18269,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, "requires": { "arr-flatten": "^1.0.1" } @@ -18989,14 +18276,12 @@ "array-unique": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" }, "braces": { "version": "1.8.5", "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true, "requires": { "expand-range": "^1.8.1", "preserve": "^0.2.0", @@ -19007,7 +18292,6 @@ "version": "0.1.5", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, "requires": { "is-posix-bracket": "^0.1.0" } @@ -19016,7 +18300,6 @@ "version": "0.3.2", "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, "requires": { "is-extglob": "^1.0.0" } @@ -19024,14 +18307,12 @@ "is-extglob": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" }, "is-glob": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, "requires": { "is-extglob": "^1.0.0" } @@ -19040,7 +18321,6 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, "requires": { "is-buffer": "^1.1.5" } @@ -19049,7 +18329,6 @@ "version": "2.3.11", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, "requires": { "arr-diff": "^2.0.0", "array-unique": "^0.2.1", @@ -19077,20 +18356,17 @@ "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" }, "throat": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz", - "integrity": "sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=", - "dev": true + "integrity": "sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=" }, "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" }, "through2": { "version": "2.0.3", @@ -19120,14 +18396,12 @@ "tiny-emitter": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.0.2.tgz", - "integrity": "sha512-2NM0auVBGft5tee/OxP4PI3d8WItkDM+fPnaRAVo6xTDI2knbz9eC5ArWGqtGlYqiH3RU5yMpdyTTO7MguC4ow==", - "dev": true + "integrity": "sha512-2NM0auVBGft5tee/OxP4PI3d8WItkDM+fPnaRAVo6xTDI2knbz9eC5ArWGqtGlYqiH3RU5yMpdyTTO7MguC4ow==" }, "tinycolor2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.1.tgz", - "integrity": "sha1-9PrTM0R7wLB9TcjpIJ2POaisd+g=", - "dev": true + "integrity": "sha1-9PrTM0R7wLB9TcjpIJ2POaisd+g=" }, "tinydate": { "version": "1.0.0", @@ -19139,7 +18413,6 @@ "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, "requires": { "os-tmpdir": "~1.0.2" } @@ -19147,8 +18420,7 @@ "tmpl": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", - "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", - "dev": true + "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=" }, "to-arraybuffer": { "version": "1.0.1", @@ -19159,14 +18431,12 @@ "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" }, "to-object-path": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, "requires": { "kind-of": "^3.0.2" }, @@ -19175,7 +18445,6 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, "requires": { "is-buffer": "^1.1.5" } @@ -19186,7 +18455,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, "requires": { "define-property": "^2.0.2", "extend-shallow": "^3.0.2", @@ -19198,7 +18466,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, "requires": { "is-number": "^3.0.0", "repeat-string": "^1.6.1" @@ -19208,7 +18475,6 @@ "version": "2.4.3", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", - "dev": true, "requires": { "psl": "^1.1.24", "punycode": "^1.4.1" @@ -19217,8 +18483,7 @@ "punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" } } }, @@ -19226,7 +18491,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", - "dev": true, "requires": { "punycode": "^2.1.0" } @@ -19246,8 +18510,7 @@ "trim-newlines": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", - "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=", - "dev": true + "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=" }, "trim-off-newlines": { "version": "1.0.1", @@ -19258,8 +18521,7 @@ "trim-right": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", - "dev": true + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=" }, "trim-trailing-lines": { "version": "1.1.1", @@ -19298,16 +18560,19 @@ "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, "requires": { "safe-buffer": "^5.0.1" } }, + "turbo-combine-reducers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/turbo-combine-reducers/-/turbo-combine-reducers-1.0.2.tgz", + "integrity": "sha512-gHbdMZlA6Ym6Ur5pSH/UWrNQMIM9IqTH6SoL1DbHpqEdQ8i+cFunSmSlFykPt0eGQwZ4d/XTHOl74H0/kFBVWw==" + }, "tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" }, "tweezer.js": { "version": "1.4.0", @@ -19319,7 +18584,6 @@ "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, "requires": { "prelude-ls": "~1.1.2" } @@ -19327,14 +18591,12 @@ "typed-styles": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/typed-styles/-/typed-styles-0.0.5.tgz", - "integrity": "sha512-ht+rEe5UsdEBAa3gr64+QjUOqjOLJfWLvl5HZR5Ev9uo/OnD3p43wPeFSB1hNFc13GXQF/JU1Bn0YHLUqBRIlw==", - "dev": true + "integrity": "sha512-ht+rEe5UsdEBAa3gr64+QjUOqjOLJfWLvl5HZR5Ev9uo/OnD3p43wPeFSB1hNFc13GXQF/JU1Bn0YHLUqBRIlw==" }, "typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" }, "typescript": { "version": "2.6.2", @@ -19393,7 +18655,6 @@ "version": "3.4.9", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz", "integrity": "sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q==", - "dev": true, "optional": true, "requires": { "commander": "~2.17.1", @@ -19404,14 +18665,12 @@ "version": "2.17.1", "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", - "dev": true, "optional": true }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, "optional": true } } @@ -19461,8 +18720,7 @@ "underscore": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.4.4.tgz", - "integrity": "sha1-YaajIBBiKvoHljvzJSA88SI51gQ=", - "dev": true + "integrity": "sha1-YaajIBBiKvoHljvzJSA88SI51gQ=" }, "underscore.string": { "version": "3.3.5", @@ -19478,7 +18736,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/underscore.string.fp/-/underscore.string.fp-1.0.4.tgz", "integrity": "sha1-BUs/GEO8rlYShsh95eiHm0/Jg2Q=", - "dev": true, "requires": { "chickencurry": "1.1.1", "compose-function": "^2.0.0", @@ -19489,16 +18746,14 @@ "underscore.string": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.0.3.tgz", - "integrity": "sha1-Rhe4waJQz25QZPu7Nj0PqWzxRVI=", - "dev": true + "integrity": "sha1-Rhe4waJQz25QZPu7Nj0PqWzxRVI=" } } }, "unescape": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/unescape/-/unescape-0.2.0.tgz", - "integrity": "sha1-t4ubYMhvFinfGBv1Pu47yNY2fd8=", - "dev": true + "integrity": "sha1-t4ubYMhvFinfGBv1Pu47yNY2fd8=" }, "unherit": { "version": "1.1.1", @@ -19513,14 +18768,12 @@ "unicode-canonical-property-names-ecmascript": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", - "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", - "dev": true + "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==" }, "unicode-match-property-ecmascript": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", - "dev": true, "requires": { "unicode-canonical-property-names-ecmascript": "^1.0.4", "unicode-property-aliases-ecmascript": "^1.0.4" @@ -19529,14 +18782,12 @@ "unicode-match-property-value-ecmascript": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.0.2.tgz", - "integrity": "sha512-Rx7yODZC1L/T8XKo/2kNzVAQaRE88AaMvI1EF/Xnj3GW2wzN6fop9DDWuFAKUVFH7vozkz26DzP0qyWLKLIVPQ==", - "dev": true + "integrity": "sha512-Rx7yODZC1L/T8XKo/2kNzVAQaRE88AaMvI1EF/Xnj3GW2wzN6fop9DDWuFAKUVFH7vozkz26DzP0qyWLKLIVPQ==" }, "unicode-property-aliases-ecmascript": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.4.tgz", - "integrity": "sha512-2WSLa6OdYd2ng8oqiGIWnJqyFArvhn+5vgx5GTxMbUYjCYKUcuKS62YLFF0R/BDGlB1yzXjQOLtPAfHsgirEpg==", - "dev": true + "integrity": "sha512-2WSLa6OdYd2ng8oqiGIWnJqyFArvhn+5vgx5GTxMbUYjCYKUcuKS62YLFF0R/BDGlB1yzXjQOLtPAfHsgirEpg==" }, "unicode-regex": { "version": "1.0.1", @@ -19563,7 +18814,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", - "dev": true, "requires": { "arr-union": "^3.1.0", "get-value": "^2.0.6", @@ -19575,7 +18825,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, "requires": { "is-extendable": "^0.1.0" } @@ -19584,7 +18833,6 @@ "version": "0.4.3", "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", - "dev": true, "requires": { "extend-shallow": "^2.0.1", "is-extendable": "^0.1.1", @@ -19691,7 +18939,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, "requires": { "has-value": "^0.3.1", "isobject": "^3.0.0" @@ -19701,7 +18948,6 @@ "version": "0.3.1", "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, "requires": { "get-value": "^2.0.3", "has-values": "^0.1.4", @@ -19712,7 +18958,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, "requires": { "isarray": "1.0.0" } @@ -19722,8 +18967,7 @@ "has-values": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" } } }, @@ -19761,7 +19005,6 @@ "version": "4.2.2", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "dev": true, "requires": { "punycode": "^2.1.0" } @@ -19769,8 +19012,7 @@ "urix": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" }, "url": { "version": "0.11.0", @@ -19802,8 +19044,7 @@ "use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" }, "util": { "version": "0.10.4", @@ -19817,14 +19058,12 @@ "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, "util.promisify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", - "dev": true, "requires": { "define-properties": "^1.1.2", "object.getownpropertydescriptors": "^2.0.3" @@ -19839,8 +19078,7 @@ "uuid": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", - "dev": true + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" }, "v8-compile-cache": { "version": "2.0.2", @@ -19852,7 +19090,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, "requires": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" @@ -19870,20 +19107,17 @@ "validator": { "version": "10.8.0", "resolved": "https://registry.npmjs.org/validator/-/validator-10.8.0.tgz", - "integrity": "sha512-mXqMxfCh5NLsVgYVKl9WvnHNDPCcbNppHSPPowu0VjtSsGWVY+z8hJF44edLR1nbLNzi3jYoYsIl8KZpioIk6g==", - "dev": true + "integrity": "sha512-mXqMxfCh5NLsVgYVKl9WvnHNDPCcbNppHSPPowu0VjtSsGWVY+z8hJF44edLR1nbLNzi3jYoYsIl8KZpioIk6g==" }, "value-equal": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-0.4.0.tgz", - "integrity": "sha512-x+cYdNnaA3CxvMaTX0INdTCN8m8aF2uY9BvEqmxuYp8bL09cs/kWVQPVGcA35fMktdOsP69IgU7wFj/61dJHEw==", - "dev": true + "integrity": "sha512-x+cYdNnaA3CxvMaTX0INdTCN8m8aF2uY9BvEqmxuYp8bL09cs/kWVQPVGcA35fMktdOsP69IgU7wFj/61dJHEw==" }, "verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, "requires": { "assert-plus": "^1.0.0", "core-util-is": "1.0.2", @@ -19920,8 +19154,7 @@ "vlq": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/vlq/-/vlq-1.0.0.tgz", - "integrity": "sha512-o3WmXySo+oI5thgqr7Qy8uBkT/v9Zr+sRyrh1lr8aWPUkgDWdWt4Nae2WKBrLsocgE8BuWWD0jLc+VW8LeU+2g==", - "dev": true + "integrity": "sha512-o3WmXySo+oI5thgqr7Qy8uBkT/v9Zr+sRyrh1lr8aWPUkgDWdWt4Nae2WKBrLsocgE8BuWWD0jLc+VW8LeU+2g==" }, "vm-browserify": { "version": "0.0.4", @@ -19936,7 +19169,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz", "integrity": "sha1-gqwr/2PZUOqeMYmlimViX+3xkEU=", - "dev": true, "requires": { "browser-process-hrtime": "^0.1.2" } @@ -19945,7 +19177,6 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", - "dev": true, "requires": { "makeerror": "1.0.x" } @@ -19954,7 +19185,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=", - "dev": true, "requires": { "loose-envify": "^1.0.0" } @@ -19963,7 +19193,6 @@ "version": "0.18.0", "resolved": "https://registry.npmjs.org/watch/-/watch-0.18.0.tgz", "integrity": "sha1-KAlUdsbffJDJYxOJkMClQj60uYY=", - "dev": true, "requires": { "exec-sh": "^0.2.0", "minimist": "^1.2.0" @@ -19972,8 +19201,7 @@ "minimist": { "version": "1.2.0", "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" } } }, @@ -20000,19 +19228,18 @@ "webidl-conversions": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", - "dev": true + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" }, "webpack": { - "version": "4.23.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.23.1.tgz", - "integrity": "sha512-iE5Cu4rGEDk7ONRjisTOjVHv3dDtcFfwitSxT7evtYj/rANJpt1OuC/Kozh1pBa99AUBr1L/LsaNB+D9Xz3CEg==", + "version": "4.25.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.25.1.tgz", + "integrity": "sha512-T0GU/3NRtO4tMfNzsvpdhUr8HnzA4LTdP2zd+e5zd6CdOH5vNKHnAlO+DvzccfhPdzqRrALOFcjYxx7K5DWmvA==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.7.10", - "@webassemblyjs/helper-module-context": "1.7.10", - "@webassemblyjs/wasm-edit": "1.7.10", - "@webassemblyjs/wasm-parser": "1.7.10", + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-module-context": "1.7.11", + "@webassemblyjs/wasm-edit": "1.7.11", + "@webassemblyjs/wasm-parser": "1.7.11", "acorn": "^5.6.2", "acorn-dynamic-import": "^3.0.0", "ajv": "^6.1.0", @@ -20284,7 +19511,6 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", - "dev": true, "requires": { "iconv-lite": "0.4.24" } @@ -20297,14 +19523,12 @@ "whatwg-mimetype": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.2.0.tgz", - "integrity": "sha512-5YSO1nMd5D1hY3WzAQV3PzZL83W3YeyR1yW9PcH26Weh1t+Vzh9B6XkDh7aXm83HBZ4nSMvkjvN2H2ySWIvBgw==", - "dev": true + "integrity": "sha512-5YSO1nMd5D1hY3WzAQV3PzZL83W3YeyR1yW9PcH26Weh1t+Vzh9B6XkDh7aXm83HBZ4nSMvkjvN2H2ySWIvBgw==" }, "whatwg-url": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz", "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==", - "dev": true, "requires": { "lodash.sortby": "^4.7.0", "tr46": "^1.0.1", @@ -20315,7 +19539,6 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, "requires": { "isexe": "^2.0.0" } @@ -20323,8 +19546,7 @@ "which-module": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" }, "wide-align": { "version": "1.1.3", @@ -20347,8 +19569,7 @@ "wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" }, "worker-farm": { "version": "1.6.0", @@ -20362,14 +19583,12 @@ "world-countries": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/world-countries/-/world-countries-2.0.0.tgz", - "integrity": "sha512-f/Atl3VHj/FxFEw5jVkTkKofbbD8z/WF/PCpmv3JPrUR2X/XtuApulLy8QwKcyrurlDDRO0lGPvX+m0GzjxaNQ==", - "dev": true + "integrity": "sha512-f/Atl3VHj/FxFEw5jVkTkKofbbD8z/WF/PCpmv3JPrUR2X/XtuApulLy8QwKcyrurlDDRO0lGPvX+m0GzjxaNQ==" }, "wrap-ansi": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, "requires": { "string-width": "^1.0.1", "strip-ansi": "^3.0.1" @@ -20379,7 +19598,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, "requires": { "number-is-nan": "^1.0.0" } @@ -20388,7 +19606,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -20400,14 +19617,12 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "write": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", - "dev": true, "requires": { "mkdirp": "^0.5.1" } @@ -20416,7 +19631,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", - "dev": true, "requires": { "graceful-fs": "^4.1.11", "imurmurhash": "^0.1.4", @@ -20465,7 +19679,6 @@ "version": "5.2.2", "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz", "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==", - "dev": true, "requires": { "async-limiter": "~1.0.0" } @@ -20491,8 +19704,7 @@ "xml-name-validator": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", - "dev": true + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==" }, "xregexp": { "version": "4.0.0", @@ -20509,14 +19721,12 @@ "y18n": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", - "dev": true + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" }, "yallist": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" }, "yargonaut": { "version": "1.1.4", @@ -20558,9 +19768,8 @@ }, "yargs": { "version": "11.1.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-11.1.0.tgz", + "resolved": "http://registry.npmjs.org/yargs/-/yargs-11.1.0.tgz", "integrity": "sha512-NwW69J42EsCSanF8kyn5upxvjp5ds+t3+udGBeTbFnERA+lF541DDpMawzo4z6W/QrzNM18D+BPMiOBibnFV5A==", - "dev": true, "requires": { "cliui": "^4.0.0", "decamelize": "^1.1.1", @@ -20580,7 +19789,6 @@ "version": "9.0.2", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz", "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=", - "dev": true, "requires": { "camelcase": "^4.1.0" } diff --git a/plugins/woocommerce-admin/package.json b/plugins/woocommerce-admin/package.json index 6924b1b56fc..b391b4f3ace 100644 --- a/plugins/woocommerce-admin/package.json +++ b/plugins/woocommerce-admin/package.json @@ -17,6 +17,7 @@ "build:packages": "node ./bin/packages/build.js", "build:core": "cross-env NODE_ENV=production webpack", "build": "npm run build:packages && npm run build:core", + "build:release": "./bin/build-plugin-zip.sh", "postbuild": "npm run -s i18n:php && npm run -s i18n:pot", "prestart": "npm run -s install-if-deps-outdated", "dev:packages": "node ./bin/packages/watch.js", @@ -26,106 +27,97 @@ "i18n:pot": "grunt makepot", "i18n:check": "grunt checktextdomain", "i18n": "npm run -s i18n:js && npm run -s i18n:php && npm run -s i18n:check && npm run -s i18n:pot", - "lint": "npm run lint:js", + "lint": "npm run lint:js && npm run lint:css", "lint:css": "stylelint '**/*.scss'", "lint:css-fix": "stylelint '**/*.scss' --fix", "lint:js": "npm run -s install-if-deps-outdated && eslint client --ext=js,jsx", "lint:php": "./vendor/bin/phpcs --standard=phpcs.xml.dist $(git ls-files | grep .php$)", "lint:php-fix": "./vendor/bin/phpcbf --standard=phpcs.xml.dist $(git ls-files | grep .php$)", - "precommit": "npm run -s install-if-no-packages && node bin/pre-commit-hook.js", - "prepush": "npm run -s install-if-no-packages && node bin/pre-push-hook.js", "pretest": "npm run -s install-if-no-packages", "test:help": "wp-scripts test-unit-js --help", "test": "wp-scripts test-unit-js --config tests/js/jest.config.json", "test:watch": "npm run test -- --watch", + "test:update-snapshots": "jest --updateSnapshot --config tests/js/jest.config.json", "docs": "node ./bin/generate-docs", "publish:check": "npm run build:packages && lerna updated", "publish:dev": "npm run build:packages && lerna publish --npm-tag next", "publish:prod": "npm run build:packages && lerna publish" }, "devDependencies": { - "@babel/cli": "7.1.2", - "@babel/core": "7.1.2", + "@babel/cli": "7.1.5", + "@babel/core": "7.1.6", "@babel/plugin-transform-async-to-generator": "7.1.0", - "@babel/plugin-transform-react-jsx": "7.0.0", - "@babel/runtime-corejs2": "7.1.2", - "@wordpress/api-fetch": "2.2.0", + "@babel/plugin-transform-react-jsx": "7.1.6", + "@babel/runtime-corejs2": "7.1.5", "@wordpress/babel-plugin-import-jsx-pragma": "1.1.2", "@wordpress/babel-plugin-makepot": "2.1.2", "@wordpress/babel-preset-default": "2.1.0", "@wordpress/browserslist-config": "2.2.2", - "@wordpress/components": "3.0.0", - "@wordpress/data": "2.1.4", - "@wordpress/date": "2.1.0", - "@wordpress/element": "2.1.5", - "@wordpress/hooks": "2.0.3", - "@wordpress/html-entities": "2.0.2", - "@wordpress/i18n": "2.0.0", + "@wordpress/custom-templated-path-webpack-plugin": "1.1.5", "@wordpress/jest-preset-default": "2.0.6", - "@wordpress/keycodes": "2.0.2", "@wordpress/postcss-themes": "1.0.4", - "@wordpress/scripts": "2.4.0", "ast-types": "0.11.6", "autoprefixer": "9.3.1", "babel-core": "7.0.0-bridge.0", "babel-eslint": "10.0.1", "babel-loader": "8.0.4", "babel-plugin-transform-class-properties": "6.24.1", - "buble": "0.19.4", + "buble": "0.19.6", "chalk": "2.4.1", - "concurrently": "^4.0.1", - "core-js": "2.5.7", + "concurrently": "4.0.1", + "copy-webpack-plugin": "4.6.0", "cross-env": "5.2.0", "css-loader": "1.0.1", - "deasync": "^0.1.13", + "deasync": "0.1.14", "deep-freeze": "0.0.1", "docsify-cli": "github:docsifyjs/docsify-cli#5df38996", - "eslint": "5.8.0", + "eslint": "5.9.0", "eslint-config-wpcalypso": "4.0.1", "eslint-loader": "2.1.1", - "eslint-plugin-jest": "21.26.2", + "eslint-plugin-jest": "22.0.0", "eslint-plugin-jsx-a11y": "6.1.2", "eslint-plugin-react": "7.11.1", "eslint-plugin-wpcalypso": "4.0.2", "extract-text-webpack-plugin": "4.0.0-beta.0", - "gfm-code-blocks": "1.0.0", - "gridicons": "3.1.1", "grunt": "1.0.3", "grunt-checktextdomain": "1.0.1", "grunt-wp-i18n": "1.0.2", - "history": "4.7.2", - "html-to-react": "1.3.3", - "husky": "1.1.2", - "interpolate-components": "1.1.1", - "lerna": "^3.4.3", - "marked": "0.5.1", - "node-sass": "4.9.4", + "husky": "1.1.4", + "lerna": "3.4.3", + "node-sass": "4.10.0", "postcss-color-function": "4.0.1", "postcss-loader": "3.0.0", "prettier": "github:automattic/calypso-prettier#c56b4251", "prop-types": "15.6.2", "raw-loader": "0.5.1", - "react": "16.6.0", - "react-click-outside": "3.0.1", "react-docgen": "2.21.0", - "react-dom": "16.6.0", - "react-live": "1.12.0", - "react-router-dom": "4.3.1", - "react-world-flags": "1.2.4", "readline-sync": "1.4.9", "recast": "0.16.0", - "rimraf": "^2.6.2", + "rimraf": "2.6.2", + "rtlcss": "2.4.0", "sass-loader": "7.1.0", "style-loader": "0.23.1", - "stylelint": "9.7.0", + "stylelint": "9.8.0", "stylelint-config-wordpress": "13.1.0", - "webpack": "4.23.1", + "webpack": "4.25.1", "webpack-cli": "3.1.2" }, "dependencies": { + "@wordpress/api-fetch": "2.2.2", + "@wordpress/components": "3.0.0", + "@wordpress/data": "3.1.0", + "@wordpress/date": "2.1.0", + "@wordpress/element": "2.1.5", + "@wordpress/hooks": "2.0.3", + "@wordpress/html-entities": "2.0.2", + "@wordpress/i18n": "2.0.0", + "@wordpress/keycodes": "2.0.3", + "@wordpress/scripts": "2.4.1", + "@wordpress/viewport": "^2.0.7", "browser-filesaver": "^1.1.1", "classnames": "^2.2.5", - "d3-array": "^1.2.4", + "core-js": "2.5.7", + "d3-array": "^2.0.0", "d3-axis": "^1.0.12", "d3-format": "^1.3.2", "d3-scale": "^2.1.2", @@ -134,10 +126,26 @@ "d3-shape": "^1.2.2", "d3-time-format": "^2.1.3", "dompurify": "1.0.8", + "gfm-code-blocks": "1.0.0", + "gridicons": "3.1.1", + "history": "4.7.2", + "html-to-react": "1.3.3", + "interpolate-components": "1.1.1", "lodash": "^4.17.11", + "marked": "0.5.1", + "qs": "^6.5.2", + "react-click-outside": "3.0.1", "react-dates": "^18.0.4", + "react-live": "1.12.0", + "react-router-dom": "4.3.1", "react-slot-fill": "^2.0.1", "react-transition-group": "^2.4.0", - "redux": "^4.0.0" + "react-world-flags": "1.2.4" + }, + "husky": { + "hooks": { + "pre-commit": "npm run -s install-if-no-packages && node bin/pre-commit-hook.js", + "pre-push": "npm run -s install-if-no-packages && node bin/pre-push-hook.js" + } } } diff --git a/plugins/woocommerce-admin/packages/components/.npmrc b/plugins/woocommerce-admin/packages/components/.npmrc new file mode 100644 index 00000000000..43c97e719a5 --- /dev/null +++ b/plugins/woocommerce-admin/packages/components/.npmrc @@ -0,0 +1 @@ +package-lock=false diff --git a/plugins/woocommerce-admin/packages/components/README.md b/plugins/woocommerce-admin/packages/components/README.md new file mode 100644 index 00000000000..4ffe2b79afb --- /dev/null +++ b/plugins/woocommerce-admin/packages/components/README.md @@ -0,0 +1,13 @@ +# Components + +This packages includes a library of components that can be used to create pages in the WooCommerce dashboard and reports pages. + +## Installation + +Install the module + +```bash +npm install @woocommerce/components --save +``` + +View [the full Component documentation](https://woocommerce.github.io/wc-admin/#/components/) for usage information. diff --git a/plugins/woocommerce-admin/client/lib/proptype-validator.js b/plugins/woocommerce-admin/packages/components/lib/proptype-validator.js similarity index 100% rename from plugins/woocommerce-admin/client/lib/proptype-validator.js rename to plugins/woocommerce-admin/packages/components/lib/proptype-validator.js diff --git a/plugins/woocommerce-admin/packages/components/package.json b/plugins/woocommerce-admin/packages/components/package.json new file mode 100644 index 00000000000..61cddeaf88f --- /dev/null +++ b/plugins/woocommerce-admin/packages/components/package.json @@ -0,0 +1,60 @@ +{ + "name": "@woocommerce/components", + "version": "1.0.0", + "description": "UI components for WooCommerce.", + "author": "Automattic", + "license": "GPL-2.0-or-later", + "keywords": [ + "wordpress", + "woocommerce", + "components" + ], + "homepage": "https://github.com/WooCommerce/wc-admin/tree/master/packages/components/README.md", + "repository": { + "type": "git", + "url": "https://github.com/WooCommerce/wc-admin.git" + }, + "bugs": { + "url": "https://github.com/WooCommerce/wc-admin/issues" + }, + "main": "build/index.js", + "module": "build-module/index.js", + "react-native": "src/index", + "dependencies": { + "@babel/runtime-corejs2": "7.1.2", + "@woocommerce/csv-export": "^1.0.0", + "@woocommerce/currency": "^1.0.0", + "@woocommerce/date": "^1.0.0", + "@woocommerce/navigation": "^1.0.0", + "@wordpress/components": "3.0.0", + "@wordpress/compose": "3.0.0", + "@wordpress/date": "2.1.0", + "@wordpress/element": "2.1.5", + "@wordpress/html-entities": "2.0.2", + "@wordpress/i18n": "2.0.0", + "@wordpress/keycodes": "2.0.2", + "@wordpress/viewport": "^2.0.7", + "classnames": "^2.2.5", + "core-js": "2.5.7", + "d3-array": "^1.2.4", + "d3-axis": "^1.0.12", + "d3-format": "^1.3.2", + "d3-scale": "^2.1.2", + "d3-scale-chromatic": "^1.3.3", + "d3-selection": "^1.3.2", + "d3-shape": "^1.2.2", + "d3-time-format": "^2.1.3", + "gridicons": "3.1.1", + "lodash": "^4.17.11", + "moment": "^2.22.1", + "prop-types": "15.6.2", + "qs": "^6.5.2", + "react-dates": "^18.0.4", + "react-router-dom": "4.3.1", + "react-transition-group": "^2.4.0", + "react-world-flags": "1.2.4" + }, + "publishConfig": { + "access": "public" + } +} diff --git a/plugins/woocommerce-admin/client/components/animation-slider/example.md b/plugins/woocommerce-admin/packages/components/src/animation-slider/example.md similarity index 100% rename from plugins/woocommerce-admin/client/components/animation-slider/example.md rename to plugins/woocommerce-admin/packages/components/src/animation-slider/example.md diff --git a/plugins/woocommerce-admin/client/components/animation-slider/index.js b/plugins/woocommerce-admin/packages/components/src/animation-slider/index.js similarity index 97% rename from plugins/woocommerce-admin/client/components/animation-slider/index.js rename to plugins/woocommerce-admin/packages/components/src/animation-slider/index.js index 951a3894ad7..3ad6e00e163 100644 --- a/plugins/woocommerce-admin/client/components/animation-slider/index.js +++ b/plugins/woocommerce-admin/packages/components/src/animation-slider/index.js @@ -4,13 +4,8 @@ */ import { Component, createRef } from '@wordpress/element'; import classnames from 'classnames'; -import PropTypes from 'prop-types'; - -/** - * Internal dependencies - */ import { CSSTransition, TransitionGroup } from 'react-transition-group'; -import './style.scss'; +import PropTypes from 'prop-types'; /** * This component creates slideable content controlled by an animate prop to direct the contents to slide left or right. diff --git a/plugins/woocommerce-admin/client/components/animation-slider/style.scss b/plugins/woocommerce-admin/packages/components/src/animation-slider/style.scss similarity index 100% rename from plugins/woocommerce-admin/client/components/animation-slider/style.scss rename to plugins/woocommerce-admin/packages/components/src/animation-slider/style.scss diff --git a/plugins/woocommerce-admin/packages/components/src/animation-slider/test/__snapshots__/index.js.snap b/plugins/woocommerce-admin/packages/components/src/animation-slider/test/__snapshots__/index.js.snap new file mode 100644 index 00000000000..96fe83cf4fb --- /dev/null +++ b/plugins/woocommerce-admin/packages/components/src/animation-slider/test/__snapshots__/index.js.snap @@ -0,0 +1,11 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`AnimationSlider it renders correctly 1`] = ` +
+
+
+
+
+`; diff --git a/plugins/woocommerce-admin/packages/components/src/animation-slider/test/index.js b/plugins/woocommerce-admin/packages/components/src/animation-slider/test/index.js new file mode 100644 index 00000000000..d0bf1d86f20 --- /dev/null +++ b/plugins/woocommerce-admin/packages/components/src/animation-slider/test/index.js @@ -0,0 +1,23 @@ +/** @format */ +/** + * External dependencies + */ +import renderer from 'react-test-renderer'; + +/** + * Internal dependencies + */ +import AnimationSlider from '../'; + +describe( 'AnimationSlider', () => { + test( 'it renders correctly', () => { + const tree = renderer + .create( + + { () =>
} + + ) + .toJSON(); + expect( tree ).toMatchSnapshot(); + } ); +} ); diff --git a/plugins/woocommerce-admin/client/components/calendar/example.md b/plugins/woocommerce-admin/packages/components/src/calendar/example.md similarity index 100% rename from plugins/woocommerce-admin/client/components/calendar/example.md rename to plugins/woocommerce-admin/packages/components/src/calendar/example.md diff --git a/plugins/woocommerce-admin/client/components/calendar/index.js b/plugins/woocommerce-admin/packages/components/src/calendar/index.js similarity index 94% rename from plugins/woocommerce-admin/client/components/calendar/index.js rename to plugins/woocommerce-admin/packages/components/src/calendar/index.js index 87eaaf2d3f6..1711ffff7a8 100644 --- a/plugins/woocommerce-admin/client/components/calendar/index.js +++ b/plugins/woocommerce-admin/packages/components/src/calendar/index.js @@ -2,20 +2,20 @@ /** * External dependencies */ -import { Component } from '@wordpress/element'; -import moment from 'moment'; import 'core-js/fn/object/assign'; import 'core-js/fn/array/from'; +import { __, sprintf } from '@wordpress/i18n'; +import classnames from 'classnames'; +import { Component } from '@wordpress/element'; import { DayPickerRangeController, isInclusivelyAfterDay, isInclusivelyBeforeDay, } from 'react-dates'; +import moment from 'moment'; import { partial } from 'lodash'; -import { __, sprintf } from '@wordpress/i18n'; -import classnames from 'classnames'; import PropTypes from 'prop-types'; -import 'react-dates/lib/css/_datepicker.css'; +import { withViewportMatch } from '@wordpress/viewport'; /** * WooCommerce dependencies @@ -26,9 +26,7 @@ import { validateDateInputForRange } from '@woocommerce/date'; * Internal dependencies */ import DateInput from './input'; -import { isMobileViewport } from 'lib/ui'; import phrases from './phrases'; -import './style.scss'; /** * This is wrapper for a [react-dates](https://github.com/airbnb/react-dates) powered calendar. @@ -114,14 +112,15 @@ class DateRange extends Component { afterError, beforeError, shortDateFormat, + isViewportMobile, + isViewportSmall, } = this.props; const isOutsideRange = this.getOutsideRange(); - const isMobile = isMobileViewport(); - const isDoubleCalendar = isMobile && window.innerWidth > 624; + const isDoubleCalendar = isViewportMobile && ! isViewportSmall; return (
@@ -225,4 +224,7 @@ DateRange.propTypes = { shortDateFormat: PropTypes.string.isRequired, }; -export default DateRange; +export default withViewportMatch( { + isViewportMobile: '< medium', + isViewportSmall: '< small', +} )( DateRange ); diff --git a/plugins/woocommerce-admin/client/components/calendar/input.js b/plugins/woocommerce-admin/packages/components/src/calendar/input.js similarity index 100% rename from plugins/woocommerce-admin/client/components/calendar/input.js rename to plugins/woocommerce-admin/packages/components/src/calendar/input.js diff --git a/plugins/woocommerce-admin/client/components/calendar/phrases.js b/plugins/woocommerce-admin/packages/components/src/calendar/phrases.js similarity index 100% rename from plugins/woocommerce-admin/client/components/calendar/phrases.js rename to plugins/woocommerce-admin/packages/components/src/calendar/phrases.js diff --git a/plugins/woocommerce-admin/client/components/calendar/style.scss b/plugins/woocommerce-admin/packages/components/src/calendar/style.scss similarity index 100% rename from plugins/woocommerce-admin/client/components/calendar/style.scss rename to plugins/woocommerce-admin/packages/components/src/calendar/style.scss diff --git a/plugins/woocommerce-admin/client/components/card/example.md b/plugins/woocommerce-admin/packages/components/src/card/example.md similarity index 100% rename from plugins/woocommerce-admin/client/components/card/example.md rename to plugins/woocommerce-admin/packages/components/src/card/example.md diff --git a/plugins/woocommerce-admin/client/components/card/index.js b/plugins/woocommerce-admin/packages/components/src/card/index.js similarity index 89% rename from plugins/woocommerce-admin/client/components/card/index.js rename to plugins/woocommerce-admin/packages/components/src/card/index.js index d0a30dc5c84..fc79d21e711 100644 --- a/plugins/woocommerce-admin/client/components/card/index.js +++ b/plugins/woocommerce-admin/packages/components/src/card/index.js @@ -9,10 +9,9 @@ import PropTypes from 'prop-types'; /** * Internal dependencies */ -import './style.scss'; -import EllipsisMenu from 'components/ellipsis-menu'; -import { H, Section } from 'components/section'; -import { validateComponent } from 'lib/proptype-validator'; +import EllipsisMenu from '../ellipsis-menu'; +import { H, Section } from '../section'; +import { validateComponent } from '../../lib/proptype-validator'; /** * A basic card component with a header. The header can contain a title, an action, and an `EllipsisMenu` menu. diff --git a/plugins/woocommerce-admin/client/components/card/style.scss b/plugins/woocommerce-admin/packages/components/src/card/style.scss similarity index 98% rename from plugins/woocommerce-admin/client/components/card/style.scss rename to plugins/woocommerce-admin/packages/components/src/card/style.scss index 79692ccce57..3467cd738d7 100644 --- a/plugins/woocommerce-admin/client/components/card/style.scss +++ b/plugins/woocommerce-admin/packages/components/src/card/style.scss @@ -2,7 +2,7 @@ .woocommerce-card { margin-bottom: $gap-large; - background: white; + background: $white; border: 1px solid $core-grey-light-700; @include breakpoint( '<782px' ) { diff --git a/plugins/woocommerce-admin/packages/components/src/card/test/__snapshots__/index.js.snap b/plugins/woocommerce-admin/packages/components/src/card/test/__snapshots__/index.js.snap new file mode 100644 index 00000000000..74c3fce3b4a --- /dev/null +++ b/plugins/woocommerce-admin/packages/components/src/card/test/__snapshots__/index.js.snap @@ -0,0 +1,20 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Card it renders correctly 1`] = ` +
+
+

+ A Card Example +

+
+
+
+`; diff --git a/plugins/woocommerce-admin/client/components/card/test/index.js b/plugins/woocommerce-admin/packages/components/src/card/test/index.js similarity index 71% rename from plugins/woocommerce-admin/client/components/card/test/index.js rename to plugins/woocommerce-admin/packages/components/src/card/test/index.js index 80d75cf3681..a5fad0da225 100644 --- a/plugins/woocommerce-admin/client/components/card/test/index.js +++ b/plugins/woocommerce-admin/packages/components/src/card/test/index.js @@ -3,7 +3,7 @@ * * @format */ - +import renderer from 'react-test-renderer'; import { shallow } from 'enzyme'; /** @@ -12,6 +12,11 @@ import { shallow } from 'enzyme'; import Card from '../'; describe( 'Card', () => { + test( 'it renders correctly', () => { + const tree = renderer.create( ).toJSON(); + expect( tree ).toMatchSnapshot(); + } ); + test( 'should have correct title', () => { const card = ; expect( card.props.title ).toBe( 'A Card Example' ); diff --git a/plugins/woocommerce-admin/client/components/count/example.md b/plugins/woocommerce-admin/packages/components/src/count/example.md similarity index 100% rename from plugins/woocommerce-admin/client/components/count/example.md rename to plugins/woocommerce-admin/packages/components/src/count/example.md diff --git a/plugins/woocommerce-admin/client/components/count/index.js b/plugins/woocommerce-admin/packages/components/src/count/index.js similarity index 92% rename from plugins/woocommerce-admin/client/components/count/index.js rename to plugins/woocommerce-admin/packages/components/src/count/index.js index ee9bfbcb72e..967881de05a 100644 --- a/plugins/woocommerce-admin/client/components/count/index.js +++ b/plugins/woocommerce-admin/packages/components/src/count/index.js @@ -4,10 +4,6 @@ */ import { __, sprintf } from '@wordpress/i18n'; import PropTypes from 'prop-types'; -/** - * Internal dependencies - */ -import './style.scss'; /** * Display a number with a styled border. diff --git a/plugins/woocommerce-admin/client/components/count/style.scss b/plugins/woocommerce-admin/packages/components/src/count/style.scss similarity index 100% rename from plugins/woocommerce-admin/client/components/count/style.scss rename to plugins/woocommerce-admin/packages/components/src/count/style.scss diff --git a/plugins/woocommerce-admin/packages/components/src/count/test/__snapshots__/index.js.snap b/plugins/woocommerce-admin/packages/components/src/count/test/__snapshots__/index.js.snap new file mode 100644 index 00000000000..0d77f5c451f --- /dev/null +++ b/plugins/woocommerce-admin/packages/components/src/count/test/__snapshots__/index.js.snap @@ -0,0 +1,10 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Count it renders correctly 1`] = ` + + 33 + +`; diff --git a/plugins/woocommerce-admin/packages/components/src/count/test/index.js b/plugins/woocommerce-admin/packages/components/src/count/test/index.js new file mode 100644 index 00000000000..2f1dc32efb8 --- /dev/null +++ b/plugins/woocommerce-admin/packages/components/src/count/test/index.js @@ -0,0 +1,17 @@ +/** @format */ +/** + * External dependencies + */ +import renderer from 'react-test-renderer'; + +/** + * Internal dependencies + */ +import Count from '../'; + +describe( 'Count', () => { + test( 'it renders correctly', () => { + const tree = renderer.create( ).toJSON(); + expect( tree ).toMatchSnapshot(); + } ); +} ); diff --git a/plugins/woocommerce-admin/client/components/dropdown-button/example.md b/plugins/woocommerce-admin/packages/components/src/dropdown-button/example.md similarity index 100% rename from plugins/woocommerce-admin/client/components/dropdown-button/example.md rename to plugins/woocommerce-admin/packages/components/src/dropdown-button/example.md diff --git a/plugins/woocommerce-admin/client/components/dropdown-button/index.js b/plugins/woocommerce-admin/packages/components/src/dropdown-button/index.js similarity index 93% rename from plugins/woocommerce-admin/client/components/dropdown-button/index.js rename to plugins/woocommerce-admin/packages/components/src/dropdown-button/index.js index 42ba9bf12af..b5f55de9db2 100644 --- a/plugins/woocommerce-admin/client/components/dropdown-button/index.js +++ b/plugins/woocommerce-admin/packages/components/src/dropdown-button/index.js @@ -6,11 +6,6 @@ import { Button } from '@wordpress/components'; import PropTypes from 'prop-types'; import classnames from 'classnames'; -/** - * Internal dependencies - */ -import './style.scss'; - /** * A button useful for a launcher of a dropdown component. The button is 100% width of its container and displays * single or multiple lines rendered as `` elments. @@ -37,7 +32,7 @@ DropdownButton.propTypes = { /** * An array of elements to be rendered as the content of the button. */ - labels: PropTypes.array, + labels: PropTypes.array.isRequired, /** * Boolean describing if the dropdown in open or not. */ diff --git a/plugins/woocommerce-admin/client/components/dropdown-button/style.scss b/plugins/woocommerce-admin/packages/components/src/dropdown-button/style.scss similarity index 100% rename from plugins/woocommerce-admin/client/components/dropdown-button/style.scss rename to plugins/woocommerce-admin/packages/components/src/dropdown-button/style.scss diff --git a/plugins/woocommerce-admin/packages/components/src/dropdown-button/test/__snapshots__/index.js.snap b/plugins/woocommerce-admin/packages/components/src/dropdown-button/test/__snapshots__/index.js.snap new file mode 100644 index 00000000000..dc70375924e --- /dev/null +++ b/plugins/woocommerce-admin/packages/components/src/dropdown-button/test/__snapshots__/index.js.snap @@ -0,0 +1,16 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`DropdownButton it renders correctly 1`] = ` + +`; diff --git a/plugins/woocommerce-admin/packages/components/src/dropdown-button/test/index.js b/plugins/woocommerce-admin/packages/components/src/dropdown-button/test/index.js new file mode 100644 index 00000000000..738287f190c --- /dev/null +++ b/plugins/woocommerce-admin/packages/components/src/dropdown-button/test/index.js @@ -0,0 +1,17 @@ +/** @format */ +/** + * External dependencies + */ +import renderer from 'react-test-renderer'; + +/** + * Internal dependencies + */ +import DropdownButton from '../'; + +describe( 'DropdownButton', () => { + test( 'it renders correctly', () => { + const tree = renderer.create( ).toJSON(); + expect( tree ).toMatchSnapshot(); + } ); +} ); diff --git a/plugins/woocommerce-admin/client/components/ellipsis-menu/example.md b/plugins/woocommerce-admin/packages/components/src/ellipsis-menu/example.md similarity index 100% rename from plugins/woocommerce-admin/client/components/ellipsis-menu/example.md rename to plugins/woocommerce-admin/packages/components/src/ellipsis-menu/example.md diff --git a/plugins/woocommerce-admin/client/components/ellipsis-menu/index.js b/plugins/woocommerce-admin/packages/components/src/ellipsis-menu/index.js similarity index 96% rename from plugins/woocommerce-admin/client/components/ellipsis-menu/index.js rename to plugins/woocommerce-admin/packages/components/src/ellipsis-menu/index.js index 623f40bca1d..7ea9ad52566 100644 --- a/plugins/woocommerce-admin/client/components/ellipsis-menu/index.js +++ b/plugins/woocommerce-admin/packages/components/src/ellipsis-menu/index.js @@ -7,11 +7,6 @@ import classnames from 'classnames'; import { IconButton, Dropdown, NavigableMenu } from '@wordpress/components'; import PropTypes from 'prop-types'; -/** - * Internal dependencies - */ -import './style.scss'; - /** * This is a dropdown menu hidden behind a vertical ellipsis icon. When clicked, the inner MenuItems are displayed. */ diff --git a/plugins/woocommerce-admin/client/components/ellipsis-menu/menu-item.js b/plugins/woocommerce-admin/packages/components/src/ellipsis-menu/menu-item.js similarity index 100% rename from plugins/woocommerce-admin/client/components/ellipsis-menu/menu-item.js rename to plugins/woocommerce-admin/packages/components/src/ellipsis-menu/menu-item.js diff --git a/plugins/woocommerce-admin/client/components/ellipsis-menu/menu-title.js b/plugins/woocommerce-admin/packages/components/src/ellipsis-menu/menu-title.js similarity index 100% rename from plugins/woocommerce-admin/client/components/ellipsis-menu/menu-title.js rename to plugins/woocommerce-admin/packages/components/src/ellipsis-menu/menu-title.js diff --git a/plugins/woocommerce-admin/client/components/ellipsis-menu/style.scss b/plugins/woocommerce-admin/packages/components/src/ellipsis-menu/style.scss similarity index 100% rename from plugins/woocommerce-admin/client/components/ellipsis-menu/style.scss rename to plugins/woocommerce-admin/packages/components/src/ellipsis-menu/style.scss diff --git a/plugins/woocommerce-admin/client/components/empty-content/example.md b/plugins/woocommerce-admin/packages/components/src/empty-content/example.md similarity index 100% rename from plugins/woocommerce-admin/client/components/empty-content/example.md rename to plugins/woocommerce-admin/packages/components/src/empty-content/example.md diff --git a/plugins/woocommerce-admin/client/components/empty-content/index.js b/plugins/woocommerce-admin/packages/components/src/empty-content/index.js similarity index 93% rename from plugins/woocommerce-admin/client/components/empty-content/index.js rename to plugins/woocommerce-admin/packages/components/src/empty-content/index.js index f3181082bd8..32aaeb2c8af 100644 --- a/plugins/woocommerce-admin/client/components/empty-content/index.js +++ b/plugins/woocommerce-admin/packages/components/src/empty-content/index.js @@ -10,9 +10,8 @@ import PropTypes from 'prop-types'; /** * Internal dependencies */ -import './style.scss'; -import { H } from 'components/section'; -import ImageAsset from 'components/image-asset'; +import { H } from '../section'; +import ImageAsset from '../image-asset'; /** * A component to be used when there is no data to show. @@ -88,9 +87,9 @@ class EmptyContent extends Component { } render() { - const { title, message, illustration } = this.props; + const { className, title, message, illustration } = this.props; return ( -
+
{ illustration && this.renderIllustration() } { title ? { title } : null } { message ?

{ message }

: null } diff --git a/plugins/woocommerce-admin/client/components/empty-content/style.scss b/plugins/woocommerce-admin/packages/components/src/empty-content/style.scss similarity index 100% rename from plugins/woocommerce-admin/client/components/empty-content/style.scss rename to plugins/woocommerce-admin/packages/components/src/empty-content/style.scss diff --git a/plugins/woocommerce-admin/client/components/filters/advanced/README.md b/plugins/woocommerce-admin/packages/components/src/filters/advanced/README.md similarity index 96% rename from plugins/woocommerce-admin/client/components/filters/advanced/README.md rename to plugins/woocommerce-admin/packages/components/src/filters/advanced/README.md index e629bd15c7d..c4c392cdef7 100644 --- a/plugins/woocommerce-admin/client/components/filters/advanced/README.md +++ b/plugins/woocommerce-admin/packages/components/src/filters/advanced/README.md @@ -54,7 +54,7 @@ const config = { Render a select component with options. -```jsx +```jsx input: { component: 'SelectControl', options: [ @@ -66,11 +66,11 @@ input: { } ``` -`options`: An array of objects with `key` and `label` properties. +`options`: An array of objects with `key` and `label` properties. ### Search -Render an input for users to search and select using an autocomplete. +Render an input for users to search and select using an autocomplete. ```jsx input: { @@ -83,7 +83,7 @@ input: { } ``` -`type`: A string Autocompleter type used by the [Search Component](https://github.com/woocommerce/wc-admin/tree/master/client/components/search). +`type`: A string Autocompleter type used by the [Search Component](https://github.com/woocommerce/wc-admin/tree/master/packages/components/src/search). `getLabels`: A function returning a Promise resolving to an array of objects with `id` and `label` properties. ### Date diff --git a/plugins/woocommerce-admin/client/components/filters/advanced/index.js b/plugins/woocommerce-admin/packages/components/src/filters/advanced/index.js similarity index 97% rename from plugins/woocommerce-admin/client/components/filters/advanced/index.js rename to plugins/woocommerce-admin/packages/components/src/filters/advanced/index.js index 4f070b0308d..8385b87b956 100644 --- a/plugins/woocommerce-admin/client/components/filters/advanced/index.js +++ b/plugins/woocommerce-admin/packages/components/src/filters/advanced/index.js @@ -11,19 +11,22 @@ import Gridicon from 'gridicons'; import interpolateComponents from 'interpolate-components'; /** - * Internal dependencies + * WooCommerce dependencies */ -import Card from 'components/card'; -import Link from 'components/link'; -import SelectFilter from './select-filter'; -import SearchFilter from './search-filter'; import { getActiveFiltersFromQuery, - getQueryFromActiveFilters, getDefaultOptionValue, -} from './utils'; -import { getNewPath } from 'lib/nav-utils'; -import './style.scss'; + getNewPath, + getQueryFromActiveFilters, +} from '@woocommerce/navigation'; + +/** + * Internal dependencies + */ +import Card from '../../card'; +import Link from '../../link'; +import SelectFilter from './select-filter'; +import SearchFilter from './search-filter'; const matches = [ { value: 'all', label: __( 'All', 'wc-admin' ) }, @@ -144,7 +147,7 @@ class AdvancedFilters extends Component { } render() { - const { config } = this.props; + const { config, query } = this.props; const { activeFilters, match } = this.state; const availableFilterKeys = this.getAvailableFilterKeys(); const updateHref = this.getUpdateHref( activeFilters, match ); @@ -172,6 +175,7 @@ class AdvancedFilters extends Component { config={ config.filters[ key ] } onFilterChange={ this.onFilterChange } isEnglish={ isEnglish } + query={ query } /> ) } window.innerWidth < 782; diff --git a/plugins/woocommerce-admin/client/components/filters/date/index.js b/plugins/woocommerce-admin/packages/components/src/filters/date/index.js similarity index 97% rename from plugins/woocommerce-admin/client/components/filters/date/index.js rename to plugins/woocommerce-admin/packages/components/src/filters/date/index.js index 7b24f14c04e..1260dbbbd57 100644 --- a/plugins/woocommerce-admin/client/components/filters/date/index.js +++ b/plugins/woocommerce-admin/packages/components/src/filters/date/index.js @@ -11,14 +11,13 @@ import PropTypes from 'prop-types'; * WooCommerce dependencies */ import { getCurrentDates, getDateParamsFromQuery, isoDateFormat } from '@woocommerce/date'; +import { updateQueryString } from '@woocommerce/navigation'; /** * Internal dependencies */ import DatePickerContent from './content'; -import DropdownButton from 'components/dropdown-button'; -import { updateQueryString } from 'lib/nav-utils'; -import './style.scss'; +import DropdownButton from '../../dropdown-button'; const shortDateFormat = __( 'MM/DD/YYYY', 'wc-admin' ); diff --git a/plugins/woocommerce-admin/client/components/filters/date/preset-periods.js b/plugins/woocommerce-admin/packages/components/src/filters/date/preset-periods.js similarity index 92% rename from plugins/woocommerce-admin/client/components/filters/date/preset-periods.js rename to plugins/woocommerce-admin/packages/components/src/filters/date/preset-periods.js index 74309f5a957..8a6b8fc65e4 100644 --- a/plugins/woocommerce-admin/client/components/filters/date/preset-periods.js +++ b/plugins/woocommerce-admin/packages/components/src/filters/date/preset-periods.js @@ -15,7 +15,7 @@ import { presetValues } from '@woocommerce/date'; /** * Internal dependencies */ -import SegmentedSelection from 'components/segmented-selection'; +import SegmentedSelection from '../../segmented-selection'; class PresetPeriods extends Component { render() { diff --git a/plugins/woocommerce-admin/client/components/filters/date/style.scss b/plugins/woocommerce-admin/packages/components/src/filters/date/style.scss similarity index 100% rename from plugins/woocommerce-admin/client/components/filters/date/style.scss rename to plugins/woocommerce-admin/packages/components/src/filters/date/style.scss diff --git a/plugins/woocommerce-admin/client/components/filters/example.md b/plugins/woocommerce-admin/packages/components/src/filters/example.md similarity index 100% rename from plugins/woocommerce-admin/client/components/filters/example.md rename to plugins/woocommerce-admin/packages/components/src/filters/example.md diff --git a/plugins/woocommerce-admin/client/components/filters/filter/README.md b/plugins/woocommerce-admin/packages/components/src/filters/filter/README.md similarity index 100% rename from plugins/woocommerce-admin/client/components/filters/filter/README.md rename to plugins/woocommerce-admin/packages/components/src/filters/filter/README.md diff --git a/plugins/woocommerce-admin/client/components/filters/filter/index.js b/plugins/woocommerce-admin/packages/components/src/filters/filter/index.js similarity index 94% rename from plugins/woocommerce-admin/client/components/filters/filter/index.js rename to plugins/woocommerce-admin/packages/components/src/filters/filter/index.js index 442cd07ff55..a955cf0bf92 100644 --- a/plugins/woocommerce-admin/client/components/filters/filter/index.js +++ b/plugins/woocommerce-admin/packages/components/src/filters/filter/index.js @@ -9,15 +9,17 @@ import { Component } from '@wordpress/element'; import { find, partial, last, get, includes } from 'lodash'; import PropTypes from 'prop-types'; +/** + * WooCommerce dependencies + */ +import { flattenFilters, getTimeRelatedQuery, updateQueryString } from '@woocommerce/navigation'; + /** * Internal dependencies */ -import AnimationSlider from 'components/animation-slider'; -import DropdownButton from 'components/dropdown-button'; -import Search from 'components/search'; -import { getTimeRelatedQuery, updateQueryString } from 'lib/nav-utils'; -import { flatenFilters } from './utils'; -import './style.scss'; +import AnimationSlider from '../../animation-slider'; +import DropdownButton from '../../dropdown-button'; +import Search from '../../search'; export const DEFAULT_FILTER = 'all'; @@ -45,7 +47,7 @@ class FilterPicker extends Component { if ( selectedFilter.settings && selectedFilter.settings.getLabels ) { const { query } = this.props; const { param: filterParam, getLabels } = selectedFilter.settings; - getLabels( query[ filterParam ] ).then( this.updateSelectedTag ); + getLabels( query[ filterParam ], query ).then( this.updateSelectedTag ); } } @@ -55,7 +57,7 @@ class FilterPicker extends Component { getFilter( value ) { const { config, query } = this.props; - const allFilters = flatenFilters( config.filters ); + const allFilters = flattenFilters( config.filters ); value = value || query[ config.param ] || DEFAULT_FILTER; return find( allFilters, { value } ) || {}; } diff --git a/plugins/woocommerce-admin/client/components/filters/filter/style.scss b/plugins/woocommerce-admin/packages/components/src/filters/filter/style.scss similarity index 100% rename from plugins/woocommerce-admin/client/components/filters/filter/style.scss rename to plugins/woocommerce-admin/packages/components/src/filters/filter/style.scss diff --git a/plugins/woocommerce-admin/client/components/filters/index.js b/plugins/woocommerce-admin/packages/components/src/filters/index.js similarity index 97% rename from plugins/woocommerce-admin/client/components/filters/index.js rename to plugins/woocommerce-admin/packages/components/src/filters/index.js index ef0d4975a2d..4cdcd81206c 100644 --- a/plugins/woocommerce-admin/client/components/filters/index.js +++ b/plugins/woocommerce-admin/packages/components/src/filters/index.js @@ -14,8 +14,7 @@ import AdvancedFilters from './advanced'; import CompareFilter from './compare'; import DatePicker from './date'; import FilterPicker from './filter'; -import { H, Section } from 'components/section'; -import './style.scss'; +import { H, Section } from '../section'; /** * Add a collection of report filters to a page. This uses `DatePicker` & `FilterPicker` for the "basic" filters, and `AdvancedFilters` diff --git a/plugins/woocommerce-admin/client/components/filters/style.scss b/plugins/woocommerce-admin/packages/components/src/filters/style.scss similarity index 93% rename from plugins/woocommerce-admin/client/components/filters/style.scss rename to plugins/woocommerce-admin/packages/components/src/filters/style.scss index 43071daecc1..41f8c0c6113 100644 --- a/plugins/woocommerce-admin/client/components/filters/style.scss +++ b/plugins/woocommerce-admin/packages/components/src/filters/style.scss @@ -10,7 +10,7 @@ display: flex; margin-bottom: $gap-large; - @include breakpoint( '<1100px' ) { + @include breakpoint( '<1280px' ) { flex-direction: column; } } @@ -31,7 +31,7 @@ padding-right: 0; } - @include breakpoint( '<1100px' ) { + @include breakpoint( '<1280px' ) { width: 50%; padding: 0; min-height: 78px; @@ -46,7 +46,7 @@ margin: 7px 0; display: block; - @include breakpoint( '<1100px' ) { + @include breakpoint( '<1280px' ) { margin: 5px 0; } } diff --git a/plugins/woocommerce-admin/client/components/flag/example.md b/plugins/woocommerce-admin/packages/components/src/flag/example.md similarity index 100% rename from plugins/woocommerce-admin/client/components/flag/example.md rename to plugins/woocommerce-admin/packages/components/src/flag/example.md diff --git a/plugins/woocommerce-admin/client/components/flag/index.js b/plugins/woocommerce-admin/packages/components/src/flag/index.js similarity index 96% rename from plugins/woocommerce-admin/client/components/flag/index.js rename to plugins/woocommerce-admin/packages/components/src/flag/index.js index 45d781fd7b9..7d53386bef0 100644 --- a/plugins/woocommerce-admin/client/components/flag/index.js +++ b/plugins/woocommerce-admin/packages/components/src/flag/index.js @@ -7,11 +7,6 @@ import ReactFlag from 'react-world-flags'; import classnames from 'classnames'; import PropTypes from 'prop-types'; -/** - * Internal dependencies - */ -import './style.scss'; - /** * Use the `Flag` component to display a country's flag. * diff --git a/plugins/woocommerce-admin/client/components/flag/style.scss b/plugins/woocommerce-admin/packages/components/src/flag/style.scss similarity index 100% rename from plugins/woocommerce-admin/client/components/flag/style.scss rename to plugins/woocommerce-admin/packages/components/src/flag/style.scss diff --git a/plugins/woocommerce-admin/client/components/gravatar/example.md b/plugins/woocommerce-admin/packages/components/src/gravatar/example.md similarity index 100% rename from plugins/woocommerce-admin/client/components/gravatar/example.md rename to plugins/woocommerce-admin/packages/components/src/gravatar/example.md diff --git a/plugins/woocommerce-admin/client/components/gravatar/index.js b/plugins/woocommerce-admin/packages/components/src/gravatar/index.js similarity index 97% rename from plugins/woocommerce-admin/client/components/gravatar/index.js rename to plugins/woocommerce-admin/packages/components/src/gravatar/index.js index da709f7566c..56bb14001e2 100644 --- a/plugins/woocommerce-admin/client/components/gravatar/index.js +++ b/plugins/woocommerce-admin/packages/components/src/gravatar/index.js @@ -9,11 +9,6 @@ import url from 'url'; import { isString } from 'lodash'; import crypto from 'crypto'; -/** - * Internal dependencies - */ -import './style.scss'; - /** * Display a users Gravatar. * diff --git a/plugins/woocommerce-admin/client/components/gravatar/style.scss b/plugins/woocommerce-admin/packages/components/src/gravatar/style.scss similarity index 100% rename from plugins/woocommerce-admin/client/components/gravatar/style.scss rename to plugins/woocommerce-admin/packages/components/src/gravatar/style.scss diff --git a/plugins/woocommerce-admin/client/components/gravatar/test/index.js b/plugins/woocommerce-admin/packages/components/src/gravatar/test/index.js similarity index 100% rename from plugins/woocommerce-admin/client/components/gravatar/test/index.js rename to plugins/woocommerce-admin/packages/components/src/gravatar/test/index.js diff --git a/plugins/woocommerce-admin/client/components/higher-order/use-filters/README.md b/plugins/woocommerce-admin/packages/components/src/higher-order/use-filters/README.md similarity index 76% rename from plugins/woocommerce-admin/client/components/higher-order/use-filters/README.md rename to plugins/woocommerce-admin/packages/components/src/higher-order/use-filters/README.md index e659cf7b259..31465511950 100644 --- a/plugins/woocommerce-admin/client/components/higher-order/use-filters/README.md +++ b/plugins/woocommerce-admin/packages/components/src/higher-order/use-filters/README.md @@ -1,7 +1,7 @@ useFilters ========== -`useFilters` is a fork of [gutenberg's `withFilters`](https://github.com/WordPress/gutenberg/tree/master/components/higher-order/with-filters). It is also a React [higher-order component](https://facebook.github.io/react/docs/higher-order-components.html). +`useFilters` is a fork of [gutenberg's `withFilters`.](https://github.com/WordPress/gutenberg/tree/master/packages/components/src/higher-order/with-filters) It is also a React [higher-order component.](https://facebook.github.io/react/docs/higher-order-components.html) Wrapping a component with `useFilters` provides a filtering capability controlled externally by the list of `hookName`s. @@ -9,7 +9,7 @@ Wrapping a component with `useFilters` provides a filtering capability controlle ```jsx import { applyFilters } from '@wordpress/hooks'; -import { useFilters } from 'components/higher-order/use-filters'; +import { useFilters } from '@woocommerce/components'; function MyCustomElement() { return

{ applyFilters( 'woocommerce.componentTitle', 'Title Text' ) }

; diff --git a/plugins/woocommerce-admin/client/components/higher-order/use-filters/index.js b/plugins/woocommerce-admin/packages/components/src/higher-order/use-filters/index.js similarity index 100% rename from plugins/woocommerce-admin/client/components/higher-order/use-filters/index.js rename to plugins/woocommerce-admin/packages/components/src/higher-order/use-filters/index.js diff --git a/plugins/woocommerce-admin/client/components/image-asset/example.md b/plugins/woocommerce-admin/packages/components/src/image-asset/example.md similarity index 100% rename from plugins/woocommerce-admin/client/components/image-asset/example.md rename to plugins/woocommerce-admin/packages/components/src/image-asset/example.md diff --git a/plugins/woocommerce-admin/client/components/image-asset/index.js b/plugins/woocommerce-admin/packages/components/src/image-asset/index.js similarity index 100% rename from plugins/woocommerce-admin/client/components/image-asset/index.js rename to plugins/woocommerce-admin/packages/components/src/image-asset/index.js diff --git a/plugins/woocommerce-admin/packages/components/src/index.js b/plugins/woocommerce-admin/packages/components/src/index.js new file mode 100644 index 00000000000..79b7de8dd4d --- /dev/null +++ b/plugins/woocommerce-admin/packages/components/src/index.js @@ -0,0 +1,47 @@ +/** @format */ +/** + * External Dependencies + */ +// Turn on react-dates classes/styles, see https://github.com/airbnb/react-dates#initialize +import 'react-dates/initialize'; + +export { default as AdvancedFilters } from './filters/advanced'; +export { default as AnimationSlider } from './animation-slider'; +export { default as Card } from './card'; +export { default as Count } from './count'; +export { default as CompareFilter } from './filters/compare'; +export { default as DatePicker } from './filters/date'; +export { default as DateRange } from './calendar'; +export { default as DropdownButton } from './dropdown-button'; +export { default as EllipsisMenu } from './ellipsis-menu'; +export { default as EmptyContent } from './empty-content'; +export { default as Flag } from './flag'; +export { default as FilterPicker } from './filters/filter'; +export { default as Gravatar } from './gravatar'; +export { H, Section } from './section'; +export { default as ImageAsset } from './image-asset'; +export { default as Link } from './link'; +export { default as MenuItem } from './ellipsis-menu/menu-item'; +export { default as MenuTitle } from './ellipsis-menu/menu-title'; +export { default as OrderStatus } from './order-status'; +export { default as Pagination } from './pagination'; +export { default as ProductImage } from './product-image'; +export { default as ProductRating } from './rating/product'; +export { default as Rating } from './rating'; +export { default as ReportFilters } from './filters'; +export { default as ReviewRating } from './rating/review'; +export { default as Search } from './search'; +export { default as SectionHeader } from './section-header'; +export { default as SegmentedSelection } from './segmented-selection'; +export { default as SplitButton } from './split-button'; +export { default as SummaryList } from './summary'; +export { default as SummaryListPlaceholder } from './summary/placeholder'; +export { default as SummaryNumber } from './summary/item'; +export { default as Table } from './table/table'; +export { default as TableCard } from './table'; +export { default as EmptyTable } from './table/empty'; +export { default as TablePlaceholder } from './table/placeholder'; +export { default as TableSummary } from './table/summary'; +export { default as Tag } from './tag'; +export { default as useFilters } from './higher-order/use-filters'; +export { default as ViewMoreList } from './view-more-list'; diff --git a/plugins/woocommerce-admin/client/components/link/example.md b/plugins/woocommerce-admin/packages/components/src/link/example.md similarity index 100% rename from plugins/woocommerce-admin/client/components/link/example.md rename to plugins/woocommerce-admin/packages/components/src/link/example.md diff --git a/plugins/woocommerce-admin/client/components/link/index.js b/plugins/woocommerce-admin/packages/components/src/link/index.js similarity index 93% rename from plugins/woocommerce-admin/client/components/link/index.js rename to plugins/woocommerce-admin/packages/components/src/link/index.js index 7a4a0a4b397..463a0dcb861 100644 --- a/plugins/woocommerce-admin/client/components/link/index.js +++ b/plugins/woocommerce-admin/packages/components/src/link/index.js @@ -3,13 +3,13 @@ * External dependencies */ import { Component } from '@wordpress/element'; -import PropTypes from 'prop-types'; import { Link as RouterLink } from 'react-router-dom'; +import PropTypes from 'prop-types'; /** - * Internal dependencies + * WooCommerce dependencies */ -import { getAdminLink } from 'lib/nav-utils'; +import { getAdminLink } from '@woocommerce/navigation'; /** * Use `Link` to create a link to another resource. It accepts a type to automatically diff --git a/plugins/woocommerce-admin/client/components/order-status/example.md b/plugins/woocommerce-admin/packages/components/src/order-status/example.md similarity index 100% rename from plugins/woocommerce-admin/client/components/order-status/example.md rename to plugins/woocommerce-admin/packages/components/src/order-status/example.md diff --git a/plugins/woocommerce-admin/client/components/order-status/index.js b/plugins/woocommerce-admin/packages/components/src/order-status/index.js similarity index 94% rename from plugins/woocommerce-admin/client/components/order-status/index.js rename to plugins/woocommerce-admin/packages/components/src/order-status/index.js index 4d6fcd77f0e..fc1a55ffa8b 100644 --- a/plugins/woocommerce-admin/client/components/order-status/index.js +++ b/plugins/woocommerce-admin/packages/components/src/order-status/index.js @@ -6,11 +6,6 @@ import classnames from 'classnames'; import PropTypes from 'prop-types'; -/** - * Internal dependencies - */ -import './style.scss'; - /** * Use `OrderStatus` to display a badge with human-friendly text describing the current order status. * diff --git a/plugins/woocommerce-admin/client/components/order-status/style.scss b/plugins/woocommerce-admin/packages/components/src/order-status/style.scss similarity index 100% rename from plugins/woocommerce-admin/client/components/order-status/style.scss rename to plugins/woocommerce-admin/packages/components/src/order-status/style.scss diff --git a/plugins/woocommerce-admin/client/components/pagination/example.md b/plugins/woocommerce-admin/packages/components/src/pagination/example.md similarity index 100% rename from plugins/woocommerce-admin/client/components/pagination/example.md rename to plugins/woocommerce-admin/packages/components/src/pagination/example.md diff --git a/plugins/woocommerce-admin/client/components/pagination/index.js b/plugins/woocommerce-admin/packages/components/src/pagination/index.js similarity index 98% rename from plugins/woocommerce-admin/client/components/pagination/index.js rename to plugins/woocommerce-admin/packages/components/src/pagination/index.js index dad30fab5bd..7068753733d 100644 --- a/plugins/woocommerce-admin/client/components/pagination/index.js +++ b/plugins/woocommerce-admin/packages/components/src/pagination/index.js @@ -10,11 +10,6 @@ import classNames from 'classnames'; import PropTypes from 'prop-types'; import { isFinite, noop, uniqueId } from 'lodash'; -/** - * Internal dependencies - */ -import './style.scss'; - const PER_PAGE_OPTIONS = [ 25, 50, 75, 100 ]; /** diff --git a/plugins/woocommerce-admin/client/components/pagination/style.scss b/plugins/woocommerce-admin/packages/components/src/pagination/style.scss similarity index 100% rename from plugins/woocommerce-admin/client/components/pagination/style.scss rename to plugins/woocommerce-admin/packages/components/src/pagination/style.scss diff --git a/plugins/woocommerce-admin/client/components/product-image/example.md b/plugins/woocommerce-admin/packages/components/src/product-image/example.md similarity index 100% rename from plugins/woocommerce-admin/client/components/product-image/example.md rename to plugins/woocommerce-admin/packages/components/src/product-image/example.md diff --git a/plugins/woocommerce-admin/client/components/product-image/index.js b/plugins/woocommerce-admin/packages/components/src/product-image/index.js similarity index 73% rename from plugins/woocommerce-admin/client/components/product-image/index.js rename to plugins/woocommerce-admin/packages/components/src/product-image/index.js index c55805594e2..e0614e9bbd0 100644 --- a/plugins/woocommerce-admin/client/components/product-image/index.js +++ b/plugins/woocommerce-admin/packages/components/src/product-image/index.js @@ -1,25 +1,21 @@ /** @format */ - /** * External dependencies */ import classnames from 'classnames'; import PropTypes from 'prop-types'; +import { get } from 'lodash'; /** - * Internal dependencies - */ -import './style.scss'; - -/** - * Use `ProductImage` to display a product's featured image. If no image can be found, a placeholder matching the front-end image + * Use `ProductImage` to display a product's or variation's featured image. + * If no image can be found, a placeholder matching the front-end image * placeholder will be displayed. * * @return { object } - */ const ProductImage = ( { product, alt, width, height, className, ...props } ) => { // The first returned image from the API is the featured/product image. - const productImage = product && product.images && product.images[ 0 ]; + const productImage = get( product, [ 'images', 0 ] ) || get( product, [ 'image' ] ); const src = ( productImage && productImage.src ) || false; const altText = alt || ( productImage && productImage.alt ) || ''; @@ -53,8 +49,10 @@ ProductImage.propTypes = { */ className: PropTypes.string, /** - * Product object. The image to display will be pulled from `product.images`. + * Product or variation object. The image to display will be pulled from + * `product.images` or `variation.image`. * See https://woocommerce.github.io/woocommerce-rest-api-docs/#product-properties + * and https://woocommerce.github.io/woocommerce-rest-api-docs/#product-variation-properties */ product: PropTypes.object, /** diff --git a/plugins/woocommerce-admin/client/components/product-image/style.scss b/plugins/woocommerce-admin/packages/components/src/product-image/style.scss similarity index 100% rename from plugins/woocommerce-admin/client/components/product-image/style.scss rename to plugins/woocommerce-admin/packages/components/src/product-image/style.scss diff --git a/plugins/woocommerce-admin/client/components/product-image/test/__snapshots__/index.js.snap b/plugins/woocommerce-admin/packages/components/src/product-image/test/__snapshots__/index.js.snap similarity index 85% rename from plugins/woocommerce-admin/client/components/product-image/test/__snapshots__/index.js.snap rename to plugins/woocommerce-admin/packages/components/src/product-image/test/__snapshots__/index.js.snap index ed2bf21ae5b..e8f2021b9ba 100644 --- a/plugins/woocommerce-admin/client/components/product-image/test/__snapshots__/index.js.snap +++ b/plugins/woocommerce-admin/packages/components/src/product-image/test/__snapshots__/index.js.snap @@ -40,6 +40,16 @@ exports[`ProductImage should render a product image 1`] = ` /> `; +exports[`ProductImage should render a variations image 1`] = ` + +`; + exports[`ProductImage should render the passed alt prop 1`] = ` testing { expect( image ).toMatchSnapshot(); } ); + test( 'should render a variations image', () => { + const variation = { + name: 'Test Variation', + image: { + src: 'https://i.cloudup.com/pt4DjwRB84-3000x3000.png', + }, + }; + const image = shallow( ); + expect( image ).toMatchSnapshot(); + } ); + test( 'should render a placeholder image if no product images are found', () => { global.wcSettings.wcAssetUrl = 'https://woocommerce.com/wp-content/plugins/woocommerce/assets/'; const product = { diff --git a/plugins/woocommerce-admin/client/components/rating/example.md b/plugins/woocommerce-admin/packages/components/src/rating/example.md similarity index 100% rename from plugins/woocommerce-admin/client/components/rating/example.md rename to plugins/woocommerce-admin/packages/components/src/rating/example.md diff --git a/plugins/woocommerce-admin/client/components/rating/index.js b/plugins/woocommerce-admin/packages/components/src/rating/index.js similarity index 96% rename from plugins/woocommerce-admin/client/components/rating/index.js rename to plugins/woocommerce-admin/packages/components/src/rating/index.js index 0550b3a4ca8..bcd53d90700 100644 --- a/plugins/woocommerce-admin/client/components/rating/index.js +++ b/plugins/woocommerce-admin/packages/components/src/rating/index.js @@ -9,11 +9,6 @@ import { Component } from '@wordpress/element'; import Gridicon from 'gridicons'; import PropTypes from 'prop-types'; -/** - * Internal dependencies - */ -import './style.scss'; - /** * Use `Rating` to display a set of stars, filled, empty or half-filled, that represents a * rating in a scale between 0 and the prop `totalStars` (default 5). diff --git a/plugins/woocommerce-admin/client/components/rating/product.js b/plugins/woocommerce-admin/packages/components/src/rating/product.js similarity index 100% rename from plugins/woocommerce-admin/client/components/rating/product.js rename to plugins/woocommerce-admin/packages/components/src/rating/product.js diff --git a/plugins/woocommerce-admin/client/components/rating/review.js b/plugins/woocommerce-admin/packages/components/src/rating/review.js similarity index 100% rename from plugins/woocommerce-admin/client/components/rating/review.js rename to plugins/woocommerce-admin/packages/components/src/rating/review.js diff --git a/plugins/woocommerce-admin/client/components/rating/style.scss b/plugins/woocommerce-admin/packages/components/src/rating/style.scss similarity index 100% rename from plugins/woocommerce-admin/client/components/rating/style.scss rename to plugins/woocommerce-admin/packages/components/src/rating/style.scss diff --git a/plugins/woocommerce-admin/client/components/rating/test/__snapshots__/index.js.snap b/plugins/woocommerce-admin/packages/components/src/rating/test/__snapshots__/index.js.snap similarity index 100% rename from plugins/woocommerce-admin/client/components/rating/test/__snapshots__/index.js.snap rename to plugins/woocommerce-admin/packages/components/src/rating/test/__snapshots__/index.js.snap diff --git a/plugins/woocommerce-admin/client/components/rating/test/index.js b/plugins/woocommerce-admin/packages/components/src/rating/test/index.js similarity index 100% rename from plugins/woocommerce-admin/client/components/rating/test/index.js rename to plugins/woocommerce-admin/packages/components/src/rating/test/index.js diff --git a/plugins/woocommerce-admin/client/components/search/autocomplete.js b/plugins/woocommerce-admin/packages/components/src/search/autocomplete.js similarity index 100% rename from plugins/woocommerce-admin/client/components/search/autocomplete.js rename to plugins/woocommerce-admin/packages/components/src/search/autocomplete.js diff --git a/plugins/woocommerce-admin/client/components/search/autocompleters/coupons.js b/plugins/woocommerce-admin/packages/components/src/search/autocompleters/coupons.js similarity index 94% rename from plugins/woocommerce-admin/client/components/search/autocompleters/coupons.js rename to plugins/woocommerce-admin/packages/components/src/search/autocompleters/coupons.js index 53fd6f977c9..d0d4b3b9d4d 100644 --- a/plugins/woocommerce-admin/client/components/search/autocompleters/coupons.js +++ b/plugins/woocommerce-admin/packages/components/src/search/autocompleters/coupons.js @@ -4,11 +4,15 @@ */ import apiFetch from '@wordpress/api-fetch'; +/** + * WooCommerce dependencies + */ +import { stringifyQuery } from '@woocommerce/navigation'; + /** * Internal dependencies */ import { computeSuggestionMatch } from './utils'; -import { stringifyQuery } from 'lib/nav-utils'; import { NAMESPACE } from 'store/constants'; /** diff --git a/plugins/woocommerce-admin/client/components/search/autocompleters/index.js b/plugins/woocommerce-admin/packages/components/src/search/autocompleters/index.js similarity index 79% rename from plugins/woocommerce-admin/client/components/search/autocompleters/index.js rename to plugins/woocommerce-admin/packages/components/src/search/autocompleters/index.js index babe4b3d63b..04cc04bc099 100644 --- a/plugins/woocommerce-admin/client/components/search/autocompleters/index.js +++ b/plugins/woocommerce-admin/packages/components/src/search/autocompleters/index.js @@ -2,6 +2,7 @@ /** * Export all autocompleters */ +export { default as coupons } from './coupons'; export { default as product } from './product'; export { default as productCategory } from './product-cat'; -export { default as coupons } from './coupons'; +export { default as variations } from './variations'; diff --git a/plugins/woocommerce-admin/client/components/search/autocompleters/product-cat.js b/plugins/woocommerce-admin/packages/components/src/search/autocompleters/product-cat.js similarity index 94% rename from plugins/woocommerce-admin/client/components/search/autocompleters/product-cat.js rename to plugins/woocommerce-admin/packages/components/src/search/autocompleters/product-cat.js index 939d3020e79..8819a2fd2bf 100644 --- a/plugins/woocommerce-admin/client/components/search/autocompleters/product-cat.js +++ b/plugins/woocommerce-admin/packages/components/src/search/autocompleters/product-cat.js @@ -4,11 +4,15 @@ */ import apiFetch from '@wordpress/api-fetch'; +/** + * WooCommerce dependencies + */ +import { stringifyQuery } from '@woocommerce/navigation'; + /** * Internal dependencies */ import { computeSuggestionMatch } from './utils'; -import { stringifyQuery } from 'lib/nav-utils'; import { NAMESPACE } from 'store/constants'; /** diff --git a/plugins/woocommerce-admin/client/components/search/autocompleters/product.js b/plugins/woocommerce-admin/packages/components/src/search/autocompleters/product.js similarity index 92% rename from plugins/woocommerce-admin/client/components/search/autocompleters/product.js rename to plugins/woocommerce-admin/packages/components/src/search/autocompleters/product.js index a4257b3e5d7..715672bda87 100644 --- a/plugins/woocommerce-admin/client/components/search/autocompleters/product.js +++ b/plugins/woocommerce-admin/packages/components/src/search/autocompleters/product.js @@ -4,12 +4,16 @@ */ import apiFetch from '@wordpress/api-fetch'; +/** + * WooCommerce dependencies + */ +import { stringifyQuery } from '@woocommerce/navigation'; + /** * Internal dependencies */ import { computeSuggestionMatch } from './utils'; -import ProductImage from 'components/product-image'; -import { stringifyQuery } from 'lib/nav-utils'; +import ProductImage from '../../product-image'; import { NAMESPACE } from 'store/constants'; /** diff --git a/plugins/woocommerce-admin/client/components/search/autocompleters/utils.js b/plugins/woocommerce-admin/packages/components/src/search/autocompleters/utils.js similarity index 100% rename from plugins/woocommerce-admin/client/components/search/autocompleters/utils.js rename to plugins/woocommerce-admin/packages/components/src/search/autocompleters/utils.js diff --git a/plugins/woocommerce-admin/packages/components/src/search/autocompleters/variations.js b/plugins/woocommerce-admin/packages/components/src/search/autocompleters/variations.js new file mode 100644 index 00000000000..088875b965c --- /dev/null +++ b/plugins/woocommerce-admin/packages/components/src/search/autocompleters/variations.js @@ -0,0 +1,94 @@ +/** @format */ +/** + * External dependencies + */ +import apiFetch from '@wordpress/api-fetch'; + +/** + * WooCommerce dependencies + */ +import { stringifyQuery, getQuery } from '@woocommerce/navigation'; + +/** + * Internal dependencies + */ +import { computeSuggestionMatch } from './utils'; +import ProductImage from '../../product-image'; +import { NAMESPACE } from 'store/constants'; + +/** + * Create a variation name by concatenating each of the variation's + * attribute option strings. + * + * @param {object} variation - variation returned by the api + * @returns {string} - variation name + */ +function getVariationName( variation ) { + return variation.attributes.reduce( + ( desc, attribute, index, arr ) => + desc + `${ attribute.option }${ arr.length === index + 1 ? '' : ', ' }`, + '' + ); +} + +/** + * A products completer. + * See https://github.com/WordPress/gutenberg/tree/master/packages/components/src/autocomplete#the-completer-interface + * + * @type {Completer} + */ +export default { + name: 'products', + className: 'woocommerce-search__product-result', + options( search ) { + let payload = ''; + if ( search ) { + const query = { + search: encodeURIComponent( search ), + per_page: 10, + }; + payload = stringifyQuery( query ); + } + const product = getQuery().products; + if ( ! product || product.includes( ',' ) ) { + console.warn( 'Invalid product id supplied to Variations autocompleter' ); + } + return apiFetch( { path: `${ NAMESPACE }products/${ product }/variations${ payload }` } ); + }, + isDebounced: true, + getOptionKeywords( variation ) { + return [ getVariationName( variation ) ]; + }, + getOptionLabel( variation, query ) { + const match = computeSuggestionMatch( getVariationName( variation ), query ) || {}; + return [ + , + + { match.suggestionBeforeMatch } + + { match.suggestionMatch } + + { match.suggestionAfterMatch } + , + ]; + }, + // This is slightly different than gutenberg/Autocomplete, we don't support different methods + // of replace/insertion, so we can just return the value. + getOptionCompletion( variation ) { + return { + id: variation.id, + label: getVariationName( variation ), + }; + }, +}; diff --git a/plugins/woocommerce-admin/client/components/search/example.md b/plugins/woocommerce-admin/packages/components/src/search/example.md similarity index 100% rename from plugins/woocommerce-admin/client/components/search/example.md rename to plugins/woocommerce-admin/packages/components/src/search/example.md diff --git a/plugins/woocommerce-admin/client/components/search/index.js b/plugins/woocommerce-admin/packages/components/src/search/index.js similarity index 95% rename from plugins/woocommerce-admin/client/components/search/index.js rename to plugins/woocommerce-admin/packages/components/src/search/index.js index 50f04aa6236..109795d3f5a 100644 --- a/plugins/woocommerce-admin/client/components/search/index.js +++ b/plugins/woocommerce-admin/packages/components/src/search/index.js @@ -14,9 +14,8 @@ import classnames from 'classnames'; * Internal dependencies */ import Autocomplete from './autocomplete'; -import { product, productCategory, coupons } from './autocompleters'; -import Tag from 'components/tag'; -import './style.scss'; +import { product, productCategory, coupons, variations } from './autocompleters'; +import Tag from '../tag'; /** * A search box which autocompletes results while typing, allowing for the user to select an existing object @@ -73,6 +72,8 @@ class Search extends Component { return productCategory; case 'coupons': return coupons; + case 'variations': + return variations; default: return {}; } @@ -197,8 +198,14 @@ Search.propTypes = { /** * The object type to be used in searching. */ - type: PropTypes.oneOf( [ 'products', 'product_cats', 'orders', 'customers', 'coupons' ] ) - .isRequired, + type: PropTypes.oneOf( [ + 'products', + 'product_cats', + 'orders', + 'customers', + 'coupons', + 'variations', + ] ).isRequired, /** * A placeholder for the search input. */ diff --git a/plugins/woocommerce-admin/client/components/search/style.scss b/plugins/woocommerce-admin/packages/components/src/search/style.scss similarity index 100% rename from plugins/woocommerce-admin/client/components/search/style.scss rename to plugins/woocommerce-admin/packages/components/src/search/style.scss diff --git a/plugins/woocommerce-admin/client/components/section-header/example.md b/plugins/woocommerce-admin/packages/components/src/section-header/example.md similarity index 100% rename from plugins/woocommerce-admin/client/components/section-header/example.md rename to plugins/woocommerce-admin/packages/components/src/section-header/example.md diff --git a/plugins/woocommerce-admin/client/components/section-header/index.js b/plugins/woocommerce-admin/packages/components/src/section-header/index.js similarity index 88% rename from plugins/woocommerce-admin/client/components/section-header/index.js rename to plugins/woocommerce-admin/packages/components/src/section-header/index.js index 28888a66c30..a626819d028 100644 --- a/plugins/woocommerce-admin/client/components/section-header/index.js +++ b/plugins/woocommerce-admin/packages/components/src/section-header/index.js @@ -9,10 +9,9 @@ import PropTypes from 'prop-types'; /** * Internal dependencies */ -import './style.scss'; -import EllipsisMenu from 'components/ellipsis-menu'; -import { H } from 'components/section'; -import { validateComponent } from 'lib/proptype-validator'; +import EllipsisMenu from '../ellipsis-menu'; +import { H } from '../section'; +import { validateComponent } from '../../lib/proptype-validator'; /** * A header component. The header can contain a title, actions via children, and an `EllipsisMenu` menu. diff --git a/plugins/woocommerce-admin/client/components/section-header/style.scss b/plugins/woocommerce-admin/packages/components/src/section-header/style.scss similarity index 100% rename from plugins/woocommerce-admin/client/components/section-header/style.scss rename to plugins/woocommerce-admin/packages/components/src/section-header/style.scss diff --git a/plugins/woocommerce-admin/client/components/section-header/test/__snapshots__/index.js.snap b/plugins/woocommerce-admin/packages/components/src/section-header/test/__snapshots__/index.js.snap similarity index 100% rename from plugins/woocommerce-admin/client/components/section-header/test/__snapshots__/index.js.snap rename to plugins/woocommerce-admin/packages/components/src/section-header/test/__snapshots__/index.js.snap diff --git a/plugins/woocommerce-admin/client/components/section-header/test/index.js b/plugins/woocommerce-admin/packages/components/src/section-header/test/index.js similarity index 93% rename from plugins/woocommerce-admin/client/components/section-header/test/index.js rename to plugins/woocommerce-admin/packages/components/src/section-header/test/index.js index e91a920215e..a2af5e32f11 100644 --- a/plugins/woocommerce-admin/client/components/section-header/test/index.js +++ b/plugins/woocommerce-admin/packages/components/src/section-header/test/index.js @@ -1,9 +1,7 @@ +/** @format */ /** * External dependencies - * - * @format */ -import React from 'react'; import renderer from 'react-test-renderer'; /** diff --git a/plugins/woocommerce-admin/client/components/section/example.md b/plugins/woocommerce-admin/packages/components/src/section/example.md similarity index 100% rename from plugins/woocommerce-admin/client/components/section/example.md rename to plugins/woocommerce-admin/packages/components/src/section/example.md diff --git a/plugins/woocommerce-admin/client/components/section/index.js b/plugins/woocommerce-admin/packages/components/src/section/index.js similarity index 100% rename from plugins/woocommerce-admin/client/components/section/index.js rename to plugins/woocommerce-admin/packages/components/src/section/index.js diff --git a/plugins/woocommerce-admin/client/components/segmented-selection/example.md b/plugins/woocommerce-admin/packages/components/src/segmented-selection/example.md similarity index 100% rename from plugins/woocommerce-admin/client/components/segmented-selection/example.md rename to plugins/woocommerce-admin/packages/components/src/segmented-selection/example.md diff --git a/plugins/woocommerce-admin/client/components/segmented-selection/index.js b/plugins/woocommerce-admin/packages/components/src/segmented-selection/index.js similarity index 97% rename from plugins/woocommerce-admin/client/components/segmented-selection/index.js rename to plugins/woocommerce-admin/packages/components/src/segmented-selection/index.js index 9a3c49d15d5..94f0ca5cedc 100644 --- a/plugins/woocommerce-admin/client/components/segmented-selection/index.js +++ b/plugins/woocommerce-admin/packages/components/src/segmented-selection/index.js @@ -7,11 +7,6 @@ import classnames from 'classnames'; import PropTypes from 'prop-types'; import { partial, uniqueId } from 'lodash'; -/** - * Internal dependencies - */ -import './style.scss'; - /** * Create a panel of styled selectable options rendering stylized checkboxes and labels */ diff --git a/plugins/woocommerce-admin/client/components/segmented-selection/style.scss b/plugins/woocommerce-admin/packages/components/src/segmented-selection/style.scss similarity index 100% rename from plugins/woocommerce-admin/client/components/segmented-selection/style.scss rename to plugins/woocommerce-admin/packages/components/src/segmented-selection/style.scss diff --git a/plugins/woocommerce-admin/client/components/split-button/example.md b/plugins/woocommerce-admin/packages/components/src/split-button/example.md similarity index 100% rename from plugins/woocommerce-admin/client/components/split-button/example.md rename to plugins/woocommerce-admin/packages/components/src/split-button/example.md diff --git a/plugins/woocommerce-admin/client/components/split-button/index.js b/plugins/woocommerce-admin/packages/components/src/split-button/index.js similarity index 98% rename from plugins/woocommerce-admin/client/components/split-button/index.js rename to plugins/woocommerce-admin/packages/components/src/split-button/index.js index 1c247776f0d..3f6f3298bae 100644 --- a/plugins/woocommerce-admin/client/components/split-button/index.js +++ b/plugins/woocommerce-admin/packages/components/src/split-button/index.js @@ -1,18 +1,12 @@ +/** @format */ /** * External dependencies - * - * @format */ import { Button, IconButton, Dropdown, NavigableMenu } from '@wordpress/components'; import classnames from 'classnames'; import PropTypes from 'prop-types'; import { noop } from 'lodash'; -/** - * Internal dependencies - */ -import './style.scss'; - /** * A component for displaying a button with a main action plus a secondary set of actions behind a menu toggle. * diff --git a/plugins/woocommerce-admin/client/components/split-button/style.scss b/plugins/woocommerce-admin/packages/components/src/split-button/style.scss similarity index 100% rename from plugins/woocommerce-admin/client/components/split-button/style.scss rename to plugins/woocommerce-admin/packages/components/src/split-button/style.scss diff --git a/plugins/woocommerce-admin/packages/components/src/style.scss b/plugins/woocommerce-admin/packages/components/src/style.scss new file mode 100644 index 00000000000..a59795b8115 --- /dev/null +++ b/plugins/woocommerce-admin/packages/components/src/style.scss @@ -0,0 +1,28 @@ +/** + * Internal Dependencies + */ +@import 'animation-slider/style.scss'; +@import 'calendar/style.scss'; +@import 'card/style.scss'; +@import 'count/style.scss'; +@import 'dropdown-button/style.scss'; +@import 'ellipsis-menu/style.scss'; +@import 'empty-content/style.scss'; +@import 'filters/advanced/style.scss'; +@import 'filters/date/style.scss'; +@import 'filters/filter/style.scss'; +@import 'filters/style.scss'; +@import 'flag/style.scss'; +@import 'gravatar/style.scss'; +@import 'order-status/style.scss'; +@import 'pagination/style.scss'; +@import 'product-image/style.scss'; +@import 'rating/style.scss'; +@import 'search/style.scss'; +@import 'section-header/style.scss'; +@import 'segmented-selection/style.scss'; +@import 'split-button/style.scss'; +@import 'summary/style.scss'; +@import 'table/style.scss'; +@import 'tag/style.scss'; +@import 'view-more-list/style.scss'; diff --git a/plugins/woocommerce-admin/client/components/summary/example.md b/plugins/woocommerce-admin/packages/components/src/summary/example.md similarity index 100% rename from plugins/woocommerce-admin/client/components/summary/example.md rename to plugins/woocommerce-admin/packages/components/src/summary/example.md diff --git a/plugins/woocommerce-admin/client/components/summary/index.js b/plugins/woocommerce-admin/packages/components/src/summary/index.js similarity index 89% rename from plugins/woocommerce-admin/client/components/summary/index.js rename to plugins/woocommerce-admin/packages/components/src/summary/index.js index 85968bbd96e..6c6812bfd0f 100644 --- a/plugins/woocommerce-admin/client/components/summary/index.js +++ b/plugins/woocommerce-admin/packages/components/src/summary/index.js @@ -8,12 +8,7 @@ import { Children, cloneElement } from '@wordpress/element'; import { Dropdown, NavigableMenu } from '@wordpress/components'; import PropTypes from 'prop-types'; import { uniqueId } from 'lodash'; - -/** - * Internal dependencies - */ -import { isMobileViewport, isTabletViewport } from 'lib/ui'; -import './style.scss'; +import { withViewportMatch } from '@wordpress/viewport'; /** * A container element for a list of SummaryNumbers. This component handles detecting & switching to @@ -21,11 +16,10 @@ import './style.scss'; * * @return { object } - */ -const SummaryList = ( { children, label } ) => { +const SummaryList = ( { children, isDropdownBreakpoint, label } ) => { if ( ! label ) { label = __( 'Performance Indicators', 'wc-admin' ); } - const isDropdownBreakpoint = isTabletViewport() || isMobileViewport(); // We default to "one" because we can't have empty children. const itemCount = Children.count( children ) || 1; @@ -86,4 +80,6 @@ SummaryList.propTypes = { label: PropTypes.string, }; -export default SummaryList; +export default withViewportMatch( { + isDropdownBreakpoint: '< large', +} )( SummaryList ); diff --git a/plugins/woocommerce-admin/client/components/summary/item.js b/plugins/woocommerce-admin/packages/components/src/summary/item.js similarity index 99% rename from plugins/woocommerce-admin/client/components/summary/item.js rename to plugins/woocommerce-admin/packages/components/src/summary/item.js index 79afedc8986..75c6b649d40 100644 --- a/plugins/woocommerce-admin/client/components/summary/item.js +++ b/plugins/woocommerce-admin/packages/components/src/summary/item.js @@ -12,7 +12,7 @@ import PropTypes from 'prop-types'; /** * Internal dependencies */ -import Link from 'components/link'; +import Link from '../link'; /** * A component to show a value, label, and an optional change percentage. Can also act as a link to a specific report focus. diff --git a/plugins/woocommerce-admin/client/components/summary/placeholder.js b/plugins/woocommerce-admin/packages/components/src/summary/placeholder.js similarity index 89% rename from plugins/woocommerce-admin/client/components/summary/placeholder.js rename to plugins/woocommerce-admin/packages/components/src/summary/placeholder.js index 48f430771ae..122bf5bbeda 100644 --- a/plugins/woocommerce-admin/client/components/summary/placeholder.js +++ b/plugins/woocommerce-admin/packages/components/src/summary/placeholder.js @@ -6,11 +6,7 @@ import { Component } from '@wordpress/element'; import classnames from 'classnames'; import { range } from 'lodash'; import PropTypes from 'prop-types'; - -/** - * Internal dependencies - */ -import { isMobileViewport, isTabletViewport } from 'lib/ui'; +import { withViewportMatch } from '@wordpress/viewport'; /** * `SummaryListPlaceholder` behaves like `SummaryList` but displays placeholder summary items instead of data. @@ -18,7 +14,7 @@ import { isMobileViewport, isTabletViewport } from 'lib/ui'; */ class SummaryListPlaceholder extends Component { render() { - const isDropdownBreakpoint = isTabletViewport() || isMobileViewport(); + const { isDropdownBreakpoint } = this.props; const numberOfItems = isDropdownBreakpoint ? 1 : this.props.numberOfItems; const hasItemsClass = numberOfItems < 10 ? `has-${ numberOfItems }-items` : 'has-10-items'; @@ -64,4 +60,6 @@ SummaryListPlaceholder.defaultProps = { numberOfRows: 5, }; -export default SummaryListPlaceholder; +export default withViewportMatch( { + isDropdownBreakpoint: '< large', +} )( SummaryListPlaceholder ); diff --git a/plugins/woocommerce-admin/client/components/summary/style.scss b/plugins/woocommerce-admin/packages/components/src/summary/style.scss similarity index 97% rename from plugins/woocommerce-admin/client/components/summary/style.scss rename to plugins/woocommerce-admin/packages/components/src/summary/style.scss index 3cb5f425ed7..19603cd1332 100644 --- a/plugins/woocommerce-admin/client/components/summary/style.scss +++ b/plugins/woocommerce-admin/packages/components/src/summary/style.scss @@ -145,7 +145,7 @@ $inner-border: $core-grey-light-500; @include wrap-contents; } - @include breakpoint( '<1365px' ) { + @include breakpoint( '<1440px' ) { &.has-4-items, &.has-7-items, &.has-8-items { @@ -170,7 +170,7 @@ $inner-border: $core-grey-light-500; } } - @include breakpoint( '<1100px' ) { + @include breakpoint( '<960px' ) { .woocommerce-summary__item { // One-col layout for all items means right border is always "outer" border-right-color: $outer-border; @@ -281,7 +281,7 @@ $inner-border: $core-grey-light-500; .has-6-items .woocommerce-summary__item-container { @include set-grid-item-position( 6, 6 ); - @include breakpoint( '<1365px' ) { + @include breakpoint( '<1440px' ) { @include set-grid-item-position( 3, 6 ); } } @@ -297,7 +297,7 @@ $inner-border: $core-grey-light-500; .has-9-items .woocommerce-summary__item-container { @include set-grid-item-position( 5, 9 ); - @include breakpoint( '<1365px' ) { + @include breakpoint( '<1440px' ) { @include set-grid-item-position( 3, 9 ); } } @@ -305,12 +305,12 @@ $inner-border: $core-grey-light-500; .has-10-items .woocommerce-summary__item-container { @include set-grid-item-position( 5, 10 ); - @include breakpoint( '<1365px' ) { + @include breakpoint( '<1440px' ) { @include set-grid-item-position( 4, 10 ); } } -@include breakpoint( '<1100px' ) { +@include breakpoint( '<960px' ) { @for $i from 1 through 10 { .woocommerce-summary > .woocommerce-summary__item-container:nth-child(#{$i}) { grid-column-start: 1; diff --git a/plugins/woocommerce-admin/client/components/table/__mocks__/table-mock-csv.js b/plugins/woocommerce-admin/packages/components/src/table/__mocks__/table-mock-csv.js similarity index 100% rename from plugins/woocommerce-admin/client/components/table/__mocks__/table-mock-csv.js rename to plugins/woocommerce-admin/packages/components/src/table/__mocks__/table-mock-csv.js diff --git a/plugins/woocommerce-admin/client/components/table/__mocks__/table-mock-data.js b/plugins/woocommerce-admin/packages/components/src/table/__mocks__/table-mock-data.js similarity index 100% rename from plugins/woocommerce-admin/client/components/table/__mocks__/table-mock-data.js rename to plugins/woocommerce-admin/packages/components/src/table/__mocks__/table-mock-data.js diff --git a/plugins/woocommerce-admin/client/components/table/__mocks__/table-mock-headers.js b/plugins/woocommerce-admin/packages/components/src/table/__mocks__/table-mock-headers.js similarity index 100% rename from plugins/woocommerce-admin/client/components/table/__mocks__/table-mock-headers.js rename to plugins/woocommerce-admin/packages/components/src/table/__mocks__/table-mock-headers.js diff --git a/plugins/woocommerce-admin/client/components/table/download-icon.js b/plugins/woocommerce-admin/packages/components/src/table/download-icon.js similarity index 69% rename from plugins/woocommerce-admin/client/components/table/download-icon.js rename to plugins/woocommerce-admin/packages/components/src/table/download-icon.js index 56af517b6b8..3f1c66c24aa 100644 --- a/plugins/woocommerce-admin/client/components/table/download-icon.js +++ b/plugins/woocommerce-admin/packages/components/src/table/download-icon.js @@ -1,11 +1,16 @@ /** @format */ -/** - * External dependencies - */ -import React from 'react'; export default () => ( - + String +Generates a CSV string from table contents + +**Returns**: String - Table contents in a CSV format + +| Param | Type | Description | +| --- | --- | --- | +| headers | Array.<Object> | Object with table header information | +| rows | Array.Array.<Object> | Object with table rows information | + +### generateCSVFileName([name], [params]) ⇒ String +Generates a file name for CSV files based on the provided name, the current date +and the provided params, which are all appended with hyphens. + +**Returns**: String - Formatted file name + +| Param | Type | Default | Description | +| --- | --- | --- | --- | +| [name] | String | '' | Name of the file | +| [params] | Object | {} | Object of key-values to append to the file name | + +### downloadCSVFile(fileName, content) +Downloads a CSV file with the given file name and contents + +| Param | Type | Description | +| --- | --- | --- | +| fileName | String | Name of the file to download | +| content | String | Contents of the file to download | diff --git a/plugins/woocommerce-admin/packages/csv-export/package.json b/plugins/woocommerce-admin/packages/csv-export/package.json new file mode 100644 index 00000000000..0d124e7c4d2 --- /dev/null +++ b/plugins/woocommerce-admin/packages/csv-export/package.json @@ -0,0 +1,31 @@ +{ + "name": "@woocommerce/csv-export", + "version": "1.0.0", + "description": "WooCommerce utility library to convert data to CSV files.", + "author": "Automattic", + "license": "GPL-2.0-or-later", + "keywords": [ + "wordpress", + "woocommerce", + "csv" + ], + "homepage": "https://github.com/WooCommerce/wc-admin/tree/master/packages/csv-export/README.md", + "repository": { + "type": "git", + "url": "https://github.com/WooCommerce/wc-admin.git" + }, + "bugs": { + "url": "https://github.com/WooCommerce/wc-admin/issues" + }, + "main": "build/index.js", + "module": "build-module/index.js", + "react-native": "src/index", + "dependencies": { + "@babel/runtime-corejs2": "7.1.5", + "browser-filesaver": "^1.1.1", + "moment": "^2.22.2" + }, + "publishConfig": { + "access": "public" + } +} diff --git a/plugins/woocommerce-admin/client/lib/csv/__mocks__/mock-csv-data.js b/plugins/woocommerce-admin/packages/csv-export/src/__mocks__/mock-csv-data.js similarity index 100% rename from plugins/woocommerce-admin/client/lib/csv/__mocks__/mock-csv-data.js rename to plugins/woocommerce-admin/packages/csv-export/src/__mocks__/mock-csv-data.js diff --git a/plugins/woocommerce-admin/client/lib/csv/__mocks__/mock-headers.js b/plugins/woocommerce-admin/packages/csv-export/src/__mocks__/mock-headers.js similarity index 100% rename from plugins/woocommerce-admin/client/lib/csv/__mocks__/mock-headers.js rename to plugins/woocommerce-admin/packages/csv-export/src/__mocks__/mock-headers.js diff --git a/plugins/woocommerce-admin/client/lib/csv/__mocks__/mock-rows.js b/plugins/woocommerce-admin/packages/csv-export/src/__mocks__/mock-rows.js similarity index 100% rename from plugins/woocommerce-admin/client/lib/csv/__mocks__/mock-rows.js rename to plugins/woocommerce-admin/packages/csv-export/src/__mocks__/mock-rows.js diff --git a/plugins/woocommerce-admin/client/lib/csv/index.js b/plugins/woocommerce-admin/packages/csv-export/src/index.js similarity index 100% rename from plugins/woocommerce-admin/client/lib/csv/index.js rename to plugins/woocommerce-admin/packages/csv-export/src/index.js diff --git a/plugins/woocommerce-admin/client/lib/csv/test/index.js b/plugins/woocommerce-admin/packages/csv-export/src/test/index.js similarity index 100% rename from plugins/woocommerce-admin/client/lib/csv/test/index.js rename to plugins/woocommerce-admin/packages/csv-export/src/test/index.js diff --git a/plugins/woocommerce-admin/packages/currency/package.json b/plugins/woocommerce-admin/packages/currency/package.json index b7986645fbf..694a729c34f 100644 --- a/plugins/woocommerce-admin/packages/currency/package.json +++ b/plugins/woocommerce-admin/packages/currency/package.json @@ -1,6 +1,6 @@ { "name": "@woocommerce/currency", - "version": "1.0.0-alpha.0", + "version": "1.0.0", "description": "WooCommerce currency utilities.", "author": "Automattic", "license": "GPL-2.0-or-later", diff --git a/plugins/woocommerce-admin/packages/date/package.json b/plugins/woocommerce-admin/packages/date/package.json index b56b4117917..4b9a9f26dcc 100644 --- a/plugins/woocommerce-admin/packages/date/package.json +++ b/plugins/woocommerce-admin/packages/date/package.json @@ -1,6 +1,6 @@ { "name": "@woocommerce/date", - "version": "1.0.0-alpha.0", + "version": "1.0.0", "description": "WooCommerce date utilities.", "author": "Automattic", "license": "GPL-2.0-or-later", @@ -22,7 +22,7 @@ "react-native": "src/index", "dependencies": { "@babel/runtime": "^7.0.0", - "@wordpress/date": "2.0.3", + "@wordpress/date": "2.1.0", "@wordpress/i18n": "2.0.0", "lodash": "^4.17.11", "moment": "^2.22.2" diff --git a/plugins/woocommerce-admin/packages/date/src/index.js b/plugins/woocommerce-admin/packages/date/src/index.js index 27674c81c4e..63f3b6cb03a 100644 --- a/plugins/woocommerce-admin/packages/date/src/index.js +++ b/plugins/woocommerce-admin/packages/date/src/index.js @@ -412,7 +412,7 @@ export function getIntervalForQuery( query ) { } export const dayTicksThreshold = 63; -export const weekTicksThreshold = 7; +export const weekTicksThreshold = 9; /** * Returns date formats for the current interval. @@ -445,8 +445,13 @@ export function getDateFormatsForInterval( interval, ticks = 0 ) { } break; case 'week': - xFormat = '%d'; - x2Format = '%b %Y'; + if ( ticks < weekTicksThreshold ) { + xFormat = '%d'; + x2Format = '%b %Y'; + } else { + xFormat = '%b'; + x2Format = '%Y'; + } tooltipFormat = __( 'Week of %B %d %Y', 'wc-admin' ); break; case 'quarter': diff --git a/plugins/woocommerce-admin/packages/navigation/.npmrc b/plugins/woocommerce-admin/packages/navigation/.npmrc new file mode 100644 index 00000000000..43c97e719a5 --- /dev/null +++ b/plugins/woocommerce-admin/packages/navigation/.npmrc @@ -0,0 +1 @@ +package-lock=false diff --git a/plugins/woocommerce-admin/packages/navigation/README.md b/plugins/woocommerce-admin/packages/navigation/README.md new file mode 100644 index 00000000000..034cdb21ce8 --- /dev/null +++ b/plugins/woocommerce-admin/packages/navigation/README.md @@ -0,0 +1,168 @@ +# Navigation + +A collection of navigation-related functions for handling query parameter objects, serializing query parameters, updating query parameters, and triggering path changes. + +## Installation + +Install the module + +```bash +npm install @woocommerce/navigation --save +``` + +## Usage + +### history + +A single history object used to perform path changes. This needs to be passed into ReactRouter to use the other path functions from this library. + +```jsx +import { history } from '@woocommerce/navigation'; + +render() { + return ( + + … + + ); +} +``` + +### getAdminLink(path) ⇒ String +Returns a string with the site's wp-admin URL appended. JS version of `admin_url`. This relies on a global object `wcSettings` with a property `adminUrl` set. + +**Returns**: String - Full admin URL. + +| Param | Type | Description | +| --- | --- | --- | +| path | String | Relative path. | + +### getPath() ⇒ String +Get the current path from history. + +**Returns**: String - Current path. + +### stringifyQuery(query) ⇒ String +Converts a query object to a query string. + +**Returns**: String - Query string. + +| Param | Type | Description | +| --- | --- | --- | +| query | Object | parameters to be converted. | + +### getTimeRelatedQuery(query) ⇒ Object +Gets time related parameters from a query. + +**Returns**: Object - Object containing the time related queries. + +| Param | Type | Description | +| --- | --- | --- | +| query | Object | Query containing the parameters. | + +### getIdsFromQuery(queryString) ⇒ Array +Get an array of IDs from a comma-separated query parameter. + +**Returns**: Array - List of IDs converted to numbers. + +| Param | Type | Description | +| --- | --- | --- | +| queryString | string | string value extracted from URL. | + +### getNewPath(query, path, currentQuery) ⇒ String +Return a URL with set query parameters. + +**Returns**: String - Updated URL merging query params into existing params. + +| Param | Type | Description | +| --- | --- | --- | +| query | Object | object of params to be updated. | +| path | String | Relative path (defaults to current path). | +| currentQuery | Object | object of current query params (defaults to current querystring). | + +### getQuery() ⇒ Object +Get the current query string, parsed into an object, from history. + +**Returns**: Object - Current query object, defaults to empty object. + +### onQueryChange(param, path, query) ⇒ function +This function returns an event handler for the given `param` + +**Returns**: function - A callback which will update `param` to the passed value when called. + +| Param | Type | Description | +| --- | --- | --- | +| param | string | The parameter in the querystring which should be updated (ex `page`, `per_page`) | +| path | string | Relative path (defaults to current path). | +| query | string | object of current query params (defaults to current querystring). | + +### updateQueryString(query, path, currentQuery) +Updates the query parameters of the current page. + +| Param | Type | Description | +| --- | --- | --- | +| query | Object | object of params to be updated. | +| path | String | Relative path (defaults to current path). | +| currentQuery | Object | object of current query params (defaults to current querystring). | + +## flattenFilters(filters) ⇒ Array +Collapse an array of filter values with subFilters into a 1-dimensional array. + +**Returns**: Array - Flattened array of all filters. + +| Param | Type | Description | +| --- | --- | --- | +| filters | Array | Set of filters with possible subfilters. | + +## getActiveFiltersFromQuery(query, config) ⇒ Array.<activeFilters> +Given a query object, return an array of activeFilters, if any. + +**Returns**: Array.<activeFilters> - - array of activeFilters + +| Param | Type | Description | +| --- | --- | --- | +| query | object | query oject | +| config | object | config object | + +## getDefaultOptionValue(config, options) ⇒ string \| undefined +Get the default option's value from the configuration object for a given filter. The first option is used as default if no defaultOption is provided. + +**Returns**: string \| undefined - - the value of the default option. + +| Param | Type | Description | +| --- | --- | --- | +| config | object | a filter config object. | +| options | array | select options. | + +## getQueryFromActiveFilters(activeFilters, query, config) ⇒ object +Given activeFilters, create a new query object to update the url. Use previousFilters to +Remove unused params. + +**Returns**: object - - query object representing the new parameters + +| Param | Type | Description | +| --- | --- | --- | +| activeFilters | Array.<activeFilters> | activeFilters shown in the UI | +| query | object | the current url query object | +| config | object | config object | + +## getUrlKey(key, rule) ⇒ string +Get the url query key from the filter key and rule. + +**Returns**: string - - url query key. + +| Param | Type | Description | +| --- | --- | --- | +| key | string | filter key. | +| rule | string | filter rule. | + +## activeFilter : Object +Describe activeFilter object. + +**Properties** + +| Name | Type | Description | +| --- | --- | --- | +| key | string | filter key. | +| [rule] | string | a modifying rule for a filter, eg 'includes' or 'is_not'. | +| value | string | filter value(s). | diff --git a/plugins/woocommerce-admin/packages/navigation/package.json b/plugins/woocommerce-admin/packages/navigation/package.json new file mode 100644 index 00000000000..6524b25c900 --- /dev/null +++ b/plugins/woocommerce-admin/packages/navigation/package.json @@ -0,0 +1,32 @@ +{ + "name": "@woocommerce/navigation", + "version": "1.0.0", + "description": "WooCommerce navigation utilities.", + "author": "Automattic", + "license": "GPL-2.0-or-later", + "keywords": [ + "wordpress", + "woocommerce", + "navigation" + ], + "homepage": "https://github.com/WooCommerce/wc-admin/tree/master/packages/navigation/README.md", + "repository": { + "type": "git", + "url": "https://github.com/WooCommerce/wc-admin.git" + }, + "bugs": { + "url": "https://github.com/WooCommerce/wc-admin/issues" + }, + "main": "build/index.js", + "module": "build-module/index.js", + "react-native": "src/index", + "dependencies": { + "@babel/runtime": "^7.0.0", + "history": "4.7.2", + "lodash": "^4.17.11", + "qs": "^6.5.2" + }, + "publishConfig": { + "access": "public" + } +} diff --git a/plugins/woocommerce-admin/client/components/filters/advanced/utils.js b/plugins/woocommerce-admin/packages/navigation/src/filters.js similarity index 70% rename from plugins/woocommerce-admin/client/components/filters/advanced/utils.js rename to plugins/woocommerce-admin/packages/navigation/src/filters.js index deaa51b76a8..6e724e24a8c 100644 --- a/plugins/woocommerce-admin/client/components/filters/advanced/utils.js +++ b/plugins/woocommerce-admin/packages/navigation/src/filters.js @@ -2,21 +2,27 @@ /** * External dependencies */ -import { find, compact } from 'lodash'; +import { compact, find, get, omit } from 'lodash'; /** - * Get the url query key from the filter key and rule. + * Collapse an array of filter values with subFilters into a 1-dimensional array. * - * @param {string} key - filter key. - * @param {string} rule - filter rule. - * @return {string} - url query key. + * @param {Array} filters Set of filters with possible subfilters. + * @return {Array} Flattened array of all filters. */ -export const getUrlKey = ( key, rule ) => { - if ( rule && rule.length ) { - return `${ key }_${ rule }`; - } - return key; -}; +export function flattenFilters( filters ) { + const allFilters = []; + filters.forEach( f => { + if ( ! f.subFilters ) { + allFilters.push( f ); + } else { + allFilters.push( omit( f, 'subFilters' ) ); + const subFilters = flattenFilters( f.subFilters ); + allFilters.push( ...subFilters ); + } + } ); + return allFilters; +} /** * Describe activeFilter object. @@ -34,7 +40,7 @@ export const getUrlKey = ( key, rule ) => { * @param {object} config - config object * @return {activeFilters[]} - array of activeFilters */ -export const getActiveFiltersFromQuery = ( query, config ) => { +export function getActiveFiltersFromQuery( query, config ) { return compact( Object.keys( config ).map( configKey => { const filter = config[ configKey ]; @@ -62,7 +68,30 @@ export const getActiveFiltersFromQuery = ( query, config ) => { return null; } ) ); -}; +} + +/** + * Get the default option's value from the configuration object for a given filter. The first + * option is used as default if no `defaultOption` is provided. + * + * @param {object} config - a filter config object. + * @param {array} options - select options. + * @return {string|undefined} - the value of the default option. + */ +export function getDefaultOptionValue( config, options ) { + const { defaultOption } = config.input; + if ( config.input.defaultOption ) { + const option = find( options, { value: defaultOption } ); + if ( ! option ) { + /* eslint-disable no-console */ + console.warn( `invalid defaultOption ${ defaultOption } supplied to ${ config.labels.add }` ); + /* eslint-enable */ + return undefined; + } + return option.value; + } + return get( options, [ 0, 'value' ] ); +} /** * Given activeFilters, create a new query object to update the url. Use previousFilters to @@ -73,7 +102,7 @@ export const getActiveFiltersFromQuery = ( query, config ) => { * @param {object} config - config object * @return {object} - query object representing the new parameters */ -export const getQueryFromActiveFilters = ( activeFilters, query, config ) => { +export function getQueryFromActiveFilters( activeFilters, query, config ) { const previousFilters = getActiveFiltersFromQuery( query, config ); const previousData = previousFilters.reduce( ( data, filter ) => { data[ getUrlKey( filter.key, filter.rule ) ] = undefined; @@ -87,24 +116,18 @@ export const getQueryFromActiveFilters = ( activeFilters, query, config ) => { }, {} ); return { ...previousData, ...nextData }; -}; +} /** * Get the url query key from the filter key and rule. * - * @param {object} config - a filter config object. - * @param {array} options - select options. - * @return {string|undefined} - the value of the default option. + * @param {string} key - filter key. + * @param {string} rule - filter rule. + * @return {string} - url query key. */ -export const getDefaultOptionValue = ( config, options ) => { - const { defaultOption } = config.input; - if ( config.input.defaultOption ) { - const option = find( options, { value: defaultOption } ); - if ( ! option ) { - console.warn( `invalid defaultOption ${ defaultOption } supplied to ${ config.labels.add }` ); - return undefined; - } - return option.value; +export function getUrlKey( key, rule ) { + if ( rule && rule.length ) { + return `${ key }_${ rule }`; } - return options[ 0 ].value; -}; + return key; +} diff --git a/plugins/woocommerce-admin/client/lib/history.js b/plugins/woocommerce-admin/packages/navigation/src/history.js similarity index 99% rename from plugins/woocommerce-admin/client/lib/history.js rename to plugins/woocommerce-admin/packages/navigation/src/history.js index 399846da1f2..6924d5233d8 100644 --- a/plugins/woocommerce-admin/client/lib/history.js +++ b/plugins/woocommerce-admin/packages/navigation/src/history.js @@ -1,5 +1,4 @@ /** @format */ - /** * External dependencies */ diff --git a/plugins/woocommerce-admin/client/lib/nav-utils/index.js b/plugins/woocommerce-admin/packages/navigation/src/index.js similarity index 85% rename from plugins/woocommerce-admin/client/lib/nav-utils/index.js rename to plugins/woocommerce-admin/packages/navigation/src/index.js index 27971819982..c2eae888ebd 100644 --- a/plugins/woocommerce-admin/client/lib/nav-utils/index.js +++ b/plugins/woocommerce-admin/packages/navigation/src/index.js @@ -2,9 +2,25 @@ /** * External dependencies */ -import history from 'lib/history'; -import { parse, stringify } from 'qs'; import { isEmpty, pick, uniq } from 'lodash'; +import { parse, stringify } from 'qs'; + +/** + * Internal dependencies + */ +import history from './history'; + +// Expose history so all uses get the same history object. +export { history }; + +// Export all filter utilities +export * from './filters'; + +/** + * Internal dependencies + */ +// Import the module into itself. Functions consumed from this import can be mocked in tests. +import * as navUtils from './index'; /** * Returns a string with the site's wp-admin URL appended. JS version of `admin_url`. @@ -35,7 +51,7 @@ export const stringifyQuery = query => ( isEmpty( query ) ? '' : '?' + stringify * @param {Object} query Query containing the parameters. * @return {Object} Object containing the time related queries. */ -export const getTimeRelatedQuery = query => +export const getTimeRelatedQuery = ( query = navUtils.getQuery() ) => pick( query, [ 'period', 'compare', 'before', 'after' ] ); /** @@ -92,8 +108,8 @@ export function onQueryChange( param, path = getPath(), query = getQuery() ) { case 'sort': return ( key, dir ) => updateQueryString( { orderby: key, order: dir }, path, query ); case 'compare': - return ( key, ids ) => - updateQueryString( { filter: `compare-${ key }`, [ key ]: ids }, path, query ); + return ( key, queryParam, ids ) => + updateQueryString( { [ queryParam ]: `compare-${ key }`, [ key ]: ids }, path, query ); default: return value => updateQueryString( { [ param ]: value }, path, query ); } diff --git a/plugins/woocommerce-admin/client/components/filters/advanced/test/utils.js b/plugins/woocommerce-admin/packages/navigation/src/test/filters.js similarity index 70% rename from plugins/woocommerce-admin/client/components/filters/advanced/test/utils.js rename to plugins/woocommerce-admin/packages/navigation/src/test/filters.js index e2cc22f2c8f..d70dac6fcc6 100644 --- a/plugins/woocommerce-admin/client/components/filters/advanced/test/utils.js +++ b/plugins/woocommerce-admin/packages/navigation/src/test/filters.js @@ -1,18 +1,17 @@ -/** - * @format - */ - -/** - * External dependencies - */ - +/** @format */ /** * Internal dependencies */ -import { getUrlKey, getActiveFiltersFromQuery, getQueryFromActiveFilters } from '../utils'; +import { + getActiveFiltersFromQuery, + getDefaultOptionValue, + getQueryFromActiveFilters, + getUrlKey, +} from '../filters'; const config = { with_select: { + labels: { add: 'Order Status' }, rules: [ { value: 'is' } ], input: { component: 'SelectControl', @@ -20,12 +19,14 @@ const config = { }, }, with_search: { + labels: { add: 'Search' }, rules: [ { value: 'includes' } ], input: { component: 'Search', }, }, with_no_rules: { + labels: { add: 'Order Status' }, input: { component: 'SelectControl', options: [ { value: 'pending' } ], @@ -126,3 +127,44 @@ describe( 'getQueryFromActiveFilters', () => { expect( nextQuery.with_search_includes ).toBeUndefined(); } ); } ); + +describe( 'getDefaultOptionValue', () => { + it( 'should return the default option value', () => { + const options = [ { value: 'new' }, { value: 'returning' } ]; + const currentFilter = { + labels: { add: 'Customer Type' }, + input: { + component: 'SelectControl', + options, + defaultOption: 'returning', + }, + }; + const value = getDefaultOptionValue( currentFilter, options ); + expect( value ).toBe( 'returning' ); + } ); + + it( 'should return the first option value when no default option', () => { + const options = [ { value: 'new' }, { value: 'returning' } ]; + const currentFilter = { + labels: { add: 'Customer Type' }, + input: { + component: 'SelectControl', + options, + }, + }; + const value = getDefaultOptionValue( currentFilter, options ); + expect( value ).toBe( 'new' ); + } ); + + it( 'should return undefined when no options are provided', () => { + const options = []; + const currentFilter = { + labels: { add: 'Product' }, + input: { + component: 'Search', + }, + }; + const value = getDefaultOptionValue( currentFilter, options ); + expect( value ).toBeUndefined(); + } ); +} ); diff --git a/plugins/woocommerce-admin/client/lib/nav-utils/test/index.js b/plugins/woocommerce-admin/packages/navigation/src/test/index.js similarity index 60% rename from plugins/woocommerce-admin/client/lib/nav-utils/test/index.js rename to plugins/woocommerce-admin/packages/navigation/src/test/index.js index 4df6494bec6..deaf5ff647a 100644 --- a/plugins/woocommerce-admin/client/lib/nav-utils/test/index.js +++ b/plugins/woocommerce-admin/packages/navigation/src/test/index.js @@ -4,6 +4,18 @@ */ import { getTimeRelatedQuery } from '../index'; +jest.mock( '../index', () => ( { + ...require.requireActual( '../index' ), + getQuery: jest.fn().mockReturnValue( { + filter: 'advanced', + product_includes: 127, + period: 'year', + compare: 'previous_year', + after: '2018-02-01', + before: '2018-01-01', + } ), +} ) ); + describe( 'getTimeRelatedQuery', () => { it( "should return an empty object it the query doesn't contain any time related parameters", () => { const query = { @@ -33,4 +45,15 @@ describe( 'getTimeRelatedQuery', () => { expect( getTimeRelatedQuery( query ) ).toEqual( timeRelatedQuery ); } ); + + it( 'should get the query from getQuery() when none is provided in the params', () => { + const timeRelatedQuery = { + period: 'year', + compare: 'previous_year', + after: '2018-02-01', + before: '2018-01-01', + }; + + expect( getTimeRelatedQuery() ).toEqual( timeRelatedQuery ); + } ); } ); diff --git a/plugins/woocommerce-admin/renovate.json b/plugins/woocommerce-admin/renovate.json index f45d8f110c3..583dcf06dda 100644 --- a/plugins/woocommerce-admin/renovate.json +++ b/plugins/woocommerce-admin/renovate.json @@ -1,5 +1,6 @@ { "extends": [ "config:base" - ] + ], + "lockFileMaintenance": { "enabled": true } } diff --git a/plugins/woocommerce-admin/tests/api/admin-notes.php b/plugins/woocommerce-admin/tests/api/admin-notes.php new file mode 100644 index 00000000000..acfab0db931 --- /dev/null +++ b/plugins/woocommerce-admin/tests/api/admin-notes.php @@ -0,0 +1,150 @@ +user = $this->factory->user->create( + array( + 'role' => 'administrator', + ) + ); + + WC_Helper_Admin_Notes::reset_notes_dbs(); + WC_Helper_Admin_Notes::add_notes_for_tests(); + } + + /** + * Test route registration. + * + * @since 3.5.0 + */ + public function test_register_routes() { + $routes = $this->server->get_routes(); + + $this->assertArrayHasKey( $this->endpoint, $routes ); + } + + /** + * Test getting a single note. + * + * @since 3.5.0 + */ + public function test_get_note() { + wp_set_current_user( $this->user ); + + $response = $this->server->dispatch( new WP_REST_Request( 'GET', $this->endpoint . '/1' ) ); + $note = $response->get_data(); + + $this->assertEquals( 200, $response->get_status() ); + + $this->assertEquals( 1, $note['id'] ); + $this->assertEquals( 'PHPUNIT_TEST_NOTE_NAME', $note['name'] ); + $this->assertEquals( WC_Admin_Note::E_WC_ADMIN_NOTE_INFORMATIONAL, $note['type'] ); + $this->assertArrayHasKey( 'locale', $note ); + $this->assertEquals( 'PHPUNIT_TEST_NOTE_1_TITLE', $note['title'] ); + + $this->assertEquals( 'PHPUNIT_TEST_NOTE_1_CONTENT', $note['content'] ); + $this->assertEquals( 'info', $note['icon'] ); + $this->assertArrayHasKey( 'content_data', $note ); + $this->assertEquals( 1.23, $note['content_data']->amount ); + $this->assertEquals( WC_Admin_Note::E_WC_ADMIN_NOTE_UNACTIONED, $note['status'] ); + $this->assertEquals( 'PHPUNIT_TEST', $note['source'] ); + + $this->assertArrayHasKey( 'date_created', $note ); + $this->assertArrayHasKey( 'date_created_gmt', $note ); + $this->assertArrayHasKey( 'date_reminder', $note ); + $this->assertArrayHasKey( 'date_reminder_gmt', $note ); + $this->assertArrayHasKey( 'actions', $note ); + + $this->assertEquals( 'PHPUNIT_TEST_NOTE_1_ACTION_1_SLUG', $note['actions'][0]->name ); + $this->assertEquals( 'http://example.org/wp-admin/admin.php?s=PHPUNIT_TEST_NOTE_1_ACTION_1_URL', $note['actions'][0]->url ); + } + + /** + * Test getting a single note without permission. It should fail. + * + * @since 3.5.0 + */ + public function test_get_note_without_permission() { + $response = $this->server->dispatch( new WP_REST_Request( 'GET', $this->endpoint . '/1' ) ); + $this->assertEquals( 401, $response->get_status() ); + } + + /** + * Test getting lots of notes. + * + * @since 3.5.0 + */ + public function test_get_notes() { + wp_set_current_user( $this->user ); + + $response = $this->server->dispatch( new WP_REST_Request( 'GET', $this->endpoint ) ); + $notes = $response->get_data(); + + $this->assertEquals( 200, $response->get_status() ); + $this->assertEquals( 2, count( $notes ) ); + } + + /** + * Test getting lots of notes without permission. It should fail. + * + * @since 3.5.0 + */ + public function test_get_notes_without_permission() { + $response = $this->server->dispatch( new WP_REST_Request( 'GET', $this->endpoint ) ); + $this->assertEquals( 401, $response->get_status() ); + } + + /** + * Test getting the notes schema. + * + * @since 3.5.0 + */ + public function test_get_notes_schema() { + wp_set_current_user( $this->user ); + + $request = new WP_REST_Request( 'OPTIONS', $this->endpoint ); + $response = $this->server->dispatch( $request ); + $data = $response->get_data(); + $properties = $data['schema']['properties']; + + $this->assertEquals( 15, count( $properties ) ); + + $this->assertArrayHasKey( 'id', $properties ); + $this->assertArrayHasKey( 'name', $properties ); + $this->assertArrayHasKey( 'type', $properties ); + $this->assertArrayHasKey( 'locale', $properties ); + $this->assertArrayHasKey( 'title', $properties ); + + $this->assertArrayHasKey( 'content', $properties ); + $this->assertArrayHasKey( 'icon', $properties ); + $this->assertArrayHasKey( 'content_data', $properties ); + $this->assertArrayHasKey( 'status', $properties ); + $this->assertArrayHasKey( 'source', $properties ); + + $this->assertArrayHasKey( 'date_created', $properties ); + $this->assertArrayHasKey( 'date_created_gmt', $properties ); + $this->assertArrayHasKey( 'date_reminder', $properties ); + $this->assertArrayHasKey( 'date_reminder_gmt', $properties ); + $this->assertArrayHasKey( 'actions', $properties ); + } +} diff --git a/plugins/woocommerce-admin/tests/bootstrap.php b/plugins/woocommerce-admin/tests/bootstrap.php index 0abac9a914c..385c587e963 100755 --- a/plugins/woocommerce-admin/tests/bootstrap.php +++ b/plugins/woocommerce-admin/tests/bootstrap.php @@ -28,6 +28,34 @@ function wc_dir() { return dirname( dirname( dirname( __FILE__ ) ) ) . '/woocommerce'; } +/** + * Install wc admin. + */ +function wc_admin_install() { + // Clean existing install first. + define( 'WP_UNINSTALL_PLUGIN', true ); + define( 'WC_REMOVE_ALL_DATA', true ); + + // Initialize the WC API extensions. + require_once dirname( dirname( __FILE__ ) ) . '/includes/class-wc-admin-api-init.php'; + + WC_Admin_Api_Init::install(); + + if ( ! wp_next_scheduled( 'wc_admin_daily' ) ) { + wp_schedule_event( time(), 'daily', 'wc_admin_daily' ); + } + + // Reload capabilities after install, see https://core.trac.wordpress.org/ticket/28374. + if ( version_compare( $GLOBALS['wp_version'], '4.7', '<' ) ) { + $GLOBALS['wp_roles']->reinit(); + } else { + $GLOBALS['wp_roles'] = null; // WPCS: override ok. + wp_roles(); + } + + echo esc_html( 'Installing wc-admin...' . PHP_EOL ); +} + /** * Adds WooCommerce testing framework classes. */ @@ -72,6 +100,8 @@ function _manually_load_plugin() { define( 'WC_USE_TRANSACTIONS', false ); require_once wc_dir() . '/woocommerce.php'; + wc_admin_install(); + require dirname( dirname( __FILE__ ) ) . '/wc-admin.php'; } tests_add_filter( 'muplugins_loaded', '_manually_load_plugin' ); @@ -83,5 +113,4 @@ wc_test_includes(); // Include wc-admin helpers. require_once dirname( __FILE__ ) . '/framework/helpers/class-wc-helper-reports.php'; - - +require_once dirname( __FILE__ ) . '/framework/helpers/class-wc-helper-admin-notes.php'; diff --git a/plugins/woocommerce-admin/tests/framework/helpers/class-wc-helper-admin-notes.php b/plugins/woocommerce-admin/tests/framework/helpers/class-wc-helper-admin-notes.php new file mode 100644 index 00000000000..2aad291ff32 --- /dev/null +++ b/plugins/woocommerce-admin/tests/framework/helpers/class-wc-helper-admin-notes.php @@ -0,0 +1,57 @@ +query( "TRUNCATE TABLE {$wpdb->prefix}woocommerce_admin_notes" ); // @codingStandardsIgnoreLine. + $wpdb->query( "TRUNCATE TABLE {$wpdb->prefix}woocommerce_admin_note_actions" ); // @codingStandardsIgnoreLine. + } + + /** + * Create two notes that we can use for notes REST API tests + */ + public static function add_notes_for_tests() { + $data_store = WC_Data_Store::load( 'admin-note' ); + + $note_1 = new WC_Admin_Note(); + $note_1->set_title( 'PHPUNIT_TEST_NOTE_1_TITLE' ); + $note_1->set_content( 'PHPUNIT_TEST_NOTE_1_CONTENT' ); + $note_1->set_content_data( (object) array( 'amount' => 1.23 ) ); + $note_1->set_type( WC_Admin_Note::E_WC_ADMIN_NOTE_INFORMATIONAL ); + $note_1->set_icon( 'info' ); + $note_1->set_name( 'PHPUNIT_TEST_NOTE_NAME' ); + $note_1->set_source( 'PHPUNIT_TEST' ); + $note_1->add_action( + 'PHPUNIT_TEST_NOTE_1_ACTION_1_SLUG', + 'PHPUNIT_TEST_NOTE_1_ACTION_1_LABEL', + '?s=PHPUNIT_TEST_NOTE_1_ACTION_1_URL' + ); + $note_1->add_action( + 'PHPUNIT_TEST_NOTE_1_ACTION_2_SLUG', + 'PHPUNIT_TEST_NOTE_1_ACTION_2_LABEL', + '?s=PHPUNIT_TEST_NOTE_1_ACTION_2_URL' + ); + $note_1->save(); + + $note_2 = new WC_Admin_Note(); + $note_2->set_title( 'PHPUNIT_TEST_NOTE_2_TITLE' ); + $note_2->set_content( 'PHPUNIT_TEST_NOTE_2_CONTENT' ); + $note_2->set_content_data( (object) array( 'amount' => 4.56 ) ); + $note_2->set_type( WC_Admin_Note::E_WC_ADMIN_NOTE_WARNING ); + $note_2->set_icon( 'info' ); + $note_2->set_name( 'PHPUNIT_TEST_NOTE_NAME' ); + $note_2->set_source( 'PHPUNIT_TEST' ); + // This note has no actions. + $note_2->save(); + + } +} diff --git a/plugins/woocommerce-admin/tests/js/jest.config.json b/plugins/woocommerce-admin/tests/js/jest.config.json index a697eff923c..cf61057c7b7 100644 --- a/plugins/woocommerce-admin/tests/js/jest.config.json +++ b/plugins/woocommerce-admin/tests/js/jest.config.json @@ -10,7 +10,6 @@ "moduleDirectories": ["node_modules", "/client", "/packages"], "moduleNameMapper": { "tinymce": "/tests/js/mocks/tinymce", - "@woocommerce/components": "/client/components", "@woocommerce/(.*)": "/packages/$1/src" }, "setupFiles": [ diff --git a/plugins/woocommerce-admin/tests/js/setup-globals.js b/plugins/woocommerce-admin/tests/js/setup-globals.js index 894e58ccbe4..b98a6eb1a74 100644 --- a/plugins/woocommerce-admin/tests/js/setup-globals.js +++ b/plugins/woocommerce-admin/tests/js/setup-globals.js @@ -23,8 +23,10 @@ const wordPressPackages = [ const wooCommercePackages = [ 'components', + 'csv', 'currency', 'date', + 'navigation', ]; wordPressPackages.forEach( lib => { diff --git a/plugins/woocommerce-admin/tests/reports/class-wc-tests-reports-orders.php b/plugins/woocommerce-admin/tests/reports/class-wc-tests-reports-orders.php index 2aea9ebc200..3ba9c6a851a 100644 --- a/plugins/woocommerce-admin/tests/reports/class-wc-tests-reports-orders.php +++ b/plugins/woocommerce-admin/tests/reports/class-wc-tests-reports-orders.php @@ -61,22 +61,24 @@ class WC_Tests_Reports_Orders extends WC_Unit_Test_Case { ), 'intervals' => array( array( - 'interval' => date( 'Y-m-d G', $order->get_date_created()->getOffsetTimestamp() ), + 'interval' => date( 'Y-m-d H', $order->get_date_created()->getOffsetTimestamp() ), 'date_start' => $start_time, 'date_start_gmt' => $start_time, 'date_end' => $end_time, 'date_end_gmt' => $end_time, 'subtotals' => array( - 'gross_revenue' => 97, - 'net_revenue' => 80, - 'coupons' => 20, - 'shipping' => 10, - 'taxes' => 7, - 'refunds' => 0, - 'orders_count' => 1, - 'num_items_sold' => 4, - 'avg_items_per_order' => 4, - 'avg_order_value' => 97, + 'gross_revenue' => 97, + 'net_revenue' => 80, + 'coupons' => 20, + 'shipping' => 10, + 'taxes' => 7, + 'refunds' => 0, + 'orders_count' => 1, + 'num_items_sold' => 4, + 'avg_items_per_order' => 4, + 'avg_order_value' => 97, + 'num_returning_customers' => 0, + 'num_new_customers' => 1, ), ), ), @@ -92,23 +94,32 @@ class WC_Tests_Reports_Orders extends WC_Unit_Test_Case { $query = new WC_Admin_Reports_Orders_Stats_Query( $args ); $expected_stats = array( 'totals' => array( - 'net_revenue' => 80, - 'avg_order_value' => 97, - 'orders_count' => 1, - 'avg_items_per_order' => 4, + 'net_revenue' => 80, + 'avg_order_value' => 97, + 'orders_count' => 1, + 'avg_items_per_order' => 4, + 'num_items_sold' => 4, + 'coupons' => 20, + 'num_returning_customers' => 0, + 'num_new_customers' => 1, + 'products' => '1', ), 'intervals' => array( array( - 'interval' => date( 'Y-m-d G', $order->get_date_created()->getOffsetTimestamp() ), + 'interval' => date( 'Y-m-d H', $order->get_date_created()->getOffsetTimestamp() ), 'date_start' => $start_time, 'date_start_gmt' => $start_time, 'date_end' => $end_time, 'date_end_gmt' => $end_time, 'subtotals' => array( - 'net_revenue' => 80, - 'avg_order_value' => 97, - 'orders_count' => 1, - 'avg_items_per_order' => 4, + 'net_revenue' => 80, + 'avg_order_value' => 97, + 'orders_count' => 1, + 'avg_items_per_order' => 4, + 'num_items_sold' => 4, + 'coupons' => 20, + 'num_returning_customers' => 0, + 'num_new_customers' => 1, ), ), ), diff --git a/plugins/woocommerce-admin/tests/reports/class-wc-tests-reports-revenue-stats.php b/plugins/woocommerce-admin/tests/reports/class-wc-tests-reports-revenue-stats.php index 405045f1d7a..f01f5d95911 100644 --- a/plugins/woocommerce-admin/tests/reports/class-wc-tests-reports-revenue-stats.php +++ b/plugins/woocommerce-admin/tests/reports/class-wc-tests-reports-revenue-stats.php @@ -64,22 +64,24 @@ class WC_Admin_Tests_Reports_Revenue_Stats extends WC_Unit_Test_Case { ), 'intervals' => array( array( - 'interval' => date( 'Y-m-d G', $order->get_date_created()->getTimestamp() ), + 'interval' => date( 'Y-m-d H', $order->get_date_created()->getTimestamp() ), 'date_start' => $start_time, 'date_start_gmt' => $start_time, 'date_end' => $end_time, 'date_end_gmt' => $end_time, 'subtotals' => array( - 'orders_count' => 1, - 'num_items_sold' => 4, - 'gross_revenue' => 97, - 'coupons' => 20, - 'refunds' => 0, - 'taxes' => 7, - 'shipping' => 10, - 'net_revenue' => 80, - 'avg_items_per_order' => 4, - 'avg_order_value' => 97, + 'orders_count' => 1, + 'num_items_sold' => 4, + 'gross_revenue' => 97, + 'coupons' => 20, + 'refunds' => 0, + 'taxes' => 7, + 'shipping' => 10, + 'net_revenue' => 80, + 'avg_items_per_order' => 4, + 'avg_order_value' => 97, + 'num_returning_customers' => 0, + 'num_new_customers' => 1, ), ), ), @@ -102,10 +104,11 @@ class WC_Admin_Tests_Reports_Revenue_Stats extends WC_Unit_Test_Case { 'taxes' => 7, 'shipping' => 10, 'net_revenue' => 80, + 'products' => '1', ), 'intervals' => array( array( - 'interval' => date( 'Y-m-d G', $order->get_date_created()->getTimestamp() ), + 'interval' => date( 'Y-m-d H', $order->get_date_created()->getTimestamp() ), 'date_start' => $start_time, 'date_start_gmt' => $start_time, 'date_end' => $end_time, diff --git a/plugins/woocommerce-admin/wc-admin.php b/plugins/woocommerce-admin/wc-admin.php index b382c33c104..be282aac802 100755 --- a/plugins/woocommerce-admin/wc-admin.php +++ b/plugins/woocommerce-admin/wc-admin.php @@ -28,12 +28,24 @@ if ( ! defined( 'WC_ADMIN_PLUGIN_FILE' ) ) { * Notify users of the plugin requirements */ function wc_admin_plugins_notice() { - $message = sprintf( - /* translators: 1: URL of Gutenberg plugin, 2: URL of WooCommerce plugin */ - __( 'The WooCommerce Admin feature plugin requires both Gutenberg and WooCommerce (>3.5) to be installed and active.', 'wc-admin' ), - 'https://wordpress.org/plugins/gutenberg/', - 'https://wordpress.org/plugins/woocommerce/' - ); + // The notice varies by WordPress version. + $wordpress_version = get_bloginfo( 'version' ); + $wordpress_includes_gutenberg = version_compare( $wordpress_version, '4.9.9', '>' ); + + if ( $wordpress_includes_gutenberg ) { + $message = sprintf( + /* translators: URL of WooCommerce plugin */ + __( 'The WooCommerce Admin feature plugin requires WooCommerce (>3.5) to be installed and active.', 'wc-admin' ), + 'https://wordpress.org/plugins/woocommerce/' + ); + } else { + $message = sprintf( + /* translators: 1: URL of Gutenberg plugin, 2: URL of WooCommerce plugin */ + __( 'The WooCommerce Admin feature plugin requires both Gutenberg and WooCommerce (>3.5) to be installed and active.', 'wc-admin' ), + 'https://wordpress.org/plugins/gutenberg/', + 'https://wordpress.org/plugins/woocommerce/' + ); + } printf( '

%s

', $message ); /* WPCS: xss ok. */ } @@ -43,8 +55,16 @@ function wc_admin_plugins_notice() { * @return bool */ function dependencies_satisfied() { - return ( defined( 'GUTENBERG_DEVELOPMENT_MODE' ) || defined( 'GUTENBERG_VERSION' ) ) - && class_exists( 'WooCommerce' ) && version_compare( WC_VERSION, '3.5', '>' ); + $woocommerce_minimum_met = class_exists( 'WooCommerce' ) && version_compare( WC_VERSION, '3.5', '>' ); + if ( ! $woocommerce_minimum_met ) { + return false; + } + + $wordpress_version = get_bloginfo( 'version' ); + $wordpress_includes_gutenberg = version_compare( $wordpress_version, '4.9.9', '>' ); + $gutenberg_plugin_active = defined( 'GUTENBERG_DEVELOPMENT_MODE' ) || defined( 'GUTENBERG_VERSION' ); + + return $wordpress_includes_gutenberg || $gutenberg_plugin_active; } /** @@ -92,6 +112,23 @@ function deactivate_wc_admin_plugin() { } register_deactivation_hook( WC_ADMIN_PLUGIN_FILE, 'deactivate_wc_admin_plugin' ); +/** + * Update the database tables if needed. This hooked function does NOT need to + * be ported to WooCommerce's code base - WC_Install will do this on plugin + * update automatically. + */ +function wc_admin_init() { + if ( ! dependencies_satisfied() ) { + return; + } + + // Only create/update tables on init if WP_DEBUG is true. + if ( defined( 'WP_DEBUG' ) && WP_DEBUG ) { + WC_Admin_Api_Init::create_db_tables(); + } +} +add_action( 'init', 'wc_admin_init' ); + /** * Set up the plugin, only if we can detect both Gutenberg and WooCommerce */ @@ -116,6 +153,7 @@ function wc_admin_plugins_loaded() { // Admin note providers. require_once dirname( __FILE__ ) . '/includes/class-wc-admin-notes-new-sales-record.php'; require_once dirname( __FILE__ ) . '/includes/class-wc-admin-notes-settings-notes.php'; + require_once dirname( __FILE__ ) . '/includes/class-wc-admin-notes-woo-subscriptions-notes.php'; } add_action( 'plugins_loaded', 'wc_admin_plugins_loaded' ); diff --git a/plugins/woocommerce-admin/webpack.config.js b/plugins/woocommerce-admin/webpack.config.js index 801e7e47014..5b2e501ba4d 100644 --- a/plugins/woocommerce-admin/webpack.config.js +++ b/plugins/woocommerce-admin/webpack.config.js @@ -2,14 +2,19 @@ /** * External dependencies */ -const path = require( 'path' ); const ExtractTextPlugin = require( 'extract-text-webpack-plugin' ); +const { get } = require( 'lodash' ); +const path = require( 'path' ); +const CopyWebpackPlugin = require( 'copy-webpack-plugin' ); + +/** + * WordPress dependencies + */ +const CustomTemplatedPathPlugin = require( '@wordpress/custom-templated-path-webpack-plugin' ); + const NODE_ENV = process.env.NODE_ENV || 'development'; const externals = { - '@woocommerce/components': { this: [ 'wc', 'components' ] }, - '@woocommerce/currency': { this: [ 'wc', 'currency' ] }, - '@woocommerce/date': { this: [ 'wc', 'date' ] }, '@wordpress/api-fetch': { this: [ 'wp', 'apiFetch' ] }, '@wordpress/blocks': { this: [ 'wp', 'blocks' ] }, '@wordpress/components': { this: [ 'wp', 'components' ] }, @@ -27,16 +32,20 @@ const externals = { 'react-dom': 'ReactDOM', }; -const wcAdminPackages = { - components: './client/components', - currency: './packages/currency', - date: './packages/date', -}; +const wcAdminPackages = [ + 'components', + 'csv-export', + 'currency', + 'date', + 'navigation', +]; -Object.keys( wcAdminPackages ).forEach( ( name ) => { +const entryPoints = {}; +wcAdminPackages.forEach( name => { externals[ `@woocommerce/${ name }` ] = { - this: [ 'wc', name ], + this: [ 'wc', name.replace( /-([a-z])/g, ( match, letter ) => letter.toUpperCase() ) ], }; + entryPoints[ name ] = `./packages/${ name }`; } ); const webpackConfig = { @@ -44,12 +53,12 @@ const webpackConfig = { entry: { app: './client/index.js', embedded: './client/embedded.js', - ...wcAdminPackages, + ...entryPoints, }, output: { filename: './dist/[name]/index.js', path: __dirname, - library: [ 'wc', '[name]' ], + library: [ 'wc', '[modulename]' ], libraryTarget: 'this', }, externals, @@ -62,7 +71,7 @@ const webpackConfig = { }, { test: /\.md$/, use: 'raw-loader' }, { - test: /\.(scss|css)$/, + test: /\.s?css$/, use: ExtractTextPlugin.extract( { fallback: 'style-loader', use: [ @@ -94,15 +103,36 @@ const webpackConfig = { }, resolve: { extensions: [ '.json', '.js', '.jsx' ], - modules: [ path.join( __dirname, 'client' ), path.join( __dirname, 'packages' ), 'node_modules' ], + modules: [ + path.join( __dirname, 'client' ), + path.join( __dirname, 'packages' ), + 'node_modules', + ], alias: { 'gutenberg-components': path.resolve( __dirname, 'node_modules/@wordpress/components/src' ), }, }, plugins: [ + new CustomTemplatedPathPlugin( { + modulename( outputPath, data ) { + const entryName = get( data, [ 'chunk', 'name' ] ); + if ( entryName ) { + return entryName.replace( /-([a-z])/g, ( match, letter ) => letter.toUpperCase() ); + } + return outputPath; + }, + } ), new ExtractTextPlugin( { filename: './dist/[name]/style.css', } ), + new CopyWebpackPlugin( + wcAdminPackages.map( packageName => ( { + from: `./packages/${ packageName }/build-style/*.css`, + to: `./dist/${ packageName }/`, + flatten: true, + transform: content => content, + } ) ) + ), ], };