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 ), + } ); +} );