diff --git a/.babelrc b/.babelrc
index 10bd9d8bd1c..453a49dcbec 100644
--- a/.babelrc
+++ b/.babelrc
@@ -9,11 +9,14 @@
],
"plugins": [
"transform-object-rest-spread",
- "transform-react-jsx"
+ "transform-react-jsx",
+ "transform-async-generator-functions"
],
"env": {
"test": {
- "presets" : [["env"]]
+ "presets" : [
+ "@wordpress/default"
+ ]
},
"production": {
"plugins": [
@@ -24,7 +27,8 @@
}
],
"transform-object-rest-spread",
- "transform-react-jsx"
+ "transform-react-jsx",
+ "transform-async-generator-functions"
]
}
}
diff --git a/assets/src/components/selection/event-select/build-event-options.js b/assets/src/components/selection/event-select/build-event-options.js
new file mode 100644
index 00000000000..d13f55b936a
--- /dev/null
+++ b/assets/src/components/selection/event-select/build-event-options.js
@@ -0,0 +1,25 @@
+/**
+ * External dependencies
+ */
+import { reduce } from 'lodash';
+
+/**
+ * Receives an array of event entities and returns an array of simple objects
+ * that can be passed along to the options array used for the WordPress
+ * SelectControl component.
+ *
+ * @param { Array } events
+ * @return { Array } Returns an array of simple objects formatted for the
+ * WordPress SelectControl component.
+ */
+export const buildEventOptions = ( events ) => {
+ return reduce( events, function( options, event ) {
+ options.push(
+ {
+ label: event.EVT_name,
+ value: event.EVT_ID,
+ },
+ );
+ return options;
+ }, [] );
+};
diff --git a/assets/src/components/selection/event-select/index.js b/assets/src/components/selection/event-select/index.js
index 8fcd5726590..83e74360a6d 100644
--- a/assets/src/components/selection/event-select/index.js
+++ b/assets/src/components/selection/event-select/index.js
@@ -3,77 +3,79 @@
*/
import { stringify } from 'querystringify';
import moment from 'moment';
-import { isUndefined, pickBy, reduce, isEmpty } from 'lodash';
+import { isUndefined, pickBy, isEmpty } from 'lodash';
import PropTypes from 'prop-types';
/**
* WP dependencies
*/
-const { Component } = wp.element;
-const { Placeholder, SelectControl, withAPIData, Spinner } = wp.components;
-const { __ } = wp.i18n;
+import { Placeholder, SelectControl, Spinner } from '@wordpress/components';
+import { __ } from '@wordpress/i18n';
+import { withSelect } from '@wordpress/data';
-const nowDateAndTime = moment();
-
-const buildEventOptions = ( events ) => {
- reduce( events, function( options, event ) {
- options.push(
- {
- label: event.EVT_name,
- value: event.EVT_ID,
- },
- );
- return options;
- }, [] );
-};
+/**
+ * Internal dependencies
+ */
+import { buildEventOptions } from './build-event-options';
-export class EventSelect extends Component {
- render() {
- const {
- events = [],
- onEventSelect,
- selectLabel = __( 'Select Event' ),
- selectedEventId,
- isLoading = true,
- } = this.props;
- if ( isLoading || isEmpty( events ) ) {
- return
- { isLoading ?
- :
- __(
- 'There are no events to select from. You need to create an event first.',
- 'event_espresso'
- )
- }
- ;
- }
+const nowDateAndTime = moment();
- return onEventSelect( value ) }
- />;
+/**
+ * EventSelect component.
+ * A react component for an event selector.
+ *
+ * @param {Array} events An empty array or array of Event Entities. See
+ * prop-types for shape.
+ * @param {function} onEventSelect The callback on selection of event.
+ * @param {string} selectLabel The label for the select input.
+ * @param {number} selectedEventId If provided, the id of the event to
+ * pre-select.
+ * @param {boolean} isLoading Whether or not the selector should start in a
+ * loading state
+ * @return {Function} A pure component function.
+ * @constructor
+ */
+export const EventSelect = ( {
+ events,
+ onEventSelect,
+ selectLabel,
+ selectedEventId,
+ isLoading,
+} ) => {
+ if ( isLoading || isEmpty( events ) ) {
+ return
+ { isLoading ?
+ :
+ __(
+ 'There are no events to select from. You need to create an event first.',
+ 'event_espresso',
+ )
+ }
+ ;
}
-}
+
+ return onEventSelect( value ) }
+ />;
+};
/**
* @todo some of these proptypes are likely reusable in various place so we may
* want to consider extracting them into a separate file/object that can be
* included as needed.
- * @type {{events: *, onEventSelect, selectLabel: *, selectedEventId: *,
- * isLoading: *, attributes: {limit: *, orderBy: *, order: *, showExpired: *,
- * categorySlug: *, month: *}}}
*/
EventSelect.propTypes = {
- events: PropTypes.shape( {
+ events: PropTypes.arrayOf( PropTypes.shape( {
EVT_name: PropTypes.string.required,
EVT_ID: PropTypes.number.required,
- } ),
- onEventSelect: PropTypes.func.required,
+ } ) ),
+ onEventSelect: PropTypes.func,
selectLabel: PropTypes.string,
selectedEventId: PropTypes.number,
isLoading: PropTypes.bool,
@@ -101,6 +103,9 @@ EventSelect.defaultProps = {
order: 'desc',
showExpired: false,
},
+ selectLabel: __( 'Select Event', 'event_espresso' ),
+ isLoading: true,
+ events: [],
};
/**
@@ -112,7 +117,7 @@ EventSelect.defaultProps = {
* @param {string} orderBy
*
* @return { string } Returns an actual orderBy string for the REST query for
- * the provided alias
+ * the provided alias
*/
const mapOrderBy = ( orderBy ) => {
const orderByMap = {
@@ -121,9 +126,21 @@ const mapOrderBy = ( orderBy ) => {
ticket_start: 'Datetime.Ticket.TKT_start_date',
ticket_end: 'Datetime.Ticket.TKT_end_date',
};
- return isUndefined( orderByMap[ orderBy ] ) ? orderBy : orderByMap[ orderBy ];
+ return isUndefined( orderByMap[ orderBy ] ) ?
+ orderBy :
+ orderByMap[ orderBy ];
};
+/**
+ * Builds where conditions for an events endpoint request using provided
+ * information.
+ *
+ * @param {boolean} showExpired Whether or not to include expired events.
+ * @param {string} categorySlug Return events for the given categorySlug
+ * @param {string} month Return events for the given month. Can be any
+ * in any month format recognized by moment.
+ * @return {string} The assembled where conditions.
+ */
const whereConditions = ( { showExpired, categorySlug, month } ) => {
const where = [];
const GREATER_AND_EQUAL = encodeURIComponent( '>=' );
@@ -137,17 +154,27 @@ const whereConditions = ( { showExpired, categorySlug, month } ) => {
where.push( 'where[Term_Relationship.Term_Taxonomy.Term.slug]=' + categorySlug );
}
if ( month && month !== 'none' ) {
- where.push( 'where[Datetime.DTT_EVT_start][]=' + GREATER_AND_EQUAL + '&where[Datetime.DTT_EVT_start][]=' +
+ where.push( 'where[Datetime.DTT_EVT_start][]=' +
+ GREATER_AND_EQUAL +
+ '&where[Datetime.DTT_EVT_start][]=' +
moment().month( month ).startOf( 'month' ).local().format() );
- where.push( 'where[Datetime.DTT_EVT_end][]=' + LESS_AND_EQUAL + '&where[Datetime.DTT_EVT_end][]=' +
+ where.push( 'where[Datetime.DTT_EVT_end][]=' +
+ LESS_AND_EQUAL +
+ '&where[Datetime.DTT_EVT_end][]=' +
moment().month( month ).endOf( 'month' ).local().format() );
}
return where.join( '&' );
};
-export default withAPIData( ( props ) => {
- const { limit, order, orderBy } = props.attributes;
- const where = whereConditions( props.attributes );
+/**
+ * The EventSelect Component wrapped in the `withSelect` higher order component.
+ * This subscribes the EventSelect component to the state maintained via the
+ * eventespresso/lists store.
+ */
+export default withSelect( ( select, ownProps ) => {
+ const { limit, order, orderBy } = ownProps.attributes;
+ const where = whereConditions( ownProps.attributes );
+ const { getEvents, isRequestingEvents } = select( 'eventespresso/lists' );
const queryArgs = {
limit,
order,
@@ -160,9 +187,8 @@ export default withAPIData( ( props ) => {
if ( where ) {
queryString += '&' + where;
}
-
return {
- events: `/ee/v4.8.36/events?${ queryString }`,
- isLoading: false,
+ events: getEvents( queryString ),
+ isLoading: isRequestingEvents( queryString ),
};
} )( EventSelect );
diff --git a/assets/src/components/selection/event-select/test/__snapshots__/index.js.snap b/assets/src/components/selection/event-select/test/__snapshots__/index.js.snap
new file mode 100644
index 00000000000..c8160611ae6
--- /dev/null
+++ b/assets/src/components/selection/event-select/test/__snapshots__/index.js.snap
@@ -0,0 +1,40 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`EventSelect with 2 events should render and match snapshot 1`] = `
+<_class
+ label="Select Event"
+ onChange={[Function]}
+ options={
+ Array [
+ Object {
+ "label": "Event A",
+ "value": 1,
+ },
+ Object {
+ "label": "Event B",
+ "value": 2,
+ },
+ ]
+ }
+/>
+`;
+
+exports[`EventSelect with default options should render and match snapshot 1`] = `
+
+
+
+`;
+
+exports[`EventSelect with no events and finished loading should render and match snapshot 1`] = `
+
+ There are no events to select from. You need to create an event first.
+
+`;
diff --git a/assets/src/components/selection/event-select/test/index.js b/assets/src/components/selection/event-select/test/index.js
new file mode 100644
index 00000000000..c2e889bb37f
--- /dev/null
+++ b/assets/src/components/selection/event-select/test/index.js
@@ -0,0 +1,48 @@
+import { shallow, render } from 'enzyme';
+import { EventSelect } from '../index';
+
+const simulatedEventOptions = [
+ { EVT_ID: 1, EVT_name: 'Event A' },
+ { EVT_ID: 2, EVT_name: 'Event B' },
+];
+
+describe( 'EventSelect with default options', () => {
+ it( 'should render and match snapshot', () => {
+ const selector = shallow( );
+ expect( selector ).toMatchSnapshot();
+ } );
+} );
+
+describe( 'EventSelect with no events and finished loading', () => {
+ it( 'should render and match snapshot', () => {
+ const selector = shallow( );
+ expect( selector ).toMatchSnapshot();
+ } );
+} );
+
+describe( 'EventSelect with 2 events', () => {
+ const element = ;
+ it( 'should render and match snapshot', () => {
+ const selector = shallow( element );
+ expect( selector ).toMatchSnapshot();
+ } );
+ it( 'should render and have 2 options', () => {
+ const selector = render( element );
+ expect( selector.find( 'option' ) ).toHaveLength( 2 );
+ } );
+
+ it( 'should render and the first option has label and value matching the first siumlated event',
+ () => {
+ const selector = render( element );
+ const firstOption = selector.find( 'option' ).first();
+ expect( firstOption.text() )
+ .toEqual( simulatedEventOptions[ 0 ].EVT_name );
+ expect( firstOption.val() )
+ .toEqual( simulatedEventOptions[ 0 ].EVT_ID.toString() );
+ }
+ );
+} );
diff --git a/assets/src/data/ee-lists/actions.js b/assets/src/data/ee-lists/actions.js
new file mode 100644
index 00000000000..777075529c2
--- /dev/null
+++ b/assets/src/data/ee-lists/actions.js
@@ -0,0 +1,38 @@
+/**
+ * Returns an action object used in signalling that the request for a given
+ * model and query string has been made.
+ *
+ * @param { string } modelName
+ * @param { string } queryString Results are stored indexed by the query string
+ * generating them.
+ * @return {{type: string, modelName: string, queryString: string}} Object
+ * for action.
+ */
+export function setRequested( modelName, queryString ) {
+ return {
+ type: 'SET_REQUESTED',
+ modelName,
+ queryString,
+ };
+}
+
+/**
+ * Returns an action object used in updating the store with the provided items
+ * retrieved from a request using the given querystring.
+ *
+ * @param { string } modelName
+ * @param { string } queryString Results are stored indexed by the query
+ * string
+ * generating them.
+ * @param { Array } items Items returned from the query.
+ * @return {{type: string, modelName: string, queryString: string, items:
+ * Array}} Object for action.
+ */
+export function receiveResponse( modelName, queryString, items = [] ) {
+ return {
+ type: 'RECEIVE_LIST',
+ modelName,
+ queryString,
+ items,
+ };
+}
diff --git a/assets/src/data/ee-lists/index.js b/assets/src/data/ee-lists/index.js
new file mode 100644
index 00000000000..1efdc35339d
--- /dev/null
+++ b/assets/src/data/ee-lists/index.js
@@ -0,0 +1,21 @@
+/**
+ * WordPress dependencies
+ */
+import { registerStore } from '@wordpress/data';
+
+/**
+ * Internal dependencies
+ */
+import reducers from './reducers';
+import * as selectors from './selectors';
+import * as actions from './actions';
+import * as resolvers from './resolvers';
+
+const store = registerStore( 'eventespresso/lists', {
+ reducers,
+ actions,
+ selectors,
+ resolvers,
+} );
+
+export default store;
diff --git a/assets/src/data/ee-lists/reducers.js b/assets/src/data/ee-lists/reducers.js
new file mode 100644
index 00000000000..f42c059188b
--- /dev/null
+++ b/assets/src/data/ee-lists/reducers.js
@@ -0,0 +1,53 @@
+/**
+ * External dependencies
+ */
+import { reduce } from 'lodash';
+
+/**
+ * Internal dependencies
+ */
+import { endpoints } from '../model/endpoints';
+
+const DEFAULT_STATE = reduce( endpoints,
+ function( defaultState, endpoint, modelName ) {
+ defaultState[ modelName ] = [];
+ },
+ {},
+);
+
+/**
+ * Reducer managing item list state.
+ *
+ * @param {Object} state Current state.
+ * @param {Object} action Dispatched action.
+ * @return {Object} Updated state.
+ *
+ * @todo still need to work out how this will update/interact with the
+ * `eventespresso/core-data` store. We might want to have a special dispatched
+ * action for that?
+ */
+export function listItems( state = DEFAULT_STATE, action ) {
+ const { type, modelName, queryString, items = {} } = action;
+ switch ( type ) {
+ case 'SET_REQUESTED':
+ if ( ! state[ modelName ] || state[ modelName ].hasOwnProperty( queryString ) ) {
+ return state;
+ }
+ return {
+ ...state,
+ [ modelName ]: {
+ [ queryString ]: null,
+ },
+ };
+ case 'RECEIVE_LIST':
+ return {
+ ...state,
+ [ modelName ]: {
+ [ queryString ]: items,
+ },
+ };
+ }
+ return state;
+}
+
+export default listItems;
diff --git a/assets/src/data/ee-lists/resolvers.js b/assets/src/data/ee-lists/resolvers.js
new file mode 100644
index 00000000000..fdd0cab252c
--- /dev/null
+++ b/assets/src/data/ee-lists/resolvers.js
@@ -0,0 +1,49 @@
+/**
+ * WordPress dependencies
+ */
+import apiRequest from '@wordpress/api-request';
+
+/**
+ * Internal dependencies
+ */
+import { setRequested, receiveResponse } from './actions';
+import { applyQueryString } from '../model/endpoints';
+
+/**
+ * Resolver for generic items returned from an endpoint.
+ *
+ * @param {Object} state Data in state.
+ * @param {string} modelName The name of the model the items are for.
+ * @param {string} queryString Additional query string parameters passed on to
+ * the REST request.
+ */
+export async function * getItems( state, modelName, queryString ) {
+ if ( state[ modelName ] &&
+ state[ modelName ].hasOwnProperty( queryString ) &&
+ state[ modelName ][ queryString ] !== null
+ ) {
+ yield receiveResponse( modelName,
+ queryString,
+ state[ modelName ][ queryString ],
+ );
+ }
+ yield setRequested( modelName, queryString );
+ const items = await apiRequest( {
+ path: applyQueryString( modelName,
+ queryString,
+ ),
+ } );
+ yield receiveResponse( modelName, queryString, items );
+}
+
+/**
+ * Resolver for event entities.
+ *
+ * @param {Object} state Data in state.
+ * @param {string} queryString Additional query string parameters passed on to
+ * the REST request.
+ * @return {IterableIterator<*>} A async iterable.
+ */
+export function getEvents( state, queryString ) {
+ return getItems( state, 'event', queryString );
+}
diff --git a/assets/src/data/ee-lists/selectors.js b/assets/src/data/ee-lists/selectors.js
new file mode 100644
index 00000000000..3c5cade90f0
--- /dev/null
+++ b/assets/src/data/ee-lists/selectors.js
@@ -0,0 +1,51 @@
+/**
+ * Returns all the items for the given modelName and queryString
+ *
+ * @param {Object} state Data state.
+ * @param {string} modelName The model the items are being retrieved for.
+ * @param {string} queryString The query string for retrieving the items.
+ * @return {Array} Returns an array of items for the given model and query.
+ */
+export function getItems( state, modelName, queryString ) {
+ return state[ modelName ] && state[ modelName ][ queryString ] ?
+ state[ modelName ][ queryString ] :
+ [];
+}
+
+/**
+ * Returns whether the items for the given model name and query string are being
+ * requested.
+ *
+ * @param {Object} state Data state.
+ * @param {string} modelName The model the itesm are being requested for.
+ * @param {string} queryString The query string for the request
+ * @return {boolean} Whether items are being requested or not.
+ */
+export function isRequestingItems( state, modelName, queryString ) {
+ if ( state[ modelName ] && state[ modelName ][ queryString ] ) {
+ return state[ modelName ][ queryString ] === null;
+ }
+ return true;
+}
+
+/**
+ * Selector specific to events.
+ *
+ * @param {Object} state Data state.
+ * @param {string} queryString The query string for the request
+ * @return {Array} An array of event entities for the given model and query.
+ */
+export function getEvents( state, queryString ) {
+ return getItems( state, 'event', queryString );
+}
+
+/**
+ * Selector specific to events for checking if requesting events.
+ *
+ * @param {Object} state Data state.
+ * @param {string} queryString The query string for the request
+ * @return {boolean} Whether items are being requested or not.
+ */
+export function isRequestingEvents( state, queryString ) {
+ return isRequestingItems( state, 'event', queryString );
+}
diff --git a/assets/src/data/ee-lists/test/__mocks__/@wordpress/api-request.js b/assets/src/data/ee-lists/test/__mocks__/@wordpress/api-request.js
new file mode 100644
index 00000000000..6ee585673ed
--- /dev/null
+++ b/assets/src/data/ee-lists/test/__mocks__/@wordpress/api-request.js
@@ -0,0 +1 @@
+module.exports = jest.fn();
diff --git a/assets/src/data/ee-lists/test/reducers.js b/assets/src/data/ee-lists/test/reducers.js
new file mode 100644
index 00000000000..ff60b57ef0c
--- /dev/null
+++ b/assets/src/data/ee-lists/test/reducers.js
@@ -0,0 +1,68 @@
+/**
+ * External dependencies
+ */
+import deepFreeze from 'deep-freeze';
+
+/**
+ * Internal dependencies
+ */
+import { listItems } from '../reducers';
+
+describe( 'listItems()', () => {
+ it( 'returns an empty object by default', () => {
+ const state = listItems( undefined, {} );
+ expect( state ).toEqual( {} );
+ } );
+
+ it( 'assigns requested model and queryString to null (for known model)',
+ () => {
+ const originalState = deepFreeze( { event: {} } );
+ const state = listItems( originalState, {
+ type: 'SET_REQUESTED',
+ modelName: 'event',
+ queryString: '?some_value=1',
+ } );
+ expect( state ).toEqual( {
+ event: {
+ '?some_value=1': null,
+ },
+ } );
+ },
+ );
+ it( 'does not assign requested model and queryString to null for unknown model',
+ () => {
+ const originalState = deepFreeze( {} );
+ const state = listItems( originalState, {
+ type: 'SET_REQUESTED',
+ modelName: 'nonExistent',
+ queryString: '?some_value=1',
+ } );
+ expect( state ).toEqual( {} );
+ },
+ );
+ it( 'does not assign set the state for requested model and queryString to null for existing values already in state',
+ () => {
+ const originalState = deepFreeze( { event: { '?some_value=1': [] } } );
+ const state = listItems( originalState, {
+ type: 'SET_REQUESTED',
+ modelName: 'event',
+ queryString: '?some_value=1',
+ } );
+ expect( state ).toEqual( originalState );
+ },
+ );
+ it( 'returns with received events for known model', () => {
+ const originalState = deepFreeze( { event: {} } );
+ const state = listItems( originalState, {
+ type: 'RECEIVE_LIST',
+ modelName: 'event',
+ queryString: '?some_value=1',
+ items: [ { id: 1 } ],
+ } );
+ expect( state ).toEqual( {
+ event: {
+ '?some_value=1': [ { id: 1 } ],
+ },
+ } );
+ } );
+} );
diff --git a/assets/src/data/ee-lists/test/resolvers.js b/assets/src/data/ee-lists/test/resolvers.js
new file mode 100644
index 00000000000..d2af4861133
--- /dev/null
+++ b/assets/src/data/ee-lists/test/resolvers.js
@@ -0,0 +1,39 @@
+/**
+ * WordPress dependencies
+ */
+import apiRequest from '@wordpress/api-request';
+
+/**
+ * Internal dependencies
+ */
+import { getItems } from '../resolvers';
+import { setRequested, receiveResponse } from '../actions';
+
+jest.mock( '@wordpress/api-request' );
+jest.mock( '@eventespresso/eejs', () => ( {
+ data: {
+ collection_endpoints: { event: '/ee/v4.8.36/events' },
+ },
+} ) );
+
+describe( 'getItems', () => {
+ const EVENTS = [ { id: 1 } ];
+
+ beforeAll( () => {
+ apiRequest.mockImplementation( ( options ) => {
+ if ( options.path === '/ee/v4.8.36/events?some_event=1' ) {
+ return Promise.resolve( EVENTS );
+ }
+ } );
+ } );
+
+ it( 'yields with requested events', async () => {
+ const fulfillment = getItems( {}, 'event', 'some_event=1' );
+ const requested = ( await fulfillment.next() ).value;
+ expect( requested.type ).toBe( setRequested().type );
+ const received = ( await fulfillment.next() ).value;
+ expect( received ).toEqual(
+ receiveResponse( 'event', 'some_event=1', EVENTS ),
+ );
+ } );
+} );
diff --git a/assets/src/data/ee-lists/test/selectors.js b/assets/src/data/ee-lists/test/selectors.js
new file mode 100644
index 00000000000..d689195ae15
--- /dev/null
+++ b/assets/src/data/ee-lists/test/selectors.js
@@ -0,0 +1,63 @@
+/**
+ * External dependencies
+ */
+import deepFreeze from 'deep-freeze';
+
+/**
+ * Internal dependencies
+ */
+import { getItems, isRequestingItems } from '../selectors';
+
+describe( 'getItems()', () => {
+ const state = deepFreeze( {
+ event: {
+ 'some_query_string=1': [ { id: 1 } ],
+ },
+ } );
+ it( 'returns empty array when modelName or queryString not found in state',
+ () => {
+ expect( getItems( state, 'event', 'notPresent=0' ) ).toEqual( [] );
+ expect( getItems( state, 'invalid', 'some_query_string=1' ) )
+ .toEqual( [] );
+ },
+ );
+
+ it( 'returns value of model and queryString', () => {
+ expect( getItems( state, 'event', 'some_query_string=1' ) )
+ .toEqual( [ { id: 1 } ] );
+ } );
+} );
+
+describe( 'isRequestingItems', () => {
+ const state = deepFreeze( {
+ event: {
+ 'some_query_string=1': [ { id: 1 } ],
+ },
+ } );
+ it( 'returns true when invalid model name provided', () => {
+ expect( isRequestingItems( state, 'invalid', 'some_query_string=1' ) )
+ .toBe( true );
+ expect( isRequestingItems( state, 'event', 'invalid_query_string' ) )
+ .toBe( true );
+ } );
+ it( 'returns false when the provided arguments are set and there\'s a non null value in the state for them',
+ () => {
+ expect( isRequestingItems( state, 'event', 'some_query_string=1' ) )
+ .toBe( false );
+ },
+ );
+ it( 'returns true when the provided arguments are set and the value is null for them in the state',
+ () => {
+ const nullState = deepFreeze( {
+ event: {
+ 'some_query_string=1': null,
+ },
+ } );
+ expect( isRequestingItems( nullState,
+ 'event',
+ 'some_query_string=1',
+ ) )
+ .toBe( true );
+ },
+ );
+} );
diff --git a/assets/src/data/model/endpoints.js b/assets/src/data/model/endpoints.js
new file mode 100644
index 00000000000..5828240258a
--- /dev/null
+++ b/assets/src/data/model/endpoints.js
@@ -0,0 +1,43 @@
+/**
+ * External imports
+ */
+import { data, exception as GeneralException } from '@eventespresso/eejs';
+import { isUndefined } from 'lodash';
+
+/**
+ * WP Dependencies
+ */
+import { sprintf } from '@wordpress/i18n';
+
+export const { collection_endpoints: endpoints = {} } = data;
+
+/**
+ * Retrieves the endpoint for the provided model.
+ *
+ * @param {string} modelName What model to retrieve the endpoint for.
+ * @return {string} The endpoint for the provided model.
+ * @throws {GeneralException}
+ */
+const getEndpoint = ( modelName ) => {
+ if ( isUndefined( endpoints[ modelName ] ) ) {
+ throw new GeneralException(
+ sprintf(
+ 'There is no registered endpoint for the provided model name reference (%s)',
+ modelName,
+ ),
+ );
+ }
+ return endpoints[ modelName ];
+};
+
+/**
+ * Applies the provided queryString to the endpoint for the provided model name.
+ * @param {string} modelName What model the final string is for.
+ * @param {string} queryString The query being appended to the endpoint.
+ * @return {string} The final assembled query string.
+ */
+export const applyQueryString = ( modelName, queryString ) => {
+ return getEndpoint( modelName ) + '?' + queryString;
+};
+
+export default getEndpoint;
diff --git a/core/services/assets/Registry.php b/core/services/assets/Registry.php
index 0333bf1aacb..7f0476e41de 100644
--- a/core/services/assets/Registry.php
+++ b/core/services/assets/Registry.php
@@ -6,6 +6,7 @@
use EE_Error;
use EE_Registry;
use EE_Template_Config;
+use EED_Core_Rest_Api;
use EEH_Qtip_Loader;
use EventEspresso\core\domain\DomainInterface;
use EventEspresso\core\exceptions\InvalidFilePathException;
@@ -176,7 +177,10 @@ public function scripts()
true
);
$this->jsdata['eejs_api_nonce'] = wp_create_nonce('wp_rest');
- $this->jsdata['paths'] = array('rest_route' => rest_url('ee/v4.8.36/'));
+ $this->jsdata['paths'] = array(
+ 'rest_route' => rest_url('ee/v4.8.36/'),
+ 'collection_endpoints' => EED_Core_Rest_Api::getCollectionRoutesIndexedByModelName()
+ );
}
if (! is_admin()) {
$this->loadCoreCss();
diff --git a/modules/core_rest_api/EED_Core_Rest_Api.module.php b/modules/core_rest_api/EED_Core_Rest_Api.module.php
index c2de58aed7e..8bd1a457db9 100644
--- a/modules/core_rest_api/EED_Core_Rest_Api.module.php
+++ b/modules/core_rest_api/EED_Core_Rest_Api.module.php
@@ -1269,6 +1269,25 @@ public static function get_default_query_limit()
}
+ /**
+ *
+ * @param string $version api version string (i.e. '4.8.36')
+ * @return array
+ */
+ public static function getCollectionRoutesIndexedByModelName($version = '')
+ {
+ $version = empty($version) ? self::latest_rest_api_version() : $version;
+ $model_names = self::model_names_with_plural_routes($version);
+ $collection_routes = array();
+ foreach ($model_names as $model_name => $model_class_name) {
+ $collection_routes[strtolower($model_name)] = '/' . self::ee_api_namespace . $version . '/'
+ . EEH_Inflector::pluralize_and_lower($model_name);
+
+ }
+ return $collection_routes;
+ }
+
+
/**
* run - initial module setup
diff --git a/package-lock.json b/package-lock.json
index 9471bdf8bbe..0a6e94640b5 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -261,6 +261,21 @@
"resolved": "https://registry.npmjs.org/@types/node/-/node-10.0.0.tgz",
"integrity": "sha512-kctoM36XiNZT86a7tPsUje+Q/yl+dqELjtYApi0T5eOQ90Elhu0MI10rmYk44yEP4v1jdDvtjQ9DFtpRtHf2Bw=="
},
+ "@wordpress/a11y": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/@wordpress/a11y/-/a11y-1.0.6.tgz",
+ "integrity": "sha512-IyL7KzYGzMEg+FFyTrQzD/CUfABYCXOvmnm29vBZBA3JMER1ep3/+NFDe6CpWVEEMCw94oj2gUOSQ4YKVgDjUQ==",
+ "dev": true,
+ "requires": {
+ "@wordpress/dom-ready": "1.0.4"
+ }
+ },
+ "@wordpress/autop": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/@wordpress/autop/-/autop-1.0.4.tgz",
+ "integrity": "sha512-nqm/gP+ipeUMvEngh4Sp4k5umph8SPqfc5aCd9Ge03mz4JSWAIE4z36pPQwId0a1B3hGqri5Wo40O1hQ851ZnA==",
+ "dev": true
+ },
"@wordpress/babel-plugin-makepot": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/@wordpress/babel-plugin-makepot/-/babel-plugin-makepot-1.0.0.tgz",
@@ -303,6 +318,12 @@
"resolved": "https://registry.npmjs.org/@wordpress/dom-ready/-/dom-ready-1.0.4.tgz",
"integrity": "sha512-FxSH0A23Xs0t/ZcvfiQly7P1V3pKsHQGjja+oISKV2NosfIcWjc3JTDFZYLcKjmSREozKqMoqVIPY+h1CP2ehw=="
},
+ "@wordpress/hooks": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/@wordpress/hooks/-/hooks-1.1.6.tgz",
+ "integrity": "sha512-+7s5j296RTXRabaubvNK35ED/+WUYJgM8oeiHWP6RvPGd/2rkei3cI0SNwjBdaRrlNQ22vtzvCfhdDCyb9W1xQ==",
+ "dev": true
+ },
"@wordpress/i18n": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@wordpress/i18n/-/i18n-1.1.0.tgz",
@@ -422,12 +443,33 @@
}
}
},
+ "@wordpress/url": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@wordpress/url/-/url-1.0.3.tgz",
+ "integrity": "sha512-0nqf62SWS0DiFnSD5miszPuAey01OrBsdqBFzOCYChjtB7AZm+8Q06qpeV02rpLY5FHaUxVgL+2JRljYIAFlpA==",
+ "dev": true
+ },
+ "@wordpress/wordcount": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@wordpress/wordcount/-/wordcount-1.0.0.tgz",
+ "integrity": "sha512-N7JyhF+wdFDgDJbxZdscQ0vivdimvk/CjmNdonoSx4QHqgYfZOSSsFgpYg/rzeRBRFfT+e3RSu7LTdOZ/t54LA==",
+ "dev": true,
+ "requires": {
+ "lodash": "4.17.4"
+ }
+ },
"abab": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/abab/-/abab-1.0.4.tgz",
"integrity": "sha1-X6rZwsB/YN12dw9xzwJbYqY8/U4=",
"dev": true
},
+ "abbrev": {
+ "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
+ },
"acorn": {
"version": "5.5.3",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-5.5.3.tgz",
@@ -793,6 +835,12 @@
}
}
},
+ "autosize": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/autosize/-/autosize-4.0.1.tgz",
+ "integrity": "sha512-Sapd3XwNqZin0VW0DFiAGfgr9s2d1Sudj2+hnE/jj6aJUKXvlaimkY+FFB2Xzm3nfD7tCaMSC2jo4sVB2EOqpw==",
+ "dev": true
+ },
"aws-sign2": {
"version": "0.7.0",
"resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
@@ -1139,6 +1187,12 @@
"integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=",
"dev": true
},
+ "babel-plugin-syntax-async-generators": {
+ "version": "6.13.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz",
+ "integrity": "sha1-a8lj67FuzLrmuStZbrfzXDQqi5o=",
+ "dev": true
+ },
"babel-plugin-syntax-exponentiation-operator": {
"version": "6.13.0",
"resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz",
@@ -1162,6 +1216,17 @@
"integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=",
"dev": true
},
+ "babel-plugin-transform-async-generator-functions": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz",
+ "integrity": "sha1-8FiQAUX9PpkHpt3yjaWfIVJYpds=",
+ "dev": true,
+ "requires": {
+ "babel-helper-remap-async-to-generator": "6.24.1",
+ "babel-plugin-syntax-async-generators": "6.13.0",
+ "babel-runtime": "6.26.0"
+ }
+ },
"babel-plugin-transform-async-to-generator": {
"version": "6.24.1",
"resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz",
@@ -2254,6 +2319,17 @@
"integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=",
"dev": true
},
+ "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",
+ "tiny-emitter": "2.0.2"
+ }
+ },
"cliui": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz",
@@ -2410,6 +2486,12 @@
"resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
"integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY="
},
+ "computed-style": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/computed-style/-/computed-style-0.1.4.tgz",
+ "integrity": "sha1-fzRP2FhLLkJb7cpKGvwOMAuwXXQ=",
+ "dev": true
+ },
"concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
@@ -2512,6 +2594,16 @@
}
}
},
+ "config-chain": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.11.tgz",
+ "integrity": "sha1-q6CXR9++TD5w52am5BWG4YWfxvI=",
+ "dev": true,
+ "requires": {
+ "ini": "1.3.5",
+ "proto-list": "1.2.4"
+ }
+ },
"console-browserify": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz",
@@ -2527,6 +2619,12 @@
"integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=",
"dev": true
},
+ "contains-path": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz",
+ "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=",
+ "dev": true
+ },
"convert-source-map": {
"version": "1.5.1",
"resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz",
@@ -2553,9 +2651,10 @@
"integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40="
},
"core-js": {
- "version": "1.2.7",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz",
- "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY="
+ "version": "2.5.5",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.5.tgz",
+ "integrity": "sha1-sU3ek2xkDAV5prUMq8wTLdYSfjs=",
+ "dev": true
},
"core-util-is": {
"version": "1.0.2",
@@ -3063,6 +3162,12 @@
"lodash.isequal": "3.0.4"
}
},
+ "deep-freeze": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/deep-freeze/-/deep-freeze-0.0.1.tgz",
+ "integrity": "sha1-OgsABd4YZygZ39OM0x+RF5yJPoQ=",
+ "dev": true
+ },
"deep-is": {
"version": "0.1.3",
"resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
@@ -3151,6 +3256,12 @@
"integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
"dev": true
},
+ "delegate": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz",
+ "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==",
+ "dev": true
+ },
"des.js": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz",
@@ -3206,6 +3317,18 @@
"esutils": "2.0.2"
}
},
+ "dom-react": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/dom-react/-/dom-react-2.2.0.tgz",
+ "integrity": "sha1-3GJwYI7VbL35DJo+w1U/m1oL17M=",
+ "dev": true
+ },
+ "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
+ },
"dom-serializer": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz",
@@ -3281,12 +3404,48 @@
"jsbn": "0.1.1"
}
},
+ "editorconfig": {
+ "version": "0.13.3",
+ "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-0.13.3.tgz",
+ "integrity": "sha512-WkjsUNVCu+ITKDj73QDvi0trvpdDWdkDyHybDGSXPfekLCqwmpD7CP7iPbvBgosNuLcI96XTDwNa75JyFl7tEQ==",
+ "dev": true,
+ "requires": {
+ "bluebird": "3.5.1",
+ "commander": "2.15.1",
+ "lru-cache": "3.2.0",
+ "semver": "5.5.0",
+ "sigmund": "1.0.1"
+ },
+ "dependencies": {
+ "commander": {
+ "version": "2.15.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz",
+ "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==",
+ "dev": true
+ },
+ "lru-cache": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-3.2.0.tgz",
+ "integrity": "sha1-cXibO39Tmb7IVl3aOKow0qCX7+4=",
+ "dev": true,
+ "requires": {
+ "pseudomap": "1.0.2"
+ }
+ }
+ }
+ },
"electron-to-chromium": {
"version": "1.3.44",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.44.tgz",
"integrity": "sha1-72sVCmDVIwgjiMra2ICF7NL9RoQ=",
"dev": true
},
+ "element-closest": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/element-closest/-/element-closest-2.0.2.tgz",
+ "integrity": "sha1-cqdAoQdFM4LijfnOXbtajfD5Zuw=",
+ "dev": true
+ },
"elliptic": {
"version": "6.4.0",
"resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz",
@@ -3412,6 +3571,12 @@
"lodash": "4.17.4"
}
},
+ "equivalent-key-map": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/equivalent-key-map/-/equivalent-key-map-0.1.1.tgz",
+ "integrity": "sha512-VfHxntFFcApMyX3TTEQg+nuDPoiGgs1WfYm1JN+d9HUM6Shxp2d7LrMrDmdiybYZVs7U8HM9mqAHpwE9/X8pSQ==",
+ "dev": true
+ },
"errno": {
"version": "0.1.7",
"resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz",
@@ -3645,12 +3810,160 @@
"integrity": "sha1-UgEgbGlk1kgxUjLt9t+9LpJeTNY=",
"dev": true
},
+ "eslint-import-resolver-node": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz",
+ "integrity": "sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q==",
+ "dev": true,
+ "requires": {
+ "debug": "2.6.9",
+ "resolve": "1.7.1"
+ },
+ "dependencies": {
+ "resolve": {
+ "version": "1.7.1",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz",
+ "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==",
+ "dev": true,
+ "requires": {
+ "path-parse": "1.0.5"
+ }
+ }
+ }
+ },
+ "eslint-module-utils": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.2.0.tgz",
+ "integrity": "sha1-snA2LNiLGkitMIl2zn+lTphBF0Y=",
+ "dev": true,
+ "requires": {
+ "debug": "2.6.9",
+ "pkg-dir": "1.0.0"
+ },
+ "dependencies": {
+ "find-up": {
+ "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.1.0",
+ "pinkie-promise": "2.0.1"
+ }
+ },
+ "path-exists": {
+ "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.1"
+ }
+ },
+ "pkg-dir": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz",
+ "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=",
+ "dev": true,
+ "requires": {
+ "find-up": "1.1.2"
+ }
+ }
+ }
+ },
"eslint-plugin-i18n": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/eslint-plugin-i18n/-/eslint-plugin-i18n-1.2.0.tgz",
"integrity": "sha1-SfP0OA7e/oyHbwyXlh9lw6w3zao=",
"dev": true
},
+ "eslint-plugin-import": {
+ "version": "2.11.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.11.0.tgz",
+ "integrity": "sha1-Fa7qN6Z0mdhI6OmBgG1GJ7VQOBY=",
+ "dev": true,
+ "requires": {
+ "contains-path": "0.1.0",
+ "debug": "2.6.9",
+ "doctrine": "1.5.0",
+ "eslint-import-resolver-node": "0.3.2",
+ "eslint-module-utils": "2.2.0",
+ "has": "1.0.1",
+ "lodash": "4.17.4",
+ "minimatch": "3.0.4",
+ "read-pkg-up": "2.0.0",
+ "resolve": "1.7.1"
+ },
+ "dependencies": {
+ "doctrine": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz",
+ "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.2",
+ "isarray": "1.0.0"
+ }
+ },
+ "load-json-file": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz",
+ "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "parse-json": "2.2.0",
+ "pify": "2.3.0",
+ "strip-bom": "3.0.0"
+ }
+ },
+ "path-type": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz",
+ "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=",
+ "dev": true,
+ "requires": {
+ "pify": "2.3.0"
+ }
+ },
+ "read-pkg": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz",
+ "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=",
+ "dev": true,
+ "requires": {
+ "load-json-file": "2.0.0",
+ "normalize-package-data": "2.4.0",
+ "path-type": "2.0.0"
+ }
+ },
+ "read-pkg-up": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz",
+ "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=",
+ "dev": true,
+ "requires": {
+ "find-up": "2.1.0",
+ "read-pkg": "2.0.0"
+ }
+ },
+ "resolve": {
+ "version": "1.7.1",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz",
+ "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==",
+ "dev": true,
+ "requires": {
+ "path-parse": "1.0.5"
+ }
+ },
+ "strip-bom": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+ "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
+ "dev": true
+ }
+ }
+ },
"eslint-plugin-jest": {
"version": "21.15.1",
"resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-21.15.1.tgz",
@@ -4114,6 +4427,13 @@
"promise": "7.3.1",
"setimmediate": "1.0.5",
"ua-parser-js": "0.7.17"
+ },
+ "dependencies": {
+ "core-js": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz",
+ "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY="
+ }
}
},
"fetch-jsonp": {
@@ -4309,24 +4629,28 @@
"dependencies": {
"abbrev": {
"version": "1.1.1",
- "bundled": true,
+ "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",
- "bundled": true,
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
"dev": true
},
"aproba": {
"version": "1.2.0",
- "bundled": true,
+ "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",
- "bundled": true,
+ "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": {
@@ -4336,12 +4660,14 @@
},
"balanced-match": {
"version": "1.0.0",
- "bundled": true,
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
"dev": true
},
"brace-expansion": {
"version": "1.1.11",
- "bundled": true,
+ "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",
@@ -4350,34 +4676,40 @@
},
"chownr": {
"version": "1.0.1",
- "bundled": true,
+ "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",
- "bundled": true,
+ "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
+ "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
"dev": true
},
"concat-map": {
"version": "0.0.1",
- "bundled": true,
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
"dev": true
},
"console-control-strings": {
"version": "1.1.0",
- "bundled": true,
+ "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
+ "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=",
"dev": true
},
"core-util-is": {
"version": "1.0.2",
- "bundled": true,
+ "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",
- "bundled": true,
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"dev": true,
"optional": true,
"requires": {
@@ -4386,25 +4718,29 @@
},
"deep-extend": {
"version": "0.4.2",
- "bundled": true,
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz",
+ "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=",
"dev": true,
"optional": true
},
"delegates": {
"version": "1.0.0",
- "bundled": true,
+ "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
+ "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=",
"dev": true,
"optional": true
},
"detect-libc": {
"version": "1.0.3",
- "bundled": true,
+ "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",
- "bundled": true,
+ "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.5.tgz",
+ "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==",
"dev": true,
"optional": true,
"requires": {
@@ -4413,13 +4749,15 @@
},
"fs.realpath": {
"version": "1.0.0",
- "bundled": true,
+ "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",
- "bundled": true,
+ "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
+ "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=",
"dev": true,
"optional": true,
"requires": {
@@ -4435,7 +4773,8 @@
},
"glob": {
"version": "7.1.2",
- "bundled": true,
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
+ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
"dev": true,
"optional": true,
"requires": {
@@ -4449,13 +4788,15 @@
},
"has-unicode": {
"version": "2.0.1",
- "bundled": true,
+ "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",
- "bundled": true,
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.21.tgz",
+ "integrity": "sha512-En5V9za5mBt2oUA03WGD3TwDv0MKAruqsuxstbMUZaj9W9k/m1CV/9py3l0L5kw9Bln8fdHQmzHSYtvpvTLpKw==",
"dev": true,
"optional": true,
"requires": {
@@ -4464,7 +4805,8 @@
},
"ignore-walk": {
"version": "3.0.1",
- "bundled": true,
+ "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz",
+ "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==",
"dev": true,
"optional": true,
"requires": {
@@ -4473,7 +4815,8 @@
},
"inflight": {
"version": "1.0.6",
- "bundled": true,
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
"dev": true,
"optional": true,
"requires": {
@@ -4483,18 +4826,21 @@
},
"inherits": {
"version": "2.0.3",
- "bundled": true,
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
"dev": true
},
"ini": {
"version": "1.3.5",
- "bundled": true,
+ "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",
- "bundled": true,
+ "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.1"
@@ -4502,13 +4848,15 @@
},
"isarray": {
"version": "1.0.0",
- "bundled": true,
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
"dev": true,
"optional": true
},
"minimatch": {
"version": "3.0.4",
- "bundled": true,
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
"dev": true,
"requires": {
"brace-expansion": "1.1.11"
@@ -4516,12 +4864,14 @@
},
"minimist": {
"version": "0.0.8",
- "bundled": true,
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
+ "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
"dev": true
},
"minipass": {
"version": "2.2.4",
- "bundled": true,
+ "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",
@@ -4530,7 +4880,8 @@
},
"minizlib": {
"version": "1.1.0",
- "bundled": true,
+ "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.1.0.tgz",
+ "integrity": "sha512-4T6Ur/GctZ27nHfpt9THOdRZNgyJ9FZchYO1ceg5S8Q3DNLCKYy44nCZzgCJgcvx2UM8czmqak5BCxJMrq37lA==",
"dev": true,
"optional": true,
"requires": {
@@ -4539,7 +4890,8 @@
},
"mkdirp": {
"version": "0.5.1",
- "bundled": true,
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
+ "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
"dev": true,
"requires": {
"minimist": "0.0.8"
@@ -4547,13 +4899,15 @@
},
"ms": {
"version": "2.0.0",
- "bundled": true,
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
"dev": true,
"optional": true
},
"needle": {
"version": "2.2.0",
- "bundled": true,
+ "resolved": "https://registry.npmjs.org/needle/-/needle-2.2.0.tgz",
+ "integrity": "sha512-eFagy6c+TYayorXw/qtAdSvaUpEbBsDwDyxYFgLZ0lTojfH7K+OdBqAF7TAFwDokJaGpubpSGG0wO3iC0XPi8w==",
"dev": true,
"optional": true,
"requires": {
@@ -4564,7 +4918,8 @@
},
"node-pre-gyp": {
"version": "0.9.1",
- "bundled": true,
+ "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.9.1.tgz",
+ "integrity": "sha1-8RwHUW3ZL4cZnbx+GDjqt81WyeA=",
"dev": true,
"optional": true,
"requires": {
@@ -4582,7 +4937,8 @@
},
"nopt": {
"version": "4.0.1",
- "bundled": true,
+ "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz",
+ "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=",
"dev": true,
"optional": true,
"requires": {
@@ -4592,13 +4948,15 @@
},
"npm-bundled": {
"version": "1.0.3",
- "bundled": true,
+ "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",
- "bundled": true,
+ "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.1.10.tgz",
+ "integrity": "sha512-AQC0Dyhzn4EiYEfIUjCdMl0JJ61I2ER9ukf/sLxJUcZHfo+VyEfz2rMJgLZSS1v30OxPQe1cN0LZA1xbcaVfWA==",
"dev": true,
"optional": true,
"requires": {
@@ -4608,7 +4966,8 @@
},
"npmlog": {
"version": "4.1.2",
- "bundled": true,
+ "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz",
+ "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==",
"dev": true,
"optional": true,
"requires": {
@@ -4620,18 +4979,21 @@
},
"number-is-nan": {
"version": "1.0.1",
- "bundled": true,
+ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
"dev": true
},
"object-assign": {
"version": "4.1.1",
- "bundled": true,
+ "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",
- "bundled": true,
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
"dev": true,
"requires": {
"wrappy": "1.0.2"
@@ -4639,19 +5001,22 @@
},
"os-homedir": {
"version": "1.0.2",
- "bundled": true,
+ "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",
- "bundled": true,
+ "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",
- "bundled": true,
+ "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz",
+ "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==",
"dev": true,
"optional": true,
"requires": {
@@ -4661,19 +5026,22 @@
},
"path-is-absolute": {
"version": "1.0.1",
- "bundled": true,
+ "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",
- "bundled": true,
+ "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.6",
- "bundled": true,
+ "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.6.tgz",
+ "integrity": "sha1-6xiYnG1PTxYsOZ953dKfODVWgJI=",
"dev": true,
"optional": true,
"requires": {
@@ -4685,7 +5053,8 @@
"dependencies": {
"minimist": {
"version": "1.2.0",
- "bundled": true,
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+ "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
"dev": true,
"optional": true
}
@@ -4693,7 +5062,8 @@
},
"readable-stream": {
"version": "2.3.6",
- "bundled": true,
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
+ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
"dev": true,
"optional": true,
"requires": {
@@ -4708,7 +5078,8 @@
},
"rimraf": {
"version": "2.6.2",
- "bundled": true,
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
+ "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==",
"dev": true,
"optional": true,
"requires": {
@@ -4717,42 +5088,49 @@
},
"safe-buffer": {
"version": "5.1.1",
- "bundled": true,
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
+ "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==",
"dev": true
},
"safer-buffer": {
"version": "2.1.2",
- "bundled": true,
+ "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",
- "bundled": true,
+ "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",
- "bundled": true,
+ "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",
- "bundled": true,
+ "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",
- "bundled": true,
+ "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",
- "bundled": true,
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
"dev": true,
"requires": {
"code-point-at": "1.1.0",
@@ -4762,7 +5140,8 @@
},
"string_decoder": {
"version": "1.1.1",
- "bundled": true,
+ "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": {
@@ -4771,7 +5150,8 @@
},
"strip-ansi": {
"version": "3.0.1",
- "bundled": true,
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
"dev": true,
"requires": {
"ansi-regex": "2.1.1"
@@ -4779,13 +5159,15 @@
},
"strip-json-comments": {
"version": "2.0.1",
- "bundled": true,
+ "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",
- "bundled": true,
+ "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.1.tgz",
+ "integrity": "sha512-O+v1r9yN4tOsvl90p5HAP4AEqbYhx4036AGMm075fH9F8Qwi3oJ+v4u50FkT/KkvywNGtwkk0zRI+8eYm1X/xg==",
"dev": true,
"optional": true,
"requires": {
@@ -4800,13 +5182,15 @@
},
"util-deprecate": {
"version": "1.0.2",
- "bundled": true,
+ "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",
- "bundled": true,
+ "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": {
@@ -4815,12 +5199,14 @@
},
"wrappy": {
"version": "1.0.2",
- "bundled": true,
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
"dev": true
},
"yallist": {
"version": "3.0.2",
- "bundled": true,
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.2.tgz",
+ "integrity": "sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k=",
"dev": true
}
}
@@ -4933,6 +5319,15 @@
"pinkie-promise": "2.0.1"
}
},
+ "good-listener": {
+ "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.2.0"
+ }
+ },
"graceful-fs": {
"version": "4.1.11",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
@@ -4944,6 +5339,127 @@
"integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=",
"dev": true
},
+ "gutenberg": {
+ "version": "github:Wordpress/gutenberg#41594cda5800dae01cc9d244339eefb6b46c9ed6",
+ "dev": true,
+ "requires": {
+ "@wordpress/a11y": "1.0.6",
+ "@wordpress/autop": "1.0.4",
+ "@wordpress/hooks": "1.1.6",
+ "@wordpress/i18n": "1.1.0",
+ "@wordpress/url": "1.0.3",
+ "@wordpress/wordcount": "1.0.0",
+ "classnames": "2.2.5",
+ "clipboard": "1.7.1",
+ "dom-react": "2.2.0",
+ "dom-scroll-into-view": "1.2.1",
+ "element-closest": "2.0.2",
+ "equivalent-key-map": "0.1.1",
+ "escape-string-regexp": "1.0.5",
+ "eslint-plugin-wordpress": "git://github.com/WordPress-Coding-Standards/eslint-plugin-wordpress.git#1774343f6226052a46b081e01db3fca8793cc9f1",
+ "hpq": "1.2.0",
+ "jquery": "3.2.1",
+ "js-beautify": "1.6.14",
+ "lodash": "4.17.5",
+ "memize": "1.0.5",
+ "moment": "2.21.0",
+ "moment-timezone": "0.5.13",
+ "mousetrap": "1.6.1",
+ "prop-types": "15.5.10",
+ "querystringify": "1.0.0",
+ "re-resizable": "4.4.8",
+ "react": "16.3.0",
+ "react-autosize-textarea": "3.0.2",
+ "react-click-outside": "2.3.1",
+ "react-color": "2.13.4",
+ "react-datepicker": "0.61.0",
+ "react-dom": "16.3.0",
+ "redux": "3.7.2",
+ "redux-multi": "0.1.12",
+ "redux-optimist": "1.0.0",
+ "refx": "3.0.0",
+ "rememo": "2.4.0",
+ "shallowequal": "1.0.2",
+ "showdown": "1.7.4",
+ "simple-html-tokenizer": "0.4.1",
+ "tinycolor2": "1.4.1",
+ "uuid": "3.1.0"
+ },
+ "dependencies": {
+ "lodash": {
+ "version": "4.17.5",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz",
+ "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==",
+ "dev": true
+ },
+ "prop-types": {
+ "version": "15.5.10",
+ "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.5.10.tgz",
+ "integrity": "sha1-J5ffwxJhguOpXj37suiT3ddFYVQ=",
+ "dev": true,
+ "requires": {
+ "fbjs": "0.8.16",
+ "loose-envify": "1.3.1"
+ }
+ },
+ "react": {
+ "version": "16.3.0",
+ "resolved": "https://registry.npmjs.org/react/-/react-16.3.0.tgz",
+ "integrity": "sha512-Qh35tNbwY8SLFELkN3PCLO16EARV+lgcmNkQnoZXfzAF1ASRpeucZYUwBlBzsRAzTb7KyfBaLQ4/K/DLC6MYeA==",
+ "dev": true,
+ "requires": {
+ "fbjs": "0.8.16",
+ "loose-envify": "1.3.1",
+ "object-assign": "4.1.1",
+ "prop-types": "15.6.1"
+ },
+ "dependencies": {
+ "prop-types": {
+ "version": "15.6.1",
+ "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.1.tgz",
+ "integrity": "sha512-4ec7bY1Y66LymSUOH/zARVYObB23AT2h8cf6e/O6ZALB/N0sqZFEx7rq6EYPX2MkOdKORuooI/H5k9TlR4q7kQ==",
+ "dev": true,
+ "requires": {
+ "fbjs": "0.8.16",
+ "loose-envify": "1.3.1",
+ "object-assign": "4.1.1"
+ }
+ }
+ }
+ },
+ "react-dom": {
+ "version": "16.3.0",
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.3.0.tgz",
+ "integrity": "sha512-xT/FxawAurL6AV8YtAP7LkdDJFFX2vvv17AqFLQRF81ZtWLXkV/0dcAaiFIy0lmoQEFT931TU9aaH+5dBUxTcw==",
+ "dev": true,
+ "requires": {
+ "fbjs": "0.8.16",
+ "loose-envify": "1.3.1",
+ "object-assign": "4.1.1",
+ "prop-types": "15.6.1"
+ },
+ "dependencies": {
+ "prop-types": {
+ "version": "15.6.1",
+ "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.1.tgz",
+ "integrity": "sha512-4ec7bY1Y66LymSUOH/zARVYObB23AT2h8cf6e/O6ZALB/N0sqZFEx7rq6EYPX2MkOdKORuooI/H5k9TlR4q7kQ==",
+ "dev": true,
+ "requires": {
+ "fbjs": "0.8.16",
+ "loose-envify": "1.3.1",
+ "object-assign": "4.1.1"
+ }
+ }
+ }
+ },
+ "uuid": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz",
+ "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==",
+ "dev": true
+ }
+ }
+ },
"handlebars": {
"version": "4.0.11",
"resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz",
@@ -5120,6 +5636,12 @@
"resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.0.tgz",
"integrity": "sha512-lIbgIIQA3lz5XaB6vxakj6sDHADJiZadYEJB+FgA+C4nubM1NwcuvUr9EJPmnH1skZqpqUzWborWo8EIUi0Sdw=="
},
+ "hpq": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/hpq/-/hpq-1.2.0.tgz",
+ "integrity": "sha1-nGGLI5YqLXPW6Cugh0l4vLNov6I=",
+ "dev": true
+ },
"html-comment-regex": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.1.tgz",
@@ -5257,6 +5779,12 @@
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
"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
+ },
"inquirer": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz",
@@ -6544,12 +7072,30 @@
"merge-stream": "1.0.1"
}
},
+ "jquery": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.2.1.tgz",
+ "integrity": "sha1-XE2d5lKvbNCncBVKYxu6ErAVx4c=",
+ "dev": true
+ },
"js-base64": {
"version": "2.4.3",
"resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.3.tgz",
"integrity": "sha512-H7ErYLM34CvDMto3GbD6xD0JLUGYXR3QTcH6B/tr4Hi/QpSThnCsIp+Sy5FRTw3B0d6py4HcNkW7nO/wdtGWEw==",
"dev": true
},
+ "js-beautify": {
+ "version": "1.6.14",
+ "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.6.14.tgz",
+ "integrity": "sha1-07j3Mi0CuSd9WL0jgmTDJ+WARM0=",
+ "dev": true,
+ "requires": {
+ "config-chain": "1.1.11",
+ "editorconfig": "0.13.3",
+ "mkdirp": "0.5.1",
+ "nopt": "3.0.6"
+ }
+ },
"js-tokens": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
@@ -6739,6 +7285,15 @@
"type-check": "0.3.2"
}
},
+ "line-height": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/line-height/-/line-height-0.3.1.tgz",
+ "integrity": "sha1-SxIF7d4YKHKl76PI9iCzGHqcVMk=",
+ "dev": true,
+ "requires": {
+ "computed-style": "0.1.4"
+ }
+ },
"load-json-file": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
@@ -7057,6 +7612,12 @@
"object-visit": "1.0.1"
}
},
+ "material-colors": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/material-colors/-/material-colors-1.2.5.tgz",
+ "integrity": "sha1-UpJZPmdUyxvMK5gDDk4Najr8nqE=",
+ "dev": true
+ },
"math-expression-evaluator": {
"version": "1.2.17",
"resolved": "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz",
@@ -7236,6 +7797,27 @@
"minimist": "0.0.8"
}
},
+ "moment": {
+ "version": "2.21.0",
+ "resolved": "https://registry.npmjs.org/moment/-/moment-2.21.0.tgz",
+ "integrity": "sha512-TCZ36BjURTeFTM/CwRcViQlfkMvL1/vFISuNLO5GkcVm1+QHfbSiNqZuWeMFjj1/3+uAjXswgRk30j1kkLYJBQ==",
+ "dev": true
+ },
+ "moment-timezone": {
+ "version": "0.5.13",
+ "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.13.tgz",
+ "integrity": "sha1-mc5cfYJyYusPH3AgRBd/YHRde5A=",
+ "dev": true,
+ "requires": {
+ "moment": "2.21.0"
+ }
+ },
+ "mousetrap": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/mousetrap/-/mousetrap-1.6.1.tgz",
+ "integrity": "sha1-KghfXHUSlMdefoH27CVFspy/Qtk=",
+ "dev": true
+ },
"move-concurrently": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz",
@@ -7391,6 +7973,15 @@
"underscore": "1.4.4"
}
},
+ "nopt": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
+ "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=",
+ "dev": true,
+ "requires": {
+ "abbrev": "1.1.1"
+ }
+ },
"normalize-package-data": {
"version": "2.4.0",
"resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz",
@@ -7824,6 +8415,29 @@
"resolved": "https://registry.npmjs.org/pegjs/-/pegjs-0.10.0.tgz",
"integrity": "sha1-z4uvrm7d/0tafvsYUmnqr0YQ3b0="
},
+ "pegjs-loader": {
+ "version": "0.5.4",
+ "resolved": "https://registry.npmjs.org/pegjs-loader/-/pegjs-loader-0.5.4.tgz",
+ "integrity": "sha512-ViH8WwUkc/N8H59zuarORrgCi7uxn+gDIq+Ydriw1GFJi/oUg2xvhsgDDujO6dAxRsxXMgqWESx6TKYIqHorqA==",
+ "dev": true,
+ "requires": {
+ "loader-utils": "0.2.17"
+ },
+ "dependencies": {
+ "loader-utils": {
+ "version": "0.2.17",
+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz",
+ "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=",
+ "dev": true,
+ "requires": {
+ "big.js": "3.2.0",
+ "emojis-list": "2.1.0",
+ "json5": "0.5.1",
+ "object-assign": "4.1.1"
+ }
+ }
+ }
+ },
"performance-now": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
@@ -7868,6 +8482,12 @@
"integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==",
"dev": true
},
+ "popper.js": {
+ "version": "1.14.3",
+ "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.14.3.tgz",
+ "integrity": "sha1-FDj5jQRqz3tNeM1QK/QYrGTU8JU=",
+ "dev": true
+ },
"posix-character-classes": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
@@ -9799,6 +10419,12 @@
"object-assign": "4.1.1"
}
},
+ "proto-list": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz",
+ "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=",
+ "dev": true
+ },
"prr": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
@@ -9958,6 +10584,12 @@
"integrity": "sha1-DD0L6u2KAclm2Xh793goElKpeao=",
"dev": true
},
+ "re-resizable": {
+ "version": "4.4.8",
+ "resolved": "https://registry.npmjs.org/re-resizable/-/re-resizable-4.4.8.tgz",
+ "integrity": "sha512-5Nm4FL5wz41/5SYz8yJIM1kCcftxNPXxv3Yfa5qhkrGasHPgYzmzbbu1pcYM9vuCHog79EVwKWuz7zxDH52Gfw==",
+ "dev": true
+ },
"react": {
"version": "16.3.2",
"resolved": "https://registry.npmjs.org/react/-/react-16.3.2.tgz",
@@ -9969,6 +10601,91 @@
"prop-types": "15.6.1"
}
},
+ "react-autosize-textarea": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/react-autosize-textarea/-/react-autosize-textarea-3.0.2.tgz",
+ "integrity": "sha1-K2hApp9xOHGavOpaQp7PcwF2jAc=",
+ "dev": true,
+ "requires": {
+ "autosize": "4.0.1",
+ "line-height": "0.3.1",
+ "prop-types": "15.6.1"
+ }
+ },
+ "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"
+ },
+ "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
+ }
+ }
+ },
+ "react-color": {
+ "version": "2.13.4",
+ "resolved": "https://registry.npmjs.org/react-color/-/react-color-2.13.4.tgz",
+ "integrity": "sha512-rNJTTxMPTImI1NpFaKLggDIvHgKOYRXj0krVh8c+Mo1YNsrLko8O94yiFqqdnSQgtIPteiAcGEJgBo9V5+uqaw==",
+ "dev": true,
+ "requires": {
+ "lodash": "4.17.4",
+ "material-colors": "1.2.5",
+ "prop-types": "15.6.1",
+ "reactcss": "1.2.3",
+ "tinycolor2": "1.4.1"
+ }
+ },
+ "react-datepicker": {
+ "version": "0.61.0",
+ "resolved": "https://registry.npmjs.org/react-datepicker/-/react-datepicker-0.61.0.tgz",
+ "integrity": "sha512-FJnqJCbYaU1ca7Jn9LaJ7iKTYHKAskVkVHCsOBDQd8vJZrESLAu3rtPbj3T6IB++dQO7qb0IlcCXtmC0geIAGA==",
+ "dev": true,
+ "requires": {
+ "classnames": "2.2.5",
+ "eslint-plugin-import": "2.11.0",
+ "eslint-plugin-node": "5.2.1",
+ "moment": "2.21.0",
+ "prop-types": "15.6.1",
+ "react-onclickoutside": "6.7.1",
+ "react-popper": "0.7.5"
+ },
+ "dependencies": {
+ "eslint-plugin-node": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-5.2.1.tgz",
+ "integrity": "sha512-xhPXrh0Vl/b7870uEbaumb2Q+LxaEcOQ3kS1jtIXanBAwpMre1l5q/l2l/hESYJGEFKuI78bp6Uw50hlpr7B+g==",
+ "dev": true,
+ "requires": {
+ "ignore": "3.3.8",
+ "minimatch": "3.0.4",
+ "resolve": "1.7.1",
+ "semver": "5.3.0"
+ }
+ },
+ "resolve": {
+ "version": "1.7.1",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz",
+ "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==",
+ "dev": true,
+ "requires": {
+ "path-parse": "1.0.5"
+ }
+ },
+ "semver": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz",
+ "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=",
+ "dev": true
+ }
+ }
+ },
"react-dom": {
"version": "16.3.2",
"resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.3.2.tgz",
@@ -10001,6 +10718,22 @@
"warning": "3.0.0"
}
},
+ "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
+ },
+ "react-popper": {
+ "version": "0.7.5",
+ "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-0.7.5.tgz",
+ "integrity": "sha512-ya9dhhGCf74JTOB2uyksEHhIGw7w9tNZRUJF73lEq2h4H5JT6MBa4PdT4G+sx6fZwq+xKZAL/sVNAIuojPn7Dg==",
+ "dev": true,
+ "requires": {
+ "popper.js": "1.14.3",
+ "prop-types": "15.6.1"
+ }
+ },
"react-reconciler": {
"version": "0.7.0",
"resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.7.0.tgz",
@@ -10043,6 +10776,15 @@
"react-is": "16.3.2"
}
},
+ "reactcss": {
+ "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.17.4"
+ }
+ },
"read-pkg": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
@@ -10183,6 +10925,24 @@
"symbol-observable": "1.2.0"
}
},
+ "redux-multi": {
+ "version": "0.1.12",
+ "resolved": "https://registry.npmjs.org/redux-multi/-/redux-multi-0.1.12.tgz",
+ "integrity": "sha1-KOH+XklnLLxb2KB/Cyrq8O+DVcI=",
+ "dev": true
+ },
+ "redux-optimist": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/redux-optimist/-/redux-optimist-1.0.0.tgz",
+ "integrity": "sha512-AG1v8o6UZcGXTEH2jVcWG6KD+gEix+Cj9JXAAzln9MPkauSVd98H7N7EOOyT/v4c9N1mJB4sm1zfspGlLDkUEw==",
+ "dev": true
+ },
+ "refx": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/refx/-/refx-3.0.0.tgz",
+ "integrity": "sha512-qmd73YvYiVWfKPECtE90ujmPwwtAnmtEOkBKgfNEuqJ4trTeKbqFV2UY878yFvHBvU7BBu4/w/Q8pk/t0zDpYA==",
+ "dev": true
+ },
"regenerate": {
"version": "1.3.3",
"resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.3.tgz",
@@ -10263,6 +11023,15 @@
}
}
},
+ "rememo": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/rememo/-/rememo-2.4.0.tgz",
+ "integrity": "sha512-4rqlLATPcha9lfdvylUWqSbceiTlYiBJvEJAyUiT/68cYPlNG1zXf7ABeve7s4YPrT6o3Q6zfN6n38ecAL71lw==",
+ "dev": true,
+ "requires": {
+ "shallow-equal": "1.0.0"
+ }
+ },
"remove-trailing-separator": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
@@ -10562,6 +11331,12 @@
"resolved": "https://registry.npmjs.org/scrollbar-width/-/scrollbar-width-3.1.1.tgz",
"integrity": "sha1-xi5j76WTTaw3tD2jT3VQysqERKI="
},
+ "select": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz",
+ "integrity": "sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0=",
+ "dev": true
+ },
"semver": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz",
@@ -10621,6 +11396,18 @@
"safe-buffer": "5.1.2"
}
},
+ "shallow-equal": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/shallow-equal/-/shallow-equal-1.0.0.tgz",
+ "integrity": "sha1-UI0YOLPeWQq4dXsBGyXkMJAJRfc=",
+ "dev": true
+ },
+ "shallowequal": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.0.2.tgz",
+ "integrity": "sha512-zlVXeVUKvo+HEv1e2KQF/csyeMKx2oHvatQ9l6XjCUj3agvC8XGf6R9HvIPDSmp8FNPvx7b5kaEJTRi7CqxtEw==",
+ "dev": true
+ },
"shebang-command": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
@@ -10642,12 +11429,152 @@
"integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==",
"dev": true
},
+ "showdown": {
+ "version": "1.7.4",
+ "resolved": "https://registry.npmjs.org/showdown/-/showdown-1.7.4.tgz",
+ "integrity": "sha1-a7yd0s2x5f3XSeza3GpHuFZZSuA=",
+ "dev": true,
+ "requires": {
+ "yargs": "8.0.2"
+ },
+ "dependencies": {
+ "camelcase": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
+ "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
+ "dev": true
+ },
+ "cliui": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
+ "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=",
+ "dev": true,
+ "requires": {
+ "string-width": "1.0.2",
+ "strip-ansi": "3.0.1",
+ "wrap-ansi": "2.1.0"
+ },
+ "dependencies": {
+ "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.1.0",
+ "is-fullwidth-code-point": "1.0.0",
+ "strip-ansi": "3.0.1"
+ }
+ }
+ }
+ },
+ "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.1"
+ }
+ },
+ "load-json-file": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz",
+ "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "parse-json": "2.2.0",
+ "pify": "2.3.0",
+ "strip-bom": "3.0.0"
+ }
+ },
+ "path-type": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz",
+ "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=",
+ "dev": true,
+ "requires": {
+ "pify": "2.3.0"
+ }
+ },
+ "read-pkg": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz",
+ "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=",
+ "dev": true,
+ "requires": {
+ "load-json-file": "2.0.0",
+ "normalize-package-data": "2.4.0",
+ "path-type": "2.0.0"
+ }
+ },
+ "read-pkg-up": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz",
+ "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=",
+ "dev": true,
+ "requires": {
+ "find-up": "2.1.0",
+ "read-pkg": "2.0.0"
+ }
+ },
+ "strip-bom": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+ "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
+ "dev": true
+ },
+ "yargs": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz",
+ "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=",
+ "dev": true,
+ "requires": {
+ "camelcase": "4.1.0",
+ "cliui": "3.2.0",
+ "decamelize": "1.2.0",
+ "get-caller-file": "1.0.2",
+ "os-locale": "2.1.0",
+ "read-pkg-up": "2.0.0",
+ "require-directory": "2.1.1",
+ "require-main-filename": "1.0.1",
+ "set-blocking": "2.0.0",
+ "string-width": "2.1.1",
+ "which-module": "2.0.0",
+ "y18n": "3.2.1",
+ "yargs-parser": "7.0.0"
+ }
+ },
+ "yargs-parser": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz",
+ "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=",
+ "dev": true,
+ "requires": {
+ "camelcase": "4.1.0"
+ }
+ }
+ }
+ },
+ "sigmund": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz",
+ "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=",
+ "dev": 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
},
+ "simple-html-tokenizer": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/simple-html-tokenizer/-/simple-html-tokenizer-0.4.1.tgz",
+ "integrity": "sha1-AomIu3/osuZkVnbYIFJYfUQLAtM=",
+ "dev": true
+ },
"slash": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz",
@@ -11211,6 +12138,12 @@
"setimmediate": "1.0.5"
}
},
+ "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
+ },
"tinycolor2": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.1.tgz",
diff --git a/package.json b/package.json
index 1732caaab47..2e606c7f85f 100644
--- a/package.json
+++ b/package.json
@@ -37,13 +37,16 @@
"babel-core": "^6.26.3",
"babel-eslint": "^8.2.2",
"babel-loader": "^7.1.2",
+ "babel-plugin-transform-async-generator-functions": "^6.24.1",
"babel-plugin-transform-react-jsx": "^6.24.1",
"babel-polyfill": "^6.26.0",
"clean-webpack-plugin": "^0.1.18",
"codecov": "^3.0.1",
"concurrently": "^3.5.1",
+ "core-js": "^2.5.5",
"cross-env": "^5.1.4",
"css-loader": "^0.28.11",
+ "deep-freeze": "0.0.1",
"eslint": "^4.19.1",
"eslint-config-wordpress": "^2.0.0",
"eslint-plugin-jest": "^21.15.1",
@@ -51,7 +54,9 @@
"eslint-plugin-react": "^7.7.0",
"eslint-plugin-wordpress": "git://github.com/WordPress-Coding-Standards/eslint-plugin-wordpress.git#1774343f6226052a46b081e01db3fca8793cc9f1",
"extract-text-webpack-plugin": "^3.0.2",
+ "gutenberg": "Wordpress/gutenberg#master",
"pegjs": "^0.10.0",
+ "pegjs-loader": "^0.5.4",
"postcss-loader": "^2.1.3",
"raw-loader": "^0.5.1",
"react-test-renderer": "^16.3.1",
diff --git a/tests/javascript-config/unit/jest.config.json b/tests/javascript-config/unit/jest.config.json
index ba132b93dec..5db3e4a909c 100644
--- a/tests/javascript-config/unit/jest.config.json
+++ b/tests/javascript-config/unit/jest.config.json
@@ -6,15 +6,23 @@
"!**/vendor/**",
"!**/test/**"
],
+ "moduleDirectories": ["node_modules"],
"moduleNameMapper": {
- "@eventespresso\\/(eejs)": "$1"
+ "@eventespresso\\/(eejs)": "assets/src/$1",
+ "@wordpress\\/(blocks|components|date|editor|element|data|utils|edit-post|viewport|plugins|core-data)": "/node_modules/gutenberg/$1",
+ "tinymce": "/tests/javascript-config/unit/mocks/tinymce",
+ "@wordpress/i18n": "/tests/javascript-config/unit/mocks/i18n"
},
"setupFiles": [
- "/tests/javascript-config/unit/setup-globals.js"
+ "core-js/fn/symbol/async-iterator",
+ "/tests/javascript-config/unit/setup-globals"
],
"preset": "@wordpress/jest-preset-default",
"testPathIgnorePatterns": [
"/node_modules/",
"/test/e2e"
+ ],
+ "transformIgnorePatterns": [
+ "node_modules/(?!(gutenberg)/)"
]
}
diff --git a/tests/javascript-config/unit/mocks/i18n.js b/tests/javascript-config/unit/mocks/i18n.js
new file mode 100644
index 00000000000..aaaf9e1f276
--- /dev/null
+++ b/tests/javascript-config/unit/mocks/i18n.js
@@ -0,0 +1,5 @@
+module.exports = {
+ __ : (string) => {
+ return string;
+ }
+};
diff --git a/tests/javascript-config/unit/mocks/tinymce.js b/tests/javascript-config/unit/mocks/tinymce.js
new file mode 100644
index 00000000000..6ee585673ed
--- /dev/null
+++ b/tests/javascript-config/unit/mocks/tinymce.js
@@ -0,0 +1 @@
+module.exports = jest.fn();
diff --git a/tests/javascript-config/unit/setup-globals.js b/tests/javascript-config/unit/setup-globals.js
index f1abdf83b22..d752880c3b7 100644
--- a/tests/javascript-config/unit/setup-globals.js
+++ b/tests/javascript-config/unit/setup-globals.js
@@ -7,4 +7,31 @@ global.eejsdata = {
data: {
testData: true
},
-};
\ No newline at end of file
+};
+
+// Set up `wp.*` aliases. Doing this because any tests importing wp stuff will
+// likely run into this.
+global.wp = {
+ shortcode: {
+ next() {},
+ regexp: jest.fn().mockReturnValue( new RegExp() ),
+ },
+};
+
+[
+ 'element',
+ 'components',
+ 'utils',
+ 'blocks',
+ 'date',
+ 'editor',
+ 'data',
+ 'core-data',
+ 'edit-post',
+ 'viewport',
+ 'plugins',
+].forEach( entryPointName => {
+ Object.defineProperty( global.wp, entryPointName, {
+ get: () => require( 'gutenberg/' + entryPointName ),
+ } );
+} );