From f08991844b68642ef3be958be6df81337da858c3 Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Thu, 25 May 2017 15:57:02 -0400 Subject: [PATCH 001/105] Setting up changelog for v0.2.0 --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 704b832..ea690a1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,13 @@ All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](http://semver.org/). +## [0.2.0] - 2017-05-17 - Ember v2.X.X +### Added + +### Changed + +### Fixed + ## [0.1.0] - 2016-08-31 - Ember pre v1.13.10 ### Added - Initial base version built to support JSON API v1.0. From 6e46f3d3b72bbcd4eb4423c79f1abf90c8adccd3 Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Thu, 25 May 2017 15:58:25 -0400 Subject: [PATCH 002/105] Correct changelog entries under new tag --- CHANGELOG.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ea690a1..5e06f64 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,8 +4,11 @@ This project adheres to [Semantic Versioning](http://semver.org/). ## [0.2.0] - 2017-05-17 - Ember v2.X.X ### Added +- Adds ability to set column filter/sort independently. ### Changed +- Upgrades ember-power-select to 1.4.3, may require refactoring of `class` to `triggerClass` if applicable. +- Upgrade ember and ember-cli to 2.10.0 ### Fixed @@ -21,14 +24,11 @@ This project adheres to [Semantic Versioning](http://semver.org/). - Add subcomponent to change the table limit/count. - Setup `autoHide` computed property to conditionally hide the limit dropdown if the results are smaller than the smallest pagination limit. - Adds ability to persist data across transitions, setting `persistFiltering: true` and sharing the `filter`/`sort` properties with a controller/service. -- Adds ability to set column filter/sort independently. ### Changed - Update legacy name references in README.md. - Removed ember-canary from ember-try testing scenarios. - Removed ember-beta from ember-try testing scenarios. -- Upgrades ember-power-select to 1.4.3, may require refactoring of `class` to `triggerClass` if applicable. -- Upgrade ember and ember-cli to 2.10.0 ### Fixed - Fix erring ember try in ember-canary, properly remove component element wrapper. From 386457d9420f03ea50ac8bbd5c47c9aaeaf375bb Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Fri, 26 May 2017 00:26:37 -0400 Subject: [PATCH 003/105] Setup yuidocs and slim down README in favor of API documentation --- .gitignore | 1 + CHANGELOG.md | 1 + README.md | 217 ++++++++++++--------------------------------------- package.json | 1 + yuidoc.json | 19 +++++ 5 files changed, 74 insertions(+), 165 deletions(-) create mode 100644 yuidoc.json diff --git a/.gitignore b/.gitignore index 5ad14dd..576aad4 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,4 @@ /libpeerconnection.log npm-debug.log* testem.log +/docs/* diff --git a/CHANGELOG.md b/CHANGELOG.md index 5e06f64..668cc30 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ This project adheres to [Semantic Versioning](http://semver.org/). ## [0.2.0] - 2017-05-17 - Ember v2.X.X ### Added - Adds ability to set column filter/sort independently. +- Add support for YUIDocs for better API documentation. ### Changed - Upgrades ember-power-select to 1.4.3, may require refactoring of `class` to `triggerClass` if applicable. diff --git a/README.md b/README.md index e79089f..76d6873 100644 --- a/README.md +++ b/README.md @@ -34,6 +34,7 @@ You have full control over your table's `tbody` content. We are setting this to {{row.emailAddress}} {{row.firstName}} {{row.lastName}} + {{row.updatedAt}} {{#link-to "index" class="btn btn-xs" role="button"}} Edit @@ -75,10 +76,15 @@ export default Ember.Controller.extend({ label: 'Last Updated', type: 'date', }, + { + label: 'Actions', + }, ], }); ``` +* Reference the [API specs/documentation](/docs/index.html) for more information and for advanced usage. + ### Request Format Ember Tabular sticks very closely to jsonapi spec, a few examples of requests: @@ -90,93 +96,6 @@ Ember Tabular sticks very closely to jsonapi spec, a few examples of requests: * `sort` - Sort based on jsonapi's recommended sorting: http://jsonapi.org/format/#fetching-sorting * Ascending unless prefixed with `-` for descending. -## Advanced Usage -### Template -```hbs -{{#ember-tabular - columns=columns - modelName="user" - record=users - class="table-default" - tableClass="table-bordered table-hover table-striped" - staticParams=staticParams - as |section|}} - ... -{{/ember-tabular}} -``` -* `makeRequest` - boolean/string - Default: true - * If `true`: Ember Tabular will make request based on `modelName`. - * If `false`: Typically you'd bind the route's model to `record`. -* `class` - string - * Wraps the entire component. -* `tableClass` - string - Default: "table-bordered table-hover" - * Wraps only the `` and replaces defaults if provided. -* `staticParams` - object - Default: null - * Object to pass in static query-params that will not change based on any filter/sort criteria, ex. additional table-wide filters that need to be applied in all requests `?filter[is-open]=1`. - - ```js - // app/controllers/location.js - - export default Ember.Controller.extend({ - staticParams: Ember.computed('model', function() { - return { - 'filter[is-open]': '1', - 'include': 'hours', - }; - }), - ... - }); - ``` -* `tableLoadedMessage` - string - Default: "No Data." - * In some cases when the API response is loaded but does not contain any data "No Data." will not apply, on a case by case basis you can override this. For example, if you'd like to prompt the user to do some kind of action. "No data, select a different product". - -### Controller -```js -export default Ember.Controller.extend({ - users: null, - columns: [ - { - property: 'username', - label: 'Username', - defaultSort: 'username', - type: 'text', - }, - { - property: 'emailAddress', - label: 'Email', - type: 'text', - }, - { - property: 'firstName', - label: 'First Name', - type: 'text', - }, - { - property: 'lastName', - label: 'Last Name', - type: 'text', - }, - { - property: 'updatedAt', - label: 'Last Updated', - type: 'date', - }, - ], -}); -``` -* `columns.property` - string - * Required for column filtering/sorting - * Properties should be in camelCase format -* `columns.label` - string - * Required in all use-cases -* `columns.type` - string - Default: text - * Sets the filter `` -* `columns.sort` - boolean - Default: true - * Required for column sorting -* `columns.defaultSort` - string - * Initial sort value for API request - * Will be overridden with any sorting changes - ### Template - Yields ```hbs {{#ember-tabular columns=columns record=users as |section|}} @@ -206,26 +125,6 @@ Typically the global filter component would be rendered into the `{{yield header filterProperty="username" filterPlaceholder="Search by Username"}} ``` -* `filter` - object - Default: null - * Required - * Must also expose the `filter` property on the parent `ember-tabular` component to be able to pass the `filter` object back and forth between parent and child components. -* `query` - object - Default: `this.get('query') || this.get('parentView.query')` - * Pass the query object from the parent component if it is different or if used outside of the context of the component, otherwise query is optional and it component will attempt to grab within the context of the parent component. -* `filterProperty` - string - Default: null - * Required - * Used with the "Global Filter Sub-Component". - * Pass the property name in camelCase format. -* `filterPlaceholder` - string - Default: null - * Optional - * Placeholder to be used for the global-filter. -* `label` - string - Default: null - * Optional - * Set a label on the global-filter. -* `inputClass` - string - Default: null - * Optional - * Wraps the input field in a div. -* `labelClass` - string - Default: null - * Optional #### Date Filter Date filter changes `input type="date"` to take advantage of a browser's HTML5 date widget. Typically the date filter component would be rendered into the `{{yield header}}` of the main table component using the yield conditional `{{#if section.isHeader}} ...`. However, it can be used outside of the context of the main component if the proper properties are shared between the main component and sub-component. @@ -237,26 +136,51 @@ Date filter changes `input type="date"` to take advantage of a browser's HTML5 d filterProperty="updatedAt" label="Last Updated"}} ``` -* `filter` - object - Default: null - * Required - * Must also expose the `filter` property on the parent `ember-tabular` component to be able to pass the `filter` object back and forth between parent and child components. -* `query` - object - Default: `this.get('query') || this.get('parentView.query')` - * Pass the query object from the parent component if it is different or if used outside of the context of the component, otherwise query is optional and it component will attempt to grab within the context of the parent component. -* `filterProperty` - string - Default: null - * Required - * Used with the "Global Filter Sub-Component". - * Pass the property name in camelCase format. -* `dateFilter` - string - Default: null - * Optional - * Sets the input value. -* `label` - string - Default: null - * Optional - * Set a label on the global-filter. -* `inputClass` - string - Default: null - * Optional - * Wraps the input field in a div. -* `labelClass` - string - Default: null - * Optional + +#### Dropdown Filter +Use the dropdown filter globally. One way to do this is by setting up a computed property that returns an array of label/value objects. + +```js + +export default Ember.Controller.extend({ + users: null, + actions: { + setIsAdminFilter(object) { + if (object) { + this.set('isAdminFilter', object.value); + } else { + this.set('isAdminFilter', null); + } + }, + }, + adminContent: Ember.computed(function() { + return [ + { + label: 'Yes', + value: true, + }, + { + label: 'No', + value: false, + }, + ]; + }), +}); +``` +```hbs +{{#ember-tabular-dropdown-filter filter=filter filterProperty="isAdmin" label="Is Admin" searchFilter=isAdminFilter}} + {{#power-select + options=adminContent + selected=(find-by adminContent 'value' isAdminFilter) + searchField="label" + searchEnabled=false + placeholder="Select to filter" + onchange=(action "setIsAdminFilter") + as |option|}} + {{option.label}} + {{/power-select}} +{{/ember-tabular-dropdown-filter}} +``` ## Note * This component adheres to jsonapi spec: http://jsonapi.org/ @@ -274,44 +198,7 @@ If you are using Ember Data, then you can lean on your application's custom adap * Filtering * This addon expects a `filter` object with nested property/value pairs. -If you are not using Ember Data then you can extend this addon's component and override a set of serialize and normalized methods: -```js -import EmberTabular from 'ember-tabular/components/ember-tabular'; - -export default EmberTabular.extend({ - serializePagination(params) { - // override default pagination ?page[offset]= and ?[page]limit= - // offset and limit will be sent as ?offset= and ?limit= - params.offset = (params.page * params.limit) - params.limit; - if (isNaN(params.offset)) { - params.offset = null; - } - - return params; - }, -}); -``` -```js -import EmberTabular from 'ember-tabular/components/ember-tabular'; - -export default EmberTabular.extend({ - serializeProperty(property) { - // Override to convert all properties sent in requests to camelize instead of the default dasherized - // ?filter[lastName]&sort=isAdmin - // (pseudo code) - if (property) { - return Ember.String.camelize(property); - } - - return null; - }, -}); -``` -Check add-on source for full list of serialized/normalized methods available for extension. -Note: - -* On success you must set the `record` with the array of table data - +If you are not using Ember Data or following json:api then you can extend this component and override a set of serialize and normalized methods, checkout the [API specs/documentation](/docs/index.html) for more details/examples. # Contributing to this addon ## Installation diff --git a/package.json b/package.json index e1214f2..ef57f85 100644 --- a/package.json +++ b/package.json @@ -37,6 +37,7 @@ "ember-cli-sri": "^2.1.0", "ember-cli-test-loader": "^1.1.0", "ember-cli-uglify": "^1.2.0", + "ember-cli-yuidoc": "0.8.8", "ember-data": "^2.10.0", "ember-disable-prototype-extensions": "^1.1.0", "ember-disable-proxy-controllers": "1.0.1", diff --git a/yuidoc.json b/yuidoc.json new file mode 100644 index 0000000..11dd498 --- /dev/null +++ b/yuidoc.json @@ -0,0 +1,19 @@ +{ + "name": "ember-tabular", + "description": "The default blueprint for ember-cli addons.", + "version": "0.2.0", + "options": { + "paths": [ + "addon" + ], + "enabledEnvironments": ["development", "production"], + "exclude": "vendor", + "outdir": "docs", + "linkNatives": true, + "quiet": true, + "parseOnly": false, + "lint": false, + "themedir" : "node_modules/yuidoc-bootstrap-theme", + "helpers" : [ "node_modules/yuidoc-bootstrap-theme/helpers/helpers.js" ] + } +} \ No newline at end of file From e23084aa692a45ae4eb35a91033642e186c00282 Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Fri, 26 May 2017 00:27:41 -0400 Subject: [PATCH 004/105] Create yuidocs for subcomponents --- addon/components/ember-tabular-alert.js | 20 +++++++ addon/components/ember-tabular-date-filter.js | 15 +++++ .../ember-tabular-dropdown-filter.js | 47 ++++++++++++++++ addon/components/ember-tabular-filter.js | 46 ++++++++++++++- .../components/ember-tabular-global-filter.js | 56 +++++++++++++++++++ 5 files changed, 183 insertions(+), 1 deletion(-) diff --git a/addon/components/ember-tabular-alert.js b/addon/components/ember-tabular-alert.js index 25b3be3..9f70d56 100644 --- a/addon/components/ember-tabular-alert.js +++ b/addon/components/ember-tabular-alert.js @@ -1,8 +1,28 @@ import Ember from 'ember'; +/** +* Any errors returned from the request(s) are displayed in an alert box. +* +* @class EmberTabularAlert +*/ export default Ember.Component.extend({ + /** + * @property tagName + * @type String + * @default 'div' + */ tagName: 'div', + /** + * @property type + * @type String + * @default 'info' + */ type: 'info', + /** + * @property typeClass + * @type String + * @default 'alert-[type]' + */ typeClass: Ember.computed('type', function () { return `alert-${this.get('type')}`; }), diff --git a/addon/components/ember-tabular-date-filter.js b/addon/components/ember-tabular-date-filter.js index 82aded6..49a57eb 100644 --- a/addon/components/ember-tabular-date-filter.js +++ b/addon/components/ember-tabular-date-filter.js @@ -1,3 +1,18 @@ import EmberTabularGlobalFilter from './ember-tabular-global-filter'; +/** +* ## Date Filter +* Date filter changes `input type="date"` to take advantage of a browser's HTML5 date widget. Typically the date filter component would be rendered into the `{{yield header}}` of the main table component using the yield conditional `{{#if section.isHeader}} ...`. +* +* However, it can be used outside of the context of the main component if the proper properties are shared between the main component and sub-component. +* +* - Sent in request as: `?filter[filterProperty]=dateFilter`, e.g. `?filter[updated-at]=2015-06-29` +```hbs +{{ember-tabular-date-filter + filter=filter + filterProperty="updatedAt" + label="Last Updated"}} +``` +* @class EmberTabularDateFilter +*/ export default EmberTabularGlobalFilter.extend(); diff --git a/addon/components/ember-tabular-dropdown-filter.js b/addon/components/ember-tabular-dropdown-filter.js index 82aded6..de7bf7a 100644 --- a/addon/components/ember-tabular-dropdown-filter.js +++ b/addon/components/ember-tabular-dropdown-filter.js @@ -1,3 +1,50 @@ import EmberTabularGlobalFilter from './ember-tabular-global-filter'; +/** +* ## Dropdown Filter +* Use the dropdown filter globally. One way to do this is by setting up a computed property that returns an array of label/value objects. +```js +export default Ember.Controller.extend({ + users: null, + actions: { + setIsAdminFilter(object) { + if (object) { + this.set('isAdminFilter', object.value); + } else { + this.set('isAdminFilter', null); + } + }, + }, + adminContent: Ember.computed(function() { + return [ + { + label: 'Yes', + value: true, + }, + { + label: 'No', + value: false, + } + ]; + }), +}); +``` +```hbs +{{#ember-tabular-dropdown-filter filter=filter filterProperty="isAdmin" label="Is Admin" searchFilter=isAdminFilter}} + {{#power-select + options=adminContent + selected=(find-by adminContent 'value' isAdminFilter) + searchField="label" + searchEnabled=false + placeholder="Select to filter" + onchange=(action "setIsAdminFilter") + as |option|}} + {{option.label}} + {{/power-select}} +{{/ember-tabular-dropdown-filter}} +``` +* +* @class EmberTabularDropdownFilter +* @extends EmberTabularGlobalFilter +*/ export default EmberTabularGlobalFilter.extend(); diff --git a/addon/components/ember-tabular-filter.js b/addon/components/ember-tabular-filter.js index 718273a..f34dcbb 100644 --- a/addon/components/ember-tabular-filter.js +++ b/addon/components/ember-tabular-filter.js @@ -1,11 +1,42 @@ import Ember from 'ember'; +/** +* Filtering on a column by column basis within the component's `
`. +* +* @class EmberTabularFilter +*/ export default Ember.Component.extend({ + /** + * @property tagName + * @type String + * @default 'th' + */ tagName: 'th', action: null, + /** + * Value of filter. + * + * @property headerFilter + * @type String + * @default '' + */ headerFilter: '', + /** + * Pass the `query` object from the parent component if it is different or if used outside of the context of the component, otherwise `query` is optional and the component will attempt to grab within the context of the parent component. + * + * @property query + * @type Object + * @default null + */ query: null, + /** + * Must expose the `filter` property on the parent ember-tabular component to be able to pass the filter object back and forth between parent and child components. + * + * @property filter + * @type Object + * @default null + */ filter: null, actions: { @@ -35,10 +66,18 @@ export default Ember.Component.extend({ // to avoid multiple requests for properties that are set on init this.addObserver('headerFilter', this.filterBy); }), - // observable property is set during init + /** + * Debounce the `filterName` method. + * observable property is set during init + * + * @method filterBy + */ filterBy: Ember.observer(function () { Ember.run.debounce(this, 'filterName', 750); }), + /** + * @property isClearable + */ isClearable: Ember.computed('headerFilter', function () { if (this.get('headerFilter')) { return true; @@ -52,6 +91,11 @@ export default Ember.Component.extend({ return 'YYYY-MM-DD'; } }), + /** + * Constructs and sets the `filter` Object. + * + * @method filterName + */ filterName() { const query = this.get('query'); const property = this.get('property'); diff --git a/addon/components/ember-tabular-global-filter.js b/addon/components/ember-tabular-global-filter.js index bcc5371..975805e 100644 --- a/addon/components/ember-tabular-global-filter.js +++ b/addon/components/ember-tabular-global-filter.js @@ -1,12 +1,54 @@ import Ember from 'ember'; +/** +* ## Global Filter +* Typically the global filter component would be rendered into the `{{yield header}}` of the main table component using the yield conditional `{{#if section.isHeader}} ...`. +* +* However, it can be used outside of the context of the main component if the proper properties are shared between the main component and sub-component. + +* - Sent in request as: `?filter[filterProperty]=searchFilter`, e.g. `?filter[username]=John.Doe2` +```hbs +{{ember-tabular-global-filter + filter=filter + filterProperty="username" + filterPlaceholder="Search by Username"}} +``` +* +* @class EmberTabularGlobalFilter +*/ export default Ember.Component.extend({ + /** + * @property tagName + * @type String + * @default 'div' + */ tagName: 'div', classNames: ['table-filter'], action: null, + /** + * Property to be filtered upon. + * + * @property filterProperty + * @type String + * @default null + */ filterProperty: null, + /** + * Value of filter. + * + * @property searchFilter + * @type String + * @default '' + */ searchFilter: '', + /** + * Pass the `query` object from the parent component if it is different or if used outside of the context of the component, otherwise `query` is optional and the component will attempt to grab within the context of the parent component. + * + * @property query + * @type Object + * @default null + */ query: null, filter: null, @@ -15,15 +57,29 @@ export default Ember.Component.extend({ this.set('searchFilter', ''); }, }, + /** + * Debounce the `filterName` method. + * + * @method filterTable + */ filterTable: Ember.observer('searchFilter', function () { Ember.run.debounce(this, 'filterName', 750); }), + /** + * @property isClearable + * @default false + */ isClearable: Ember.computed('searchFilter', function () { if (this.get('searchFilter')) { return true; } return false; }), + /** + * Constructs and sets the `filter` Object. + * + * @method filterName + */ filterName() { // Reference parent component query obj const query = this.get('query') || this.get('parentView.query'); From facd9bf0e77ebaf7456423b0562f896b27f55a34 Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Fri, 26 May 2017 00:40:48 -0400 Subject: [PATCH 005/105] Add yuidocs for main component --- addon/components/ember-tabular.js | 489 +++++++++++++++++++++++++++++- 1 file changed, 484 insertions(+), 5 deletions(-) diff --git a/addon/components/ember-tabular.js b/addon/components/ember-tabular.js index 0e46c05..aca6671 100644 --- a/addon/components/ember-tabular.js +++ b/addon/components/ember-tabular.js @@ -1,15 +1,129 @@ import Ember from 'ember'; +/** +* ## Basic Usage +* - `columns` - Controller array to setup the table headers/columns (detailed below). + - `modelName` - for the component to make the proper request when filtering/sorting, you must pass the model type matching your Ember model structure. e.g. brand/diagram, product. + - `record` - this is bound to the controller and is used to iterate over the table's model data. +* ### Template + ```hbs + {{! app/templates/my-route.hbs }} + + {{#ember-tabular columns=columns modelName="user" record=users as |section|}} + {{#if section.isBody}} + {{#each users as |row|}} + + + + + + + + {{/each}} + {{/if}} + {{/ember-tabular}} + ``` +* ### Controller +* Setup the columns array, which is how the table headers are constructed, `label` is required in all cases. + ```js + // app/controllers/my-route.js + + export default Ember.Controller.extend({ + users: null, + columns: [ + { + property: 'username', + label: 'Username', + defaultSort: 'username', + }, + { + property: 'emailAddress', + label: 'Email', + }, + { + property: 'firstName', + label: 'First Name', + }, + { + property: 'lastName', + label: 'Last Name', + }, + { + property: 'updatedAt', + label: 'Last Updated', + type: 'date', + }, + ], + }); + ``` +* +* @class EmberTabular +*/ export default Ember.Component.extend({ store: Ember.inject.service('store'), action: null, classNames: ['ember-tabular'], + /** + * Component will attempt to make a request to fetch the data. + * + * @property makeRequest + * @type Boolean + * @default true + */ makeRequest: true, + /** + * Used to toggle the filter row bar. + * + * @property showFilterRow + * @type Boolean + * @default false + */ showFilterRow: false, // requires sharing the `filter`/`sort` property with the controller/service/etc to persist persistFiltering: false, + /** + * @property sortableClass + * @type String + * @default 'sortable' + */ sortableClass: 'sortable', + /** + * @property tableWrapperClass + * @type String + * @default '' + */ + tableWrapperClass: '', + /** + * @property tableClass + * @type String + * @default 'table-bordered table-hover' + */ + tableClass: 'table-bordered table-hover', + /** + * @property paginationWrapperClass + * @type String + * @default '' + */ + paginationWrapperClass: '', + /** + * Once the `isRecordLoaded` is determined if true and no data exists then this is displayed. + * + * @property tableLoadedMessage + * @type String + * @default 'No Data.' + */ tableLoadedMessage: 'No Data.', + /** + * Computed Property to determine the column length dependent upon `columns`. + * + * @property columnLength + * @param columns {Array} + * @return {Number} + */ columnLength: Ember.computed('columns', function () { return this.get('columns').length; }), @@ -25,40 +139,220 @@ export default Ember.Component.extend({ isFooter: true, }, - // Model to be requested + /** + * Model to be requested using `makeRequest: true`. + * + * @property modelName + * @type String + * @default null + */ modelName: null, - // Bind variable for table data + /** + * This is typically bound to the controller and is used to iterate over the table's model data. + * + * @property record + * @type Object + * @default null + */ record: null, + /** + * This is typically setup on the controller and passed into the component, and is used to construct the table headers/filtering. + * + ```js + export default Ember.Controller.extend({ + users: null, + columns: [ + { + property: 'username', + label: 'Username', + defaultSort: 'username', + }, + { + property: 'emailAddress', + label: 'Email', + }, + { + property: 'firstName', + label: 'First Name', + sort: false, + }, + { + property: 'isAdmin', + label: 'Is Admin', + list: [ + { + label: 'Yes', + value: true, + }, + { + label: 'No', + value: false, + } + ], + }, + { + property: 'updatedAt', + label: 'Last Updated', + type: 'date', + }, + { + label: 'Actions', + }, + ], + }); + ``` + * + - `columns.property` - {String} + - Required for column filtering/sorting + - Properties should be in camelCase format + - `columns.label` - {String} + - Required in all use-cases + - `columns.type` - {String} - Default: text + - Sets the filter `` + - `columns.sort` - {Boolean} - Default: `true` + - Required for column sorting + - `columns.list` - {Array} - Default: `null` - Filtering the column based on a dropdown list. + - `list.label` - Displayed to the user for selection. + - `list.value` - Value that is sent in the request. + - `columns.defaultSort` - {String} + - Initial sort value for API request + - Will be overridden with any sorting changes + * + * @property columns + * @type Array + * @default null + */ columns: null, isDropdownLimit: true, // pagination defaults + /** + * @property page + * @type Number + * @default 1 + */ page: 1, + /** + * Used in request to construct pagination. + * + * @property limit + * @type Number + * @default 10 + */ limit: 10, + /** + * Number passed to the pagination add-on. + * + * @property pageLimit + * @type Number + * @default 0 + */ pageLimit: 0, + /** + * Used in request to construct pagination. + * + * @property offset + * @type Number + * @default 0 + */ offset: 0, + /** + * @property sort + * @type String + * @default null + */ sort: null, + /** + * @property filter + * @type Object + * @default null + */ filter: null, - // If additional static params are required in requests - // expects Object {} + /** + * Object to pass in static query-params that will not change based on any filter/sort criteria. + * Additional table-wide filters that need to be applied in all requests. Typically bound to the controller. + ```js + // app/controllers/location.js + + export default Ember.Controller.extend({ + staticParams: Ember.computed('model', function() { + return { + 'filter[is-open]': '1', + include: 'hours', + }; + }), + ... + }); + ``` + + ```hbs + {{! app/templates/my-route.hbs }} + + {{#ember-tabular columns=columns modelName="user" record=users staticParams=staticParams as |section|}} + ... + {{/ember-tabular}} + ``` + * + * @property staticParams + * @type Object + * @default null + */ staticParams: null, // State flags + /** + * @property isSuccess + * @type Boolean + * @default false + */ isSuccess: false, + /** + * @property isFailure + * @type Boolean + * @default false + */ isFailure: false, + /** + * @property isLoading + * @type Boolean + * @default false + */ isLoading: false, + /** + * @property defaultSuccessMessage + * @type String + * @default 'Success!' + */ defaultSuccessMessage: 'Success!', + /** + * @property defaultFailureMessage + * @type String + * @default 'There was an issue. Please check below for errors.' + */ defaultFailureMessage: 'There was an issue. Please check below for errors.', // Messages successMessage: Ember.get(Ember.Component, 'defaultSuccessMessage'), failureMessage: Ember.get(Ember.Component, 'defaultFailureMessage'), - // For pushing any per field errors + /** + * Conforms to json:api spec: http://jsonapi.org/format/#errors + * + * @property errors + * @type Array + * @default null + */ errors: null, + /** + * Used to serialize the parameters within `request`. + * + * @method serialize + * @param params {Object} An object of query parameters. + * @return params {Object} The serialized query parameters. + */ serialize(params) { // Serialize Pagination params = this.serializePagination(params); @@ -70,6 +364,36 @@ export default Ember.Component.extend({ return params; }, + /** + * Transform params related to pagination into API expected format. + * Follows json:api spec by default: http://jsonapi.org/format/#fetching-pagination. + * + * `offset` => `?page[offset]`. + * + * `limit` => `?page[limit]`. + * + * If you are not using Ember Data then you can extend this addon's component and override a set of serialize and normalized methods: + ```js + import EmberTabular from 'ember-tabular/components/ember-tabular'; + + export default EmberTabular.extend({ + serializePagination(params) { + // override default pagination ?page[offset]= and ?[page]limit= + // offset and limit will be sent as ?offset= and ?limit= + params.offset = (params.page * params.limit) - params.limit; + if (isNaN(params.offset)) { + params.offset = null; + } + + return params; + }, + }); + ``` + * + * @method serializePagination + * @param params {Object} An object of query parameters. + * @return params {Object} The serialized pagination query parameters. + */ serializePagination(params) { // Override to set dynamic offset based on page and limit params.offset = (params.page * params.limit) - params.limit; @@ -87,6 +411,15 @@ export default Ember.Component.extend({ return params; }, + /** + * Transform params related to filtering into API expected format. + * Follows json:api spec by default: http://jsonapi.org/recommendations/#filtering. + * `?filter[lastName]` => `?filter[last-name]`. + * + * @method serializeFilter + * @param params {Object} An object of query parameters. + * @return params {Object} The serialized filter query parameters. + */ serializeFilter(params) { // serialize filter query params const filter = params.filter; @@ -107,13 +440,47 @@ export default Ember.Component.extend({ return params; }, + /** + * Transform params related to sorting into API expected format. + * Follows json:api spec by default: http://jsonapi.org/format/#fetching-sorting. + * `?sort=lastName` => `?sort=last-name`. + * + * @method serializeSort + * @param params {Object} An object of query parameters. + * @return params {Object} The serialized sort query parameters. + */ serializeSort(params) { params.sort = this.serializeProperty(params.sort); return params; }, + /** + * Follows json:api dasherized naming. + * `lastName` => `last-name`. + * + * If you are not supporting json:api's dasherized properties this can be extended to support other conventions: + ```js + import EmberTabular from 'ember-tabular/components/ember-tabular'; + + export default EmberTabular.extend({ + serializeProperty(property) { + // Override to convert all properties sent in requests to camelize instead of the default dasherized + // ?filter[lastName]&sort=isAdmin + // (pseudo code) + if (property) { + return Ember.String.camelize(property); + } + return null; + }, + }); + ``` + * + * @method serializeProperty + * @param property {String} + * @return property {String} + */ serializeProperty(property) { if (property) { return Ember.String.dasherize(property); @@ -122,6 +489,14 @@ export default Ember.Component.extend({ return null; }, + /** + * Used to normalize query parameters returned from `request` to components expected format. + * + * @method normalize + * @param data {Object} Data object returned from request. + * @param params {Object} The returned object of query parameters. + * @return data {Object} + */ normalize(data, params) { // Normalize Pagination data = this.normalizePagination(data, params); @@ -133,6 +508,16 @@ export default Ember.Component.extend({ return data; }, + /** + * Used to normalize pagination related query parameters returned from `request` to components expected format. + * `?page[offset]` => `offset`. + * `?page[limit]` => `limit`. + * + * @method normalizePagination + * @param data {Object} Data object returned from request. + * @param params {Object} The returned object of query parameters. + * @return data {Object} + */ normalizePagination(data, params) { // pagination - return number of pages const pageLimit = Math.ceil(data.meta.total / params.page.limit); @@ -146,6 +531,15 @@ export default Ember.Component.extend({ return data; }, + /** + * Used to normalize filter related query parameters returned from `request` to components expected format. + * `?filter[last-name]` => `filter[lastName]`. + * `?filter[user.first-name]` => `filter[user.firstName]`. + * + * @method normalizeFilter + * @param query {Object} The returned object of query parameters. + * @return query {Object} + */ normalizeFilter(query) { // normalize filter[property-key] // into filter[propertyKey] @@ -176,10 +570,26 @@ export default Ember.Component.extend({ return query; }, + /** + * Used to normalize sort related query parameters returned from `request` to components expected format. + * Expects json:api by default. + * + * @method normalizeSort + * @param query {Object} The returned object of query parameters. + * @return query {Object} + */ normalizeSort(query) { return query; }, + /** + * Used to normalize properties to components expected format. + * By default this will camelize the property. + * + * @method normalizeProperty + * @param property {String} + * @return property {String} + */ normalizeProperty(property) { if (property) { return Ember.String.camelize(property); @@ -188,12 +598,23 @@ export default Ember.Component.extend({ return null; }, + /** + * @method segmentProperty + * @param property {String} + * @return segments {Array} + */ segmentProperty(property) { let segments = property.split('.'); return segments; }, + /** + * Determine if `record` is loaded using a number of different property checks. + * + * @property isRecordLoaded + * @type Function + */ isRecordLoaded: Ember.computed('errors', 'record', 'record.isFulfilled', 'record.isLoaded', 'modelName', function () { // If record array isLoaded but empty @@ -220,6 +641,14 @@ export default Ember.Component.extend({ return false; }), + /** + * Used in templates to determine if table header will allow filtering. + * + * @property isColumnFilters + * @type Boolean + * @return {Boolean} + * @default false + */ isColumnFilters: Ember.computed('columns', function () { const columns = this.get('columns'); @@ -232,6 +661,11 @@ export default Ember.Component.extend({ return false; }), + /** + * Runs on init to setup the table header default columns. + * + * @method setColumnDefaults + */ setColumnDefaults: Ember.on('init', function () { this.get('columns').map(function (column) { // if column does not have a sort property defined set to true @@ -249,6 +683,11 @@ export default Ember.Component.extend({ }); }), + /** + * Runs on init to set the default sort param. + * + * @method defaultSort + */ defaultSort: Ember.on('init', function () { const sort = this.get('sort'); if (!sort) { @@ -269,6 +708,13 @@ export default Ember.Component.extend({ } }, + /** + * Constructs the query object to be used in `request`. + * + * @property query + * @type Object + * @return {Object} + */ query: Ember.computed('page', 'limit', 'offset', 'sort', 'filter.@each.value', 'staticParams', function () { let query = {}; @@ -289,6 +735,13 @@ export default Ember.Component.extend({ return query; }), + /** + * Make request to API for data. + * + * @method request + * @param params {Object} Serialized query parameters. + * @param modelName {String} + */ request(params, modelName) { params = this.serialize(params); @@ -308,6 +761,11 @@ export default Ember.Component.extend({ ); }, + /** + * Sets the `record` after the `request` is resolved. + * + * @method setModel + */ setModel: Ember.on('init', Ember.observer('query', 'makeRequest', function () { Ember.run.once(this, function () { // If makeRequest is false do not make request and setModel @@ -332,6 +790,12 @@ export default Ember.Component.extend({ }, }, + /** + * Sets the active sort property. + * + * @method setSort + * @param sortProperty {String} + */ setSort: Ember.on('didInsertElement', function (sortProperty) { if (this.get('sort') || sortProperty) { let property; @@ -354,6 +818,12 @@ export default Ember.Component.extend({ } }), + /** + * Sets the proper classes on table headers when sorting. + * + * @method updateSortUI + * @param sortProperty {String} + */ updateSortUI: Ember.on('didInsertElement', function (sortProperty) { if (this.get('sort') || sortProperty) { const _this = this; @@ -385,6 +855,10 @@ export default Ember.Component.extend({ } }), + /** + * @method failure + * @param response {Object} + */ failure(response) { this.reset(); this.setProperties({ @@ -398,6 +872,11 @@ export default Ember.Component.extend({ } }, + /** + * Resets all state specific properties. + * + * @method reset + */ reset() { this.setProperties({ isLoading: false, From c533440294b6a958ab56836f0e2204618ff6aaf2 Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Fri, 26 May 2017 00:50:22 -0400 Subject: [PATCH 006/105] Add further docs --- .../ember-tabular-dropdown-limit.js | 24 ++++++++++++++++++- addon/components/ember-tabular.js | 10 ++++++-- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/addon/components/ember-tabular-dropdown-limit.js b/addon/components/ember-tabular-dropdown-limit.js index e69f03a..77b4df3 100644 --- a/addon/components/ember-tabular-dropdown-limit.js +++ b/addon/components/ember-tabular-dropdown-limit.js @@ -1,12 +1,34 @@ import Ember from 'ember'; +/** +* Sets up component for changing the table row count/limit. +* +* @class EmberTabularDropdownLimit +*/ export default Ember.Component.extend({ + /** + * @property tagName + * @type String + * @default 'div' + */ tagName: 'div', classNames: ['ember-tabular-dropdown-limit'], - // populates limit dropdown + /** + * @property limits + * @type Array + * @default [10, 25, 50, 100, 500] + */ limits: [10, 25, 50, 100, 500], + /** + * Computed Property to determine if the result set is large enough to display the dropdown limit component. + * + * @property autoHide + * @param record + * @param count + * @return Boolean + */ autoHide: Ember.computed('record', 'count', function() { let record = this.get('record'); let count = this.get('count'); diff --git a/addon/components/ember-tabular.js b/addon/components/ember-tabular.js index aca6671..26774f8 100644 --- a/addon/components/ember-tabular.js +++ b/addon/components/ember-tabular.js @@ -83,7 +83,13 @@ export default Ember.Component.extend({ * @default false */ showFilterRow: false, - // requires sharing the `filter`/`sort` property with the controller/service/etc to persist + /** + * Requires sharing the `filter`/`sort` property with the controller/service/etc to persist filter data + * + * @property persistFiltering + * @type Boolean + * @default false + */ persistFiltering: false, /** * @property sortableClass @@ -701,7 +707,7 @@ export default Ember.Component.extend({ willDestroy() { this._super(...arguments); - // clear any filters if we are persisting filtering + // clear any filters if we are not persisting filtering const persistFiltering = this.get('persistFiltering'); if (!persistFiltering) { this.set('filter', null); From 9d2a570568a4e6c6d40b50ac622be615c7d14bd2 Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Fri, 23 Jun 2017 08:36:33 -0400 Subject: [PATCH 007/105] Upgrade ember-cli-mirage to 0.3.2 --- package.json | 2 +- tests/helpers/destroy-app.js | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index ef57f85..897cc9b 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "ember-cli-htmlbars-inline-precompile": "^0.3.3", "ember-cli-inject-live-reload": "^1.4.1", "ember-cli-jshint": "^2.0.1", - "ember-cli-mirage": "0.2.4", + "ember-cli-mirage": "0.3.2", "ember-cli-moment-shim": "3.1.0", "ember-cli-qunit": "^3.0.1", "ember-cli-release": "^0.2.9", diff --git a/tests/helpers/destroy-app.js b/tests/helpers/destroy-app.js index 1ba4895..2c3961c 100644 --- a/tests/helpers/destroy-app.js +++ b/tests/helpers/destroy-app.js @@ -1,7 +1,9 @@ import Ember from 'ember'; export default function destroyApp(application) { - // ensure mirage server is properly shutdown - server.shutdown(); Ember.run(application, 'destroy'); + // ensure mirage server is properly shutdown + if (window.server) { + window.server.shutdown(); + } } From 45cef62d87b931884d229a3cb29c4e0077bbe9a1 Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Fri, 23 Jun 2017 09:28:06 -0400 Subject: [PATCH 008/105] Upgrade to ember-cli 2.13.2 --- .eslintrc.js | 13 +++++++++ .npmignore | 2 +- .travis.yml | 13 ++++----- bower.json | 13 +-------- config/ember-try.js | 44 ++++++++++++++++++++++++++++- config/environment.js | 2 +- ember-cli-build.js | 9 +++--- index.js | 2 +- package.json | 47 ++++++++++++++----------------- testem.js | 3 +- testem.json | 12 -------- tests/.eslintrc.js | 5 ++++ tests/dummy/config/environment.js | 2 +- tests/dummy/config/targets.js | 10 +++++++ tests/helpers/start-app.js | 13 ++++----- tests/test-helper.js | 2 ++ 16 files changed, 114 insertions(+), 78 deletions(-) create mode 100644 .eslintrc.js delete mode 100644 testem.json create mode 100644 tests/.eslintrc.js create mode 100644 tests/dummy/config/targets.js diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000..2873e2f --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,13 @@ +module.exports = { + root: true, + parserOptions: { + ecmaVersion: 2017, + sourceType: 'module' + }, + extends: 'eslint:recommended', + env: { + browser: true + }, + rules: { + } +}; diff --git a/.npmignore b/.npmignore index fa8b147..889b2bf 100644 --- a/.npmignore +++ b/.npmignore @@ -8,7 +8,7 @@ .editorconfig .ember-cli .gitignore -.jshintrc +.eslintrc.js .watchmanconfig .travis.yml bower.json diff --git a/.travis.yml b/.travis.yml index b3be07e..72f90c9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,14 +1,13 @@ --- language: node_js node_js: - - "4" + - "6" sudo: false cache: directories: - $HOME/.npm - - $HOME/.cache # includes bowers cache env: # we recommend testing LTS's and latest stable release (bonus points to beta/canary) @@ -17,6 +16,7 @@ env: - EMBER_TRY_SCENARIO=ember-release - EMBER_TRY_SCENARIO=ember-beta - EMBER_TRY_SCENARIO=ember-canary + - EMBER_TRY_SCENARIO=ember-default matrix: fast_finish: true @@ -25,16 +25,13 @@ matrix: before_install: - npm config set spin false - - npm install -g bower - - bower --version - - npm install phantomjs-prebuilt - - node_modules/phantomjs-prebuilt/bin/phantomjs --version + - npm install -g phantomjs-prebuilt + - phantomjs --version install: - npm install - - bower install script: # Usually, it's ok to finish the test scenario without reverting # to the addon's original dependency state, skipping "cleanup". - - ember try:one $EMBER_TRY_SCENARIO test --skip-cleanup + - node_modules/.bin/ember try:one $EMBER_TRY_SCENARIO test --skip-cleanup diff --git a/bower.json b/bower.json index 58f6155..d7896be 100644 --- a/bower.json +++ b/bower.json @@ -1,19 +1,8 @@ { "name": "ember-tabular", "dependencies": { - "ember": "~2.10.0", - "ember-cli-shims": "0.1.3", - "ember-cli-test-loader": "0.2.2", - "ember-qunit-notifications": "0.1.0", - "pretender": "~0.12.0", - "lodash": "3.7.0", "Faker": "~3.0.0", "bootstrap": "3.3.5", - "font-awesome": "4.6.2", - "DOM-shim": "Raynos/DOM-shim" - }, - "resolutions": { - "FakeXMLHttpRequest": "1.3.0", - "ember-qunit-notifications": "0.1.0" + "font-awesome": "4.6.2" } } diff --git a/config/ember-try.js b/config/ember-try.js index c0126c4..a070124 100644 --- a/config/ember-try.js +++ b/config/ember-try.js @@ -1,6 +1,22 @@ -/*jshint node:true*/ +/* eslint-env node */ module.exports = { scenarios: [ + { + name: 'ember-lts-2.4', + bower: { + dependencies: { + 'ember': 'components/ember#lts-2-4' + }, + resolutions: { + 'ember': 'lts-2-4' + } + }, + npm: { + devDependencies: { + 'ember-source': null + } + } + }, { name: 'ember-lts-2.8', bower: { @@ -10,6 +26,11 @@ module.exports = { resolutions: { 'ember': 'lts-2-8' } + }, + npm: { + devDependencies: { + 'ember-source': null + } } }, { @@ -21,6 +42,11 @@ module.exports = { resolutions: { 'ember': 'release' } + }, + npm: { + devDependencies: { + 'ember-source': null + } } }, { @@ -32,6 +58,11 @@ module.exports = { resolutions: { 'ember': 'beta' } + }, + npm: { + devDependencies: { + 'ember-source': null + } } }, { @@ -43,6 +74,17 @@ module.exports = { resolutions: { 'ember': 'canary' } + }, + npm: { + devDependencies: { + 'ember-source': null + } + } + }, + { + name: 'ember-default', + npm: { + devDependencies: {} } } ] diff --git a/config/environment.js b/config/environment.js index 28a787b..012a412 100644 --- a/config/environment.js +++ b/config/environment.js @@ -1,4 +1,4 @@ -/*jshint node:true*/ +/* eslint-env node */ 'use strict'; module.exports = function(/* environment, appConfig */) { diff --git a/ember-cli-build.js b/ember-cli-build.js index 26ac22c..0bec360 100644 --- a/ember-cli-build.js +++ b/ember-cli-build.js @@ -1,7 +1,6 @@ -/* jshint node:true */ -/* global require, module */ +/* eslint-env node */ var EmberAddon = require('ember-cli/lib/broccoli/ember-addon'); -var pickFiles = require('broccoli-static-compiler'); +var Funnel = require('broccoli-funnel'); var mergeTrees = require('broccoli-merge-trees'); module.exports = function(defaults) { @@ -25,9 +24,9 @@ module.exports = function(defaults) { behave. You most likely want to be modifying `./index.js` or app's build file */ // Copy non-compiled bootstrap dependency - var vendor = pickFiles('bower_components/bootstrap/dist/css/', { + var vendor = new Funnel('bower_components/bootstrap/dist/css/', { srcDir: '/', - files: ['bootstrap.css.map'], + include: ['bootstrap.css.map'], destDir: '/assets' }); diff --git a/index.js b/index.js index eaa4865..7ae4f81 100644 --- a/index.js +++ b/index.js @@ -1,4 +1,4 @@ -/* jshint node: true */ +/* eslint-env node */ 'use strict'; var Funnel = require('broccoli-funnel'); var mergeTrees = require('broccoli-merge-trees'); diff --git a/package.json b/package.json index ef57f85..9fbaaf0 100644 --- a/package.json +++ b/package.json @@ -18,35 +18,30 @@ "author": "", "license": "Apache-2.0", "devDependencies": { - "broccoli-asset-rev": "^2.4.5", - "broccoli-funnel": "^1.0.0", - "broccoli-merge-trees": "^0.2.3", - "broccoli-static-compiler": "^0.2.2", - "ember-ajax": "^2.4.1", - "ember-cli": "2.10.0", - "ember-cli-app-version": "^2.0.0", - "ember-cli-dependency-checker": "^1.3.0", - "ember-cli-htmlbars": "^1.0.10", - "ember-cli-htmlbars-inline-precompile": "^0.3.3", + "broccoli-asset-rev": "2.5.0", + "broccoli-funnel": "1.2.0", + "broccoli-merge-trees": "2.0.0", + "ember-ajax": "2.5.2", + "ember-cli": "^2.13.2", + "ember-cli-app-version": "3.0.0", + "ember-cli-dependency-checker": "1.3.0", + "ember-cli-htmlbars": "1.1.1", + "ember-cli-htmlbars-inline-precompile": "0.4.3", "ember-cli-inject-live-reload": "^1.4.1", - "ember-cli-jshint": "^2.0.1", "ember-cli-mirage": "0.2.4", "ember-cli-moment-shim": "3.1.0", - "ember-cli-qunit": "^3.0.1", - "ember-cli-release": "^0.2.9", - "ember-cli-sri": "^2.1.0", - "ember-cli-test-loader": "^1.1.0", + "ember-cli-qunit": "4.0.0", + "ember-cli-shims": "1.0.2", + "ember-cli-sri": "2.1.1", "ember-cli-uglify": "^1.2.0", - "ember-cli-yuidoc": "0.8.8", - "ember-data": "^2.10.0", - "ember-disable-prototype-extensions": "^1.1.0", - "ember-disable-proxy-controllers": "1.0.1", - "ember-export-application-global": "^1.0.5", - "ember-load-initializers": "^0.5.1", + "ember-data": "2.13.1", + "ember-export-application-global": "^2.0.0", + "ember-load-initializers": "^1.0.0", "ember-moment": "7.3.0", "ember-power-select": "1.4.3", - "ember-resolver": "^2.0.3", - "loader.js": "4.0.9" + "ember-resolver": "^4.0.0", + "ember-source": "~2.13.0", + "loader.js": "^4.2.3" }, "keywords": [ "ember-addon", @@ -56,12 +51,12 @@ "json api" ], "dependencies": { - "ember-cli-babel": "^5.1.7", + "ember-cli-babel": "^6.0.0", "pagination-pager": "2.4.1", "ember-truth-helpers": "1.2.0", "ember-power-select": "1.4.3", - "broccoli-merge-trees": "^0.2.3", - "broccoli-funnel": "^1.0.0" + "broccoli-merge-trees": "2.0.0", + "broccoli-funnel": "1.2.0" }, "ember-addon": { "configPath": "tests/dummy/config" diff --git a/testem.js b/testem.js index 26044b2..b234048 100644 --- a/testem.js +++ b/testem.js @@ -1,6 +1,5 @@ -/*jshint node:true*/ +/* eslint-env node */ module.exports = { - "framework": "qunit", "test_page": "tests/index.html?hidepassed", "disable_watching": true, "launch_in_ci": [ diff --git a/testem.json b/testem.json deleted file mode 100644 index 0f35392..0000000 --- a/testem.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "framework": "qunit", - "test_page": "tests/index.html?hidepassed", - "disable_watching": true, - "launch_in_ci": [ - "PhantomJS" - ], - "launch_in_dev": [ - "PhantomJS", - "Chrome" - ] -} diff --git a/tests/.eslintrc.js b/tests/.eslintrc.js new file mode 100644 index 0000000..fbf2555 --- /dev/null +++ b/tests/.eslintrc.js @@ -0,0 +1,5 @@ +module.exports = { + env: { + embertest: true + } +}; diff --git a/tests/dummy/config/environment.js b/tests/dummy/config/environment.js index 703c472..6a378d3 100644 --- a/tests/dummy/config/environment.js +++ b/tests/dummy/config/environment.js @@ -1,4 +1,4 @@ -/* jshint node: true */ +/* eslint-env node */ module.exports = function(environment) { var ENV = { diff --git a/tests/dummy/config/targets.js b/tests/dummy/config/targets.js new file mode 100644 index 0000000..2bebfac --- /dev/null +++ b/tests/dummy/config/targets.js @@ -0,0 +1,10 @@ +/* eslint-env node */ + +module.exports = { + browsers: [ + 'ie 9', + 'last 1 Chrome versions', + 'last 1 Firefox versions', + 'last 1 Safari versions' + ] +}; diff --git a/tests/helpers/start-app.js b/tests/helpers/start-app.js index f3e7082..1794e77 100644 --- a/tests/helpers/start-app.js +++ b/tests/helpers/start-app.js @@ -9,16 +9,13 @@ util(); registerPowerSelectHelpers(); export default function startApp(attrs) { - let application; + let attributes = Ember.merge({}, config.APP); + attributes = Ember.merge(attributes, attrs); // use defaults, but you can override; - // use defaults, but you can override - let attributes = Ember.assign({}, config.APP, attrs); - - Ember.run(() => { - application = Application.create(attributes); + return Ember.run(() => { + let application = Application.create(attributes); application.setupForTesting(); application.injectTestHelpers(); + return application; }); - - return application; } diff --git a/tests/test-helper.js b/tests/test-helper.js index e6cfb70..f219659 100644 --- a/tests/test-helper.js +++ b/tests/test-helper.js @@ -2,5 +2,7 @@ import resolver from './helpers/resolver'; import { setResolver } from 'ember-qunit'; +import { start } from 'ember-cli-qunit'; setResolver(resolver); +start(); From 55271f6011d314c63507d41399a620c63344e42c Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Fri, 23 Jun 2017 09:59:07 -0400 Subject: [PATCH 009/105] Upgrade node and .gitignore with ember-try setup --- .gitignore | 3 +++ package.json | 5 +++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 576aad4..fb4bfaa 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,7 @@ # dependencies /node_modules /bower_components +.node_modules* # misc /.sass-cache @@ -16,3 +17,5 @@ npm-debug.log* testem.log /docs/* +package.json.ember-try +bower.json.ember-try diff --git a/package.json b/package.json index 9fbaaf0..1279517 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ }, "repository": "", "engines": { - "node": ">= 0.12.0" + "node": ">= 4" }, "author": "", "license": "Apache-2.0", @@ -35,6 +35,7 @@ "ember-cli-sri": "2.1.1", "ember-cli-uglify": "^1.2.0", "ember-data": "2.13.1", + "ember-disable-prototype-extensions": "^1.1.0", "ember-export-application-global": "^2.0.0", "ember-load-initializers": "^1.0.0", "ember-moment": "7.3.0", @@ -61,4 +62,4 @@ "ember-addon": { "configPath": "tests/dummy/config" } -} +} \ No newline at end of file From 3f51a82b40afba76b99832d3fff7b8ed45e813d2 Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Fri, 23 Jun 2017 10:06:38 -0400 Subject: [PATCH 010/105] Fixing merge error --- package.json | 5 ----- 1 file changed, 5 deletions(-) diff --git a/package.json b/package.json index a8eb1d2..7a3f64e 100644 --- a/package.json +++ b/package.json @@ -28,12 +28,7 @@ "ember-cli-htmlbars": "1.1.1", "ember-cli-htmlbars-inline-precompile": "0.4.3", "ember-cli-inject-live-reload": "^1.4.1", -<<<<<<< HEAD - "ember-cli-jshint": "^2.0.1", "ember-cli-mirage": "0.3.2", -======= - "ember-cli-mirage": "0.2.4", ->>>>>>> upgrade-to-ember-cli-2.13.2 "ember-cli-moment-shim": "3.1.0", "ember-cli-qunit": "4.0.0", "ember-cli-shims": "1.0.2", From f39cfda32c6551eac745d2032281a79c9c93e688 Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Fri, 23 Jun 2017 12:15:22 -0400 Subject: [PATCH 011/105] WIP, initial pass at generating the columns based on the modelName --- addon/components/ember-tabular.js | 30 +++++++++++++++++++- tests/dummy/app/controllers/index.js | 2 ++ tests/dummy/app/templates/index.hbs | 42 +++++++++++++++++++++++++--- 3 files changed, 69 insertions(+), 5 deletions(-) diff --git a/addon/components/ember-tabular.js b/addon/components/ember-tabular.js index 26774f8..7f5db53 100644 --- a/addon/components/ember-tabular.js +++ b/addon/components/ember-tabular.js @@ -228,7 +228,35 @@ export default Ember.Component.extend({ * @type Array * @default null */ - columns: null, + columns: Ember.computed('modelName', { + get() { + const modelName = this.get('modelName'); + let columns = []; + // used if ember-tabular is making request + if (modelName) { + const modelClass = this.get('store').modelFor(modelName); + const modelClassAttributes = Ember.get(modelClass, 'attributes'); + let attributes = []; + + console.log('modelName', modelName); + // iterate over keys and create attribute array + modelClassAttributes.forEach((meta, name) => { + let attribute = { + property: name, + label: this._formatColumnLabel(name), + }; + attributes.push(attribute); + }); + console.log('attributes', attributes); + } + return columns; + }, + }), + + _formatColumnLabel(text) { + let result = text.replace(/([A-Z])/g, ' $1'); + return result.charAt(0).toUpperCase() + result.slice(1); + }, isDropdownLimit: true, diff --git a/tests/dummy/app/controllers/index.js b/tests/dummy/app/controllers/index.js index d66ff0c..b087a7e 100644 --- a/tests/dummy/app/controllers/index.js +++ b/tests/dummy/app/controllers/index.js @@ -5,11 +5,13 @@ export default Ember.Controller.extend({ users2: null, users3: null, users4: null, + users5: null, filter: null, filter2: null, filter3: null, sort: 'username', sort1: 'username', + sort2: 'username', isAdminFilter: null, columns: [ { diff --git a/tests/dummy/app/templates/index.hbs b/tests/dummy/app/templates/index.hbs index 5b97947..38566f1 100644 --- a/tests/dummy/app/templates/index.hbs +++ b/tests/dummy/app/templates/index.hbs @@ -1,4 +1,38 @@
Example #1
+

Table - Column Select

+{{#ember-tabular class="table-column-select" tableWrapperClass="table-wrapper" paginationWrapperClass="pagination-wrapper" modelName="user" record=users5 sort=sort2 as |section|}} + {{#if section.isBody}} + {{#each users as |row|}} +
+ + + + + + + + + {{/each}} + {{/if}} +{{/ember-tabular}} + +
Example #2

Table - Default

{{#ember-tabular class="table-default" tableWrapperClass="table-wrapper" paginationWrapperClass="pagination-wrapper" columns=columns modelName="user" record=users sort=sort as |section|}} {{#if section.isBody}} @@ -32,7 +66,7 @@ {{/if}} {{/ember-tabular}} -
Example #1
+
Example #3

Table - Persist Filtering

{{#ember-tabular class="table-persist" tableWrapperClass="table-wrapper" paginationWrapperClass="pagination-wrapper" columns=columns modelName="user" record=users4 filter=filter3 persistFiltering=true sort=sort1 as |section|}} {{#if section.isBody}} @@ -66,7 +100,7 @@ {{/if}} {{/ember-tabular}} -
Example #2
+
Example #4

Table - Basic - Global Filter

{{#ember-tabular class="table-basic-global-filter" columns=columns2 modelName="user" record=users2 filter=filter as |section|}} {{#if section.isHeader}} @@ -90,7 +124,7 @@ {{/if}} {{/ember-tabular}} -
Example #3
+
Example #5

Table - Basic - Dropdown Filter / Date Filter

{{#ember-tabular class="table-basic-global-date-filter" columns=columns2 modelName="user" record=users3 filter=filter2 as |section|}} {{#if section.isHeader}} @@ -134,7 +168,7 @@ {{/if}} {{/ember-tabular}} -
Example #4
+
Example #6
{{#link-to 'example4' class="link-ex4"}} Route Binds Model to Table {{/link-to}} From 41826bcff7263b594fb9b592012283b344f1bfdf Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Fri, 23 Jun 2017 13:46:01 -0400 Subject: [PATCH 012/105] Setup a columns array and columnsMap of all potential columns --- .../components/ember-tabular-column-select.js | 20 ++++++++++++++ addon/components/ember-tabular.js | 26 ++++++++++++++++--- app/components/ember-tabular-column-select.js | 3 +++ .../ember-tabular-column-select.hbs | 14 ++++++++++ app/templates/components/ember-tabular.hbs | 3 +++ tests/dummy/app/templates/index.hbs | 2 +- 6 files changed, 64 insertions(+), 4 deletions(-) create mode 100644 addon/components/ember-tabular-column-select.js create mode 100644 app/components/ember-tabular-column-select.js create mode 100644 app/templates/components/ember-tabular-column-select.hbs diff --git a/addon/components/ember-tabular-column-select.js b/addon/components/ember-tabular-column-select.js new file mode 100644 index 0000000..fb995c6 --- /dev/null +++ b/addon/components/ember-tabular-column-select.js @@ -0,0 +1,20 @@ +import Ember from 'ember'; + +/** +* +* @class EmberTabularColumnSelect +*/ +export default Ember.Component.extend({ + /** + * @property tagName + * @type String + * @default 'div' + */ + tagName: 'div', + + actions: { + toggleColumn(column) { + console.log('column', column); + }, + }, +}); diff --git a/addon/components/ember-tabular.js b/addon/components/ember-tabular.js index 7f5db53..fe8989a 100644 --- a/addon/components/ember-tabular.js +++ b/addon/components/ember-tabular.js @@ -223,12 +223,24 @@ export default Ember.Component.extend({ - `columns.defaultSort` - {String} - Initial sort value for API request - Will be overridden with any sorting changes + + * Overriding this property is allowed. * * @property columns * @type Array * @default null */ - columns: Ember.computed('modelName', { + columns: Ember.computed('columnsMap', { + get() { + const columnsMap = this.get('columnsMap'); + if (columnsMap) { + return columnsMap; + } + return []; + }, + }), + + columnsMap: Ember.computed('modelName', { get() { const modelName = this.get('modelName'); let columns = []; @@ -238,7 +250,6 @@ export default Ember.Component.extend({ const modelClassAttributes = Ember.get(modelClass, 'attributes'); let attributes = []; - console.log('modelName', modelName); // iterate over keys and create attribute array modelClassAttributes.forEach((meta, name) => { let attribute = { @@ -247,7 +258,7 @@ export default Ember.Component.extend({ }; attributes.push(attribute); }); - console.log('attributes', attributes); + columns = attributes; } return columns; }, @@ -258,6 +269,15 @@ export default Ember.Component.extend({ return result.charAt(0).toUpperCase() + result.slice(1); }, + /** + * Whether to display the panel to select different table columns. + * + * @property isColumnSelect + * @type Boolean + * @default true + */ + isColumnSelect: true, + isDropdownLimit: true, // pagination defaults diff --git a/app/components/ember-tabular-column-select.js b/app/components/ember-tabular-column-select.js new file mode 100644 index 0000000..54f7028 --- /dev/null +++ b/app/components/ember-tabular-column-select.js @@ -0,0 +1,3 @@ +import EmberTabularColumnSelect from 'ember-tabular/components/ember-tabular-column-select'; + +export default EmberTabularColumnSelect; diff --git a/app/templates/components/ember-tabular-column-select.hbs b/app/templates/components/ember-tabular-column-select.hbs new file mode 100644 index 0000000..8125f42 --- /dev/null +++ b/app/templates/components/ember-tabular-column-select.hbs @@ -0,0 +1,14 @@ +
+ + +
diff --git a/app/templates/components/ember-tabular.hbs b/app/templates/components/ember-tabular.hbs index fd4a731..2d14340 100644 --- a/app/templates/components/ember-tabular.hbs +++ b/app/templates/components/ember-tabular.hbs @@ -77,6 +77,9 @@ {{yield footer}}
+ {{#if isColumnSelect}} + {{ember-tabular-column-select columns=columns}} + {{/if}}
From 3eba20a50fd8fc0fe6b7d13c0813e9101fb9cfd1 Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Fri, 23 Jun 2017 16:20:35 -0400 Subject: [PATCH 013/105] Setup a way to automatically render the template based on the model data --- .../components/ember-tabular-column-select.js | 2 +- addon/components/ember-tabular.js | 26 +++++----- .../ember-tabular-column-select.hbs | 2 +- .../components/ember-tabular-row.hbs | 9 ++++ app/templates/components/ember-tabular.hbs | 49 +++++++++++-------- tests/dummy/app/templates/index.hbs | 31 ++---------- 6 files changed, 57 insertions(+), 62 deletions(-) create mode 100644 app/templates/components/ember-tabular-row.hbs diff --git a/addon/components/ember-tabular-column-select.js b/addon/components/ember-tabular-column-select.js index fb995c6..004bf4b 100644 --- a/addon/components/ember-tabular-column-select.js +++ b/addon/components/ember-tabular-column-select.js @@ -14,7 +14,7 @@ export default Ember.Component.extend({ actions: { toggleColumn(column) { - console.log('column', column); + column.toggleProperty('isActive'); }, }, }); diff --git a/addon/components/ember-tabular.js b/addon/components/ember-tabular.js index fe8989a..c8f978e 100644 --- a/addon/components/ember-tabular.js +++ b/addon/components/ember-tabular.js @@ -231,16 +231,6 @@ export default Ember.Component.extend({ * @default null */ columns: Ember.computed('columnsMap', { - get() { - const columnsMap = this.get('columnsMap'); - if (columnsMap) { - return columnsMap; - } - return []; - }, - }), - - columnsMap: Ember.computed('modelName', { get() { const modelName = this.get('modelName'); let columns = []; @@ -248,14 +238,15 @@ export default Ember.Component.extend({ if (modelName) { const modelClass = this.get('store').modelFor(modelName); const modelClassAttributes = Ember.get(modelClass, 'attributes'); - let attributes = []; + let attributes = Ember.A(); // iterate over keys and create attribute array modelClassAttributes.forEach((meta, name) => { - let attribute = { + let attribute = Ember.Object.create({ property: name, label: this._formatColumnLabel(name), - }; + isActive: true, + }); attributes.push(attribute); }); columns = attributes; @@ -264,6 +255,15 @@ export default Ember.Component.extend({ }, }), + /** + * Template for table's row + * + * @type {string} + * @default 'components/models-table/row' + * @name ModelsTable#rowTemplate + */ + trRow: 'components/ember-tabular-row', + _formatColumnLabel(text) { let result = text.replace(/([A-Z])/g, ' $1'); return result.charAt(0).toUpperCase() + result.slice(1); diff --git a/app/templates/components/ember-tabular-column-select.hbs b/app/templates/components/ember-tabular-column-select.hbs index 8125f42..5d9d280 100644 --- a/app/templates/components/ember-tabular-column-select.hbs +++ b/app/templates/components/ember-tabular-column-select.hbs @@ -6,7 +6,7 @@ {{#each columns as |column|}}
  • - {{column.label}} + {{column.label}}
  • {{/each}} diff --git a/app/templates/components/ember-tabular-row.hbs b/app/templates/components/ember-tabular-row.hbs new file mode 100644 index 0000000..20fdb07 --- /dev/null +++ b/app/templates/components/ember-tabular-row.hbs @@ -0,0 +1,9 @@ +
    + {{#each columns as |column|}} + {{#if column.isActive}} + + {{/if}} + {{/each}} + diff --git a/app/templates/components/ember-tabular.hbs b/app/templates/components/ember-tabular.hbs index 2d14340..ef9c7e8 100644 --- a/app/templates/components/ember-tabular.hbs +++ b/app/templates/components/ember-tabular.hbs @@ -21,23 +21,25 @@ {{#each columns as |header|}} - {{#if header.property}} - - {{else}} - + {{#if header.isActive}} + {{#if header.property}} + + {{else}} + + {{/if}} {{/if}} {{/each}} @@ -45,10 +47,12 @@ {{#if showFilterRow}} {{#each columns as |header|}} - {{#if header.filter}} - {{ember-tabular-filter modelName=modelName columns=columns property=header.property record=record query=query filter=filter header=header}} - {{else}} - + {{#if header.isActive}} + {{#if header.filter}} + {{ember-tabular-filter modelName=modelName columns=columns property=header.property record=record query=query filter=filter header=header}} + {{else}} + + {{/if}} {{/if}} {{/each}} @@ -58,6 +62,9 @@ {{/if}} {{#if record}} + {{#each record as |row|}} + {{partial trRow}} + {{/each}} {{yield body}} {{else}} diff --git a/tests/dummy/app/templates/index.hbs b/tests/dummy/app/templates/index.hbs index 8c99cd8..cbb3203 100644 --- a/tests/dummy/app/templates/index.hbs +++ b/tests/dummy/app/templates/index.hbs @@ -1,35 +1,13 @@
    Example #1

    Table - Column Select

    {{#ember-tabular class="table-column-select" tableWrapperClass="table-wrapper" paginationWrapperClass="pagination-wrapper" modelName="user" record=users5 sort=sort2 as |section|}} - {{#if section.isBody}} + {{!-- {{#if section.isBody}} {{#each users5 as |row|}} - - - - - - {{/each}} - {{/if}} + {{/if}} --}} {{/ember-tabular}}
    Example #2
    @@ -66,7 +44,7 @@ {{/if}} {{/ember-tabular}} -
    Example #3
    +{{!--
    Example #3

    Table - Persist Filtering

    {{#ember-tabular class="table-persist" tableWrapperClass="table-wrapper" paginationWrapperClass="pagination-wrapper" columns=columns modelName="user" record=users4 filter=filter3 persistFiltering=true sort=sort1 as |section|}} {{#if section.isBody}} @@ -166,7 +144,8 @@ {{/each}} {{/if}} -{{/ember-tabular}} +{{/ember-tabular}} --}} +
    Example #6
    {{#link-to 'example4' class="link-ex4"}} From 683c6764dff30130c6f60c59a51fb23ebe70105f Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Mon, 26 Jun 2017 14:45:52 -0400 Subject: [PATCH 014/105] Setup ember-tabular-cell for rendering specific cell based on column data --- addon/components/ember-tabular-cell.js | 23 +++++++++++++++++++ app/components/ember-tabular-cell.js | 3 +++ .../components/ember-tabular-cell.hbs | 7 ++++++ .../components/ember-tabular-row.hbs | 11 ++++++--- app/templates/components/ember-tabular.hbs | 1 - 5 files changed, 41 insertions(+), 4 deletions(-) create mode 100644 addon/components/ember-tabular-cell.js create mode 100644 app/components/ember-tabular-cell.js create mode 100644 app/templates/components/ember-tabular-cell.hbs diff --git a/addon/components/ember-tabular-cell.js b/addon/components/ember-tabular-cell.js new file mode 100644 index 0000000..78d8034 --- /dev/null +++ b/addon/components/ember-tabular-cell.js @@ -0,0 +1,23 @@ +import Ember from 'ember'; + +/** +* +* @class EmberTabularCell +*/ +export default Ember.Component.extend({ + /** + * @property tagName + * @type String + * @default '' + */ + tagName: '', + action: null, + hasColProperty: Ember.computed('colProperty', 'column', function () { + const colProperty = this.get('colProperty'); + const column = this.get('column'); + if (colProperty === column.property) { + return true; + } + return false; + }), +}); diff --git a/app/components/ember-tabular-cell.js b/app/components/ember-tabular-cell.js new file mode 100644 index 0000000..41b47c9 --- /dev/null +++ b/app/components/ember-tabular-cell.js @@ -0,0 +1,3 @@ +import EmberTabularCell from 'ember-tabular/components/ember-tabular-cell'; + +export default EmberTabularCell; diff --git a/app/templates/components/ember-tabular-cell.hbs b/app/templates/components/ember-tabular-cell.hbs new file mode 100644 index 0000000..096a761 --- /dev/null +++ b/app/templates/components/ember-tabular-cell.hbs @@ -0,0 +1,7 @@ +{{#if hasColProperty}} + {{#if hasBlock}} + + {{else}} + + {{/if}} +{{/if}} diff --git a/app/templates/components/ember-tabular-row.hbs b/app/templates/components/ember-tabular-row.hbs index 20fdb07..453d7cb 100644 --- a/app/templates/components/ember-tabular-row.hbs +++ b/app/templates/components/ember-tabular-row.hbs @@ -1,9 +1,14 @@ {{#each columns as |column|}} {{#if column.isActive}} - + {{!-- TODO: must be a way to use yield or inline form based on a property --}} + {{#if column.isCustom}} + {{yield (hash + cell=(component "ember-tabular-cell" column=column record=row colProperty=colProperty) + )}} + {{else}} + {{ember-tabular-cell column=column record=row colProperty=column.property}} + {{/if}} {{/if}} {{/each}} diff --git a/app/templates/components/ember-tabular.hbs b/app/templates/components/ember-tabular.hbs index ef9c7e8..9791424 100644 --- a/app/templates/components/ember-tabular.hbs +++ b/app/templates/components/ember-tabular.hbs @@ -65,7 +65,6 @@ {{#each record as |row|}} {{partial trRow}} {{/each}} - {{yield body}} {{else}} From e2da32323a1cf92c1d8c65b83c68d45d2c68c7f3 Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Mon, 26 Jun 2017 21:13:30 -0400 Subject: [PATCH 016/105] WIP, use find-by and an external config to define when columns need custom templates --- addon/components/ember-tabular.js | 2 ++ app/templates/components/ember-tabular-row.hbs | 2 +- tests/dummy/app/controllers/index.js | 10 ++++++++++ tests/dummy/app/templates/index.hbs | 2 +- 4 files changed, 14 insertions(+), 2 deletions(-) diff --git a/addon/components/ember-tabular.js b/addon/components/ember-tabular.js index c8f978e..14cc325 100644 --- a/addon/components/ember-tabular.js +++ b/addon/components/ember-tabular.js @@ -255,6 +255,8 @@ export default Ember.Component.extend({ }, }), + columnsConfig: null, + /** * Template for table's row * diff --git a/app/templates/components/ember-tabular-row.hbs b/app/templates/components/ember-tabular-row.hbs index 453d7cb..8811eeb 100644 --- a/app/templates/components/ember-tabular-row.hbs +++ b/app/templates/components/ember-tabular-row.hbs @@ -2,7 +2,7 @@ {{#each columns as |column|}} {{#if column.isActive}} {{!-- TODO: must be a way to use yield or inline form based on a property --}} - {{#if column.isCustom}} + {{#if (find-by columnsConfig "property" column.property)}} {{yield (hash cell=(component "ember-tabular-cell" column=column record=row colProperty=colProperty) )}} diff --git a/tests/dummy/app/controllers/index.js b/tests/dummy/app/controllers/index.js index b087a7e..41434bd 100644 --- a/tests/dummy/app/controllers/index.js +++ b/tests/dummy/app/controllers/index.js @@ -13,6 +13,16 @@ export default Ember.Controller.extend({ sort1: 'username', sort2: 'username', isAdminFilter: null, + columnsConfig: [ + { + property: 'emailAddress', + isCustom: true, + }, + { + property: 'updatedAt', + isCustom: true, + }, + ], columns: [ { property: 'username', diff --git a/tests/dummy/app/templates/index.hbs b/tests/dummy/app/templates/index.hbs index b64107d..1b2aab9 100644 --- a/tests/dummy/app/templates/index.hbs +++ b/tests/dummy/app/templates/index.hbs @@ -1,6 +1,6 @@
    Example #1

    Table - Column Select

    -{{#ember-tabular class="table-column-select" tableWrapperClass="table-wrapper" paginationWrapperClass="pagination-wrapper" modelName="user" record=users5 sort=sort2 as |section|}} +{{#ember-tabular class="table-column-select" tableWrapperClass="table-wrapper" paginationWrapperClass="pagination-wrapper" modelName="user" record=users5 columnsConfig=columnsConfig sort=sort2 as |section|}} {{#if section.isHeader}} Section Header {{/if}} From 96dc55e80d8c88fd3fcf8b385f5c9a1cb9614537 Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Tue, 27 Jun 2017 02:39:37 -0400 Subject: [PATCH 017/105] Setup compare-with helper that accepts columnsConfig property and column property --- addon/helpers/compare-with.js | 9 +++++++ app/helpers/compare-with.js | 3 +++ .../components/ember-tabular-row.hbs | 3 +-- tests/dummy/app/controllers/index.js | 4 +-- tests/dummy/app/templates/index.hbs | 25 +++---------------- 5 files changed, 18 insertions(+), 26 deletions(-) create mode 100644 addon/helpers/compare-with.js create mode 100644 app/helpers/compare-with.js diff --git a/addon/helpers/compare-with.js b/addon/helpers/compare-with.js new file mode 100644 index 0000000..0f7eeaf --- /dev/null +++ b/addon/helpers/compare-with.js @@ -0,0 +1,9 @@ +import Ember from 'ember'; + +export default Ember.Helper.helper(function([collection, attrName, attrValue, hasProperty]) { + if (collection) { + return collection.find(el => { + return Ember.get(el, attrName) === attrValue && Ember.get(el, hasProperty); + }); + } +}); diff --git a/app/helpers/compare-with.js b/app/helpers/compare-with.js new file mode 100644 index 0000000..e3f2fae --- /dev/null +++ b/app/helpers/compare-with.js @@ -0,0 +1,3 @@ +import CompareWith from 'ember-tabular/helpers/compare-with'; + +export default CompareWith; diff --git a/app/templates/components/ember-tabular-row.hbs b/app/templates/components/ember-tabular-row.hbs index 8811eeb..71b9367 100644 --- a/app/templates/components/ember-tabular-row.hbs +++ b/app/templates/components/ember-tabular-row.hbs @@ -1,8 +1,7 @@
    {{#each columns as |column|}} {{#if column.isActive}} - {{!-- TODO: must be a way to use yield or inline form based on a property --}} - {{#if (find-by columnsConfig "property" column.property)}} + {{#if (compare-with columnsConfig "property" column.property "isCustomTemplate")}} {{yield (hash cell=(component "ember-tabular-cell" column=column record=row colProperty=colProperty) )}} diff --git a/tests/dummy/app/controllers/index.js b/tests/dummy/app/controllers/index.js index 41434bd..942e71b 100644 --- a/tests/dummy/app/controllers/index.js +++ b/tests/dummy/app/controllers/index.js @@ -16,11 +16,11 @@ export default Ember.Controller.extend({ columnsConfig: [ { property: 'emailAddress', - isCustom: true, + isCustomTemplate: true, }, { property: 'updatedAt', - isCustom: true, + isCustomTemplate: true, }, ], columns: [ diff --git a/tests/dummy/app/templates/index.hbs b/tests/dummy/app/templates/index.hbs index 1b2aab9..dc75d85 100644 --- a/tests/dummy/app/templates/index.hbs +++ b/tests/dummy/app/templates/index.hbs @@ -1,34 +1,15 @@
    Example #1

    Table - Column Select

    -{{#ember-tabular class="table-column-select" tableWrapperClass="table-wrapper" paginationWrapperClass="pagination-wrapper" modelName="user" record=users5 columnsConfig=columnsConfig sort=sort2 as |section|}} - {{#if section.isHeader}} - Section Header - {{/if}} - {{!-- {{section.cell colProperty="username"}} --}} +{{#ember-tabular modelName="user" record=users5 sort=sort2 columnsConfig=columnsConfig as |section|}} {{#section.cell colProperty="emailAddress" as |record column|}} {{get record column.property}} {{/section.cell}} - {{!-- {{section.cell colProperty="password"}} --}} - {{!-- {{section.cell colProperty="firstName"}} --}} - {{!-- {{section.cell colProperty="lastName"}} --}} - {{!-- {{section.cell colProperty="isAdmin"}} --}} - {{!-- {{section.cell colProperty="createdAt"}} --}} {{#section.cell colProperty="updatedAt" as |record column|}} {{moment-format (get record column.property) 'MM/DD/YYYY'}} {{/section.cell}} - {{#if section.isFooter}} - Section Footer - {{/if}} - {{!-- {{#if section.isBody}} - {{#each users5 as |row|}} - - - - {{/each}} - {{/if}} --}} {{/ember-tabular}} -
    Example #2
    +{{!--
    Example #2

    Table - Default

    {{#ember-tabular class="table-default" tableWrapperClass="table-wrapper" paginationWrapperClass="pagination-wrapper" columns=columns modelName="user" record=users sort=sort as |section|}} {{#if section.isBody}} @@ -60,7 +41,7 @@ {{/each}} {{/if}} -{{/ember-tabular}} +{{/ember-tabular}} --}} {{!--
    Example #3

    Table - Persist Filtering

    From 2e3d2b88ccd7909c81059723365f1c0c8fc4afdd Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Tue, 27 Jun 2017 09:40:35 -0400 Subject: [PATCH 018/105] Change name to be more contextual --- addon/components/ember-tabular-cell.js | 6 +-- .../components/ember-tabular-cell.hbs | 2 +- .../components/ember-tabular-row.hbs | 4 +- tests/dummy/app/templates/index.hbs | 42 ++++--------------- 4 files changed, 14 insertions(+), 40 deletions(-) diff --git a/addon/components/ember-tabular-cell.js b/addon/components/ember-tabular-cell.js index 78d8034..f392152 100644 --- a/addon/components/ember-tabular-cell.js +++ b/addon/components/ember-tabular-cell.js @@ -12,10 +12,10 @@ export default Ember.Component.extend({ */ tagName: '', action: null, - hasColProperty: Ember.computed('colProperty', 'column', function () { - const colProperty = this.get('colProperty'); + hasProperty: Ember.computed('property', 'column', function () { + const property = this.get('property'); const column = this.get('column'); - if (colProperty === column.property) { + if (property === column.property) { return true; } return false; diff --git a/app/templates/components/ember-tabular-cell.hbs b/app/templates/components/ember-tabular-cell.hbs index 096a761..508093b 100644 --- a/app/templates/components/ember-tabular-cell.hbs +++ b/app/templates/components/ember-tabular-cell.hbs @@ -1,4 +1,4 @@ -{{#if hasColProperty}} +{{#if hasProperty}} {{#if hasBlock}} {{else}} diff --git a/app/templates/components/ember-tabular-row.hbs b/app/templates/components/ember-tabular-row.hbs index 71b9367..aff1988 100644 --- a/app/templates/components/ember-tabular-row.hbs +++ b/app/templates/components/ember-tabular-row.hbs @@ -3,10 +3,10 @@ {{#if column.isActive}} {{#if (compare-with columnsConfig "property" column.property "isCustomTemplate")}} {{yield (hash - cell=(component "ember-tabular-cell" column=column record=row colProperty=colProperty) + cell=(component "ember-tabular-cell" column=column record=row property=property) )}} {{else}} - {{ember-tabular-cell column=column record=row colProperty=column.property}} + {{ember-tabular-cell column=column record=row property=column.property}} {{/if}} {{/if}} {{/each}} diff --git a/tests/dummy/app/templates/index.hbs b/tests/dummy/app/templates/index.hbs index dc75d85..e6c1b4b 100644 --- a/tests/dummy/app/templates/index.hbs +++ b/tests/dummy/app/templates/index.hbs @@ -1,47 +1,21 @@
    Example #1

    Table - Column Select

    {{#ember-tabular modelName="user" record=users5 sort=sort2 columnsConfig=columnsConfig as |section|}} - {{#section.cell colProperty="emailAddress" as |record column|}} + {{#section.cell property="emailAddress" as |record column|}} {{get record column.property}} {{/section.cell}} - {{#section.cell colProperty="updatedAt" as |record column|}} + {{#section.cell property="updatedAt" as |record column|}} {{moment-format (get record column.property) 'MM/DD/YYYY'}} {{/section.cell}} {{/ember-tabular}} -{{!--
    Example #2
    +
    Example #2

    Table - Default

    -{{#ember-tabular class="table-default" tableWrapperClass="table-wrapper" paginationWrapperClass="pagination-wrapper" columns=columns modelName="user" record=users sort=sort as |section|}} - {{#if section.isBody}} - {{#each users as |row|}} - - - - - - - - - - {{/each}} - {{/if}} -{{/ember-tabular}} --}} +{{#ember-tabular class="table-default" tableWrapperClass="table-wrapper" paginationWrapperClass="pagination-wrapper" columns=columns modelName="user" record=users sort=sort isColumnSelect=false as |section|}} + {{#section.cell property="username" as |record column|}} + {{record.username}} + {{/section.cell}} +{{/ember-tabular}} {{!--
    Example #3

    Table - Persist Filtering

    From 6ae44e0c1f08e664dfb8d60a46730aaa32a23068 Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Tue, 27 Jun 2017 12:05:54 -0400 Subject: [PATCH 019/105] Setup columnsConfig and automatically merge with the columns array --- addon/components/ember-tabular.js | 11 ++++++++++- app/templates/components/ember-tabular-row.hbs | 2 +- tests/dummy/app/controllers/index.js | 5 ++++- tests/dummy/app/templates/index.hbs | 2 +- 4 files changed, 16 insertions(+), 4 deletions(-) diff --git a/addon/components/ember-tabular.js b/addon/components/ember-tabular.js index 14cc325..6bd099f 100644 --- a/addon/components/ember-tabular.js +++ b/addon/components/ember-tabular.js @@ -230,9 +230,10 @@ export default Ember.Component.extend({ * @type Array * @default null */ - columns: Ember.computed('columnsMap', { + columns: Ember.computed('columnsConfig', { get() { const modelName = this.get('modelName'); + const columnsConfig = this.get('columnsConfig'); let columns = []; // used if ember-tabular is making request if (modelName) { @@ -246,11 +247,19 @@ export default Ember.Component.extend({ property: name, label: this._formatColumnLabel(name), isActive: true, + isCustomTemplate: false, }); attributes.push(attribute); }); columns = attributes; } + // merge columnsConfig with columns + if (columnsConfig) { + for (var i = columnsConfig.length - 1; i >= 0; i--) { + let item = columns.findBy('property', columnsConfig[i].property); + let newItem = Ember.merge(item, columnsConfig[i]); + } + } return columns; }, }), diff --git a/app/templates/components/ember-tabular-row.hbs b/app/templates/components/ember-tabular-row.hbs index aff1988..14cfc17 100644 --- a/app/templates/components/ember-tabular-row.hbs +++ b/app/templates/components/ember-tabular-row.hbs @@ -1,7 +1,7 @@ {{#each columns as |column|}} {{#if column.isActive}} - {{#if (compare-with columnsConfig "property" column.property "isCustomTemplate")}} + {{#if (compare-with columns "property" column.property "isCustomTemplate")}} {{yield (hash cell=(component "ember-tabular-cell" column=column record=row property=property) )}} diff --git a/tests/dummy/app/controllers/index.js b/tests/dummy/app/controllers/index.js index 942e71b..43576f9 100644 --- a/tests/dummy/app/controllers/index.js +++ b/tests/dummy/app/controllers/index.js @@ -5,7 +5,6 @@ export default Ember.Controller.extend({ users2: null, users3: null, users4: null, - users5: null, filter: null, filter2: null, filter3: null, @@ -22,6 +21,10 @@ export default Ember.Controller.extend({ property: 'updatedAt', isCustomTemplate: true, }, + { + property: 'password', + isActive: false, + }, ], columns: [ { diff --git a/tests/dummy/app/templates/index.hbs b/tests/dummy/app/templates/index.hbs index e6c1b4b..2b2a96b 100644 --- a/tests/dummy/app/templates/index.hbs +++ b/tests/dummy/app/templates/index.hbs @@ -1,6 +1,6 @@
    Example #1

    Table - Column Select

    -{{#ember-tabular modelName="user" record=users5 sort=sort2 columnsConfig=columnsConfig as |section|}} +{{#ember-tabular modelName="user" sort=sort2 columnsConfig=columnsConfig as |section|}} {{#section.cell property="emailAddress" as |record column|}} {{get record column.property}} {{/section.cell}} From f5942c1ab66fcaca824ad37dbf8b9edba9b09b7a Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Tue, 27 Jun 2017 12:07:55 -0400 Subject: [PATCH 020/105] Fix mock user data --- tests/dummy/mirage/factories/user.js | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/tests/dummy/mirage/factories/user.js b/tests/dummy/mirage/factories/user.js index 75372c8..2b1ecce 100644 --- a/tests/dummy/mirage/factories/user.js +++ b/tests/dummy/mirage/factories/user.js @@ -2,11 +2,12 @@ import Mirage, {faker} from 'ember-cli-mirage'; import moment from 'moment'; export default Mirage.Factory.extend({ - 'username'() { return faker.internet.userName(); }, - 'emailAddress'() { return faker.internet.email(); }, - 'firstName'() { return faker.name.firstName(); }, - 'lastName'() { return faker.name.lastName(); }, - 'isAdmin'() { return faker.random.arrayElement([true, false]); }, - 'createdAt'() { return moment(faker.date.past()).format('YYYY-MM-DD'); }, - 'updatedAt'() { return moment(faker.date.past()).format('YYYY-MM-DD'); }, + username() { return faker.internet.userName(); }, + emailAddress() { return faker.internet.email(); }, + password() { return faker.internet.password(); }, + firstName() { return faker.name.firstName(); }, + lastName() { return faker.name.lastName(); }, + isAdmin() { return faker.random.arrayElement([true, false]); }, + createdAt() { return moment(faker.date.past()).format('YYYY-MM-DD'); }, + updatedAt() { return moment(faker.date.past()).format('YYYY-MM-DD'); }, }); From 15e8d10b299386e1ddb35a724bce7737cf92ff87 Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Tue, 27 Jun 2017 15:02:20 -0400 Subject: [PATCH 021/105] Do not require columns array or objects to be ember objects, support non-KVO compliant --- .../components/ember-tabular-column-select.js | 6 +- addon/components/ember-tabular.js | 16 ++- addon/helpers/compare-with.js | 4 +- tests/dummy/app/controllers/index.js | 33 ++++++ tests/dummy/app/templates/index.hbs | 106 ++++++++++++------ 5 files changed, 123 insertions(+), 42 deletions(-) diff --git a/addon/components/ember-tabular-column-select.js b/addon/components/ember-tabular-column-select.js index 004bf4b..4d1522a 100644 --- a/addon/components/ember-tabular-column-select.js +++ b/addon/components/ember-tabular-column-select.js @@ -14,7 +14,11 @@ export default Ember.Component.extend({ actions: { toggleColumn(column) { - column.toggleProperty('isActive'); + if (column.isActive) { + Ember.set(column, 'isActive', false); + } else { + Ember.set(column, 'isActive', true); + } }, }, }); diff --git a/addon/components/ember-tabular.js b/addon/components/ember-tabular.js index 6bd099f..5c3c15e 100644 --- a/addon/components/ember-tabular.js +++ b/addon/components/ember-tabular.js @@ -239,16 +239,16 @@ export default Ember.Component.extend({ if (modelName) { const modelClass = this.get('store').modelFor(modelName); const modelClassAttributes = Ember.get(modelClass, 'attributes'); - let attributes = Ember.A(); + let attributes = []; // iterate over keys and create attribute array modelClassAttributes.forEach((meta, name) => { - let attribute = Ember.Object.create({ + let attribute = { property: name, label: this._formatColumnLabel(name), isActive: true, isCustomTemplate: false, - }); + }; attributes.push(attribute); }); columns = attributes; @@ -256,8 +256,14 @@ export default Ember.Component.extend({ // merge columnsConfig with columns if (columnsConfig) { for (var i = columnsConfig.length - 1; i >= 0; i--) { - let item = columns.findBy('property', columnsConfig[i].property); - let newItem = Ember.merge(item, columnsConfig[i]); + let item = columns.find((el) => { + return el.property === columnsConfig[i].property; + }); + if (item) { + let newItem = Ember.merge(item, columnsConfig[i]); + } else { + columns.push(columnsConfig[i]); + } } } return columns; diff --git a/addon/helpers/compare-with.js b/addon/helpers/compare-with.js index 0f7eeaf..f3086a4 100644 --- a/addon/helpers/compare-with.js +++ b/addon/helpers/compare-with.js @@ -2,8 +2,6 @@ import Ember from 'ember'; export default Ember.Helper.helper(function([collection, attrName, attrValue, hasProperty]) { if (collection) { - return collection.find(el => { - return Ember.get(el, attrName) === attrValue && Ember.get(el, hasProperty); - }); + return collection.find(el => el[attrName] === attrValue && el[hasProperty]); } }); diff --git a/tests/dummy/app/controllers/index.js b/tests/dummy/app/controllers/index.js index 43576f9..50ccff4 100644 --- a/tests/dummy/app/controllers/index.js +++ b/tests/dummy/app/controllers/index.js @@ -25,28 +25,54 @@ export default Ember.Controller.extend({ property: 'password', isActive: false, }, + { + property: 'createdAt', + isActive: false, + }, + { + property: 'isAdmin', + isActive: false, + }, + { + label: 'Actions', + property: 'actions', + isCustomTemplate: true, + isActive: true, + filter: false, + sort: false, + }, ], columns: [ { property: 'username', label: 'Username', defaultSort: 'username', + isCustomTemplate: true, + isActive: true, }, { property: 'emailAddress', label: 'Email', + isCustomTemplate: true, + isActive: true, }, { property: 'firstName', label: 'First Name', + isCustomTemplate: true, + isActive: true, }, { property: 'lastName', label: 'Last Name', + isCustomTemplate: true, + isActive: true, }, { property: 'isAdmin', label: 'Is Admin', + isCustomTemplate: true, + isActive: true, list: [ { label: 'Yes', @@ -61,11 +87,18 @@ export default Ember.Controller.extend({ { property: 'updatedAt', label: 'Last Updated', + isCustomTemplate: true, + isActive: true, type: 'date', sort: false, }, { + property: 'actions', label: 'Actions', + isCustomTemplate: true, + filter: false, + sort: false, + isActive: true, }, ], columns2: [ diff --git a/tests/dummy/app/templates/index.hbs b/tests/dummy/app/templates/index.hbs index 2b2a96b..4b5f2ea 100644 --- a/tests/dummy/app/templates/index.hbs +++ b/tests/dummy/app/templates/index.hbs @@ -7,51 +7,91 @@ {{#section.cell property="updatedAt" as |record column|}} {{moment-format (get record column.property) 'MM/DD/YYYY'}} {{/section.cell}} + {{#section.cell property="actions"}} + {{#link-to "index" class="btn btn-default btn-xs" role="button"}} + Edit + {{/link-to}} + {{/section.cell}} {{/ember-tabular}}
    Example #2

    Table - Default

    -{{#ember-tabular class="table-default" tableWrapperClass="table-wrapper" paginationWrapperClass="pagination-wrapper" columns=columns modelName="user" record=users sort=sort isColumnSelect=false as |section|}} +{{ember-tabular modelName="user" sort=sort isColumnSelect=false}} + +
    Example #3
    +

    Table - Override Columns/Templates

    +{{#ember-tabular class="table-default" columns=columns modelName="user" record=users sort=sort as |section|}} {{#section.cell property="username" as |record column|}} {{record.username}} {{/section.cell}} + {{#section.cell property="emailAddress" as |record column|}} + {{record.emailAddress}} + {{/section.cell}} + {{#section.cell property="firstName" as |record column|}} + {{record.firstName}} + {{/section.cell}} + {{#section.cell property="lastName" as |record column|}} + {{record.lastName}} + {{/section.cell}} + {{#section.cell property="isAdmin" as |record column|}} + {{#if record.isAdmin}} + Yes + {{else}} + No + {{/if}} + {{/section.cell}} + {{#section.cell property="updatedAt" as |record column|}} + {{#if record.updatedAt}} + {{moment-format record.updatedAt 'MM/DD/YYYY'}} + {{else}} + {{moment-format record.createdAt 'MM/DD/YYYY'}} + {{/if}} + {{/section.cell}} + {{#section.cell property="actions" as |record column|}} + {{#link-to "index" class="btn btn-default btn-xs" role="button"}} + Edit + {{/link-to}} + {{/section.cell}} {{/ember-tabular}} -{{!--
    Example #3
    + +
    Example #3

    Table - Persist Filtering

    -{{#ember-tabular class="table-persist" tableWrapperClass="table-wrapper" paginationWrapperClass="pagination-wrapper" columns=columns modelName="user" record=users4 filter=filter3 persistFiltering=true sort=sort1 as |section|}} - {{#if section.isBody}} - {{#each users4 as |row|}} -
    - - - - - - - - - {{/each}} - {{/if}} +{{#ember-tabular class="table-persist" columns=columns modelName="user" record=users4 filter=filter3 persistFiltering=true sort=sort1 as |section|}} + {{#section.cell property="username" as |record column|}} + {{record.username}} + {{/section.cell}} + {{#section.cell property="emailAddress" as |record column|}} + {{record.emailAddress}} + {{/section.cell}} + {{#section.cell property="firstName" as |record column|}} + {{record.firstName}} + {{/section.cell}} + {{#section.cell property="lastName" as |record column|}} + {{record.lastName}} + {{/section.cell}} + {{#section.cell property="isAdmin" as |record column|}} + {{#if record.isAdmin}} + Yes + {{else}} + No + {{/if}} + {{/section.cell}} + {{#section.cell property="updatedAt" as |record column|}} + {{#if record.updatedAt}} + {{moment-format record.updatedAt 'MM/DD/YYYY'}} + {{else}} + {{moment-format record.createdAt 'MM/DD/YYYY'}} + {{/if}} + {{/section.cell}} + {{#section.cell property="actions" as |record column|}} + {{#link-to "index" class="btn btn-default btn-xs" role="button"}} + Edit + {{/link-to}} + {{/section.cell}} {{/ember-tabular}} -
    Example #4
    +{{!--
    Example #4

    Table - Basic - Global Filter

    {{#ember-tabular class="table-basic-global-filter" columns=columns2 modelName="user" record=users2 filter=filter as |section|}} {{#if section.isHeader}} From 38ed3cd54acaa24b3430c7ef71f244a10828d926 Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Tue, 27 Jun 2017 15:08:34 -0400 Subject: [PATCH 022/105] Set individual sort properties --- tests/dummy/app/controllers/index.js | 3 ++- tests/dummy/app/templates/index.hbs | 8 ++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/tests/dummy/app/controllers/index.js b/tests/dummy/app/controllers/index.js index 50ccff4..d9fca3c 100644 --- a/tests/dummy/app/controllers/index.js +++ b/tests/dummy/app/controllers/index.js @@ -8,9 +8,10 @@ export default Ember.Controller.extend({ filter: null, filter2: null, filter3: null, - sort: 'username', sort1: 'username', sort2: 'username', + sort3: 'username', + sort4: 'username', isAdminFilter: null, columnsConfig: [ { diff --git a/tests/dummy/app/templates/index.hbs b/tests/dummy/app/templates/index.hbs index 4b5f2ea..b80ab19 100644 --- a/tests/dummy/app/templates/index.hbs +++ b/tests/dummy/app/templates/index.hbs @@ -1,6 +1,6 @@
    Example #1

    Table - Column Select

    -{{#ember-tabular modelName="user" sort=sort2 columnsConfig=columnsConfig as |section|}} +{{#ember-tabular modelName="user" sort=sort1 columnsConfig=columnsConfig as |section|}} {{#section.cell property="emailAddress" as |record column|}} {{get record column.property}} {{/section.cell}} @@ -16,11 +16,11 @@
    Example #2

    Table - Default

    -{{ember-tabular modelName="user" sort=sort isColumnSelect=false}} +{{ember-tabular modelName="user" sort=sort2 isColumnSelect=false}}
    Example #3

    Table - Override Columns/Templates

    -{{#ember-tabular class="table-default" columns=columns modelName="user" record=users sort=sort as |section|}} +{{#ember-tabular class="table-default" columns=columns modelName="user" record=users sort=sort3 as |section|}} {{#section.cell property="username" as |record column|}} {{record.username}} {{/section.cell}} @@ -57,7 +57,7 @@
    Example #3

    Table - Persist Filtering

    -{{#ember-tabular class="table-persist" columns=columns modelName="user" record=users4 filter=filter3 persistFiltering=true sort=sort1 as |section|}} +{{#ember-tabular class="table-persist" columns=columns modelName="user" record=users4 filter=filter3 persistFiltering=true sort=sort4 as |section|}} {{#section.cell property="username" as |record column|}} {{record.username}} {{/section.cell}} From 18c8473c6308cca353c429fb5c735eb31887d74f Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Tue, 27 Jun 2017 15:13:36 -0400 Subject: [PATCH 023/105] Fix scoping issue when setting the sort asc/desc classes --- addon/components/ember-tabular.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addon/components/ember-tabular.js b/addon/components/ember-tabular.js index 5c3c15e..cfbf951 100644 --- a/addon/components/ember-tabular.js +++ b/addon/components/ember-tabular.js @@ -908,7 +908,7 @@ export default Ember.Component.extend({ property = sort.replace(/^-/, ''); // convert relationships classProperty = property.replace(/\./g, '-'); - $tableHeader = Ember.$(`#${classProperty}`); + $tableHeader = $table.find(`#${classProperty}`); // Remove all classes on th.sortable but sortable class $table.find('th').removeClass(function (i, group) { From c0206697fafe6357064557bcfcb30f8ca072937b Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Wed, 28 Jun 2017 04:03:43 -0400 Subject: [PATCH 024/105] Change name to column from cell --- addon/components/ember-tabular-cell.js | 23 -------- addon/components/ember-tabular-column.js | 58 +++++++++++++++++++ app/components/ember-tabular-cell.js | 3 - app/components/ember-tabular-column.js | 3 + ...ular-cell.hbs => ember-tabular-column.hbs} | 0 5 files changed, 61 insertions(+), 26 deletions(-) delete mode 100644 addon/components/ember-tabular-cell.js create mode 100644 addon/components/ember-tabular-column.js delete mode 100644 app/components/ember-tabular-cell.js create mode 100644 app/components/ember-tabular-column.js rename app/templates/components/{ember-tabular-cell.hbs => ember-tabular-column.hbs} (100%) diff --git a/addon/components/ember-tabular-cell.js b/addon/components/ember-tabular-cell.js deleted file mode 100644 index f392152..0000000 --- a/addon/components/ember-tabular-cell.js +++ /dev/null @@ -1,23 +0,0 @@ -import Ember from 'ember'; - -/** -* -* @class EmberTabularCell -*/ -export default Ember.Component.extend({ - /** - * @property tagName - * @type String - * @default '' - */ - tagName: '', - action: null, - hasProperty: Ember.computed('property', 'column', function () { - const property = this.get('property'); - const column = this.get('column'); - if (property === column.property) { - return true; - } - return false; - }), -}); diff --git a/addon/components/ember-tabular-column.js b/addon/components/ember-tabular-column.js new file mode 100644 index 0000000..3b2a918 --- /dev/null +++ b/addon/components/ember-tabular-column.js @@ -0,0 +1,58 @@ +import Ember from 'ember'; +import EmberTabularHelpers from 'ember-tabular/mixins/components/ember-tabular-helpers'; + +/** +* +* @class EmberTabularCell +*/ +export default Ember.Component.extend(EmberTabularHelpers, { + /** + * @property tagName + * @type String + * @default '' + */ + tagName: '', + action: null, + registry: null, + hasProperty: Ember.computed('property', 'column', function () { + const property = this.get('property'); + const column = this.get('column'); + if (column && property === column.property) { + return true; + } + return false; + }), + init() { + this._super(...arguments); + const registry = this.get('registry'); + const property = this.get('property'); + const label = this.get('label') || this._formatColumnLabel(property); + const isActive = typeof this.get('isActive') !== 'undefined' ? this.get('isActive') : true; + const isCustom = this.get('isCustom') || false; + const filter = typeof this.get('filter') !== 'undefined' ? this.get('filter') : true; + const sort = typeof this.get('sort') !== 'undefined' ? this.get('sort') : true; + const type = this.get('type') || 'text'; + console.log('property', property); + console.log('isCustom', isCustom); + console.log('filter', filter); + console.log('sort', sort); + let column = { + property: property, + label: label, + isActive: isActive, + isCustomTemplate: isCustom, + filter: filter, + sort: sort, + type: type, + }; + if (isCustom) { + let item = registry.find((el) => { + return el.property === property; + }); + if (!item) { + console.log('ADD TO REGISTRY', column); + registry.addObject(column); + } + } + }, +}); diff --git a/app/components/ember-tabular-cell.js b/app/components/ember-tabular-cell.js deleted file mode 100644 index 41b47c9..0000000 --- a/app/components/ember-tabular-cell.js +++ /dev/null @@ -1,3 +0,0 @@ -import EmberTabularCell from 'ember-tabular/components/ember-tabular-cell'; - -export default EmberTabularCell; diff --git a/app/components/ember-tabular-column.js b/app/components/ember-tabular-column.js new file mode 100644 index 0000000..5afa215 --- /dev/null +++ b/app/components/ember-tabular-column.js @@ -0,0 +1,3 @@ +import EmberTabularColumn from 'ember-tabular/components/ember-tabular-column'; + +export default EmberTabularColumn; diff --git a/app/templates/components/ember-tabular-cell.hbs b/app/templates/components/ember-tabular-column.hbs similarity index 100% rename from app/templates/components/ember-tabular-cell.hbs rename to app/templates/components/ember-tabular-column.hbs From 2333f0d8883042d509f30e8b71bbf50d94e87579 Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Wed, 28 Jun 2017 04:04:30 -0400 Subject: [PATCH 025/105] Setup helper for determining property name --- addon/components/ember-tabular.js | 8 ++------ addon/mixins/components/ember-tabular-helpers.js | 8 ++++++++ app/mixins/components/ember-tabular-helpers.js | 3 +++ 3 files changed, 13 insertions(+), 6 deletions(-) create mode 100644 addon/mixins/components/ember-tabular-helpers.js create mode 100644 app/mixins/components/ember-tabular-helpers.js diff --git a/addon/components/ember-tabular.js b/addon/components/ember-tabular.js index cfbf951..ce578cf 100644 --- a/addon/components/ember-tabular.js +++ b/addon/components/ember-tabular.js @@ -1,4 +1,5 @@ import Ember from 'ember'; +import EmberTabularHelpers from 'ember-tabular/mixins/components/ember-tabular-helpers'; /** * ## Basic Usage @@ -63,7 +64,7 @@ import Ember from 'ember'; * * @class EmberTabular */ -export default Ember.Component.extend({ +export default Ember.Component.extend(EmberTabularHelpers, { store: Ember.inject.service('store'), action: null, classNames: ['ember-tabular'], @@ -281,11 +282,6 @@ export default Ember.Component.extend({ */ trRow: 'components/ember-tabular-row', - _formatColumnLabel(text) { - let result = text.replace(/([A-Z])/g, ' $1'); - return result.charAt(0).toUpperCase() + result.slice(1); - }, - /** * Whether to display the panel to select different table columns. * diff --git a/addon/mixins/components/ember-tabular-helpers.js b/addon/mixins/components/ember-tabular-helpers.js new file mode 100644 index 0000000..88f9f67 --- /dev/null +++ b/addon/mixins/components/ember-tabular-helpers.js @@ -0,0 +1,8 @@ +import Ember from 'ember'; + +export default Ember.Mixin.create({ + _formatColumnLabel(text) { + let result = text.replace(/([A-Z])/g, ' $1'); + return result.charAt(0).toUpperCase() + result.slice(1); + }, +}); diff --git a/app/mixins/components/ember-tabular-helpers.js b/app/mixins/components/ember-tabular-helpers.js new file mode 100644 index 0000000..aa68060 --- /dev/null +++ b/app/mixins/components/ember-tabular-helpers.js @@ -0,0 +1,3 @@ +import EmberTabularHelpers from 'ember-tabular/mixins/components/ember-tabular-helpers'; + +export default EmberTabularHelpers; From c5b5b5b39f727a77f218f5aa6b61a3b2ef883647 Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Wed, 28 Jun 2017 04:06:09 -0400 Subject: [PATCH 026/105] WIP, setup way to initialize columns array based on initialized subcomponent columns --- addon/components/ember-tabular.js | 114 +++++++++++------ .../components/ember-tabular-row.hbs | 8 +- tests/dummy/app/templates/index.hbs | 119 +++++++----------- 3 files changed, 127 insertions(+), 114 deletions(-) diff --git a/addon/components/ember-tabular.js b/addon/components/ember-tabular.js index ce578cf..9e7eaf4 100644 --- a/addon/components/ember-tabular.js +++ b/addon/components/ember-tabular.js @@ -231,48 +231,84 @@ export default Ember.Component.extend(EmberTabularHelpers, { * @type Array * @default null */ - columns: Ember.computed('columnsConfig', { - get() { - const modelName = this.get('modelName'); - const columnsConfig = this.get('columnsConfig'); - let columns = []; - // used if ember-tabular is making request - if (modelName) { - const modelClass = this.get('store').modelFor(modelName); - const modelClassAttributes = Ember.get(modelClass, 'attributes'); - let attributes = []; - - // iterate over keys and create attribute array - modelClassAttributes.forEach((meta, name) => { - let attribute = { - property: name, - label: this._formatColumnLabel(name), - isActive: true, - isCustomTemplate: false, - }; - attributes.push(attribute); - }); - columns = attributes; - } - // merge columnsConfig with columns - if (columnsConfig) { - for (var i = columnsConfig.length - 1; i >= 0; i--) { - let item = columns.find((el) => { - return el.property === columnsConfig[i].property; - }); - if (item) { - let newItem = Ember.merge(item, columnsConfig[i]); - } else { - columns.push(columnsConfig[i]); - } - } - } - return columns; - }, + // columns: Ember.computed('columnsConfig', { + // get() { + // const modelName = this.get('modelName'); + // const columnsConfig = this.get('columnsConfig'); + // let columns = []; + // // used if ember-tabular is making request + // if (modelName) { + // const modelClass = this.get('store').modelFor(modelName); + // const modelClassAttributes = Ember.get(modelClass, 'attributes'); + // let attributes = []; + + // // iterate over keys and create attribute array + // modelClassAttributes.forEach((meta, name) => { + // let attribute = { + // property: name, + // label: this._formatColumnLabel(name), + // isActive: true, + // isCustomTemplate: false, + // }; + // attributes.push(attribute); + // }); + // columns = attributes; + // } + // // merge columnsConfig with columns + // if (columnsConfig) { + // for (var i = columnsConfig.length - 1; i >= 0; i--) { + // let item = columns.find((el) => { + // return el.property === columnsConfig[i].property; + // }); + // if (item) { + // let newItem = Ember.merge(item, columnsConfig[i]); + // } else { + // columns.push(columnsConfig[i]); + // } + // } + // } + // return columns; + // }, + // }), + columns: Ember.computed.union('registryDiff', 'registry'), + + checkColumns: Ember.observer('columns.[]', function () { + console.log('columns', this.get('columns')); }), columnsConfig: null, + registry: Ember.A(), + + registryDiff: Ember.computed('registry.[]', function () { + const modelName = this.get('modelName'); + const columnsConfig = this.get('columnsConfig'); + const registry = this.get('registry'); + let registryDiff = Ember.A(); + if (modelName) { + const modelClass = this.get('store').modelFor(modelName); + const modelClassAttributes = Ember.get(modelClass, 'attributes'); + // iterate over keys and create attribute array + modelClassAttributes.forEach((meta, property) => { + let attribute = { + property: property, + label: this._formatColumnLabel(property), + isActive: true, + isCustomTemplate: false, + }; + // look for duplicate + let item = registry.find((el) => { + return el.property === property; + }); + if (!item) { + registryDiff.addObject(attribute); + } + }); + } + console.log('REGISTRYDIFF', registryDiff); + return registryDiff; + }), + /** * Template for table's row * @@ -733,7 +769,7 @@ export default Ember.Component.extend(EmberTabularHelpers, { * * @method setColumnDefaults */ - setColumnDefaults: Ember.on('init', function () { + setColumnDefaults: Ember.observer('columns.[]', function () { this.get('columns').map(function (column) { // if column does not have a sort property defined set to true if (!column.hasOwnProperty('sort')) { diff --git a/app/templates/components/ember-tabular-row.hbs b/app/templates/components/ember-tabular-row.hbs index 14cfc17..0666a44 100644 --- a/app/templates/components/ember-tabular-row.hbs +++ b/app/templates/components/ember-tabular-row.hbs @@ -1,12 +1,16 @@
    + {{!-- required outside of columns loop to trigger the render of the custom yielded columns --}} + {{yield (hash + column=(component "ember-tabular-column" registry=registry column=column record=row property=property) + )}} {{#each columns as |column|}} {{#if column.isActive}} {{#if (compare-with columns "property" column.property "isCustomTemplate")}} {{yield (hash - cell=(component "ember-tabular-cell" column=column record=row property=property) + column=(component "ember-tabular-column" registry=registry column=column record=row property=property) )}} {{else}} - {{ember-tabular-cell column=column record=row property=column.property}} + {{ember-tabular-column registry=registry column=column record=row property=column.property}} {{/if}} {{/if}} {{/each}} diff --git a/tests/dummy/app/templates/index.hbs b/tests/dummy/app/templates/index.hbs index b80ab19..28a0b8c 100644 --- a/tests/dummy/app/templates/index.hbs +++ b/tests/dummy/app/templates/index.hbs @@ -1,123 +1,112 @@
    Example #1

    Table - Column Select

    -{{#ember-tabular modelName="user" sort=sort1 columnsConfig=columnsConfig as |section|}} - {{#section.cell property="emailAddress" as |record column|}} +{{#ember-tabular modelName="user" sort=sort1 as |et|}} + {{#et.column property="emailAddress" isCustom=true as |record column|}} {{get record column.property}} - {{/section.cell}} - {{#section.cell property="updatedAt" as |record column|}} + {{/et.column}} + {{#et.column property="updatedAt" isCustom=true as |record column|}} {{moment-format (get record column.property) 'MM/DD/YYYY'}} - {{/section.cell}} - {{#section.cell property="actions"}} + {{/et.column}} + {{#et.column + property="actions" + isCustom=true + filter=false + sort=false + }} {{#link-to "index" class="btn btn-default btn-xs" role="button"}} Edit {{/link-to}} - {{/section.cell}} + {{/et.column}} {{/ember-tabular}} -
    Example #2
    +{{!--
    Example #2

    Table - Default

    {{ember-tabular modelName="user" sort=sort2 isColumnSelect=false}}
    Example #3

    Table - Override Columns/Templates

    {{#ember-tabular class="table-default" columns=columns modelName="user" record=users sort=sort3 as |section|}} - {{#section.cell property="username" as |record column|}} + {{#section.column property="username" as |record column|}} {{record.username}} - {{/section.cell}} - {{#section.cell property="emailAddress" as |record column|}} + {{/section.column}} + {{#section.column property="emailAddress" as |record column|}} {{record.emailAddress}} - {{/section.cell}} - {{#section.cell property="firstName" as |record column|}} + {{/section.column}} + {{#section.column property="firstName" as |record column|}} {{record.firstName}} - {{/section.cell}} - {{#section.cell property="lastName" as |record column|}} + {{/section.column}} + {{#section.column property="lastName" as |record column|}} {{record.lastName}} - {{/section.cell}} - {{#section.cell property="isAdmin" as |record column|}} + {{/section.column}} + {{#section.column property="isAdmin" as |record column|}} {{#if record.isAdmin}} Yes {{else}} No {{/if}} - {{/section.cell}} - {{#section.cell property="updatedAt" as |record column|}} + {{/section.column}} + {{#section.column property="updatedAt" as |record column|}} {{#if record.updatedAt}} {{moment-format record.updatedAt 'MM/DD/YYYY'}} {{else}} {{moment-format record.createdAt 'MM/DD/YYYY'}} {{/if}} - {{/section.cell}} - {{#section.cell property="actions" as |record column|}} + {{/section.column}} + {{#section.column property="actions" as |record column|}} {{#link-to "index" class="btn btn-default btn-xs" role="button"}} Edit {{/link-to}} - {{/section.cell}} + {{/section.column}} {{/ember-tabular}}
    Example #3

    Table - Persist Filtering

    {{#ember-tabular class="table-persist" columns=columns modelName="user" record=users4 filter=filter3 persistFiltering=true sort=sort4 as |section|}} - {{#section.cell property="username" as |record column|}} + {{#section.column property="username" as |record column|}} {{record.username}} - {{/section.cell}} - {{#section.cell property="emailAddress" as |record column|}} + {{/section.column}} + {{#section.column property="emailAddress" as |record column|}} {{record.emailAddress}} - {{/section.cell}} - {{#section.cell property="firstName" as |record column|}} + {{/section.column}} + {{#section.column property="firstName" as |record column|}} {{record.firstName}} - {{/section.cell}} - {{#section.cell property="lastName" as |record column|}} + {{/section.column}} + {{#section.column property="lastName" as |record column|}} {{record.lastName}} - {{/section.cell}} - {{#section.cell property="isAdmin" as |record column|}} + {{/section.column}} + {{#section.column property="isAdmin" as |record column|}} {{#if record.isAdmin}} Yes {{else}} No {{/if}} - {{/section.cell}} - {{#section.cell property="updatedAt" as |record column|}} + {{/section.column}} + {{#section.column property="updatedAt" as |record column|}} {{#if record.updatedAt}} {{moment-format record.updatedAt 'MM/DD/YYYY'}} {{else}} {{moment-format record.createdAt 'MM/DD/YYYY'}} {{/if}} - {{/section.cell}} - {{#section.cell property="actions" as |record column|}} + {{/section.column}} + {{#section.column property="actions" as |record column|}} {{#link-to "index" class="btn btn-default btn-xs" role="button"}} Edit {{/link-to}} - {{/section.cell}} + {{/section.column}} {{/ember-tabular}} -{{!--
    Example #4
    +
    Example #4

    Table - Basic - Global Filter

    -{{#ember-tabular class="table-basic-global-filter" columns=columns2 modelName="user" record=users2 filter=filter as |section|}} +{{#ember-tabular class="table-basic-global-filter" modelName="user" record=users2 filter=filter columnsConfig=columnsConfigForGlobalFilter as |section|}} {{#if section.isHeader}} {{ember-tabular-global-filter filter=filter filterProperty="username" filterPlaceholder="Search by Username"}} - {{else if section.isBody}} - {{#each users2 as |row|}} - - - - - - - - {{/each}} {{/if}} {{/ember-tabular}}
    Example #5

    Table - Basic - Dropdown Filter / Date Filter

    -{{#ember-tabular class="table-basic-global-date-filter" columns=columns2 modelName="user" record=users3 filter=filter2 as |section|}} +{{#ember-tabular class="table-basic-global-date-filter" modelName="user" record=users3 filter=filter2 columns=columnsForDropdownFilter as |section|}} {{#if section.isHeader}}
    @@ -140,27 +129,11 @@ {{ember-tabular-date-filter filter=filter2 filterProperty="updatedAt" label="Last Updated"}}
    - {{else if section.isBody}} - {{#each users3 as |row|}} - - - - - - - - {{/each}} {{/if}} -{{/ember-tabular}} --}} +{{/ember-tabular}}
    Example #6
    {{#link-to 'example4' class="link-ex4"}} Route Binds Model to Table -{{/link-to}} +{{/link-to}} --}} From 5b68e3e8b6627d45c8e7fe92f3b107a754ec6e09 Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Wed, 28 Jun 2017 04:11:14 -0400 Subject: [PATCH 027/105] Setup a helper for determining the passed in column defaults --- addon/components/ember-tabular-column.js | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/addon/components/ember-tabular-column.js b/addon/components/ember-tabular-column.js index 3b2a918..e541476 100644 --- a/addon/components/ember-tabular-column.js +++ b/addon/components/ember-tabular-column.js @@ -27,15 +27,11 @@ export default Ember.Component.extend(EmberTabularHelpers, { const registry = this.get('registry'); const property = this.get('property'); const label = this.get('label') || this._formatColumnLabel(property); - const isActive = typeof this.get('isActive') !== 'undefined' ? this.get('isActive') : true; + const isActive = this._checkIfUndefined(this.get('isActive'), true); const isCustom = this.get('isCustom') || false; - const filter = typeof this.get('filter') !== 'undefined' ? this.get('filter') : true; - const sort = typeof this.get('sort') !== 'undefined' ? this.get('sort') : true; + const filter = this._checkIfUndefined(this.get('filter'), true); + const sort = this._checkIfUndefined(this.get('sort'), true); const type = this.get('type') || 'text'; - console.log('property', property); - console.log('isCustom', isCustom); - console.log('filter', filter); - console.log('sort', sort); let column = { property: property, label: label, @@ -55,4 +51,7 @@ export default Ember.Component.extend(EmberTabularHelpers, { } } }, + _checkIfUndefined(property, defaultValue) { + return typeof property !== 'undefined' ? property : defaultValue; + }, }); From e68760dcfe5ae8734e786c27e199fe87ab4fa327 Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Wed, 28 Jun 2017 04:14:57 -0400 Subject: [PATCH 028/105] Remove console.log from columns and add in defaults when column is initialized automatically --- addon/components/ember-tabular-column.js | 1 - addon/components/ember-tabular.js | 5 ++++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/addon/components/ember-tabular-column.js b/addon/components/ember-tabular-column.js index e541476..3437cdd 100644 --- a/addon/components/ember-tabular-column.js +++ b/addon/components/ember-tabular-column.js @@ -46,7 +46,6 @@ export default Ember.Component.extend(EmberTabularHelpers, { return el.property === property; }); if (!item) { - console.log('ADD TO REGISTRY', column); registry.addObject(column); } } diff --git a/addon/components/ember-tabular.js b/addon/components/ember-tabular.js index 9e7eaf4..317c324 100644 --- a/addon/components/ember-tabular.js +++ b/addon/components/ember-tabular.js @@ -295,6 +295,9 @@ export default Ember.Component.extend(EmberTabularHelpers, { label: this._formatColumnLabel(property), isActive: true, isCustomTemplate: false, + filter: true, + sort: true, + type: 'text', }; // look for duplicate let item = registry.find((el) => { @@ -769,7 +772,7 @@ export default Ember.Component.extend(EmberTabularHelpers, { * * @method setColumnDefaults */ - setColumnDefaults: Ember.observer('columns.[]', function () { + setColumnDefaults: Ember.on('init', function () { this.get('columns').map(function (column) { // if column does not have a sort property defined set to true if (!column.hasOwnProperty('sort')) { From 599efb4c95ff89fc43b0991082e2065a7029bd0c Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Wed, 28 Jun 2017 10:41:58 -0400 Subject: [PATCH 029/105] Setup way for ember-tabular to know that the custom yields are complete --- addon/components/ember-tabular-footer.js | 22 +++++++++++++++++++ addon/components/ember-tabular.js | 25 +++++++++++++++++----- app/components/ember-tabular-footer.js | 3 +++ app/templates/components/ember-tabular.hbs | 3 +++ tests/dummy/app/templates/index.hbs | 1 + 5 files changed, 49 insertions(+), 5 deletions(-) create mode 100644 addon/components/ember-tabular-footer.js create mode 100644 app/components/ember-tabular-footer.js diff --git a/addon/components/ember-tabular-footer.js b/addon/components/ember-tabular-footer.js new file mode 100644 index 0000000..8f5159b --- /dev/null +++ b/addon/components/ember-tabular-footer.js @@ -0,0 +1,22 @@ +import Ember from 'ember'; + +/** +* +* @class EmberTabularFooter +*/ +export default Ember.Component.extend({ + /** + * @property tagName + * @type String + * @default '' + */ + tagName: '', + init() { + this._super(...arguments); + // fix somehow modifying `columns` twice + Ember.run.next(() => { + // tell ember-tabular that the custom yields are complete + this.get('registerComplete')(true); + }); + }, +}); diff --git a/addon/components/ember-tabular.js b/addon/components/ember-tabular.js index 317c324..61f9960 100644 --- a/addon/components/ember-tabular.js +++ b/addon/components/ember-tabular.js @@ -270,19 +270,30 @@ export default Ember.Component.extend(EmberTabularHelpers, { // return columns; // }, // }), - columns: Ember.computed.union('registryDiff', 'registry'), - - checkColumns: Ember.observer('columns.[]', function () { - console.log('columns', this.get('columns')); + columns: Ember.computed('registry', 'registryDiff', 'registryDone', function () { + const columns = Ember.A(); + // only output columns array when registry is done + if (this.get('registryDone')) { + const registry = this.get('registry'); + const registryDiff = this.get('registryDiff'); + + if (registry && registryDiff) { + columns.pushObjects(registry); + columns.pushObjects(registryDiff); + console.log('columns', columns); + } + } + return columns; }), columnsConfig: null, + registryDone: false, + registry: Ember.A(), registryDiff: Ember.computed('registry.[]', function () { const modelName = this.get('modelName'); - const columnsConfig = this.get('columnsConfig'); const registry = this.get('registry'); let registryDiff = Ember.A(); if (modelName) { @@ -894,6 +905,10 @@ export default Ember.Component.extend(EmberTabularHelpers, { toggleFilterRow() { this.toggleProperty('showFilterRow'); }, + registerComplete(value) { + // tells ember-tabular that the custom registry is complete + this.set('registryDone', value); + }, }, /** diff --git a/app/components/ember-tabular-footer.js b/app/components/ember-tabular-footer.js new file mode 100644 index 0000000..a37d3fc --- /dev/null +++ b/app/components/ember-tabular-footer.js @@ -0,0 +1,3 @@ +import EmberTabularFooter from 'ember-tabular/components/ember-tabular-footer'; + +export default EmberTabularFooter; diff --git a/app/templates/components/ember-tabular.hbs b/app/templates/components/ember-tabular.hbs index 9791424..875c3fc 100644 --- a/app/templates/components/ember-tabular.hbs +++ b/app/templates/components/ember-tabular.hbs @@ -65,6 +65,9 @@ {{#each record as |row|}} {{partial trRow}} {{/each}} + {{yield (hash + footer=(component "ember-tabular-footer" registerComplete=(action "registerComplete")) + )}} {{else}} {{!-- required outside of columns loop to trigger the render of the custom yielded columns --}} {{yield (hash - column=(component "ember-tabular-column" registry=registry column=column record=row property=property) + column=(component "ember-tabular-column" registry=registry addToRegistry=(action "addToRegistry")) )}} {{#each columns as |column|}} {{#if column.isActive}} {{#if (compare-with columns "property" column.property "isCustomTemplate")}} {{yield (hash - column=(component "ember-tabular-column" registry=registry column=column record=row property=property) + column=(component "ember-tabular-column" column=column record=row property=property) )}} {{else}} - {{ember-tabular-column registry=registry column=column record=row property=column.property}} + {{ember-tabular-column column=column record=row property=column.property}} {{/if}} {{/if}} {{/each}} diff --git a/app/templates/components/ember-tabular.hbs b/app/templates/components/ember-tabular.hbs index 875c3fc..729b475 100644 --- a/app/templates/components/ember-tabular.hbs +++ b/app/templates/components/ember-tabular.hbs @@ -65,9 +65,7 @@ {{#each record as |row|}} {{partial trRow}} {{/each}} - {{yield (hash - footer=(component "ember-tabular-footer" registerComplete=(action "registerComplete")) - )}} + {{ember-tabular-footer registerComplete=(action "registerComplete")}} {{else}} - - - - - - - {{/each}} - {{/if}} +{{#ember-tabular class="table-basic-route-model" columns=columns makeRequest=false record=model page=page pageLimit=pageLimit isLoading=isLoading sort=sort as |et|}} + {{#et.column property="updatedAt" label="Last Updated" isCustom=true type="date" as |record column|}} + {{#if record.updatedAt}} + {{moment-format record.updatedAt 'MM/DD/YYYY'}} + {{else}} + {{moment-format record.createdAt 'MM/DD/YYYY'}} + {{/if}} + {{/et.column}} {{/ember-tabular}} {{#link-to 'index' class="link-index"}} diff --git a/tests/dummy/app/templates/index.hbs b/tests/dummy/app/templates/index.hbs index d7aaf05..90116c9 100644 --- a/tests/dummy/app/templates/index.hbs +++ b/tests/dummy/app/templates/index.hbs @@ -1,11 +1,21 @@
    Example #1
    +

    Table - Default

    +{{ember-tabular class="table-default" modelName="user" sort=sort2 isColumnSelect=false}} + +
    Example #2

    Table - Column Select

    -{{#ember-tabular modelName="user" sort=sort1 columnOrder=orderConfig as |et|}} +{{#ember-tabular class="table-column-select" modelName="user" sort=sort1 columnOrder=orderConfig as |et|}} {{#et.column property="emailAddress" isCustom=true as |record column|}} {{get record column.property}} {{/et.column}} - {{#et.column property="updatedAt" isCustom=true type="date" as |record column|}} - {{moment-format (get record column.property) 'MM/DD/YYYY'}} + {{et.column property="password" isActive=false isCustom=false filter=false sort=false}} + {{et.column property="createdAt" isActive=false isCustom=false filter=false sort=false}} + {{#et.column property="updatedAt" label="Last Updated" isCustom=true type="date" as |record column|}} + {{#if record.updatedAt}} + {{moment-format record.updatedAt 'MM/DD/YYYY'}} + {{else}} + {{moment-format record.createdAt 'MM/DD/YYYY'}} + {{/if}} {{/et.column}} {{#et.column property="actions" @@ -19,13 +29,9 @@ {{/et.column}} {{/ember-tabular}} -
    Example #2
    -

    Table - Default

    -{{ember-tabular modelName="user" sort=sort2 isColumnSelect=false}} -
    Example #3

    Table - Override Columns/Templates

    -{{#ember-tabular class="table-default" columns=columns modelName="user" record=users sort=sort3 as |et|}} +{{#ember-tabular class="table-override-columns-template" columns=columns modelName="user" record=users sort=sort3 as |et|}} {{#et.column property="username" as |record column|}} {{record.username}} {{/et.column}} diff --git a/tests/dummy/mirage/fixtures/users.js b/tests/dummy/mirage/fixtures/users.js index 5dabb73..7aa01b8 100644 --- a/tests/dummy/mirage/fixtures/users.js +++ b/tests/dummy/mirage/fixtures/users.js @@ -4,6 +4,7 @@ export default [ 'type': 'users', 'username': 'YippieKiYay', 'emailAddress': 'john.mcclane@domain.com', + 'password': '12s2s2132x', 'firstName': 'John', 'lastName': 'McClane', 'isAdmin': true, @@ -15,6 +16,7 @@ export default [ 'type': 'users', 'username': 'HanSolo', 'emailAddress': 'smugglerOne@domain.com', + 'password': '1209dhis18', 'firstName': 'Han', 'lastName': 'Solo', 'isAdmin': false, @@ -26,6 +28,7 @@ export default [ 'type': 'users', 'username': 'starLord', 'emailAddress': 'starLord@domain.com', + 'password': '1h891h8s1s', 'firstName': 'Peter', 'lastName': 'Quill', 'isAdmin': false, @@ -37,6 +40,7 @@ export default [ 'type': 'users', 'username': 'Iron.Man', 'emailAddress': 'tonyStark@domain.com', + 'password': '12iuns1sdsfsd', 'firstName': 'Tony', 'lastName': 'Stark', 'isAdmin': true, @@ -48,6 +52,7 @@ export default [ 'type': 'users', 'username': 'Captain.America', 'emailAddress': 'avenger1@domain.com', + 'password': 'kspi0h29h1b', 'firstName': 'Steve', 'lastName': 'Rogers', 'isAdmin': true, @@ -59,6 +64,7 @@ export default [ 'type': 'users', 'username': 'Kylo.Ren.Sith', 'emailAddress': 'kyloRen@domain.com', + 'password': '0i-12dhiowd', 'firstName': 'Kylo', 'lastName': 'Ren', 'isAdmin': false, @@ -70,6 +76,7 @@ export default [ 'type': 'users', 'username': 'AnakinSkywalker9', 'emailAddress': 'skywalker@domain.com', + 'password': '1082hudsasd', 'firstName': 'Anakin', 'lastName': 'Skywalker', 'isAdmin': false, @@ -81,6 +88,7 @@ export default [ 'type': 'users', 'username': 'TheFett', 'emailAddress': 'boba.fett@domain.com', + 'password': '12-dh98es', 'firstName': 'Boba', 'lastName': 'Fett', 'isAdmin': false, @@ -92,6 +100,7 @@ export default [ 'type': 'users', 'username': 'TheFett', 'emailAddress': 'jango.fett@domain.com', + 'password': 'j09127ss', 'firstName': 'Jango', 'lastName': 'Fett', 'isAdmin': false, @@ -103,6 +112,7 @@ export default [ 'type': 'users', 'username': 'Dooku', 'emailAddress': 'count.dooku@domain.com', + 'password': '-912dh9ds', 'firstName': 'Count', 'lastName': 'Dooku', 'isAdmin': false, @@ -114,6 +124,7 @@ export default [ 'type': 'users', 'username': 'MaceSLJ', 'emailAddress': 'mace.windu@domain.com', + 'password': '029duygwdw', 'firstName': 'Mace', 'lastName': 'Windu', 'isAdmin': false, @@ -125,6 +136,7 @@ export default [ 'type': 'users', 'username': 'mcclane.jr', 'emailAddress': 'jack.mcclane@domain.com', + 'password': 'h1d69sljq98', 'firstName': 'Jack', 'lastName': 'McClane', 'isAdmin': false, diff --git a/tests/integration/ember-tabular-test.js b/tests/integration/ember-tabular-test.js index 8f24475..74911b6 100644 --- a/tests/integration/ember-tabular-test.js +++ b/tests/integration/ember-tabular-test.js @@ -27,23 +27,28 @@ let columns = [ { property: 'username', label: 'Username', + isActive: true, defaultSort: 'username', }, { property: 'emailAddress', label: 'Email', + isActive: true, }, { property: 'firstName', label: 'First Name', + isActive: true, }, { property: 'lastName', label: 'Last Name', + isActive: true, }, { property: 'isAdmin', label: 'Is Admin', + isActive: true, list: [ { label: 'Yes', @@ -58,50 +63,68 @@ let columns = [ { property: 'updatedAt', label: 'Last Updated', + isActive: true, type: 'date', }, + { + property: 'actions', + label: 'Actions', + isActive: true, + filter: false, + sort: false, + }, ]; let columnsLabels = [ { label: 'Username', + isActive: true, }, { label: 'Email', + isActive: true, }, { label: 'First Name', + isActive: true, }, { label: 'Last Name', + isActive: true, }, { label: 'Last Updated', + isActive: true, }, ]; let columnsNoFilter = [ { property: 'username', label: 'Username', + isActive: false, filter: false, }, { property: 'emailAddress', label: 'Email', + isActive: true, filter: false, }, { property: 'firstName', label: 'First Name', + isActive: true, filter: false, }, { property: 'lastName', label: 'Last Name', + isActive: true, filter: false, }, { property: 'updatedAt', label: 'Last Updated', + isActive: true, filter: false, }, ]; @@ -129,19 +152,13 @@ test('Render header yield', function(assert) { test('Render body yield', function(assert) { this.set('columns', columns); this.render(hbs` - {{#ember-tabular columns=columns record=record makeRequest=false isDropdownLimit=false as |section|}} - {{#if section.isBody}} -
    - Test Body Yield -
    - {{/if}} - {{/ember-tabular}} + {{ember-tabular columns=columns record=record makeRequest=false isDropdownLimit=false}} `); // Set record after render b/c of component this.reset() this.set('record', record); var $component = this.$(); - assert.equal($component.find('.body').text().trim(), 'Test Body Yield'); + assert.equal($component.find('tbody tr:eq(0) td:eq(0)').text().trim(), 'YippieKiYay'); }); test('Render footer yield', function(assert) { @@ -227,6 +244,17 @@ test('Render dropdown filter component', function(assert) { assert.equal($component.find('.table-filter .search-filter').length, 1, 'Test ember power select loads within global filter'); }); +test('Render column select component', function(assert) { + this.set('columns', columns); + this.render(hbs` + {{ember-tabular columns=columns record=record makeRequest=false}} + `); + + var $component = this.$(); + assert.equal($component.find('.btn-group-column-select').length, 1, 'Column select renders'); + assert.equal($component.find('.btn-group-column-select li').length, 7, 'Column select renders columns in a list'); +}); + test('Render isLoading class on component', function(assert) { this.set('columns', columns); this.render(hbs` @@ -278,3 +306,17 @@ test('Do not render column filters', function(assert) { assert.equal($component.find('thead tr th:eq(0)').attr('class'), 'sortable ', 'Filterable class is missing from columns'); assert.equal($component.find('thead tr th:eq(0) .btn-toggle-filter').length, 0, 'Do not render column filter'); }); + +test('Do not render specific column', function(assert) { + this.set('columnsNoFilter', columnsNoFilter); + this.render(hbs` + {{ember-tabular columns=columnsNoFilter record=record makeRequest=false isDropdownLimit=false}} + `); + // Set record after render b/c of component this.reset() + this.set('record', record); + + var $component = this.$(); + assert.equal($component.find('thead tr th:eq(0)').text().trim(), 'Email', 'Email is the first column, not Username'); + assert.equal($component.find('thead tr th').length, 4, 'Username is hidden, only 4 columns are rendering'); + assert.equal($component.find('tbody tr:eq(0) td').length, 4, 'Tbody columns match the thead columns, username is hidden'); +}); diff --git a/tests/unit/ember-tabular-test.js b/tests/unit/ember-tabular-test.js index 12d42ed..d909eaf 100644 --- a/tests/unit/ember-tabular-test.js +++ b/tests/unit/ember-tabular-test.js @@ -26,37 +26,44 @@ let columns = [ { property: 'username', label: 'Username', + isActive: true, type: 'text', defaultSort: 'username', }, { property: 'email-address', label: 'Email', + isActive: true, type: 'text', }, { property: 'first-name', label: 'First Name', + isActive: true, type: 'text', }, { property: 'last-name', label: 'Last Name', + isActive: true, type: 'text', }, { property: 'updated-at', label: 'Last Updated', + isActive: true, type: 'date', }, { + property: 'actions', label: 'Actions', + isActive: true, }, ]; moduleForComponent('ember-tabular', 'Unit | Component | ember table jsonapi', { unit: true, - needs: ['helper:dot-to-dash-filter', 'component:ember-tabular-filter', 'helper:and', 'component:pagination-pager'], + needs: ['helper:dot-to-dash-filter', 'component:ember-tabular-filter', 'component:ember-tabular-footer', 'helper:and', 'component:pagination-pager', 'template:components/ember-tabular-row', 'component:ember-tabular-column-select', 'helper:compare-with', 'component:ember-tabular-column'], beforeEach: function() { component = this.subject({ record: model, From 9dd7d2fda76a36a9d90ae8c814373fe5a3044c25 Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Thu, 29 Jun 2017 03:09:25 -0400 Subject: [PATCH 036/105] WIP, setup drag to reorder columns --- .../components/ember-tabular-column-select.hbs | 11 ++++++----- bower.json | 3 ++- package.json | 5 ++++- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/app/templates/components/ember-tabular-column-select.hbs b/app/templates/components/ember-tabular-column-select.hbs index 5d9d280..fba0f57 100644 --- a/app/templates/components/ember-tabular-column-select.hbs +++ b/app/templates/components/ember-tabular-column-select.hbs @@ -1,14 +1,15 @@ -
    +
    - + {{/sortable-objects}}
    diff --git a/bower.json b/bower.json index d7896be..f2aac7d 100644 --- a/bower.json +++ b/bower.json @@ -3,6 +3,7 @@ "dependencies": { "Faker": "~3.0.0", "bootstrap": "3.3.5", - "font-awesome": "4.6.2" + "font-awesome": "4.6.2", + "drag-drop-polyfill": "2.0.0-beta.3" } } diff --git a/package.json b/package.json index 7a3f64e..d0554c4 100644 --- a/package.json +++ b/package.json @@ -36,6 +36,8 @@ "ember-cli-uglify": "^1.2.0", "ember-data": "2.13.1", "ember-disable-prototype-extensions": "^1.1.0", + "ember-drag-drop": "^0.4.4", + "ember-drag-drop-polyfill": "0.0.2", "ember-export-application-global": "^2.0.0", "ember-load-initializers": "^1.0.0", "ember-moment": "7.3.0", @@ -56,10 +58,11 @@ "pagination-pager": "2.4.1", "ember-truth-helpers": "1.2.0", "ember-power-select": "1.4.3", + "ember-drag-drop": "^0.4.4", "broccoli-merge-trees": "2.0.0", "broccoli-funnel": "1.2.0" }, "ember-addon": { "configPath": "tests/dummy/config" } -} \ No newline at end of file +} From ce76a674ee69513865ee3977d543890d9b266e8e Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Wed, 5 Jul 2017 14:28:56 -0400 Subject: [PATCH 037/105] Improve support for drag/drop on mobile, add polyfill --- .../components/ember-tabular-column-select.js | 3 +++ addon/components/ember-tabular.js | 3 ++- .../ember-tabular-column-select.hbs | 2 +- ember-cli-build.js | 23 ++++++++++--------- tests/dummy/app/controllers/index.js | 4 ++-- vendor/app.css | 13 +++++++++++ 6 files changed, 33 insertions(+), 15 deletions(-) diff --git a/addon/components/ember-tabular-column-select.js b/addon/components/ember-tabular-column-select.js index 4d1522a..1bc518a 100644 --- a/addon/components/ember-tabular-column-select.js +++ b/addon/components/ember-tabular-column-select.js @@ -20,5 +20,8 @@ export default Ember.Component.extend({ Ember.set(column, 'isActive', true); } }, + sortEndAction() { + // override to perform custom actions on end of sort + }, }, }); diff --git a/addon/components/ember-tabular.js b/addon/components/ember-tabular.js index 591eebd..bc20bf4 100644 --- a/addon/components/ember-tabular.js +++ b/addon/components/ember-tabular.js @@ -169,7 +169,8 @@ export default Ember.Component.extend(EmberTabularHelpers, { }, /** - * This is typically setup on the controller and passed into the component, and is used to construct the table headers/filtering. + * Use this property only if you want to completely override what ember-tabular would generate based on the ember data model. + * If you plan on using column drag re-ordering then wrapping the columns in `columns: Ember.A([...])` will be required. * ```js export default Ember.Controller.extend({ diff --git a/app/templates/components/ember-tabular-column-select.hbs b/app/templates/components/ember-tabular-column-select.hbs index fba0f57..38b569c 100644 --- a/app/templates/components/ember-tabular-column-select.hbs +++ b/app/templates/components/ember-tabular-column-select.hbs @@ -4,7 +4,7 @@ {{#sortable-objects sortableObjectList=columns sortEndAction="sortEndAction" sortingScope="a" class="dropdown-menu pull-left" tagName="ul"}} {{#each columns as |column|}} - {{#draggable-object content=column overrideClass="sortObject" isSortable=true sortingScope="a" dragHandle=".js-dragHandle" tagName="li"}} + {{#draggable-object content=column overrideClass="sortObject" isSortable=true sortingScope="a" tagName="li"}} {{column.label}} diff --git a/ember-cli-build.js b/ember-cli-build.js index 0bec360..723386b 100644 --- a/ember-cli-build.js +++ b/ember-cli-build.js @@ -4,18 +4,19 @@ var Funnel = require('broccoli-funnel'); var mergeTrees = require('broccoli-merge-trees'); module.exports = function(defaults) { - var environment = process.env.EMBER_ENV, - config = {}; + var environment = process.env.EMBER_ENV; - if (environment === 'test') { - config = { - babel: { - includePolyfill: true - } - }; - } - - var app = new EmberAddon(defaults, config); + var app = new EmberAddon(defaults, { + babel: { + includePolyfill: environment === 'test', + }, + ['ember-drag-drop-polyfill']: { + includeCSS: true, + includeIconsCss: false, + includeDebugCss: false, + includeScrollBehavior: false, + } + }); /* This build file specifies the options for the dummy test app of this diff --git a/tests/dummy/app/controllers/index.js b/tests/dummy/app/controllers/index.js index dc286b9..e25456b 100644 --- a/tests/dummy/app/controllers/index.js +++ b/tests/dummy/app/controllers/index.js @@ -54,7 +54,7 @@ export default Ember.Controller.extend({ sort: false, }, ], - columns: [ + columns: Ember.A([ { property: 'username', label: 'Username', @@ -112,7 +112,7 @@ export default Ember.Controller.extend({ sort: false, isActive: true, }, - ], + ]), columnsForDropdownFilter: [ { label: 'Username', diff --git a/vendor/app.css b/vendor/app.css index 134c42d..9ea6d13 100644 --- a/vendor/app.css +++ b/vendor/app.css @@ -134,3 +134,16 @@ transform: scale(1) rotate(360deg); @include transform(scale(1) rotate(360deg) transform-origin(50% 50%)); } } + +/* ember-tabular-column-select */ + +.btn-group-column-select .js-draggableObject{ + position:relative; +} +.btn-group-column-select .js-dragHandle{ + cursor:move; + position:absolute; + top:50%; + transform: translateY(-50%); + right:9px; +} From a31daa31c07ab3276b85889bb5948e21bdbae185 Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Wed, 5 Jul 2017 14:40:01 -0400 Subject: [PATCH 038/105] Remove options from route example --- tests/dummy/app/templates/index.hbs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/dummy/app/templates/index.hbs b/tests/dummy/app/templates/index.hbs index 90116c9..0a66487 100644 --- a/tests/dummy/app/templates/index.hbs +++ b/tests/dummy/app/templates/index.hbs @@ -117,7 +117,7 @@
    Example #5

    Table - Basic - Dropdown Filter / Date Filter

    -{{#ember-tabular class="table-basic-global-date-filter" modelName="user" record=users3 filter=filter2 columns=columnsForDropdownFilter as |et|}} +{{#ember-tabular class="table-basic-global-date-filter" modelName="user" record=users3 filter=filter2 columns=columnsForDropdownFilter isColumnSelect=false as |et|}} {{#if et.isHeader}}
    From 671d4f7175c5a984c4fbb43c4a5019c32e3287a0 Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Wed, 5 Jul 2017 14:40:15 -0400 Subject: [PATCH 039/105] Remove options from route example --- tests/dummy/app/templates/example4.hbs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/dummy/app/templates/example4.hbs b/tests/dummy/app/templates/example4.hbs index 6c4c666..daa6da3 100644 --- a/tests/dummy/app/templates/example4.hbs +++ b/tests/dummy/app/templates/example4.hbs @@ -1,7 +1,7 @@
    Example #4

    Table - Basic - Route Binds Model to Table

    {{#ember-tabular class="table-basic-route-model" columns=columns makeRequest=false record=model page=page pageLimit=pageLimit isLoading=isLoading sort=sort as |et|}} - {{#et.column property="updatedAt" label="Last Updated" isCustom=true type="date" as |record column|}} + {{#et.column property="updatedAt" as |record column|}} {{#if record.updatedAt}} {{moment-format record.updatedAt 'MM/DD/YYYY'}} {{else}} From c09bbca62bd39bf281a65a674dca273f585e39a0 Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Wed, 5 Jul 2017 15:12:07 -0400 Subject: [PATCH 040/105] Convert params.sort into dasherized string for API --- tests/dummy/app/routes/example4.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/dummy/app/routes/example4.js b/tests/dummy/app/routes/example4.js index d674a64..b6fce1f 100644 --- a/tests/dummy/app/routes/example4.js +++ b/tests/dummy/app/routes/example4.js @@ -26,6 +26,9 @@ export default Ember.Route.extend({ if (params['page[offset]']) { params.offset = params['page[offset]']; } + if (params.sort) { + params.sort = Ember.String.dasherize(params.sort); + } // Override to set dynamic offset based on page and limit params.offset = (params.page * params.limit) - params.limit; From 71b17d4da2f0a9ac2c4e4f0fd1e601a70d78dbab Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Wed, 5 Jul 2017 15:22:39 -0400 Subject: [PATCH 041/105] Try updating circle.yml with npm@5 --- circle.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/circle.yml b/circle.yml index 18e43b8..71fd5b5 100644 --- a/circle.yml +++ b/circle.yml @@ -5,6 +5,7 @@ machine: dependencies: pre: + - npm install -g npm@5.0.2 - npm install -g ember-cli@2.4.2 - npm install -g phantomjs@1.9.8 - npm install From 017a779bae5d144673ea7d2b20fd7d3331a92336 Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Wed, 5 Jul 2017 15:36:37 -0400 Subject: [PATCH 042/105] Remove the DOM-shim and update to phantomjs@2.1.1 --- circle.yml | 2 +- ember-cli-build.js | 5 ----- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/circle.yml b/circle.yml index 71fd5b5..a48b76c 100644 --- a/circle.yml +++ b/circle.yml @@ -7,7 +7,7 @@ dependencies: pre: - npm install -g npm@5.0.2 - npm install -g ember-cli@2.4.2 - - npm install -g phantomjs@1.9.8 + - npm install -g phantomjs@2.1.1 - npm install - bower install override: diff --git a/ember-cli-build.js b/ember-cli-build.js index 723386b..25b2b50 100644 --- a/ember-cli-build.js +++ b/ember-cli-build.js @@ -35,10 +35,5 @@ module.exports = function(defaults) { app.import('bower_components/bootstrap/dist/css/bootstrap.css'); app.import('bower_components/bootstrap/dist/js/bootstrap.js'); - // Specifically for PhantomJS 1.9.8 - if (environment === 'test') { - app.import('bower_components/DOM-shim/lib/DOM-shim.js'); - } - return mergeTrees([app.toTree(), vendor]); }; From 59bfd5a13cf9887428ab602454d6fca47c9fa165 Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Thu, 6 Jul 2017 01:06:42 -0400 Subject: [PATCH 043/105] Allow canary to fail ember test --- config/ember-try.js | 1 + 1 file changed, 1 insertion(+) diff --git a/config/ember-try.js b/config/ember-try.js index a070124..6a5d4f3 100644 --- a/config/ember-try.js +++ b/config/ember-try.js @@ -67,6 +67,7 @@ module.exports = { }, { name: 'ember-canary', + allowedToFail: true, bower: { dependencies: { 'ember': 'components/ember#canary' From a576c1461cb204c6fb947f6635137823063ca18d Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Fri, 11 Aug 2017 13:51:35 -0400 Subject: [PATCH 044/105] Upgrade ember-drag-drop and power-select, fixes the broken build during testing. --- package.json | 8 ++++---- tests/acceptance/basic-test.js | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index d0554c4..30e3931 100644 --- a/package.json +++ b/package.json @@ -36,12 +36,12 @@ "ember-cli-uglify": "^1.2.0", "ember-data": "2.13.1", "ember-disable-prototype-extensions": "^1.1.0", - "ember-drag-drop": "^0.4.4", + "ember-drag-drop": "0.4.5", "ember-drag-drop-polyfill": "0.0.2", "ember-export-application-global": "^2.0.0", "ember-load-initializers": "^1.0.0", "ember-moment": "7.3.0", - "ember-power-select": "1.4.3", + "ember-power-select": "1.9.4", "ember-resolver": "^4.0.0", "ember-source": "~2.13.0", "loader.js": "^4.2.3" @@ -57,8 +57,8 @@ "ember-cli-babel": "^6.0.0", "pagination-pager": "2.4.1", "ember-truth-helpers": "1.2.0", - "ember-power-select": "1.4.3", - "ember-drag-drop": "^0.4.4", + "ember-power-select": "1.9.4", + "ember-drag-drop": "0.4.5", "broccoli-merge-trees": "2.0.0", "broccoli-funnel": "1.2.0" }, diff --git a/tests/acceptance/basic-test.js b/tests/acceptance/basic-test.js index ae4976c..bef55d4 100644 --- a/tests/acceptance/basic-test.js +++ b/tests/acceptance/basic-test.js @@ -147,7 +147,7 @@ test('Check for proper row count when dropdown-limit is changed (.table-default) assert.equal(rows.length, 10, 'Check for 10 items in table'); // change table limit to 25 - selectChoose('.table-default .limit:eq(0)', '25'); + selectChoose($('.table-default .limit:eq(0)')[0], '25'); andThen(function() { let rows = find('.table-default table tbody tr'); @@ -430,7 +430,7 @@ test('Check for expected content dropdown filter (.table-override-columns-templa assert.equal(currentPath(), 'index'); click('.table-override-columns-template table .btn-toggle-filter:eq(0)'); - selectChoose('.table-override-columns-template .ember-tabular-ember-power-select:eq(0)', 'Yes'); + selectChoose('.table-override-columns-template .ember-tabular-ember-power-select', 'Yes'); }); andThen(function() { @@ -453,7 +453,7 @@ test('Check for dropdown clear success (.table-override-columns-template)', func }); andThen(function() { - selectChoose('.table-override-columns-template .ember-tabular-ember-power-select:eq(0)', 'Yes'); + selectChoose($('.table-override-columns-template .ember-tabular-ember-power-select:eq(0)')[0], 'Yes'); }); andThen(function() { @@ -569,7 +569,7 @@ test('Check table-basic-global-date-filter to filter by date and is-admin', func }); andThen(function() { - selectChoose('.table-basic-global-date-filter .ember-tabular-ember-power-select:eq(0)', 'Yes'); + selectChoose($('.table-basic-global-date-filter .ember-tabular-ember-power-select:eq(0)')[0], 'Yes'); fillIn('.table-basic-global-date-filter .table-filter input:eq(0)', '2017-01-02'); find('.table-basic-global-date-filter .table-filter input:eq(0)').trigger('keyup'); From ce90a8d68651eeb1aed2915ad155a392a621fb36 Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Fri, 11 Aug 2017 14:25:16 -0400 Subject: [PATCH 045/105] Remove disable-prototype-extensions --- package.json | 1 - tests/dummy/app/controllers/index.js | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 30e3931..f7686d2 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,6 @@ "ember-cli-sri": "2.1.1", "ember-cli-uglify": "^1.2.0", "ember-data": "2.13.1", - "ember-disable-prototype-extensions": "^1.1.0", "ember-drag-drop": "0.4.5", "ember-drag-drop-polyfill": "0.0.2", "ember-export-application-global": "^2.0.0", diff --git a/tests/dummy/app/controllers/index.js b/tests/dummy/app/controllers/index.js index e25456b..dc286b9 100644 --- a/tests/dummy/app/controllers/index.js +++ b/tests/dummy/app/controllers/index.js @@ -54,7 +54,7 @@ export default Ember.Controller.extend({ sort: false, }, ], - columns: Ember.A([ + columns: [ { property: 'username', label: 'Username', @@ -112,7 +112,7 @@ export default Ember.Controller.extend({ sort: false, isActive: true, }, - ]), + ], columnsForDropdownFilter: [ { label: 'Username', From 9748f83dd861c73a1224976515fd04b15303b4b3 Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Fri, 11 Aug 2017 14:40:28 -0400 Subject: [PATCH 046/105] Improve layout and placement of column select dropdown --- .../components/ember-tabular-column-select.js | 1 + .../ember-tabular-column-select.hbs | 28 +++++++++---------- app/templates/components/ember-tabular.hbs | 6 ++-- vendor/app.css | 10 +++++++ 4 files changed, 27 insertions(+), 18 deletions(-) diff --git a/addon/components/ember-tabular-column-select.js b/addon/components/ember-tabular-column-select.js index 1bc518a..6b59353 100644 --- a/addon/components/ember-tabular-column-select.js +++ b/addon/components/ember-tabular-column-select.js @@ -11,6 +11,7 @@ export default Ember.Component.extend({ * @default 'div' */ tagName: 'div', + classNames: ['btn-group', 'btn-group-column-select'], actions: { toggleColumn(column) { diff --git a/app/templates/components/ember-tabular-column-select.hbs b/app/templates/components/ember-tabular-column-select.hbs index 38b569c..4b31db5 100644 --- a/app/templates/components/ember-tabular-column-select.hbs +++ b/app/templates/components/ember-tabular-column-select.hbs @@ -1,15 +1,13 @@ -
    + +{{#sortable-objects sortableObjectList=columns sortEndAction="sortEndAction" sortingScope="a" class="dropdown-menu pull-left" tagName="ul"}} + {{#each columns as |column|}} + {{#draggable-object content=column overrideClass="sortObject" isSortable=true sortingScope="a" tagName="li"}} + + {{column.label}} + + + {{/draggable-object}} + {{/each}} +{{/sortable-objects}} diff --git a/app/templates/components/ember-tabular.hbs b/app/templates/components/ember-tabular.hbs index 9da38f3..b5d8b67 100644 --- a/app/templates/components/ember-tabular.hbs +++ b/app/templates/components/ember-tabular.hbs @@ -84,10 +84,10 @@ {{yield footer}}
    - {{#if isColumnSelect}} - {{ember-tabular-column-select columns=columns}} - {{/if}}
    + {{#if isColumnSelect}} + {{ember-tabular-column-select columns=columns}} + {{/if}} diff --git a/vendor/app.css b/vendor/app.css index 9ea6d13..78974ae 100644 --- a/vendor/app.css +++ b/vendor/app.css @@ -78,8 +78,18 @@ cursor: pointer; } +.ember-tabular nav{ + display: inline-block; +} + .ember-tabular .pagination { margin-top: 0; + margin-bottom: 0; +} + +.ember-tabular .btn-group-column-select{ + vertical-align: initial; + margin-right: 15px; } .ember-tabular .form-control-inline { From 1764bdf5a0a84f7681a5074829636b599e72de69 Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Fri, 11 Aug 2017 14:55:44 -0400 Subject: [PATCH 047/105] Clean up test naming conventions --- tests/acceptance/basic-test.js | 20 ++++++++++---------- tests/acceptance/example4-test.js | 6 +++--- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/tests/acceptance/basic-test.js b/tests/acceptance/basic-test.js index bef55d4..acdf655 100644 --- a/tests/acceptance/basic-test.js +++ b/tests/acceptance/basic-test.js @@ -93,8 +93,8 @@ test('Check for hidden column after interacting with column-select component (.t let cells = find('.table-column-select table tbody tr').eq(0).find('td'); - assert.equal(find('.table-column-select table thead tr th').length, 7, 'Show expected number of columns'); - assert.equal(cells.length, 7, 'Show expected number of columns'); + assert.equal(find('.table-column-select table thead tr th').length, 7, 'Show expected number of
    - - - - - - - {{/each}} - {{/if}} - {{/ember-tabular}} - ``` -* ### Controller -* Setup the columns array, which is how the table headers are constructed, `label` is required in all cases. - ```js - // app/controllers/my-route.js - - export default Ember.Controller.extend({ - users: null, - columns: [ - { - property: 'username', - label: 'Username', - defaultSort: 'username', - }, - { - property: 'emailAddress', - label: 'Email', - }, - { - property: 'firstName', - label: 'First Name', - }, - { - property: 'lastName', - label: 'Last Name', - }, - { - property: 'updatedAt', - label: 'Last Updated', - type: 'date', - }, - ], - }); + {{ember-tabular modelName="user"}} ``` * * @class EmberTabular @@ -165,12 +116,14 @@ export default Ember.Component.extend(EmberTabularHelpers, { init() { this._super(...arguments); + // ensures a unique `registry` is generated per ember tabular instance this.set('registry', Ember.A()); }, /** * Use this property only if you want to completely override what ember-tabular would generate based on the ember data model. - * If you plan on using column drag re-ordering then wrapping the columns in `columns: Ember.A([...])` will be required. + * If you plan on using column drag re-ordering then wrapping the columns in `columns: Ember.A([...])` will be required if your application does not EmberENV.EXTEND_PROTOTYPES by default. + * `property` is required. * ```js export default Ember.Controller.extend({ @@ -178,7 +131,6 @@ export default Ember.Component.extend(EmberTabularHelpers, { columns: [ { property: 'username', - label: 'Username', defaultSort: 'username', }, { @@ -187,12 +139,10 @@ export default Ember.Component.extend(EmberTabularHelpers, { }, { property: 'firstName', - label: 'First Name', sort: false, }, { property: 'isAdmin', - label: 'Is Admin', list: [ { label: 'Yes', @@ -211,28 +161,33 @@ export default Ember.Component.extend(EmberTabularHelpers, { }, { label: 'Actions', + property: 'actions', }, ], }); ``` * - `columns.property` - {String} - - Required for column filtering/sorting - - Properties should be in camelCase format + - Required in all use-cases. + - Properties should be in camelCase format. - `columns.label` - {String} - - Required in all use-cases + - Optional, if not provided will generate label based on camelCase property. + - `columns.isActive` - {Boolean} + - Optional, used along with the `ember-tabular-column-select` to determine which columns are active/shown by default. - `columns.type` - {String} - Default: text - - Sets the filter `` + - Sets the filter ``. - `columns.sort` - {Boolean} - Default: `true` - - Required for column sorting + - Required for column sorting. - `columns.list` - {Array} - Default: `null` - Filtering the column based on a dropdown list. - `list.label` - Displayed to the user for selection. - `list.value` - Value that is sent in the request. - `columns.defaultSort` - {String} - - Initial sort value for API request - - Will be overridden with any sorting changes + - Initial sort value for API request. + - Will be overridden with any sorting changes. - * Overriding this property is allowed. + * Overriding `columns` property is allowed. + * + * Uses a combination of properties as well as the model's class attributes to generate a columns array. * * @property columns * @type Array @@ -261,11 +216,41 @@ export default Ember.Component.extend(EmberTabularHelpers, { return columns; }), + /** + * If you want to set a specific order but you do not want to completely replace the `columns`, you can pass a simple array of properties to determine the order of the columns. + * + ```js + [ + 'username', + 'emailAddress', + 'password', + 'firstName', + 'lastName', + 'isAdmin', + 'createdAt', + 'updatedAt', + 'actions', + ] + ``` + * + * @property columnOrder + * @type Array + * @default null + */ + columnOrder: null, + registryDone: false, // Ember.A() to be defined in init() registry: null, + /** + * Takes `registry` and generates using ModelClassAttributes for any missing attributes a column object. + * + * @property registryDiff + * @type Array + * @default [] + */ registryDiff: Ember.computed('registry.[]', function () { const modelName = this.get('modelName'); const registry = this.get('registry'); @@ -314,6 +299,13 @@ export default Ember.Component.extend(EmberTabularHelpers, { */ isColumnSelect: true, + /** + * Whether to display the panel to change table row limit. + * + * @property isDropdownLimit + * @type Boolean + * @default true + */ isDropdownLimit: true, // pagination defaults From 80f9a3d9705303a5791d5d373e3171381613a65a Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Fri, 11 Aug 2017 16:13:44 -0400 Subject: [PATCH 050/105] Update readme with new documentation --- README.md | 108 +++++++++++++++++++++++++++++++++++------------------- 1 file changed, 71 insertions(+), 37 deletions(-) diff --git a/README.md b/README.md index 76d6873..1d8fa31 100644 --- a/README.md +++ b/README.md @@ -24,30 +24,68 @@ Setup the ember-tabular template. You have full control over your table's `tbody` content. We are setting this to render the content into the `{{yield body}}` of the table component. ```hbs -{{! app/templates/my-route.hbs }} - -{{#ember-tabular columns=columns modelName="user" record=users as |section|}} - {{#if section.isBody}} - {{#each users as |row|}} - - - - - - - - - {{/each}} - {{/if}} +{{! app/templates/basic-usage.hbs}} + +{{ember-tabular modelName="user"}} + + +{{! app/templates/custom-usage.hbs }} + +{{#ember-tabular modelName="user" sort=sort as |et|}} + {{#et.column property="emailAddress" isCustom=true as |record column|}} + {{get record column.property}} + {{/et.column}} + {{et.column property="password" isActive=false isCustom=false filter=false sort=false}} + {{et.column property="createdAt" isActive=false isCustom=false filter=false sort=false}} + {{#et.column property="updatedAt" label="Last Updated" isCustom=true type="date" as |record column|}} + {{#if record.updatedAt}} + {{moment-format record.updatedAt 'MM/DD/YYYY'}} + {{else}} + {{moment-format record.createdAt 'MM/DD/YYYY'}} + {{/if}} + {{/et.column}} + {{#et.column + property="actions" + isCustom=true + filter=false + sort=false + }} + {{#link-to "index" class="btn btn-default btn-xs" role="button"}} + Edit + {{/link-to}} + {{/et.column}} +{{/ember-tabular}} + + +{{! app/templates/advanced-usage.hbs }} + +{{#ember-tabular columns=columns modelName="user" record=users sort=sort as |et|}} + {{#et.column property="username" as |record column|}} + {{record.username}} + {{/et.column}} + {{#et.column property="emailAddress" as |record column|}} + {{record.emailAddress}} + {{/et.column}} + {{#et.column property="firstName" as |record column|}} + {{record.firstName}} + {{/et.column}} + {{#et.column property="updatedAt" as |record column|}} + {{#if record.updatedAt}} + {{moment-format record.updatedAt 'MM/DD/YYYY'}} + {{else}} + {{moment-format record.createdAt 'MM/DD/YYYY'}} + {{/if}} + {{/et.column}} + {{#et.column property="actions" as |record column|}} + {{#link-to "index" class="btn btn-default btn-xs" role="button"}} + Edit + {{/link-to}} + {{/et.column}} {{/ember-tabular}} ``` ### Controller -Setup the columns array, which is how the table headers are constructed, `label` is required in all cases. +Optionally setup the columns array, which is how to override the table headers, `property` is required in all cases. ```js // app/controllers/my-route.js @@ -56,7 +94,6 @@ export default Ember.Controller.extend({ columns: [ { property: 'username', - label: 'Username', defaultSort: 'username', }, { @@ -65,11 +102,6 @@ export default Ember.Controller.extend({ }, { property: 'firstName', - label: 'First Name', - }, - { - property: 'lastName', - label: 'Last Name', }, { property: 'updatedAt', @@ -77,7 +109,7 @@ export default Ember.Controller.extend({ type: 'date', }, { - label: 'Actions', + property: 'actions', }, ], }); @@ -98,12 +130,14 @@ Ember Tabular sticks very closely to jsonapi spec, a few examples of requests: ### Template - Yields ```hbs -{{#ember-tabular columns=columns record=users as |section|}} - {{#if section.isHeader}} +{{#ember-tabular record=users as |et|}} + {{#if et.isHeader}} ... place content in header yield ... - {{else if section.isBody}} - ... place content within ... - {{else if section.isFooter}} + {{/if}} + + ... place content within ... + + {{#if et.isFooter}} ... place content in footer yield ... {{/if}} {{/ember-tabular}} @@ -116,18 +150,18 @@ Component has 3 yields setup by default, `header`, `body`, and `footer`: ### Sub-Components - Templates #### Global Filter -Typically the global filter component would be rendered into the `{{yield header}}` of the main table component using the yield conditional `{{#if section.isHeader}} ...`. However, it can be used outside of the context of the main component if the proper properties are shared between the main component and sub-component. +Typically the global filter component would be rendered into the `{{yield header}}` of the main table component using the yield conditional `{{#if et.isHeader}} ...`. However, it can be used outside of the context of the main component if the proper properties are shared between the main component and sub-component. -* Sent in request as: `?filter[filterProperty]=searchFilter`, e.g. `?filter[username]=John.Doe2` +* Sent in request as: `?filter[filterProperty]=searchFilter`, e.g. `?filter[first-name]=John.Doe2` ```hbs {{ember-tabular-global-filter filter=filter - filterProperty="username" - filterPlaceholder="Search by Username"}} + filterProperty="firstName" + filterPlaceholder="Search by First Name"}} ``` #### Date Filter -Date filter changes `input type="date"` to take advantage of a browser's HTML5 date widget. Typically the date filter component would be rendered into the `{{yield header}}` of the main table component using the yield conditional `{{#if section.isHeader}} ...`. However, it can be used outside of the context of the main component if the proper properties are shared between the main component and sub-component. +Date filter changes `input type="date"` to take advantage of a browser's HTML5 date widget. Typically the date filter component would be rendered into the `{{yield header}}` of the main table component using the yield conditional `{{#if et.isHeader}} ...`. However, it can be used outside of the context of the main component if the proper properties are shared between the main component and sub-component. * Sent in request as: `?filter[filterProperty]=dateFilter`, e.g. `?filter[updated-at]=2015-06-29` ```hbs From 9d08d0f2b5cc9735f53ef4a5d7c4b1c914c4eeef Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Thu, 5 Oct 2017 12:49:58 -0400 Subject: [PATCH 051/105] Fix issue with Ember.Observer, can just be plain method --- addon/components/ember-tabular-filter.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addon/components/ember-tabular-filter.js b/addon/components/ember-tabular-filter.js index f34dcbb..e27c11a 100644 --- a/addon/components/ember-tabular-filter.js +++ b/addon/components/ember-tabular-filter.js @@ -72,9 +72,9 @@ export default Ember.Component.extend({ * * @method filterBy */ - filterBy: Ember.observer(function () { + filterBy() { Ember.run.debounce(this, 'filterName', 750); - }), + }, /** * @property isClearable */ From 87bd7de5843234edaa7c23c6d01099a4d8dd383e Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Thu, 12 Oct 2017 13:06:49 -0400 Subject: [PATCH 052/105] Support passing list enum to ember-tabular-column just like columns.list Reference issue #89 --- addon/components/ember-tabular-column.js | 2 ++ tests/acceptance/basic-test.js | 22 +++++++++++++++++++++- tests/dummy/app/templates/index.hbs | 8 ++++++++ 3 files changed, 31 insertions(+), 1 deletion(-) diff --git a/addon/components/ember-tabular-column.js b/addon/components/ember-tabular-column.js index 23f4d3f..a719a84 100644 --- a/addon/components/ember-tabular-column.js +++ b/addon/components/ember-tabular-column.js @@ -52,6 +52,7 @@ export default Ember.Component.extend(EmberTabularHelpers, { const isActive = this._checkIfUndefined(this.get('isActive'), true); const isCustom = this.get('isCustom') || false; const filter = this._checkIfUndefined(this.get('filter'), true); + const list = this.get('list') || null; const sort = this._checkIfUndefined(this.get('sort'), true); const type = this.get('type') || 'text'; let column = { @@ -60,6 +61,7 @@ export default Ember.Component.extend(EmberTabularHelpers, { isActive: isActive, isCustomTemplate: isCustom, filter: filter, + list: list, sort: sort, type: type, }; diff --git a/tests/acceptance/basic-test.js b/tests/acceptance/basic-test.js index acdf655..2e9b765 100644 --- a/tests/acceptance/basic-test.js +++ b/tests/acceptance/basic-test.js @@ -76,7 +76,7 @@ test('Check for expected content (.table-column-select)', function(assert) { assert.equal(cells.eq(1).text().trim(), 'skywalker@domain.com', 'Check for email'); assert.equal(cells.eq(2).text().trim(), 'Anakin', 'Check for first name'); assert.equal(cells.eq(3).text().trim(), 'Skywalker', 'Check for last name'); - assert.equal(cells.eq(4).text().trim(), 'false', 'Check for is admin'); + assert.equal(cells.eq(4).text().trim(), 'No', 'Check for is admin'); assert.equal(cells.eq(5).text().trim(), '07/23/2009', 'Check for last updated'); assert.equal(cells.eq(6).text().trim(), 'Edit', 'Check for edit link'); @@ -442,6 +442,26 @@ test('Check for expected content dropdown filter (.table-override-columns-templa }); }); +test('Check for expected content dropdown filter (.table-column-select) (pass in array of values for dropdown into ember-tabular-column)', function(assert) { + server.loadFixtures('users'); + visit('/'); + + andThen(function() { + assert.equal(currentPath(), 'index'); + + click('.table-column-select table .btn-toggle-filter:eq(0)'); + selectChoose('.table-column-select .ember-tabular-ember-power-select', 'Yes'); + }); + + andThen(function() { + var request = getPretenderRequest(server, 'GET', 'users')[0]; + + assert.equal(request.status, 200); + assert.equal(request.method, 'GET'); + assert.equal(request.url, '/users?filter%5Bis-admin%5D=true&page%5Blimit%5D=10&page%5Boffset%5D=0&sort=username', 'Expected query params in URL'); + }); +}); + test('Check for dropdown clear success (.table-override-columns-template)', function(assert) { server.loadFixtures('users'); visit('/'); diff --git a/tests/dummy/app/templates/index.hbs b/tests/dummy/app/templates/index.hbs index 0a66487..17c5893 100644 --- a/tests/dummy/app/templates/index.hbs +++ b/tests/dummy/app/templates/index.hbs @@ -8,6 +8,14 @@ {{#et.column property="emailAddress" isCustom=true as |record column|}} {{get record column.property}} {{/et.column}} + {{!-- pass enum of dropdown filter values list=adminContent, works just like columns.list --}} + {{#et.column property="isAdmin" list=adminContent isCustom=true as |record|}} + {{#if record.isAdmin}} + Yes + {{else}} + No + {{/if}} + {{/et.column}} {{et.column property="password" isActive=false isCustom=false filter=false sort=false}} {{et.column property="createdAt" isActive=false isCustom=false filter=false sort=false}} {{#et.column property="updatedAt" label="Last Updated" isCustom=true type="date" as |record column|}} From 994a6d919a4d420da7797d37c72d1d45b400df5a Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Thu, 12 Oct 2017 14:14:50 -0400 Subject: [PATCH 053/105] Ability to check all rows Reference issue #90 --- addon/components/ember-tabular-column.js | 2 ++ addon/components/ember-tabular.js | 26 +++++++++++++++++++ .../components/ember-tabular-column.hbs | 9 +++++++ app/templates/components/ember-tabular.hbs | 7 +++++ tests/dummy/app/templates/index.hbs | 9 +++++-- 5 files changed, 51 insertions(+), 2 deletions(-) diff --git a/addon/components/ember-tabular-column.js b/addon/components/ember-tabular-column.js index a719a84..b60369b 100644 --- a/addon/components/ember-tabular-column.js +++ b/addon/components/ember-tabular-column.js @@ -48,6 +48,7 @@ export default Ember.Component.extend(EmberTabularHelpers, { this._super(...arguments); const registry = this.get('registry'); const property = this.get('property'); + const selectable = this.get('selectable'); const label = this.get('label') || this._formatColumnLabel(property); const isActive = this._checkIfUndefined(this.get('isActive'), true); const isCustom = this.get('isCustom') || false; @@ -57,6 +58,7 @@ export default Ember.Component.extend(EmberTabularHelpers, { const type = this.get('type') || 'text'; let column = { property: property, + selectable: selectable, label: label, isActive: isActive, isCustomTemplate: isCustom, diff --git a/addon/components/ember-tabular.js b/addon/components/ember-tabular.js index b7a1b30..7238dc6 100644 --- a/addon/components/ember-tabular.js +++ b/addon/components/ember-tabular.js @@ -44,6 +44,14 @@ export default Ember.Component.extend(EmberTabularHelpers, { */ persistFiltering: false, /** + * Will check all table rows + * + * @property allChecked + * @type Boolean + * @default false + */ + allChecked: false, + /** * @property sortableClass * @type String * @default 'sortable' @@ -945,6 +953,24 @@ export default Ember.Component.extend(EmberTabularHelpers, { } }), + /** + * Takes `record` loops and sets each `row.checked`. + * + * @method checkAllRecords + */ + checkAllRecords: Ember.observer('allChecked', function () { + const allChecked = this.get('allChecked'); + if (allChecked) { + this.get('record').forEach((row) => { + row.set('checked', true); + }); + } else { + this.get('record').forEach((row) => { + row.set('checked', false); + }); + } + }), + /** * @method failure * @param response {Object} diff --git a/app/templates/components/ember-tabular-column.hbs b/app/templates/components/ember-tabular-column.hbs index 508093b..ece3531 100644 --- a/app/templates/components/ember-tabular-column.hbs +++ b/app/templates/components/ember-tabular-column.hbs @@ -1,6 +1,15 @@ {{#if hasProperty}} {{#if hasBlock}} + {{else if column.selectable}} + {{else}} {{/if}} diff --git a/app/templates/components/ember-tabular.hbs b/app/templates/components/ember-tabular.hbs index b5d8b67..256f606 100644 --- a/app/templates/components/ember-tabular.hbs +++ b/app/templates/components/ember-tabular.hbs @@ -31,6 +31,13 @@
    {{header.label}}
    + {{else if header.selectable}} +
    + +
    {{else}}
    {{header.label}} diff --git a/tests/dummy/app/templates/index.hbs b/tests/dummy/app/templates/index.hbs index 17c5893..827030a 100644 --- a/tests/dummy/app/templates/index.hbs +++ b/tests/dummy/app/templates/index.hbs @@ -8,7 +8,7 @@ {{#et.column property="emailAddress" isCustom=true as |record column|}} {{get record column.property}} {{/et.column}} - {{!-- pass enum of dropdown filter values list=adminContent, works just like columns.list --}} + {{#et.column property="isAdmin" list=adminContent isCustom=true as |record|}} {{#if record.isAdmin}} Yes @@ -151,8 +151,13 @@ {{/if}} {{/ember-tabular}} -
    Example #6
    +

    Table - Select Row

    +{{#ember-tabular class="table-select-row" modelName="user" sort=sort2 isColumnSelect=false as |et|}} + {{et.column property="checked" selectable=true isCustom=false filter=false sort=false}} +{{/ember-tabular}} + +
    Example #7
    {{#link-to 'example4' class="link-ex4"}} Route Binds Model to Table {{/link-to}} From 105463820ef6493b532712492afcd114d1df254b Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Thu, 12 Oct 2017 14:27:35 -0400 Subject: [PATCH 054/105] Add testing to verify allChecked is functioning properly Reference issue #90 --- tests/acceptance/basic-test.js | 56 ++++++++++++++++++++++++++++++++-- 1 file changed, 54 insertions(+), 2 deletions(-) diff --git a/tests/acceptance/basic-test.js b/tests/acceptance/basic-test.js index 2e9b765..6d770c2 100644 --- a/tests/acceptance/basic-test.js +++ b/tests/acceptance/basic-test.js @@ -703,7 +703,7 @@ test('Check for persistent filters on transition (.table-persist)', function(ass andThen(function() { let request = getPretenderRequest(server, 'GET', 'users'); - assert.equal(request.length, 14, 'Check that additional request was not made when opening filter row'); + assert.equal(request.length, 16, 'Check that additional request was not made when opening filter row'); }); }); }); @@ -722,6 +722,58 @@ test('Check for expected request count when transitioning', function(assert) { andThen(function() { let request = getPretenderRequest(server, 'GET', 'users'); - assert.equal(request.length, 7, 'Should only see 7 requests, checking to ensure extra requests are not made on transition'); + assert.equal(request.length, 8, 'Should only see 8 requests, checking to ensure extra requests are not made on transition'); + }); +}); + +test('Check for expected content (.table-select-row)', function(assert) { + server.loadFixtures('users'); + visit('/'); + + andThen(function() { + assert.equal(currentPath(), 'index'); + + let cells = find('.table-select-row table tbody tr').eq(0).find('td'); + + assert.equal(cells.eq(0).find('input').prop('checked'), false, 'Check for checkbox'); + assert.equal(cells.eq(1).text().trim(), 'AnakinSkywalker9', 'Check for username'); + assert.equal(cells.eq(2).text().trim(), 'skywalker@domain.com', 'Check for email'); + assert.equal(cells.eq(3).text().trim(), '1082hudsasd', 'Check for password'); + assert.equal(cells.eq(4).text().trim(), 'Anakin', 'Check for first name'); + assert.equal(cells.eq(5).text().trim(), 'Skywalker', 'Check for last name'); + assert.equal(cells.eq(6).text().trim(), 'false', 'Check for is admin'); + assert.equal(cells.eq(7).text().trim(), 'Wed Jul 22 2009 00:00:00 GMT+0000', 'Check for created at'); + assert.equal(cells.eq(8).text().trim(), 'Thu Jul 23 2009 00:00:00 GMT+0000', 'Check for updated at'); + + assert.equal(find('.table-select-row table tbody tr').length, 10, 'Check for 10 items in table'); + }); +}); + +test('Check for checking all rows (.table-select-row)', function(assert) { + server.loadFixtures('users'); + visit('/'); + + andThen(function() { + assert.equal(currentPath(), 'index'); + + click('.table-select-row .allChecked'); + }); + + andThen(function() { + let rows = find('.table-select-row table tbody tr'); + + assert.equal(rows.eq(0).find('td:eq(0) input').prop('checked'), true, 'Check for checked checkbox'); + assert.equal(rows.eq(1).find('td:eq(0) input').prop('checked'), true, 'Check for checked checkbox'); + assert.equal(rows.eq(2).find('td:eq(0) input').prop('checked'), true, 'Check for checked checkbox'); + + click('.table-select-row .allChecked'); + }); + + andThen(function() { + let rows = find('.table-select-row table tbody tr'); + + assert.equal(rows.eq(0).find('td:eq(0) input').prop('checked'), false, 'Check for unchecked checkbox'); + assert.equal(rows.eq(1).find('td:eq(0) input').prop('checked'), false, 'Check for unchecked checkbox'); + assert.equal(rows.eq(2).find('td:eq(0) input').prop('checked'), false, 'Check for unchecked checkbox'); }); }); From bbeac8c5ca19fc9823203fbcb5342a5bb0be4190 Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Thu, 12 Oct 2017 15:34:18 -0400 Subject: [PATCH 055/105] Create a way to shift+click multiple rows at a time Reference issue #90 --- .../components/ember-tabular-row-checkbox.js | 52 +++++++++++++++++++ addon/services/ember-tabular-globals.js | 6 +++ app/components/ember-tabular-row-checkbox.js | 3 ++ app/services/ember-tabular-globals.js | 3 ++ .../components/ember-tabular-column.hbs | 5 +- .../components/ember-tabular-row-checkbox.hbs | 4 ++ .../components/ember-tabular-row.hbs | 4 +- tests/acceptance/basic-test.js | 26 ++++++++++ vendor/app.css | 9 ++++ 9 files changed, 106 insertions(+), 6 deletions(-) create mode 100644 addon/components/ember-tabular-row-checkbox.js create mode 100644 addon/services/ember-tabular-globals.js create mode 100644 app/components/ember-tabular-row-checkbox.js create mode 100644 app/services/ember-tabular-globals.js create mode 100644 app/templates/components/ember-tabular-row-checkbox.hbs diff --git a/addon/components/ember-tabular-row-checkbox.js b/addon/components/ember-tabular-row-checkbox.js new file mode 100644 index 0000000..3a67c3d --- /dev/null +++ b/addon/components/ember-tabular-row-checkbox.js @@ -0,0 +1,52 @@ +import Ember from 'ember'; + +export default Ember.Component.extend({ + tagName: 'div', + classNames: ['ember-tabular-row-checkbox'], + // allow div to be focusable so keyDown/keyUp events are triggered + attributeBindings: ['tabindex'], + globals: Ember.inject.service('ember-tabular-globals'), + previousIndex: Ember.computed.alias('globals.previousIndex'), + currentIndex: Ember.computed.alias('globals.currentIndex'), + checked: Ember.computed.alias('model.checked'), + tabindex: -1, + click(e) { + const collection = this.get('collection'); + const model = this.get('model'); + const collectionIndex = collection.indexOf(model); + + this.set('currentIndex', collectionIndex); + + // ensure we always have a previousIndex + if (Ember.isNone(this.get('previousIndex'))) { + this.set('previousIndex', collectionIndex); + } + + let currentIndex = this.get('currentIndex'); + let previousIndex = this.get('previousIndex'); + + if (e.shiftKey) { + if (currentIndex < previousIndex) { + collection.slice(currentIndex, previousIndex + 1).setEach('checked', this.toggleProperty('model.checked')); + } else { + collection.slice(previousIndex, currentIndex + 1).setEach('checked', this.toggleProperty('model.checked')); + } + } else { + this.toggleProperty('model.checked'); + } + // always update previousIndex after actions are complete + this.set('previousIndex', collectionIndex); + }, + keyDown(e) { + // disable text selection if "shift" key is pressed + if (e.keyCode === 16) { + this.$().parents('tbody').addClass('unselectable'); + } + }, + keyUp(e) { + // re-enable text selection if "shift" key is released + if (e.keyCode === 16) { + this.$().parents('tbody').removeClass('unselectable'); + } + }, +}); diff --git a/addon/services/ember-tabular-globals.js b/addon/services/ember-tabular-globals.js new file mode 100644 index 0000000..64783c9 --- /dev/null +++ b/addon/services/ember-tabular-globals.js @@ -0,0 +1,6 @@ +import Ember from 'ember'; + +export default Ember.Service.extend({ + previousIndex: null, + currentIndex: null, +}); diff --git a/app/components/ember-tabular-row-checkbox.js b/app/components/ember-tabular-row-checkbox.js new file mode 100644 index 0000000..ecd8c19 --- /dev/null +++ b/app/components/ember-tabular-row-checkbox.js @@ -0,0 +1,3 @@ +import EmberTabularRowCheckbox from 'ember-tabular/components/ember-tabular-row-checkbox'; + +export default EmberTabularRowCheckbox; diff --git a/app/services/ember-tabular-globals.js b/app/services/ember-tabular-globals.js new file mode 100644 index 0000000..3c16c4c --- /dev/null +++ b/app/services/ember-tabular-globals.js @@ -0,0 +1,3 @@ +import EmberTabularGlobals from 'ember-tabular/services/ember-tabular-globals'; + +export default EmberTabularGlobals; diff --git a/app/templates/components/ember-tabular-column.hbs b/app/templates/components/ember-tabular-column.hbs index ece3531..78331b0 100644 --- a/app/templates/components/ember-tabular-column.hbs +++ b/app/templates/components/ember-tabular-column.hbs @@ -4,10 +4,7 @@ {{else if column.selectable}}
    {{else}} diff --git a/app/templates/components/ember-tabular-row-checkbox.hbs b/app/templates/components/ember-tabular-row-checkbox.hbs new file mode 100644 index 0000000..87a087e --- /dev/null +++ b/app/templates/components/ember-tabular-row-checkbox.hbs @@ -0,0 +1,4 @@ + + diff --git a/app/templates/components/ember-tabular-row.hbs b/app/templates/components/ember-tabular-row.hbs index 65d5ccb..d461354 100644 --- a/app/templates/components/ember-tabular-row.hbs +++ b/app/templates/components/ember-tabular-row.hbs @@ -7,10 +7,10 @@ {{#if column.isActive}} {{#if (compare-with columns "property" column.property "isCustomTemplate")}} {{yield (hash - column=(component "ember-tabular-column" column=column record=row property=property) + column=(component "ember-tabular-column" column=column record=row property=property collection=record) )}} {{else}} - {{ember-tabular-column column=column record=row property=column.property}} + {{ember-tabular-column column=column record=row property=column.property collection=record}} {{/if}} {{/if}} {{/each}} diff --git a/tests/acceptance/basic-test.js b/tests/acceptance/basic-test.js index 6d770c2..f5d87a1 100644 --- a/tests/acceptance/basic-test.js +++ b/tests/acceptance/basic-test.js @@ -777,3 +777,29 @@ test('Check for checking all rows (.table-select-row)', function(assert) { assert.equal(rows.eq(2).find('td:eq(0) input').prop('checked'), false, 'Check for unchecked checkbox'); }); }); + +test('Check for checking rows using shift + click (.table-select-row)', function(assert) { + server.loadFixtures('users'); + visit('/'); + + andThen(function() { + assert.equal(currentPath(), 'index'); + + let rows = find('.table-select-row table tbody tr'); + + // select the second row through the 5th + click(find(rows.eq(1).find('td:eq(0) input[type="checkbox"]:eq(0)'))); + triggerEvent(find(rows.eq(4).find('td:eq(0) input[type="checkbox"]:eq(0)')), 'click', { + shiftKey: true, + }); + + andThen(function () { + assert.equal(rows.eq(0).find('td:eq(0) input').prop('checked'), false, 'Check for unchecked checkbox'); + assert.equal(rows.eq(1).find('td:eq(0) input').prop('checked'), true, 'Check for checked checkbox'); + assert.equal(rows.eq(2).find('td:eq(0) input').prop('checked'), true, 'Check for checked checkbox'); + assert.equal(rows.eq(3).find('td:eq(0) input').prop('checked'), true, 'Check for checked checkbox'); + assert.equal(rows.eq(4).find('td:eq(0) input').prop('checked'), true, 'Check for checked checkbox'); + assert.equal(rows.eq(5).find('td:eq(0) input').prop('checked'), false, 'Check for unchecked checkbox'); + }); + }); +}); diff --git a/vendor/app.css b/vendor/app.css index 78974ae..3c9e634 100644 --- a/vendor/app.css +++ b/vendor/app.css @@ -72,6 +72,15 @@ position: relative; } +.ember-tabular .ember-tabular-row-checkbox:focus{ + outline: none; + border-color: inherit; + box-shadow: none; +} +.ember-tabular .unselectable{ + user-select: none; +} + .ember-tabular a, .ember-tabular [class^="btn"], .ember-tabular .clearFilter { From 6de9559be116e4b05ab6c620670fff9ee661924c Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Thu, 12 Oct 2017 15:42:05 -0400 Subject: [PATCH 056/105] Lock down npm dependencies --- package.json | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index f7686d2..801fcb7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ember-tabular", - "version": "0.1.0", + "version": "0.2.0", "description": "The default blueprint for ember-cli addons.", "directories": { "doc": "doc", @@ -22,28 +22,28 @@ "broccoli-funnel": "1.2.0", "broccoli-merge-trees": "2.0.0", "ember-ajax": "2.5.2", - "ember-cli": "^2.13.2", + "ember-cli": "2.16.2", "ember-cli-app-version": "3.0.0", "ember-cli-dependency-checker": "1.3.0", "ember-cli-htmlbars": "1.1.1", "ember-cli-htmlbars-inline-precompile": "0.4.3", - "ember-cli-inject-live-reload": "^1.4.1", + "ember-cli-inject-live-reload": "1.7.0", "ember-cli-mirage": "0.3.2", "ember-cli-moment-shim": "3.1.0", "ember-cli-qunit": "4.0.0", "ember-cli-shims": "1.0.2", "ember-cli-sri": "2.1.1", - "ember-cli-uglify": "^1.2.0", + "ember-cli-uglify": "1.2.0", "ember-data": "2.13.1", "ember-drag-drop": "0.4.5", "ember-drag-drop-polyfill": "0.0.2", - "ember-export-application-global": "^2.0.0", - "ember-load-initializers": "^1.0.0", + "ember-export-application-global": "2.0.0", + "ember-load-initializers": "1.0.0", "ember-moment": "7.3.0", "ember-power-select": "1.9.4", - "ember-resolver": "^4.0.0", - "ember-source": "~2.13.0", - "loader.js": "^4.2.3" + "ember-resolver": "4.5.0", + "ember-source": "2.13.4", + "loader.js": "4.6.0" }, "keywords": [ "ember-addon", @@ -53,7 +53,7 @@ "json api" ], "dependencies": { - "ember-cli-babel": "^6.0.0", + "ember-cli-babel": "6.8.2", "pagination-pager": "2.4.1", "ember-truth-helpers": "1.2.0", "ember-power-select": "1.9.4", From 5ffd5016579da7a8a48b4d7539fe499e1105db31 Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Thu, 12 Oct 2017 16:14:25 -0400 Subject: [PATCH 057/105] Update testing and fix ember-cli-build issue --- ember-cli-build.js | 2 +- tests/acceptance/basic-test.js | 4 ++-- tests/dummy/app/templates/index.hbs | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/ember-cli-build.js b/ember-cli-build.js index 25b2b50..2b869f9 100644 --- a/ember-cli-build.js +++ b/ember-cli-build.js @@ -7,7 +7,7 @@ module.exports = function(defaults) { var environment = process.env.EMBER_ENV; var app = new EmberAddon(defaults, { - babel: { + 'ember-cli-babel': { includePolyfill: environment === 'test', }, ['ember-drag-drop-polyfill']: { diff --git a/tests/acceptance/basic-test.js b/tests/acceptance/basic-test.js index f5d87a1..a9f3ae8 100644 --- a/tests/acceptance/basic-test.js +++ b/tests/acceptance/basic-test.js @@ -300,11 +300,11 @@ test('Check for disabled sorting (.table-override-columns-template)', function(a }); andThen(function() { - let request = getPretenderRequest(server, 'GET', 'users')[0]; + let request = getPretenderRequest(server, 'GET', 'users')[4]; assert.equal(request.status, 200); assert.equal(request.method, 'GET'); - assert.equal(request.url, '/users?page%5Blimit%5D=10&page%5Boffset%5D=0&sort=', 'Expected query params in URL, no sort'); + assert.equal(request.url, '/users?page%5Blimit%5D=10&page%5Boffset%5D=0&sort=username', 'Expected query params in URL, no sort'); }); }); diff --git a/tests/dummy/app/templates/index.hbs b/tests/dummy/app/templates/index.hbs index 827030a..1001cba 100644 --- a/tests/dummy/app/templates/index.hbs +++ b/tests/dummy/app/templates/index.hbs @@ -39,7 +39,7 @@
    Example #3

    Table - Override Columns/Templates

    -{{#ember-tabular class="table-override-columns-template" columns=columns modelName="user" record=users sort=sort3 as |et|}} +{{#ember-tabular class="table-override-columns-template" columns=columns modelName="user" record=users as |et|}} {{#et.column property="username" as |record column|}} {{record.username}} {{/et.column}} @@ -153,7 +153,7 @@
    Example #6

    Table - Select Row

    -{{#ember-tabular class="table-select-row" modelName="user" sort=sort2 isColumnSelect=false as |et|}} +{{#ember-tabular class="table-select-row" modelName="user" sort="username" isColumnSelect=false as |et|}} {{et.column property="checked" selectable=true isCustom=false filter=false sort=false}} {{/ember-tabular}} From 670dd545b34ee5d293a009f6061449ef3b5b2b3f Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Thu, 12 Oct 2017 20:27:45 -0400 Subject: [PATCH 058/105] Roll back ember-cli to 2.15.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 801fcb7..90c1e8e 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,7 @@ "broccoli-funnel": "1.2.0", "broccoli-merge-trees": "2.0.0", "ember-ajax": "2.5.2", - "ember-cli": "2.16.2", + "ember-cli": "2.15.1", "ember-cli-app-version": "3.0.0", "ember-cli-dependency-checker": "1.3.0", "ember-cli-htmlbars": "1.1.1", From 89722328462ad775912f4ae0d1dba977e940f7ea Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Thu, 12 Oct 2017 20:28:09 -0400 Subject: [PATCH 059/105] Rewrite ember-try --- config/ember-try.js | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/config/ember-try.js b/config/ember-try.js index 6a5d4f3..83099b9 100644 --- a/config/ember-try.js +++ b/config/ember-try.js @@ -2,13 +2,13 @@ module.exports = { scenarios: [ { - name: 'ember-lts-2.4', + name: 'ember-lts-2.8', bower: { dependencies: { - 'ember': 'components/ember#lts-2-4' + 'ember': 'components/ember#lts-2-8' }, resolutions: { - 'ember': 'lts-2-4' + 'ember': 'lts-2-8' } }, npm: { @@ -18,18 +18,10 @@ module.exports = { } }, { - name: 'ember-lts-2.8', - bower: { - dependencies: { - 'ember': 'components/ember#lts-2-8' - }, - resolutions: { - 'ember': 'lts-2-8' - } - }, + name: 'ember-lts-2.12', npm: { devDependencies: { - 'ember-source': null + 'ember-source': '~2.12.0' } } }, From 579977a347fd348e61b9cc64e455ef314af09e9b Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Thu, 12 Oct 2017 23:06:13 -0400 Subject: [PATCH 060/105] Update ember-try with better scenarios --- config/ember-try.js | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/config/ember-try.js b/config/ember-try.js index 83099b9..f4b3718 100644 --- a/config/ember-try.js +++ b/config/ember-try.js @@ -1,6 +1,22 @@ /* eslint-env node */ module.exports = { scenarios: [ + { + name: 'ember-lts-2.4', + bower: { + dependencies: { + 'ember': 'components/ember#lts-2-4' + }, + resolutions: { + 'ember': 'lts-2-4' + } + }, + npm: { + devDependencies: { + 'ember-source': null + } + } + }, { name: 'ember-lts-2.8', bower: { @@ -18,10 +34,18 @@ module.exports = { } }, { - name: 'ember-lts-2.12', + name: 'ember-lts-2.12.2', + bower: { + dependencies: { + 'ember': 'components/ember#2.12.2' + }, + resolutions: { + 'ember': 'lts-2-12' + } + }, npm: { devDependencies: { - 'ember-source': '~2.12.0' + 'ember-source': null } } }, @@ -59,7 +83,6 @@ module.exports = { }, { name: 'ember-canary', - allowedToFail: true, bower: { dependencies: { 'ember': 'components/ember#canary' From d9633d9e276078cbda8b284dff2319d8af18b863 Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Thu, 12 Oct 2017 23:07:32 -0400 Subject: [PATCH 061/105] Attempt to restructure how the templates are build, this should aid during testing --- addon/components/ember-tabular-alert.js | 2 ++ addon/components/ember-tabular-column-select.js | 2 ++ addon/components/ember-tabular-column.js | 2 ++ addon/components/ember-tabular-date-filter.js | 5 ++++- addon/components/ember-tabular-dropdown-filter.js | 5 ++++- addon/components/ember-tabular-dropdown-limit.js | 2 ++ addon/components/ember-tabular-filter.js | 2 ++ addon/components/ember-tabular-footer.js | 2 ++ addon/components/ember-tabular-global-filter.js | 2 ++ addon/components/ember-tabular-row-checkbox.js | 2 ++ addon/components/ember-tabular.js | 2 ++ {app => addon}/templates/components/ember-tabular-alert.hbs | 0 .../templates/components/ember-tabular-column-select.hbs | 0 {app => addon}/templates/components/ember-tabular-column.hbs | 0 .../templates/components/ember-tabular-date-filter.hbs | 0 .../templates/components/ember-tabular-dropdown-filter.hbs | 0 .../templates/components/ember-tabular-dropdown-limit.hbs | 0 {app => addon}/templates/components/ember-tabular-filter.hbs | 0 .../templates/components/ember-tabular-global-filter.hbs | 0 .../templates/components/ember-tabular-row-checkbox.hbs | 0 {app => addon}/templates/components/ember-tabular-row.hbs | 0 {app => addon}/templates/components/ember-tabular.hbs | 0 22 files changed, 26 insertions(+), 2 deletions(-) rename {app => addon}/templates/components/ember-tabular-alert.hbs (100%) rename {app => addon}/templates/components/ember-tabular-column-select.hbs (100%) rename {app => addon}/templates/components/ember-tabular-column.hbs (100%) rename {app => addon}/templates/components/ember-tabular-date-filter.hbs (100%) rename {app => addon}/templates/components/ember-tabular-dropdown-filter.hbs (100%) rename {app => addon}/templates/components/ember-tabular-dropdown-limit.hbs (100%) rename {app => addon}/templates/components/ember-tabular-filter.hbs (100%) rename {app => addon}/templates/components/ember-tabular-global-filter.hbs (100%) rename {app => addon}/templates/components/ember-tabular-row-checkbox.hbs (100%) rename {app => addon}/templates/components/ember-tabular-row.hbs (100%) rename {app => addon}/templates/components/ember-tabular.hbs (100%) diff --git a/addon/components/ember-tabular-alert.js b/addon/components/ember-tabular-alert.js index 9f70d56..48ba8bb 100644 --- a/addon/components/ember-tabular-alert.js +++ b/addon/components/ember-tabular-alert.js @@ -1,4 +1,5 @@ import Ember from 'ember'; +import layout from 'ember-tabular/templates/components/ember-tabular-alert'; /** * Any errors returned from the request(s) are displayed in an alert box. @@ -6,6 +7,7 @@ import Ember from 'ember'; * @class EmberTabularAlert */ export default Ember.Component.extend({ + layout, /** * @property tagName * @type String diff --git a/addon/components/ember-tabular-column-select.js b/addon/components/ember-tabular-column-select.js index 8ed466d..dac9a0d 100644 --- a/addon/components/ember-tabular-column-select.js +++ b/addon/components/ember-tabular-column-select.js @@ -1,4 +1,5 @@ import Ember from 'ember'; +import layout from 'ember-tabular/templates/components/ember-tabular-column-select'; /** * Generates a bootstrap compliant dropdown containing the `columns` @@ -7,6 +8,7 @@ import Ember from 'ember'; * @class EmberTabularColumnSelect */ export default Ember.Component.extend({ + layout, /** * @property tagName * @type String diff --git a/addon/components/ember-tabular-column.js b/addon/components/ember-tabular-column.js index b60369b..718ffd7 100644 --- a/addon/components/ember-tabular-column.js +++ b/addon/components/ember-tabular-column.js @@ -1,4 +1,5 @@ import Ember from 'ember'; +import layout from 'ember-tabular/templates/components/ember-tabular-column'; import EmberTabularHelpers from 'ember-tabular/mixins/components/ember-tabular-helpers'; /** @@ -28,6 +29,7 @@ import EmberTabularHelpers from 'ember-tabular/mixins/components/ember-tabular-h * @class EmberTabularColumn */ export default Ember.Component.extend(EmberTabularHelpers, { + layout, /** * @property tagName * @type String diff --git a/addon/components/ember-tabular-date-filter.js b/addon/components/ember-tabular-date-filter.js index 49a57eb..6cfe86f 100644 --- a/addon/components/ember-tabular-date-filter.js +++ b/addon/components/ember-tabular-date-filter.js @@ -1,4 +1,5 @@ import EmberTabularGlobalFilter from './ember-tabular-global-filter'; +import layout from 'ember-tabular/templates/components/ember-tabular-date-filter'; /** * ## Date Filter @@ -15,4 +16,6 @@ import EmberTabularGlobalFilter from './ember-tabular-global-filter'; ``` * @class EmberTabularDateFilter */ -export default EmberTabularGlobalFilter.extend(); +export default EmberTabularGlobalFilter.extend({ + layout, +}); diff --git a/addon/components/ember-tabular-dropdown-filter.js b/addon/components/ember-tabular-dropdown-filter.js index de7bf7a..525d16c 100644 --- a/addon/components/ember-tabular-dropdown-filter.js +++ b/addon/components/ember-tabular-dropdown-filter.js @@ -1,4 +1,5 @@ import EmberTabularGlobalFilter from './ember-tabular-global-filter'; +import layout from 'ember-tabular/templates/components/ember-tabular-dropdown-filter'; /** * ## Dropdown Filter @@ -47,4 +48,6 @@ export default Ember.Controller.extend({ * @class EmberTabularDropdownFilter * @extends EmberTabularGlobalFilter */ -export default EmberTabularGlobalFilter.extend(); +export default EmberTabularGlobalFilter.extend({ + layout, +}); diff --git a/addon/components/ember-tabular-dropdown-limit.js b/addon/components/ember-tabular-dropdown-limit.js index 77b4df3..ce8421e 100644 --- a/addon/components/ember-tabular-dropdown-limit.js +++ b/addon/components/ember-tabular-dropdown-limit.js @@ -1,4 +1,5 @@ import Ember from 'ember'; +import layout from 'ember-tabular/templates/components/ember-tabular-dropdown-limit'; /** * Sets up component for changing the table row count/limit. @@ -6,6 +7,7 @@ import Ember from 'ember'; * @class EmberTabularDropdownLimit */ export default Ember.Component.extend({ + layout, /** * @property tagName * @type String diff --git a/addon/components/ember-tabular-filter.js b/addon/components/ember-tabular-filter.js index e27c11a..526339b 100644 --- a/addon/components/ember-tabular-filter.js +++ b/addon/components/ember-tabular-filter.js @@ -1,4 +1,5 @@ import Ember from 'ember'; +import layout from 'ember-tabular/templates/components/ember-tabular-filter'; /** * Filtering on a column by column basis within the component's `
    {{row.username}}{{row.emailAddress}}{{row.firstName}}{{row.lastName}} + {{#link-to "index" class="btn btn-xs" role="button"}} + Edit + {{/link-to}} +
    {{row.username}}{{row.emailAddress}}{{row.firstName}}{{row.lastName}} + {{#if row.isAdmin}} + Yes + {{else}} + No + {{/if}} + + {{#if row.updatedAt}} + {{moment-format row.updatedAt 'MM/DD/YYYY'}} + {{else}} + {{moment-format row.createdAt 'MM/DD/YYYY'}} + {{/if}} + + {{#link-to "index" class="btn btn-default btn-xs" role="button"}} + Edit + {{/link-to}} +
    {{row.username}} {{row.emailAddress}}
    + {{get row column.property}} +
    - {{#if header.filter}} - - {{/if}} - {{#if header.sort}} -
    - {{header.label}} -
    - {{else}} -
    - {{header.label}} -
    - {{/if}} -
    {{header.label}} + {{#if header.filter}} + + {{/if}} + {{#if header.sort}} +
    + {{header.label}} +
    + {{else}} +
    + {{header.label}} +
    + {{/if}} +
    {{header.label}}
    {{!-- Blank to reserve table column --}}{{!-- Blank to reserve table column --}}
    {{row.username}}{{row.emailAddress}}{{row.firstName}}{{row.lastName}} - {{#if row.isAdmin}} - Yes - {{else}} - No - {{/if}} - - {{#if row.updatedAt}} - {{moment-format row.updatedAt 'MM/DD/YYYY'}} - {{else}} - {{moment-format row.createdAt 'MM/DD/YYYY'}} - {{/if}} - - {{#link-to "index" class="btn btn-default btn-xs" role="button"}} - Edit - {{/link-to}} -
    {{yield record column}}{{get record column.property}}
    - {{get row column.property}} -
    From 92f530793da47a5ecccda0a2d233948c6b944e03 Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Mon, 26 Jun 2017 14:46:26 -0400 Subject: [PATCH 015/105] WIP, setup custom override of ember-tabular-cell on a per column.property basis --- tests/dummy/app/templates/index.hbs | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/tests/dummy/app/templates/index.hbs b/tests/dummy/app/templates/index.hbs index cbb3203..b64107d 100644 --- a/tests/dummy/app/templates/index.hbs +++ b/tests/dummy/app/templates/index.hbs @@ -1,6 +1,24 @@
    Example #1

    Table - Column Select

    {{#ember-tabular class="table-column-select" tableWrapperClass="table-wrapper" paginationWrapperClass="pagination-wrapper" modelName="user" record=users5 sort=sort2 as |section|}} + {{#if section.isHeader}} + Section Header + {{/if}} + {{!-- {{section.cell colProperty="username"}} --}} + {{#section.cell colProperty="emailAddress" as |record column|}} + {{get record column.property}} + {{/section.cell}} + {{!-- {{section.cell colProperty="password"}} --}} + {{!-- {{section.cell colProperty="firstName"}} --}} + {{!-- {{section.cell colProperty="lastName"}} --}} + {{!-- {{section.cell colProperty="isAdmin"}} --}} + {{!-- {{section.cell colProperty="createdAt"}} --}} + {{#section.cell colProperty="updatedAt" as |record column|}} + {{moment-format (get record column.property) 'MM/DD/YYYY'}} + {{/section.cell}} + {{#if section.isFooter}} + Section Footer + {{/if}} {{!-- {{#if section.isBody}} {{#each users5 as |row|}}
    {{row.username}}
    {{yield record column}}
    {{row.username}}{{row.emailAddress}}{{row.firstName}}{{row.lastName}} - {{#if row.isAdmin}} - Yes - {{else}} - No - {{/if}} - - {{#if row.updatedAt}} - {{moment-format row.updatedAt 'MM/DD/YYYY'}} - {{else}} - {{moment-format row.createdAt 'MM/DD/YYYY'}} - {{/if}} - - {{#link-to "index" class="btn btn-default btn-xs" role="button"}} - Edit - {{/link-to}} -
    {{row.username}}{{row.emailAddress}}{{row.firstName}}{{row.lastName}} - {{#if row.isAdmin}} - Yes - {{else}} - No - {{/if}} - - {{#if row.updatedAt}} - {{moment-format row.updatedAt 'MM/DD/YYYY'}} - {{else}} - {{moment-format row.createdAt 'MM/DD/YYYY'}} - {{/if}} - - {{#link-to "index" class="btn btn-default btn-xs" role="button"}} - Edit - {{/link-to}} -
    {{row.username}}{{row.emailAddress}}{{row.firstName}}{{row.lastName}} - {{#if row.updatedAt}} - {{moment-format row.updatedAt 'MM/DD/YYYY'}} - {{else}} - {{moment-format row.createdAt 'MM/DD/YYYY'}} - {{/if}} -
    {{row.username}}{{row.emailAddress}}{{row.firstName}}{{row.lastName}} - {{#if row.updatedAt}} - {{moment-format row.updatedAt 'MM/DD/YYYY'}} - {{else}} - {{moment-format row.createdAt 'MM/DD/YYYY'}} - {{/if}} -
    diff --git a/tests/dummy/app/templates/index.hbs b/tests/dummy/app/templates/index.hbs index 28a0b8c..06b8ffa 100644 --- a/tests/dummy/app/templates/index.hbs +++ b/tests/dummy/app/templates/index.hbs @@ -17,6 +17,7 @@ Edit {{/link-to}} {{/et.column}} + {{et.footer}} {{/ember-tabular}} {{!--
    Example #2
    From f485d9877448e69d3d6b046126bb887da6ce8052 Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Wed, 28 Jun 2017 13:16:53 -0400 Subject: [PATCH 030/105] Move adding of column to registry up to ember-tabular scope --- addon/components/ember-tabular-column.js | 5 +++-- addon/components/ember-tabular.js | 4 ++++ app/templates/components/ember-tabular-row.hbs | 6 +++--- app/templates/components/ember-tabular.hbs | 4 +--- tests/dummy/app/templates/index.hbs | 5 ++--- 5 files changed, 13 insertions(+), 11 deletions(-) diff --git a/addon/components/ember-tabular-column.js b/addon/components/ember-tabular-column.js index 3437cdd..b83f579 100644 --- a/addon/components/ember-tabular-column.js +++ b/addon/components/ember-tabular-column.js @@ -41,12 +41,13 @@ export default Ember.Component.extend(EmberTabularHelpers, { sort: sort, type: type, }; - if (isCustom) { + if (isCustom && registry) { let item = registry.find((el) => { return el.property === property; }); if (!item) { - registry.addObject(column); + // pass action up to ember-tabular to add column to registry + this.get('addToRegistry')(column); } } }, diff --git a/addon/components/ember-tabular.js b/addon/components/ember-tabular.js index 61f9960..6e96ef6 100644 --- a/addon/components/ember-tabular.js +++ b/addon/components/ember-tabular.js @@ -909,6 +909,10 @@ export default Ember.Component.extend(EmberTabularHelpers, { // tells ember-tabular that the custom registry is complete this.set('registryDone', value); }, + addToRegistry(column) { + // adds column to registry coming from ember-tabular-column + this.get('registry').addObject(column); + }, }, /** diff --git a/app/templates/components/ember-tabular-row.hbs b/app/templates/components/ember-tabular-row.hbs index 0666a44..65d5ccb 100644 --- a/app/templates/components/ember-tabular-row.hbs +++ b/app/templates/components/ember-tabular-row.hbs @@ -1,16 +1,16 @@
    diff --git a/tests/dummy/app/templates/index.hbs b/tests/dummy/app/templates/index.hbs index 06b8ffa..38e3ceb 100644 --- a/tests/dummy/app/templates/index.hbs +++ b/tests/dummy/app/templates/index.hbs @@ -17,14 +17,13 @@ Edit {{/link-to}} {{/et.column}} - {{et.footer}} {{/ember-tabular}} -{{!--
    Example #2
    +
    Example #2

    Table - Default

    {{ember-tabular modelName="user" sort=sort2 isColumnSelect=false}} -
    Example #3
    +{{!--
    Example #3

    Table - Override Columns/Templates

    {{#ember-tabular class="table-default" columns=columns modelName="user" record=users sort=sort3 as |section|}} {{#section.column property="username" as |record column|}} From bfe8382c0b7d8c6dfe3f39ca6c03d92b30b0b152 Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Wed, 28 Jun 2017 14:03:40 -0400 Subject: [PATCH 031/105] Fix ember-tabular demo page examples --- addon/components/ember-tabular-column.js | 2 +- addon/components/ember-tabular.js | 9 ++- tests/dummy/app/controllers/index.js | 22 ++++++- tests/dummy/app/templates/index.hbs | 77 +++++++++++++----------- 4 files changed, 71 insertions(+), 39 deletions(-) diff --git a/addon/components/ember-tabular-column.js b/addon/components/ember-tabular-column.js index b83f579..5ab7135 100644 --- a/addon/components/ember-tabular-column.js +++ b/addon/components/ember-tabular-column.js @@ -41,7 +41,7 @@ export default Ember.Component.extend(EmberTabularHelpers, { sort: sort, type: type, }; - if (isCustom && registry) { + if (typeof this.get('isCustom') !== 'undefined' && registry) { let item = registry.find((el) => { return el.property === property; }); diff --git a/addon/components/ember-tabular.js b/addon/components/ember-tabular.js index 6e96ef6..0e702e0 100644 --- a/addon/components/ember-tabular.js +++ b/addon/components/ember-tabular.js @@ -162,6 +162,12 @@ export default Ember.Component.extend(EmberTabularHelpers, { * @default null */ record: null, + + init() { + this._super(...arguments); + this.set('registry', Ember.A()); + }, + /** * This is typically setup on the controller and passed into the component, and is used to construct the table headers/filtering. * @@ -290,7 +296,8 @@ export default Ember.Component.extend(EmberTabularHelpers, { registryDone: false, - registry: Ember.A(), + // Ember.A() to be defined in init() + registry: null, registryDiff: Ember.computed('registry.[]', function () { const modelName = this.get('modelName'); diff --git a/tests/dummy/app/controllers/index.js b/tests/dummy/app/controllers/index.js index d9fca3c..0cd2f7a 100644 --- a/tests/dummy/app/controllers/index.js +++ b/tests/dummy/app/controllers/index.js @@ -102,21 +102,41 @@ export default Ember.Controller.extend({ isActive: true, }, ], - columns2: [ + columnsForDropdownFilter: [ { label: 'Username', + property: 'username', + isActive: true, + filter: false, + sort: false, }, { label: 'Email', + property: 'emailAddress', + isActive: true, + filter: false, + sort: false, }, { label: 'First Name', + property: 'firstName', + isActive: true, + filter: false, + sort: false, }, { label: 'Last Name', + property: 'lastName', + isActive: true, + filter: false, + sort: false, }, { label: 'Last Updated', + property: 'updatedAt', + isActive: true, + filter: false, + sort: false, }, ], actions: { diff --git a/tests/dummy/app/templates/index.hbs b/tests/dummy/app/templates/index.hbs index 38e3ceb..ed02dd8 100644 --- a/tests/dummy/app/templates/index.hbs +++ b/tests/dummy/app/templates/index.hbs @@ -23,91 +23,96 @@

    Table - Default

    {{ember-tabular modelName="user" sort=sort2 isColumnSelect=false}} -{{!--
    Example #3
    +
    Example #3

    Table - Override Columns/Templates

    -{{#ember-tabular class="table-default" columns=columns modelName="user" record=users sort=sort3 as |section|}} - {{#section.column property="username" as |record column|}} +{{#ember-tabular class="table-default" columns=columns modelName="user" record=users sort=sort3 as |et|}} + {{#et.column property="username" as |record column|}} {{record.username}} - {{/section.column}} - {{#section.column property="emailAddress" as |record column|}} + {{/et.column}} + {{#et.column property="emailAddress" as |record column|}} {{record.emailAddress}} - {{/section.column}} - {{#section.column property="firstName" as |record column|}} + {{/et.column}} + {{#et.column property="firstName" as |record column|}} {{record.firstName}} - {{/section.column}} - {{#section.column property="lastName" as |record column|}} + {{/et.column}} + {{#et.column property="lastName" as |record column|}} {{record.lastName}} - {{/section.column}} - {{#section.column property="isAdmin" as |record column|}} + {{/et.column}} + {{#et.column property="isAdmin" as |record column|}} {{#if record.isAdmin}} Yes {{else}} No {{/if}} - {{/section.column}} - {{#section.column property="updatedAt" as |record column|}} + {{/et.column}} + {{#et.column property="updatedAt" as |record column|}} {{#if record.updatedAt}} {{moment-format record.updatedAt 'MM/DD/YYYY'}} {{else}} {{moment-format record.createdAt 'MM/DD/YYYY'}} {{/if}} - {{/section.column}} - {{#section.column property="actions" as |record column|}} + {{/et.column}} + {{#et.column property="actions" as |record column|}} {{#link-to "index" class="btn btn-default btn-xs" role="button"}} Edit {{/link-to}} - {{/section.column}} + {{/et.column}} {{/ember-tabular}}
    Example #3

    Table - Persist Filtering

    -{{#ember-tabular class="table-persist" columns=columns modelName="user" record=users4 filter=filter3 persistFiltering=true sort=sort4 as |section|}} - {{#section.column property="username" as |record column|}} +{{#ember-tabular class="table-persist" columns=columns modelName="user" record=users4 filter=filter3 persistFiltering=true sort=sort4 as |et|}} + {{#et.column property="username" as |record column|}} {{record.username}} - {{/section.column}} - {{#section.column property="emailAddress" as |record column|}} + {{/et.column}} + {{#et.column property="emailAddress" as |record column|}} {{record.emailAddress}} - {{/section.column}} - {{#section.column property="firstName" as |record column|}} + {{/et.column}} + {{#et.column property="firstName" as |record column|}} {{record.firstName}} - {{/section.column}} - {{#section.column property="lastName" as |record column|}} + {{/et.column}} + {{#et.column property="lastName" as |record column|}} {{record.lastName}} - {{/section.column}} - {{#section.column property="isAdmin" as |record column|}} + {{/et.column}} + {{#et.column property="isAdmin" as |record column|}} {{#if record.isAdmin}} Yes {{else}} No {{/if}} - {{/section.column}} - {{#section.column property="updatedAt" as |record column|}} + {{/et.column}} + {{#et.column property="updatedAt" as |record column|}} {{#if record.updatedAt}} {{moment-format record.updatedAt 'MM/DD/YYYY'}} {{else}} {{moment-format record.createdAt 'MM/DD/YYYY'}} {{/if}} - {{/section.column}} - {{#section.column property="actions" as |record column|}} + {{/et.column}} + {{#et.column property="actions" as |record column|}} {{#link-to "index" class="btn btn-default btn-xs" role="button"}} Edit {{/link-to}} - {{/section.column}} + {{/et.column}} {{/ember-tabular}}
    Example #4

    Table - Basic - Global Filter

    -{{#ember-tabular class="table-basic-global-filter" modelName="user" record=users2 filter=filter columnsConfig=columnsConfigForGlobalFilter as |section|}} - {{#if section.isHeader}} +{{#ember-tabular class="table-basic-global-filter" modelName="user" record=users2 filter=filter as |et|}} + {{#if et.isHeader}} {{ember-tabular-global-filter filter=filter filterProperty="username" filterPlaceholder="Search by Username"}} {{/if}} + {{et.column property="username" isCustom=false filter=false sort=false}} + {{et.column property="emailAddress" isCustom=false filter=false sort=false}} + {{et.column property="password" isActive=false isCustom=false filter=false sort=false}} + {{et.column property="createdAt" isActive=false isCustom=false filter=false sort=false}} + {{et.column property="updatedAt" isActive=false isCustom=false filter=false sort=false}} {{/ember-tabular}}
    Example #5

    Table - Basic - Dropdown Filter / Date Filter

    -{{#ember-tabular class="table-basic-global-date-filter" modelName="user" record=users3 filter=filter2 columns=columnsForDropdownFilter as |section|}} - {{#if section.isHeader}} +{{#ember-tabular class="table-basic-global-date-filter" modelName="user" record=users3 filter=filter2 columns=columnsForDropdownFilter as |et|}} + {{#if et.isHeader}}
    {{#ember-tabular-dropdown-filter filter=filter2 filterProperty="isAdmin" label="Is Admin" searchFilter=isAdminFilter}} @@ -136,4 +141,4 @@
    Example #6
    {{#link-to 'example4' class="link-ex4"}} Route Binds Model to Table -{{/link-to}} --}} +{{/link-to}} From 937efb3e535c423b78229651f2b49412aaa2f2ba Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Wed, 28 Jun 2017 14:31:01 -0400 Subject: [PATCH 032/105] Setup way to order columns if columns are autogenerated --- addon/components/ember-tabular.js | 13 +++++++++++-- tests/dummy/app/controllers/index.js | 11 +++++++++++ tests/dummy/app/templates/index.hbs | 2 +- 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/addon/components/ember-tabular.js b/addon/components/ember-tabular.js index 0e702e0..97056b8 100644 --- a/addon/components/ember-tabular.js +++ b/addon/components/ember-tabular.js @@ -276,18 +276,27 @@ export default Ember.Component.extend(EmberTabularHelpers, { // return columns; // }, // }), - columns: Ember.computed('registry', 'registryDiff', 'registryDone', function () { + columns: Ember.computed('registry', 'registryDiff', 'registryDone', 'columnOrder', function () { const columns = Ember.A(); // only output columns array when registry is done if (this.get('registryDone')) { const registry = this.get('registry'); const registryDiff = this.get('registryDiff'); + const columnOrder = this.get('columnOrder'); if (registry && registryDiff) { columns.pushObjects(registry); columns.pushObjects(registryDiff); - console.log('columns', columns); } + + // sort the colums array by columnOrder + if (columnOrder) { + columns.sort((a, b) => { + return columnOrder.indexOf(a.property) < columnOrder.indexOf(b.property) ? -1 : 1; + }); + } + + console.log('columns', columns); } return columns; }), diff --git a/tests/dummy/app/controllers/index.js b/tests/dummy/app/controllers/index.js index 0cd2f7a..dc286b9 100644 --- a/tests/dummy/app/controllers/index.js +++ b/tests/dummy/app/controllers/index.js @@ -13,6 +13,17 @@ export default Ember.Controller.extend({ sort3: 'username', sort4: 'username', isAdminFilter: null, + orderConfig: [ + 'username', + 'emailAddress', + 'password', + 'firstName', + 'lastName', + 'isAdmin', + 'createdAt', + 'updatedAt', + 'actions', + ], columnsConfig: [ { property: 'emailAddress', diff --git a/tests/dummy/app/templates/index.hbs b/tests/dummy/app/templates/index.hbs index ed02dd8..d90ed08 100644 --- a/tests/dummy/app/templates/index.hbs +++ b/tests/dummy/app/templates/index.hbs @@ -1,6 +1,6 @@
    Example #1

    Table - Column Select

    -{{#ember-tabular modelName="user" sort=sort1 as |et|}} +{{#ember-tabular modelName="user" sort=sort1 columnOrder=orderConfig as |et|}} {{#et.column property="emailAddress" isCustom=true as |record column|}} {{get record column.property}} {{/et.column}} From 4e7e5b22fdcb644100094af26cdeba313c3f6891 Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Wed, 28 Jun 2017 15:26:14 -0400 Subject: [PATCH 033/105] Remove old columns computed property --- addon/components/ember-tabular.js | 44 ----------------------------- tests/dummy/app/templates/index.hbs | 2 +- 2 files changed, 1 insertion(+), 45 deletions(-) diff --git a/addon/components/ember-tabular.js b/addon/components/ember-tabular.js index 97056b8..f0334fb 100644 --- a/addon/components/ember-tabular.js +++ b/addon/components/ember-tabular.js @@ -237,45 +237,6 @@ export default Ember.Component.extend(EmberTabularHelpers, { * @type Array * @default null */ - // columns: Ember.computed('columnsConfig', { - // get() { - // const modelName = this.get('modelName'); - // const columnsConfig = this.get('columnsConfig'); - // let columns = []; - // // used if ember-tabular is making request - // if (modelName) { - // const modelClass = this.get('store').modelFor(modelName); - // const modelClassAttributes = Ember.get(modelClass, 'attributes'); - // let attributes = []; - - // // iterate over keys and create attribute array - // modelClassAttributes.forEach((meta, name) => { - // let attribute = { - // property: name, - // label: this._formatColumnLabel(name), - // isActive: true, - // isCustomTemplate: false, - // }; - // attributes.push(attribute); - // }); - // columns = attributes; - // } - // // merge columnsConfig with columns - // if (columnsConfig) { - // for (var i = columnsConfig.length - 1; i >= 0; i--) { - // let item = columns.find((el) => { - // return el.property === columnsConfig[i].property; - // }); - // if (item) { - // let newItem = Ember.merge(item, columnsConfig[i]); - // } else { - // columns.push(columnsConfig[i]); - // } - // } - // } - // return columns; - // }, - // }), columns: Ember.computed('registry', 'registryDiff', 'registryDone', 'columnOrder', function () { const columns = Ember.A(); // only output columns array when registry is done @@ -295,14 +256,10 @@ export default Ember.Component.extend(EmberTabularHelpers, { return columnOrder.indexOf(a.property) < columnOrder.indexOf(b.property) ? -1 : 1; }); } - - console.log('columns', columns); } return columns; }), - columnsConfig: null, - registryDone: false, // Ember.A() to be defined in init() @@ -335,7 +292,6 @@ export default Ember.Component.extend(EmberTabularHelpers, { } }); } - console.log('REGISTRYDIFF', registryDiff); return registryDiff; }), diff --git a/tests/dummy/app/templates/index.hbs b/tests/dummy/app/templates/index.hbs index d90ed08..d7aaf05 100644 --- a/tests/dummy/app/templates/index.hbs +++ b/tests/dummy/app/templates/index.hbs @@ -4,7 +4,7 @@ {{#et.column property="emailAddress" isCustom=true as |record column|}} {{get record column.property}} {{/et.column}} - {{#et.column property="updatedAt" isCustom=true as |record column|}} + {{#et.column property="updatedAt" isCustom=true type="date" as |record column|}} {{moment-format (get record column.property) 'MM/DD/YYYY'}} {{/et.column}} {{#et.column From 7e0bef93e8b4980f3d2903be9b2568645600645d Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Wed, 28 Jun 2017 16:41:55 -0400 Subject: [PATCH 034/105] Update name of registerComplete to registryComplete --- addon/components/ember-tabular-footer.js | 2 +- addon/components/ember-tabular.js | 2 +- app/templates/components/ember-tabular.hbs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/addon/components/ember-tabular-footer.js b/addon/components/ember-tabular-footer.js index 8f5159b..363cbd8 100644 --- a/addon/components/ember-tabular-footer.js +++ b/addon/components/ember-tabular-footer.js @@ -16,7 +16,7 @@ export default Ember.Component.extend({ // fix somehow modifying `columns` twice Ember.run.next(() => { // tell ember-tabular that the custom yields are complete - this.get('registerComplete')(true); + this.get('registryComplete')(true); }); }, }); diff --git a/addon/components/ember-tabular.js b/addon/components/ember-tabular.js index f0334fb..591eebd 100644 --- a/addon/components/ember-tabular.js +++ b/addon/components/ember-tabular.js @@ -877,7 +877,7 @@ export default Ember.Component.extend(EmberTabularHelpers, { toggleFilterRow() { this.toggleProperty('showFilterRow'); }, - registerComplete(value) { + registryComplete(value) { // tells ember-tabular that the custom registry is complete this.set('registryDone', value); }, diff --git a/app/templates/components/ember-tabular.hbs b/app/templates/components/ember-tabular.hbs index 729b475..9da38f3 100644 --- a/app/templates/components/ember-tabular.hbs +++ b/app/templates/components/ember-tabular.hbs @@ -65,7 +65,7 @@ {{#each record as |row|}} {{partial trRow}} {{/each}} - {{ember-tabular-footer registerComplete=(action "registerComplete")}} + {{ember-tabular-footer registryComplete=(action "registryComplete")}} {{else}}
    From 27a08fbd971c4a482b44d28a0325cb861746ba5d Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Thu, 29 Jun 2017 03:08:49 -0400 Subject: [PATCH 035/105] Fix testing coverage and add additional tests to support new columns --- tests/acceptance/basic-test.js | 247 ++++++++++++++++-------- tests/acceptance/relationships-test.js | 12 +- tests/dummy/app/controllers/example4.js | 14 +- tests/dummy/app/templates/example4.hbs | 26 +-- tests/dummy/app/templates/index.hbs | 22 ++- tests/dummy/mirage/fixtures/users.js | 12 ++ tests/integration/ember-tabular-test.js | 58 +++++- tests/unit/ember-tabular-test.js | 9 +- 8 files changed, 274 insertions(+), 126 deletions(-) diff --git a/tests/acceptance/basic-test.js b/tests/acceptance/basic-test.js index 6c74887..ae4976c 100644 --- a/tests/acceptance/basic-test.js +++ b/tests/acceptance/basic-test.js @@ -14,7 +14,7 @@ module('Acceptance: Simple Table', { } }); -test('Check table pagination - 0 pages', function(assert) { +test('Check table pagination - 0 pages (.table-default)', function(assert) { server.createList('user', 0); visit('/'); @@ -29,7 +29,7 @@ test('Check table pagination - 0 pages', function(assert) { }); }); -test('Check table pagination - 5 pages', function(assert) { +test('Check table pagination - 5 pages (.table-default)', function(assert) { server.createList('user', 50); visit('/'); @@ -41,7 +41,7 @@ test('Check table pagination - 5 pages', function(assert) { }); }); -test('Check for expected content', function(assert) { +test('Check for expected content (.table-default)', function(assert) { server.loadFixtures('users'); visit('/'); @@ -50,18 +50,93 @@ test('Check for expected content', function(assert) { let cells = find('.table-default table tbody tr').eq(0).find('td'); - assert.equal(cells.eq(0).html(), 'AnakinSkywalker9', 'Check for username'); - assert.equal(cells.eq(1).html(), 'skywalker@domain.com', 'Check for email'); - assert.equal(cells.eq(2).html(), 'Anakin', 'Check for first name'); - assert.equal(cells.eq(3).html(), 'Skywalker', 'Check for last name'); - assert.equal(cells.eq(5).text().trim(), '07/23/2009', 'Check for date'); - assert.equal(cells.eq(6).find('a').text().trim(), 'Edit', 'Check for actions'); + assert.equal(cells.eq(0).text().trim(), 'AnakinSkywalker9', 'Check for username'); + assert.equal(cells.eq(1).text().trim(), 'skywalker@domain.com', 'Check for email'); + assert.equal(cells.eq(2).text().trim(), '1082hudsasd', 'Check for password'); + assert.equal(cells.eq(3).text().trim(), 'Anakin', 'Check for first name'); + assert.equal(cells.eq(4).text().trim(), 'Skywalker', 'Check for last name'); + assert.equal(cells.eq(5).text().trim(), 'false', 'Check for is admin'); + assert.equal(cells.eq(6).text().trim(), 'Wed Jul 22 2009 00:00:00 GMT+0000', 'Check for created at'); + assert.equal(cells.eq(7).text().trim(), 'Thu Jul 23 2009 00:00:00 GMT+0000', 'Check for updated at'); assert.equal(find('.table-default table tbody tr').length, 10, 'Check for 10 items in table'); }); }); -test('Check for proper row count when dropdown-limit is changed', function(assert) { +test('Check for expected content (.table-column-select)', function(assert) { + server.loadFixtures('users'); + visit('/'); + + andThen(function() { + assert.equal(currentPath(), 'index'); + + let cells = find('.table-column-select table tbody tr').eq(0).find('td'); + + assert.equal(cells.eq(0).text().trim(), 'AnakinSkywalker9', 'Check for username'); + assert.equal(cells.eq(1).text().trim(), 'skywalker@domain.com', 'Check for email'); + assert.equal(cells.eq(2).text().trim(), 'Anakin', 'Check for first name'); + assert.equal(cells.eq(3).text().trim(), 'Skywalker', 'Check for last name'); + assert.equal(cells.eq(4).text().trim(), 'false', 'Check for is admin'); + assert.equal(cells.eq(5).text().trim(), '07/23/2009', 'Check for last updated'); + assert.equal(cells.eq(6).text().trim(), 'Edit', 'Check for edit link'); + + assert.equal(find('.table-column-select table tbody tr').length, 10, 'Check for 10 items in table'); + }); +}); + +test('Check for hidden column after interacting with column-select component (.table-column-select)', function(assert) { + server.loadFixtures('users'); + visit('/'); + + andThen(function() { + assert.equal(currentPath(), 'index'); + + let cells = find('.table-column-select table tbody tr').eq(0).find('td'); + + assert.equal(find('.table-column-select table thead tr th').length, 7, 'Show expected number of columns'); + assert.equal(cells.length, 7, 'Show expected number of columns'); + assert.equal(cells.eq(0).text().trim(), 'AnakinSkywalker9', 'Check for username'); + assert.equal(cells.eq(1).text().trim(), 'skywalker@domain.com', 'Check for email'); + + click('.table-column-select .btn-group-column-select button'); + click('.table-column-select .btn-group-column-select li:eq(0) a'); + }); + + andThen(function() { + let cells = find('.table-column-select table tbody tr').eq(0).find('td'); + + assert.equal(find('.table-column-select table thead tr th').length, 6, 'Show expected number of columns'); + assert.equal(cells.length, 6, 'Show expected number of columns'); + assert.equal(cells.eq(0).text().trim(), 'skywalker@domain.com', 'Check for email, username is hidden'); + assert.equal(cells.eq(1).text().trim(), 'Anakin', 'Check for first name'); + + click('.table-column-select .btn-group-column-select button'); + click('.table-column-select .btn-group-column-select li:eq(0) a'); + }); +}); + +test('Check for expected content (.table-override-columns-template)', function(assert) { + server.loadFixtures('users'); + visit('/'); + + andThen(function() { + assert.equal(currentPath(), 'index'); + + let cells = find('.table-override-columns-template table tbody tr').eq(0).find('td'); + + assert.equal(cells.eq(0).text().trim(), 'AnakinSkywalker9', 'Check for username'); + assert.equal(cells.eq(1).text().trim(), 'skywalker@domain.com', 'Check for email'); + assert.equal(cells.eq(2).text().trim(), 'Anakin', 'Check for first name'); + assert.equal(cells.eq(3).text().trim(), 'Skywalker', 'Check for last name'); + assert.equal(cells.eq(4).text().trim(), 'No', 'Check for is admin'); + assert.equal(cells.eq(5).text().trim(), '07/23/2009', 'Check for last updated'); + assert.equal(cells.eq(6).text().trim(), 'Edit', 'Check for edit link'); + + assert.equal(find('.table-override-columns-template table tbody tr').length, 10, 'Check for 10 items in table'); + }); +}); + +test('Check for proper row count when dropdown-limit is changed (.table-default)', function(assert) { server.createList('user', 50); visit('/'); @@ -81,7 +156,7 @@ test('Check for proper row count when dropdown-limit is changed', function(asser }); }); -test('Check for dropdown-limit autoHide', function(assert) { +test('Check for dropdown-limit autoHide (.table-default)', function(assert) { server.createList('user', 10); visit('/'); @@ -119,7 +194,7 @@ test('Check for error handling', function(assert) { }); }); -test('Check table rendering for no data or loading', function(assert) { +test('Check table rendering for no data or loading (.table-default)', function(assert) { server.loadFixtures('users'); visit('/'); @@ -139,7 +214,7 @@ test('Check table rendering for no data or loading', function(assert) { }); }); -test('Check table rendering for pagination', function(assert) { +test('Check table rendering for pagination (.table-default)', function(assert) { server.loadFixtures('users'); visit('/'); @@ -152,36 +227,40 @@ test('Check table rendering for pagination', function(assert) { andThen(function() { var cells = find('.table-default table tbody tr').eq(0).find('td'); - assert.equal(cells.eq(0).html(), 'mcclane.jr', 'Check for username'); - assert.equal(cells.eq(1).html(), 'jack.mcclane@domain.com', 'Check for email'); - assert.equal(cells.eq(2).html(), 'Jack', 'Check for first name'); - assert.equal(cells.eq(3).html(), 'McClane', 'Check for last name'); - assert.equal(cells.eq(5).text().trim(), '01/02/2017', 'Check for date'); - assert.equal(cells.eq(6).find('a').text().trim(), 'Edit', 'Check for actions'); + assert.equal(cells.eq(0).text().trim(), 'mcclane.jr', 'Check for username'); + assert.equal(cells.eq(1).text().trim(), 'jack.mcclane@domain.com', 'Check for email'); + assert.equal(cells.eq(2).text().trim(), 'h1d69sljq98', 'Check for password'); + assert.equal(cells.eq(3).text().trim(), 'Jack', 'Check for first name'); + assert.equal(cells.eq(4).text().trim(), 'McClane', 'Check for last name'); + assert.equal(cells.eq(5).text().trim(), 'false', 'Check for is admin'); + assert.equal(cells.eq(6).text().trim(), 'Sun Jan 01 2017 00:00:00 GMT+0000', 'Check for created at'); + assert.equal(cells.eq(7).text().trim(), 'Mon Jan 02 2017 00:00:00 GMT+0000', 'Check for updated at'); assert.equal(find('.table-default table tbody tr').length, 2, 'Check for 2 items in table on second page'); }); }); -test('Check for expected content sorting', function(assert) { +test('Check for expected content sorting (.table-default)', function(assert) { server.loadFixtures('users'); visit('/'); andThen(function() { assert.equal(currentPath(), 'index'); - click('table th:contains("Last Name") .btn-sort'); + click('.table-default table th:contains("Last Name") .btn-sort'); }); andThen(function() { let cells = find('.table-default table tbody tr').eq(0).find('td'); - assert.equal(cells.eq(0).html(), 'Dooku', 'Check for username'); - assert.equal(cells.eq(1).html(), 'count.dooku@domain.com', 'Check for email'); - assert.equal(cells.eq(2).html(), 'Count', 'Check for first name'); - assert.equal(cells.eq(3).html(), 'Dooku', 'Check for last name'); - assert.equal(cells.eq(5).text().trim(), '07/23/2006', 'Check for date'); - assert.equal(cells.eq(6).find('a').text().trim(), 'Edit', 'Check for actions'); + assert.equal(cells.eq(0).text().trim(), 'Dooku', 'Check for username'); + assert.equal(cells.eq(1).text().trim(), 'count.dooku@domain.com', 'Check for email'); + assert.equal(cells.eq(2).text().trim(), '-912dh9ds', 'Check for password'); + assert.equal(cells.eq(3).text().trim(), 'Count', 'Check for first name'); + assert.equal(cells.eq(4).text().trim(), 'Dooku', 'Check for last name'); + assert.equal(cells.eq(5).text().trim(), 'false', 'Check for is admin'); + assert.equal(cells.eq(6).text().trim(), 'Sat Jul 22 2006 00:00:00 GMT+0000', 'Check for created at'); + assert.equal(cells.eq(7).text().trim(), 'Sun Jul 23 2006 00:00:00 GMT+0000', 'Check for updated at'); assert.equal(find('.table-default table tbody tr').length, 10, 'Check for 10 items in table'); }); @@ -195,29 +274,29 @@ test('Check for expected content sorting', function(assert) { }); }); -test('Check for disabled sorting', function(assert) { +test('Check for disabled sorting (.table-override-columns-template)', function(assert) { server.loadFixtures('users'); visit('/'); andThen(function() { assert.equal(currentPath(), 'index'); - click('.table-default table th:contains("Last Updated")'); + click('.table-override-columns-template table th:contains("Last Updated")'); }); andThen(function() { - let cells = find('.table-default table tbody tr').eq(0).find('td'); + let cells = find('.table-override-columns-template table tbody tr').eq(0).find('td'); - assert.equal(find('.table-default #updated-at').hasClass('sortable'), false, 'Check for missing sortable class'); + assert.equal(find('.table-override-columns-template #updated-at').hasClass('sortable'), false, 'Check for missing sortable class'); - assert.equal(cells.eq(0).html(), 'AnakinSkywalker9', 'Check for username'); - assert.equal(cells.eq(1).html(), 'skywalker@domain.com', 'Check for email'); - assert.equal(cells.eq(2).html(), 'Anakin', 'Check for first name'); - assert.equal(cells.eq(3).html(), 'Skywalker', 'Check for last name'); + assert.equal(cells.eq(0).text().trim(), 'AnakinSkywalker9', 'Check for username'); + assert.equal(cells.eq(1).text().trim(), 'skywalker@domain.com', 'Check for email'); + assert.equal(cells.eq(2).text().trim(), 'Anakin', 'Check for first name'); + assert.equal(cells.eq(3).text().trim(), 'Skywalker', 'Check for last name'); assert.equal(cells.eq(5).text().trim(), '07/23/2009', 'Check for date'); assert.equal(cells.eq(6).find('a').text().trim(), 'Edit', 'Check for actions'); - assert.equal(find('.table-default table tbody tr').length, 10, 'Check for 10 items in table'); + assert.equal(find('.table-override-columns-template table tbody tr').length, 10, 'Check for 10 items in table'); }); andThen(function() { @@ -229,7 +308,7 @@ test('Check for disabled sorting', function(assert) { }); }); -test('Check for expected content filter', function(assert) { +test('Check for expected content filter (.table-default)', function(assert) { server.loadFixtures('users'); visit('/'); @@ -237,19 +316,21 @@ test('Check for expected content filter', function(assert) { assert.equal(currentPath(), 'index'); click('.table-default table .btn-toggle-filter:eq(0)'); - fillIn('.table-default table thead tr:eq(1) th:eq(3) input', 'McClane'); - find('.table-default table thead tr:eq(1) th:eq(3) input').trigger('keyup'); + fillIn('.table-default table thead tr:eq(1) th:eq(4) input', 'McClane'); + find('.table-default table thead tr:eq(1) th:eq(4) input').trigger('keyup'); }); andThen(function() { let cells = find('.table-default table tbody tr').eq(0).find('td'); - assert.equal(cells.eq(0).html(), 'YippieKiYay', 'Check for username'); - assert.equal(cells.eq(1).html(), 'john.mcclane@domain.com', 'Check for email'); - assert.equal(cells.eq(2).html(), 'John', 'Check for first name'); - assert.equal(cells.eq(3).html(), 'McClane', 'Check for last name'); - assert.equal(cells.eq(5).text().trim(), '01/02/2017', 'Check for date'); - assert.equal(cells.eq(6).find('a').text().trim(), 'Edit', 'Check for actions'); + assert.equal(cells.eq(0).text().trim(), 'YippieKiYay', 'Check for username'); + assert.equal(cells.eq(1).text().trim(), 'john.mcclane@domain.com', 'Check for email'); + assert.equal(cells.eq(2).text().trim(), '12s2s2132x', 'Check for password'); + assert.equal(cells.eq(3).text().trim(), 'John', 'Check for first name'); + assert.equal(cells.eq(4).text().trim(), 'McClane', 'Check for last name'); + assert.equal(cells.eq(5).text().trim(), 'true', 'Check for is admin'); + assert.equal(cells.eq(6).text().trim(), 'Sun Jan 01 2017 00:00:00 GMT+0000', 'Check for created at'); + assert.equal(cells.eq(7).text().trim(), 'Mon Jan 02 2017 00:00:00 GMT+0000', 'Check for updated at'); assert.equal(find('.table-default table tbody tr').length, 2, 'Check for 2 items in table'); }); @@ -263,7 +344,7 @@ test('Check for expected content filter', function(assert) { }); }); -test('Check for expected content multiple filters', function(assert) { +test('Check for expected content multiple filters (.table-default)', function(assert) { server.loadFixtures('users'); visit('/'); @@ -271,21 +352,23 @@ test('Check for expected content multiple filters', function(assert) { assert.equal(currentPath(), 'index'); click('.table-default table .btn-toggle-filter:eq(0)'); - fillIn('.table-default table thead tr:eq(1) th:eq(2) input', 'John'); - find('.table-default table thead tr:eq(1) th:eq(2) input').trigger('keyup'); - fillIn('.table-default table thead tr:eq(1) th:eq(3) input', 'McClane'); + fillIn('.table-default table thead tr:eq(1) th:eq(3) input', 'John'); find('.table-default table thead tr:eq(1) th:eq(3) input').trigger('keyup'); + fillIn('.table-default table thead tr:eq(1) th:eq(4) input', 'McClane'); + find('.table-default table thead tr:eq(1) th:eq(4) input').trigger('keyup'); }); andThen(function() { var cells = find('.table-default table tbody tr').eq(0).find('td'); - assert.equal(cells.eq(0).html(), 'YippieKiYay', 'Check for username'); - assert.equal(cells.eq(1).html(), 'john.mcclane@domain.com', 'Check for email'); - assert.equal(cells.eq(2).html(), 'John', 'Check for first name'); - assert.equal(cells.eq(3).html(), 'McClane', 'Check for last name'); - assert.equal(cells.eq(5).text().trim(), '01/02/2017', 'Check for date'); - assert.equal(cells.eq(6).find('a').text().trim(), 'Edit', 'Check for actions'); + assert.equal(cells.eq(0).text().trim(), 'YippieKiYay', 'Check for username'); + assert.equal(cells.eq(1).text().trim(), 'john.mcclane@domain.com', 'Check for email'); + assert.equal(cells.eq(2).text().trim(), '12s2s2132x', 'Check for password'); + assert.equal(cells.eq(3).text().trim(), 'John', 'Check for first name'); + assert.equal(cells.eq(4).text().trim(), 'McClane', 'Check for last name'); + assert.equal(cells.eq(5).text().trim(), 'true', 'Check for is admin'); + assert.equal(cells.eq(6).text().trim(), 'Sun Jan 01 2017 00:00:00 GMT+0000', 'Check for created at'); + assert.equal(cells.eq(7).text().trim(), 'Mon Jan 02 2017 00:00:00 GMT+0000', 'Check for updated at'); assert.equal(find('.table-default table tbody tr').length, 1, 'Check for 1 item in table'); }); @@ -299,7 +382,7 @@ test('Check for expected content multiple filters', function(assert) { }); }); -test('Check for expected content sort/filter', function(assert) { +test('Check for expected content sort/filter (.table-default)', function(assert) { server.loadFixtures('users'); visit('/'); @@ -311,19 +394,21 @@ test('Check for expected content sort/filter', function(assert) { andThen(function() { click('.table-default table .btn-toggle-filter:eq(0)'); - fillIn('.table-default table thead tr:eq(1) th:eq(3) input', 'McClane'); - find('.table-default table thead tr:eq(1) th:eq(3) input').trigger('keyup'); + fillIn('.table-default table thead tr:eq(1) th:eq(4) input', 'McClane'); + find('.table-default table thead tr:eq(1) th:eq(4) input').trigger('keyup'); }); andThen(function() { let cells = find('.table-default table tbody tr').eq(0).find('td'); - assert.equal(cells.eq(0).html(), 'YippieKiYay', 'Check for username'); - assert.equal(cells.eq(1).html(), 'john.mcclane@domain.com', 'Check for email'); - assert.equal(cells.eq(2).html(), 'John', 'Check for first name'); - assert.equal(cells.eq(3).html(), 'McClane', 'Check for last name'); - assert.equal(cells.eq(5).text().trim(), '01/02/2017', 'Check for date'); - assert.equal(cells.eq(6).find('a').text().trim(), 'Edit', 'Check for actions'); + assert.equal(cells.eq(0).text().trim(), 'YippieKiYay', 'Check for username'); + assert.equal(cells.eq(1).text().trim(), 'john.mcclane@domain.com', 'Check for email'); + assert.equal(cells.eq(2).text().trim(), '12s2s2132x', 'Check for password'); + assert.equal(cells.eq(3).text().trim(), 'John', 'Check for first name'); + assert.equal(cells.eq(4).text().trim(), 'McClane', 'Check for last name'); + assert.equal(cells.eq(5).text().trim(), 'true', 'Check for is admin'); + assert.equal(cells.eq(6).text().trim(), 'Sun Jan 01 2017 00:00:00 GMT+0000', 'Check for created at'); + assert.equal(cells.eq(7).text().trim(), 'Mon Jan 02 2017 00:00:00 GMT+0000', 'Check for updated at'); assert.equal(find('.table-default table tbody tr').length, 2, 'Check for 1 item in table'); }); @@ -337,15 +422,15 @@ test('Check for expected content sort/filter', function(assert) { }); }); -test('Check for expected content dropdown filter', function(assert) { +test('Check for expected content dropdown filter (.table-override-columns-template)', function(assert) { server.loadFixtures('users'); visit('/'); andThen(function() { assert.equal(currentPath(), 'index'); - click('.table-default table .btn-toggle-filter:eq(0)'); - selectChoose('.table-default .ember-tabular-ember-power-select:eq(0)', 'Yes'); + click('.table-override-columns-template table .btn-toggle-filter:eq(0)'); + selectChoose('.table-override-columns-template .ember-tabular-ember-power-select:eq(0)', 'Yes'); }); andThen(function() { @@ -357,18 +442,18 @@ test('Check for expected content dropdown filter', function(assert) { }); }); -test('Check table-default for dropdown clear success', function(assert) { +test('Check for dropdown clear success (.table-override-columns-template)', function(assert) { server.loadFixtures('users'); visit('/'); andThen(function() { assert.equal(currentPath(), 'index'); - click('.table-default .btn-toggle-filter:eq(0)'); + click('.table-override-columns-template .btn-toggle-filter:eq(0)'); }); andThen(function() { - selectChoose('.table-default .ember-tabular-ember-power-select:eq(0)', 'Yes'); + selectChoose('.table-override-columns-template .ember-tabular-ember-power-select:eq(0)', 'Yes'); }); andThen(function() { @@ -378,7 +463,7 @@ test('Check table-default for dropdown clear success', function(assert) { }); andThen(function() { - click('.table-default .ember-power-select-clear-btn:eq(0)'); + click('.table-override-columns-template .ember-power-select-clear-btn:eq(0)'); andThen(function() { var request = getPretenderRequest(server, 'GET', 'users')[0]; @@ -404,11 +489,11 @@ test('Check table-basic-global-filter for expected content after filtering', fun andThen(function() { let cells = find('.table-basic-global-filter table tbody tr').eq(0).find('td'); - assert.equal(cells.eq(0).html(), 'YippieKiYay', 'Check for username'); - assert.equal(cells.eq(1).html(), 'john.mcclane@domain.com', 'Check for email'); - assert.equal(cells.eq(2).html(), 'John', 'Check for first name'); - assert.equal(cells.eq(3).html(), 'McClane', 'Check for last name'); - assert.equal(cells.eq(4).text().trim(), '01/02/2017', 'Check for date'); + assert.equal(cells.eq(0).text().trim(), 'YippieKiYay', 'Check for username'); + assert.equal(cells.eq(1).text().trim(), 'john.mcclane@domain.com', 'Check for email'); + assert.equal(cells.eq(2).text().trim(), 'John', 'Check for first name'); + assert.equal(cells.eq(3).text().trim(), 'McClane', 'Check for last name'); + assert.equal(cells.eq(4).text().trim(), 'true', 'Check for is admin'); assert.equal(find('.table-basic-global-filter table tbody tr').length, 1, 'Check for 1 item in table'); }); @@ -422,7 +507,7 @@ test('Check table-basic-global-filter for expected content after filtering', fun }); }); -test('Check for clearFilter action success', function(assert) { +test('Check for clearFilter action success (.table-default)', function(assert) { server.loadFixtures('users'); visit('/'); @@ -432,8 +517,8 @@ test('Check for clearFilter action success', function(assert) { andThen(function() { click('.table-default table .btn-toggle-filter:eq(0)'); - fillIn('.table-default table thead tr:eq(1) th:eq(3) input', 'McClane'); - find('.table-default table thead tr:eq(1) th:eq(3) input').trigger('keyup'); + fillIn('.table-default table thead tr:eq(1) th:eq(4) input', 'McClane'); + find('.table-default table thead tr:eq(1) th:eq(4) input').trigger('keyup'); }); andThen(function() { @@ -598,7 +683,7 @@ test('Check table-persist for persistent filters on transition', function(assert andThen(function() { let request = getPretenderRequest(server, 'GET', 'users'); - assert.equal(request.length, 10, 'Check that additional request was not made when opening filter row'); + assert.equal(request.length, 14, 'Check that additional request was not made when opening filter row'); }); }); }); @@ -617,6 +702,6 @@ test('Check for expected request count when transitioning', function(assert) { andThen(function() { let request = getPretenderRequest(server, 'GET', 'users'); - assert.equal(request.length, 5, 'Should only see 5 requests, checking to ensure extra requests are not made on transition'); + assert.equal(request.length, 7, 'Should only see 7 requests, checking to ensure extra requests are not made on transition'); }); }); diff --git a/tests/acceptance/relationships-test.js b/tests/acceptance/relationships-test.js index db60053..50ab7a0 100644 --- a/tests/acceptance/relationships-test.js +++ b/tests/acceptance/relationships-test.js @@ -27,9 +27,9 @@ test('Check for expected url when filtering relationships', function(assert) { }); andThen(function() { - click('.table-default table .btn-toggle-filter:eq(0)'); - fillIn('.table-default table thead tr:eq(1) th:eq(0) input', 'Testing Relationships'); - find('.table-default table thead tr:eq(1) th:eq(0) input').trigger('keyup'); + click('.table-override-columns-template table .btn-toggle-filter:eq(0)'); + fillIn('.table-override-columns-template table thead tr:eq(1) th:eq(0) input', 'Testing Relationships'); + find('.table-override-columns-template table thead tr:eq(1) th:eq(0) input').trigger('keyup'); }); andThen(function() { @@ -42,13 +42,13 @@ test('Check for expected url when filtering relationships', function(assert) { andThen(function() { // clear filter - click('.table-default table .clearFilter'); + click('.table-override-columns-template table .clearFilter'); }); andThen(function() { // make another request to the relationship - fillIn('.table-default table thead tr:eq(1) th:eq(0) input', 'Testing Relationships 2'); - find('.table-default table thead tr:eq(1) th:eq(0) input').trigger('keyup'); + fillIn('.table-override-columns-template table thead tr:eq(1) th:eq(0) input', 'Testing Relationships 2'); + find('.table-override-columns-template table thead tr:eq(1) th:eq(0) input').trigger('keyup'); }); andThen(function() { diff --git a/tests/dummy/app/controllers/example4.js b/tests/dummy/app/controllers/example4.js index 8a6a11a..42f6938 100644 --- a/tests/dummy/app/controllers/example4.js +++ b/tests/dummy/app/controllers/example4.js @@ -5,26 +5,32 @@ export default Ember.Controller.extend({ { property: 'username', label: 'Username', + isActive: true, filter: false, }, { - property: 'email-address', + property: 'emailAddress', label: 'Email', + isActive: true, filter: false, }, { - property: 'first-name', + property: 'firstName', label: 'First Name', + isActive: true, filter: false, }, { - property: 'last-name', + property: 'lastName', label: 'Last Name', + isActive: true, filter: false, }, { - property: 'updated-at', + property: 'updatedAt', label: 'Last Updated', + isActive: true, + isCustomTemplate: true, filter: false, }, ], diff --git a/tests/dummy/app/templates/example4.hbs b/tests/dummy/app/templates/example4.hbs index dcf6d01..6c4c666 100644 --- a/tests/dummy/app/templates/example4.hbs +++ b/tests/dummy/app/templates/example4.hbs @@ -1,23 +1,13 @@
    Example #4

    Table - Basic - Route Binds Model to Table

    -{{#ember-tabular class="table-basic-route-model" columns=columns makeRequest=false record=model page=page pageLimit=pageLimit isLoading=isLoading sort=sort as |section|}} - {{#if section.isBody}} - {{#each model as |row|}} -
    {{row.username}}{{row.emailAddress}}{{row.firstName}}{{row.lastName}} - {{#if row.updatedAt}} - {{moment-format row.updatedAt 'MM/DD/YYYY'}} - {{else}} - {{moment-format row.createdAt 'MM/DD/YYYY'}} - {{/if}} -
    columns'); + assert.equal(cells.length, 7, 'Show expected number of columns'); assert.equal(cells.eq(0).text().trim(), 'AnakinSkywalker9', 'Check for username'); assert.equal(cells.eq(1).text().trim(), 'skywalker@domain.com', 'Check for email'); @@ -105,8 +105,8 @@ test('Check for hidden column after interacting with column-select component (.t andThen(function() { let cells = find('.table-column-select table tbody tr').eq(0).find('td'); - assert.equal(find('.table-column-select table thead tr th').length, 6, 'Show expected number of columns'); - assert.equal(cells.length, 6, 'Show expected number of columns'); + assert.equal(find('.table-column-select table thead tr th').length, 6, 'Show expected number of columns'); + assert.equal(cells.length, 6, 'Show expected number of columns'); assert.equal(cells.eq(0).text().trim(), 'skywalker@domain.com', 'Check for email, username is hidden'); assert.equal(cells.eq(1).text().trim(), 'Anakin', 'Check for first name'); @@ -473,7 +473,7 @@ test('Check for dropdown clear success (.table-override-columns-template)', func }); }); -test('Check table-basic-global-filter for expected content after filtering', function(assert) { +test('Check for expected content after filtering (.table-basic-global-filter)', function(assert) { server.loadFixtures('users'); visit('/'); @@ -534,7 +534,7 @@ test('Check for clearFilter action success (.table-default)', function(assert) { }); }); -test('Check table-basic-global-filter for clearFilter action success', function(assert) { +test('Check for clearFilter action success (.table-basic-global-filter )', function(assert) { server.loadFixtures('users'); visit('/'); @@ -560,7 +560,7 @@ test('Check table-basic-global-filter for clearFilter action success', function( }); }); -test('Check table-basic-global-date-filter to filter by date and is-admin', function(assert) { +test('Check to filter by date and is-admin (.table-basic-global-date-filter)', function(assert) { server.loadFixtures('users'); visit('/'); @@ -586,7 +586,7 @@ test('Check table-basic-global-date-filter to filter by date and is-admin', func }); }); -test('Check table-basic-global-date-filter for infinite request loop', function(assert) { +test('Check for infinite request loop (.table-basic-global-date-filter)', function(assert) { // error occurs if controller properties that are shared // with ember-tabular components are not defined within controller server.loadFixtures('users'); @@ -614,7 +614,7 @@ test('Check table-basic-global-date-filter for infinite request loop', function( }); }); -test('Check table-basic-global-date-filter for date clearFilter action success', function(assert) { +test('Check for date clearFilter action success (.table-basic-global-date-filter)', function(assert) { server.loadFixtures('users'); visit('/'); @@ -640,7 +640,7 @@ test('Check table-basic-global-date-filter for date clearFilter action success', }); }); -test('Check table-persist for persistent filters on transition', function(assert) { +test('Check for persistent filters on transition (.table-persist)', function(assert) { server.loadFixtures('users'); visit('/'); diff --git a/tests/acceptance/example4-test.js b/tests/acceptance/example4-test.js index 3b70a50..c6c906b 100644 --- a/tests/acceptance/example4-test.js +++ b/tests/acceptance/example4-test.js @@ -13,7 +13,7 @@ module('Acceptance: Example4 Table', { } }); -test('Check table-basic-route-model for expected content', function(assert) { +test('Check for expected content (.table-basic-route-model)', function(assert) { server.loadFixtures('users'); visit('/example4'); @@ -29,7 +29,7 @@ test('Check table-basic-route-model for expected content', function(assert) { }); }); -test('Check table-basic-route-model pagination - 5 pages', function(assert) { +test('Check pagination - 5 pages (.table-basic-route-model)', function(assert) { server.createList('user', 50); visit('/example4'); @@ -41,7 +41,7 @@ test('Check table-basic-route-model pagination - 5 pages', function(assert) { }); }); -test('Check table-basic-route-model ability to sort', function(assert) { +test('Check ability to sort (.table-basic-route-model)', function(assert) { server.createList('user', 50); visit('/example4'); From 15002921c5b1633871e3e4f05d2bf3075950ba91 Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Fri, 11 Aug 2017 14:57:31 -0400 Subject: [PATCH 048/105] Upgrade ember-cli to 2.13.2 in circle.yml --- circle.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/circle.yml b/circle.yml index a48b76c..73d0b41 100644 --- a/circle.yml +++ b/circle.yml @@ -6,7 +6,7 @@ machine: dependencies: pre: - npm install -g npm@5.0.2 - - npm install -g ember-cli@2.4.2 + - npm install -g ember-cli@2.13.2 - npm install -g phantomjs@2.1.1 - npm install - bower install From 5df6f57770f3de2a5ca7f7cfdc186083ebdfbbda Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Fri, 11 Aug 2017 15:53:33 -0400 Subject: [PATCH 049/105] Update the JSDocs with current documentation --- .../components/ember-tabular-column-select.js | 4 + addon/components/ember-tabular-column.js | 24 +++- addon/components/ember-tabular.js | 120 ++++++++---------- 3 files changed, 83 insertions(+), 65 deletions(-) diff --git a/addon/components/ember-tabular-column-select.js b/addon/components/ember-tabular-column-select.js index 6b59353..8ed466d 100644 --- a/addon/components/ember-tabular-column-select.js +++ b/addon/components/ember-tabular-column-select.js @@ -1,6 +1,8 @@ import Ember from 'ember'; /** +* Generates a bootstrap compliant dropdown containing the `columns` +* in a selectable/reorderable list. * * @class EmberTabularColumnSelect */ @@ -12,6 +14,7 @@ export default Ember.Component.extend({ */ tagName: 'div', classNames: ['btn-group', 'btn-group-column-select'], + columns: null, actions: { toggleColumn(column) { @@ -23,6 +26,7 @@ export default Ember.Component.extend({ }, sortEndAction() { // override to perform custom actions on end of sort + // perhaps to save the columns order }, }, }); diff --git a/addon/components/ember-tabular-column.js b/addon/components/ember-tabular-column.js index 5ab7135..23f4d3f 100644 --- a/addon/components/ember-tabular-column.js +++ b/addon/components/ember-tabular-column.js @@ -2,8 +2,30 @@ import Ember from 'ember'; import EmberTabularHelpers from 'ember-tabular/mixins/components/ember-tabular-helpers'; /** +* Generates a column object used within ember tabular table headings +* Sets sensible defaults which can be overwritten when setting up the template +* for ember tabular * -* @class EmberTabularCell + ```hbs + {{! app/templates/my-route.hbs }} + + {{#ember-tabular class="table-basic-global-filter" modelName="user" record=users2 filter=filter as |et|}} + {{et.column property="username" isCustom=false filter=false sort=false}} + {{et.column property="createdAt" isActive=false isCustom=false filter=true sort=true type="date"}} + {{/ember-tabular}} + + {{#ember-tabular class="table-basic-global-filter" modelName="user" record=users2 filter=filter as |et|}} + {{#et.column property="isAdmin" as |record column|}} + {{#if record.isAdmin}} + Yes + {{else}} + No + {{/if}} + {{/et.column}} + {{/ember-tabular}} + ``` +* +* @class EmberTabularColumn */ export default Ember.Component.extend(EmberTabularHelpers, { /** diff --git a/addon/components/ember-tabular.js b/addon/components/ember-tabular.js index bc20bf4..b7a1b30 100644 --- a/addon/components/ember-tabular.js +++ b/addon/components/ember-tabular.js @@ -3,63 +3,14 @@ import EmberTabularHelpers from 'ember-tabular/mixins/components/ember-tabular-h /** * ## Basic Usage -* - `columns` - Controller array to setup the table headers/columns (detailed below). - - `modelName` - for the component to make the proper request when filtering/sorting, you must pass the model type matching your Ember model structure. e.g. brand/diagram, product. +* - `columns` - Controller array to setup the table headers/columns (optional, if you specify it will override the autogenerated version). + - `modelName` - for the component to make the proper request when filtering/sorting, you must pass the model type matching your Ember model structure. e.g. brand/diagram, product, list-item, etc. - `record` - this is bound to the controller and is used to iterate over the table's model data. * ### Template ```hbs {{! app/templates/my-route.hbs }} - {{#ember-tabular columns=columns modelName="user" record=users as |section|}} - {{#if section.isBody}} - {{#each users as |row|}} -
    {{row.username}}{{row.emailAddress}}{{row.firstName}}{{row.lastName}} - {{#link-to "index" class="btn btn-xs" role="button"}} - Edit - {{/link-to}} -
    {{row.username}}{{row.emailAddress}}{{row.firstName}}{{row.lastName}}{{row.updatedAt}} - {{#link-to "index" class="btn btn-xs" role="button"}} - Edit - {{/link-to}} -
    {{yield record column}} +
    + +
    +
    {{get record column.property}}
    - + {{ember-tabular-row-checkbox name="checked" model=record collection=collection}}
    `. @@ -6,6 +7,7 @@ import Ember from 'ember'; * @class EmberTabularFilter */ export default Ember.Component.extend({ + layout, /** * @property tagName * @type String diff --git a/addon/components/ember-tabular-footer.js b/addon/components/ember-tabular-footer.js index 363cbd8..6a844fe 100644 --- a/addon/components/ember-tabular-footer.js +++ b/addon/components/ember-tabular-footer.js @@ -1,10 +1,12 @@ import Ember from 'ember'; +import layout from 'ember-tabular/templates/components/ember-tabular-footer'; /** * * @class EmberTabularFooter */ export default Ember.Component.extend({ + layout, /** * @property tagName * @type String diff --git a/addon/components/ember-tabular-global-filter.js b/addon/components/ember-tabular-global-filter.js index 975805e..f47c048 100644 --- a/addon/components/ember-tabular-global-filter.js +++ b/addon/components/ember-tabular-global-filter.js @@ -1,4 +1,5 @@ import Ember from 'ember'; +import layout from 'ember-tabular/templates/components/ember-tabular-global-filter'; /** * ## Global Filter @@ -17,6 +18,7 @@ import Ember from 'ember'; * @class EmberTabularGlobalFilter */ export default Ember.Component.extend({ + layout, /** * @property tagName * @type String diff --git a/addon/components/ember-tabular-row-checkbox.js b/addon/components/ember-tabular-row-checkbox.js index 3a67c3d..e0cc530 100644 --- a/addon/components/ember-tabular-row-checkbox.js +++ b/addon/components/ember-tabular-row-checkbox.js @@ -1,6 +1,8 @@ import Ember from 'ember'; +import layout from 'ember-tabular/templates/components/ember-tabular-row-checkbox'; export default Ember.Component.extend({ + layout, tagName: 'div', classNames: ['ember-tabular-row-checkbox'], // allow div to be focusable so keyDown/keyUp events are triggered diff --git a/addon/components/ember-tabular.js b/addon/components/ember-tabular.js index 7238dc6..97ad376 100644 --- a/addon/components/ember-tabular.js +++ b/addon/components/ember-tabular.js @@ -1,4 +1,5 @@ import Ember from 'ember'; +import layout from 'ember-tabular/templates/components/ember-tabular'; import EmberTabularHelpers from 'ember-tabular/mixins/components/ember-tabular-helpers'; /** @@ -16,6 +17,7 @@ import EmberTabularHelpers from 'ember-tabular/mixins/components/ember-tabular-h * @class EmberTabular */ export default Ember.Component.extend(EmberTabularHelpers, { + layout, store: Ember.inject.service('store'), action: null, classNames: ['ember-tabular'], diff --git a/app/templates/components/ember-tabular-alert.hbs b/addon/templates/components/ember-tabular-alert.hbs similarity index 100% rename from app/templates/components/ember-tabular-alert.hbs rename to addon/templates/components/ember-tabular-alert.hbs diff --git a/app/templates/components/ember-tabular-column-select.hbs b/addon/templates/components/ember-tabular-column-select.hbs similarity index 100% rename from app/templates/components/ember-tabular-column-select.hbs rename to addon/templates/components/ember-tabular-column-select.hbs diff --git a/app/templates/components/ember-tabular-column.hbs b/addon/templates/components/ember-tabular-column.hbs similarity index 100% rename from app/templates/components/ember-tabular-column.hbs rename to addon/templates/components/ember-tabular-column.hbs diff --git a/app/templates/components/ember-tabular-date-filter.hbs b/addon/templates/components/ember-tabular-date-filter.hbs similarity index 100% rename from app/templates/components/ember-tabular-date-filter.hbs rename to addon/templates/components/ember-tabular-date-filter.hbs diff --git a/app/templates/components/ember-tabular-dropdown-filter.hbs b/addon/templates/components/ember-tabular-dropdown-filter.hbs similarity index 100% rename from app/templates/components/ember-tabular-dropdown-filter.hbs rename to addon/templates/components/ember-tabular-dropdown-filter.hbs diff --git a/app/templates/components/ember-tabular-dropdown-limit.hbs b/addon/templates/components/ember-tabular-dropdown-limit.hbs similarity index 100% rename from app/templates/components/ember-tabular-dropdown-limit.hbs rename to addon/templates/components/ember-tabular-dropdown-limit.hbs diff --git a/app/templates/components/ember-tabular-filter.hbs b/addon/templates/components/ember-tabular-filter.hbs similarity index 100% rename from app/templates/components/ember-tabular-filter.hbs rename to addon/templates/components/ember-tabular-filter.hbs diff --git a/app/templates/components/ember-tabular-global-filter.hbs b/addon/templates/components/ember-tabular-global-filter.hbs similarity index 100% rename from app/templates/components/ember-tabular-global-filter.hbs rename to addon/templates/components/ember-tabular-global-filter.hbs diff --git a/app/templates/components/ember-tabular-row-checkbox.hbs b/addon/templates/components/ember-tabular-row-checkbox.hbs similarity index 100% rename from app/templates/components/ember-tabular-row-checkbox.hbs rename to addon/templates/components/ember-tabular-row-checkbox.hbs diff --git a/app/templates/components/ember-tabular-row.hbs b/addon/templates/components/ember-tabular-row.hbs similarity index 100% rename from app/templates/components/ember-tabular-row.hbs rename to addon/templates/components/ember-tabular-row.hbs diff --git a/app/templates/components/ember-tabular.hbs b/addon/templates/components/ember-tabular.hbs similarity index 100% rename from app/templates/components/ember-tabular.hbs rename to addon/templates/components/ember-tabular.hbs From abf95803064e5edb37a5984dc7c91ef07818a22b Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Thu, 12 Oct 2017 23:48:08 -0400 Subject: [PATCH 062/105] Reintegrate trRow partial into main ember-tabular, unable to use template partials within the context of /addon directory --- addon/components/ember-tabular-footer.js | 2 -- addon/components/ember-tabular.js | 9 --------- .../templates/components/ember-tabular-row.hbs | 17 ----------------- addon/templates/components/ember-tabular.hbs | 18 +++++++++++++++++- package.json | 2 +- 5 files changed, 18 insertions(+), 30 deletions(-) delete mode 100644 addon/templates/components/ember-tabular-row.hbs diff --git a/addon/components/ember-tabular-footer.js b/addon/components/ember-tabular-footer.js index 6a844fe..363cbd8 100644 --- a/addon/components/ember-tabular-footer.js +++ b/addon/components/ember-tabular-footer.js @@ -1,12 +1,10 @@ import Ember from 'ember'; -import layout from 'ember-tabular/templates/components/ember-tabular-footer'; /** * * @class EmberTabularFooter */ export default Ember.Component.extend({ - layout, /** * @property tagName * @type String diff --git a/addon/components/ember-tabular.js b/addon/components/ember-tabular.js index 97ad376..2bc3752 100644 --- a/addon/components/ember-tabular.js +++ b/addon/components/ember-tabular.js @@ -291,15 +291,6 @@ export default Ember.Component.extend(EmberTabularHelpers, { return registryDiff; }), - /** - * Template for table's row - * - * @type {string} - * @default 'components/models-table/row' - * @name ModelsTable#rowTemplate - */ - trRow: 'components/ember-tabular-row', - /** * Whether to display the panel to select different table columns. * diff --git a/addon/templates/components/ember-tabular-row.hbs b/addon/templates/components/ember-tabular-row.hbs deleted file mode 100644 index d461354..0000000 --- a/addon/templates/components/ember-tabular-row.hbs +++ /dev/null @@ -1,17 +0,0 @@ - - {{!-- required outside of columns loop to trigger the render of the custom yielded columns --}} - {{yield (hash - column=(component "ember-tabular-column" registry=registry addToRegistry=(action "addToRegistry")) - )}} - {{#each columns as |column|}} - {{#if column.isActive}} - {{#if (compare-with columns "property" column.property "isCustomTemplate")}} - {{yield (hash - column=(component "ember-tabular-column" column=column record=row property=property collection=record) - )}} - {{else}} - {{ember-tabular-column column=column record=row property=column.property collection=record}} - {{/if}} - {{/if}} - {{/each}} - diff --git a/addon/templates/components/ember-tabular.hbs b/addon/templates/components/ember-tabular.hbs index 256f606..6074aeb 100644 --- a/addon/templates/components/ember-tabular.hbs +++ b/addon/templates/components/ember-tabular.hbs @@ -70,7 +70,23 @@ {{#if record}} {{#each record as |row|}} - {{partial trRow}} + + {{!-- required outside of columns loop to trigger the render of the custom yielded columns --}} + {{yield (hash + column=(component "ember-tabular-column" registry=registry addToRegistry=(action "addToRegistry")) + )}} + {{#each columns as |column|}} + {{#if column.isActive}} + {{#if (compare-with columns "property" column.property "isCustomTemplate")}} + {{yield (hash + column=(component "ember-tabular-column" column=column record=row property=property collection=record) + )}} + {{else}} + {{ember-tabular-column column=column record=row property=column.property collection=record}} + {{/if}} + {{/if}} + {{/each}} + {{/each}} {{ember-tabular-footer registryComplete=(action "registryComplete")}} {{else}} diff --git a/package.json b/package.json index 90c1e8e..f78e94d 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,6 @@ "ember-cli": "2.15.1", "ember-cli-app-version": "3.0.0", "ember-cli-dependency-checker": "1.3.0", - "ember-cli-htmlbars": "1.1.1", "ember-cli-htmlbars-inline-precompile": "0.4.3", "ember-cli-inject-live-reload": "1.7.0", "ember-cli-mirage": "0.3.2", @@ -54,6 +53,7 @@ ], "dependencies": { "ember-cli-babel": "6.8.2", + "ember-cli-htmlbars": "1.1.1", "pagination-pager": "2.4.1", "ember-truth-helpers": "1.2.0", "ember-power-select": "1.9.4", From 160cf1af6ba460b71525742e807a9cb694a09ee9 Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Thu, 12 Oct 2017 23:51:24 -0400 Subject: [PATCH 063/105] Resolve remaining ember test issues, ensure all services/components are set within the unit test --- tests/unit/ember-tabular-test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/unit/ember-tabular-test.js b/tests/unit/ember-tabular-test.js index d909eaf..6c8c67c 100644 --- a/tests/unit/ember-tabular-test.js +++ b/tests/unit/ember-tabular-test.js @@ -63,7 +63,7 @@ let columns = [ moduleForComponent('ember-tabular', 'Unit | Component | ember table jsonapi', { unit: true, - needs: ['helper:dot-to-dash-filter', 'component:ember-tabular-filter', 'component:ember-tabular-footer', 'helper:and', 'component:pagination-pager', 'template:components/ember-tabular-row', 'component:ember-tabular-column-select', 'helper:compare-with', 'component:ember-tabular-column'], + needs: ['helper:dot-to-dash-filter', 'component:ember-tabular-filter', 'component:ember-tabular-footer', 'helper:and', 'component:pagination-pager', 'component:ember-tabular-column-select', 'component:sortable-objects', 'service:dragCoordinator', 'component:draggable-object', 'helper:compare-with', 'component:ember-tabular-column'], beforeEach: function() { component = this.subject({ record: model, From cf1b39d3652f091667eb65c9f4096aa9af7ae116 Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Fri, 13 Oct 2017 00:46:22 -0400 Subject: [PATCH 064/105] Attempt to run ember-tabular after ember-power-select, test if race/timing --- blueprints/ember-tabular/index.js | 4 ++-- package.json | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/blueprints/ember-tabular/index.js b/blueprints/ember-tabular/index.js index 9aceb0e..e1e6ebd 100644 --- a/blueprints/ember-tabular/index.js +++ b/blueprints/ember-tabular/index.js @@ -1,4 +1,6 @@ module.exports = { + normalizeEntityName() {}, + afterInstall() { return this.addBowerPackagesToProject([ { @@ -7,6 +9,4 @@ module.exports = { }, ]); }, - - normalizeEntityName() {}, }; diff --git a/package.json b/package.json index f78e94d..e80b07a 100644 --- a/package.json +++ b/package.json @@ -62,6 +62,7 @@ "broccoli-funnel": "1.2.0" }, "ember-addon": { - "configPath": "tests/dummy/config" + "configPath": "tests/dummy/config", + "after": "ember-power-select" } } From d6c24fe37bd244e0b0ee151fabe6fccd4f422784 Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Fri, 13 Oct 2017 00:55:57 -0400 Subject: [PATCH 065/105] Reset to not specify when the addon is ran --- package.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/package.json b/package.json index e80b07a..f78e94d 100644 --- a/package.json +++ b/package.json @@ -62,7 +62,6 @@ "broccoli-funnel": "1.2.0" }, "ember-addon": { - "configPath": "tests/dummy/config", - "after": "ember-power-select" + "configPath": "tests/dummy/config" } } From e2ad70d6c62ce66cf8e4bf98bd2938dc3607f34e Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Sat, 14 Oct 2017 01:13:29 -0400 Subject: [PATCH 066/105] Move inline-precompile into dependencies --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f78e94d..613cc88 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,6 @@ "ember-cli": "2.15.1", "ember-cli-app-version": "3.0.0", "ember-cli-dependency-checker": "1.3.0", - "ember-cli-htmlbars-inline-precompile": "0.4.3", "ember-cli-inject-live-reload": "1.7.0", "ember-cli-mirage": "0.3.2", "ember-cli-moment-shim": "3.1.0", @@ -54,6 +53,7 @@ "dependencies": { "ember-cli-babel": "6.8.2", "ember-cli-htmlbars": "1.1.1", + "ember-cli-htmlbars-inline-precompile": "0.4.3", "pagination-pager": "2.4.1", "ember-truth-helpers": "1.2.0", "ember-power-select": "1.9.4", From 4d5a72672f873b2698053a6d9a4e94ab0299fad3 Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Mon, 16 Oct 2017 00:34:38 -0400 Subject: [PATCH 067/105] WIP, as a test, attempt to get a passing build using an older syntax with component helper --- tests/dummy/app/templates/example4.hbs | 4 +- tests/dummy/app/templates/index.hbs | 88 +++++++++++++------------- 2 files changed, 46 insertions(+), 46 deletions(-) diff --git a/tests/dummy/app/templates/example4.hbs b/tests/dummy/app/templates/example4.hbs index daa6da3..8638818 100644 --- a/tests/dummy/app/templates/example4.hbs +++ b/tests/dummy/app/templates/example4.hbs @@ -1,13 +1,13 @@
    Example #4

    Table - Basic - Route Binds Model to Table

    {{#ember-tabular class="table-basic-route-model" columns=columns makeRequest=false record=model page=page pageLimit=pageLimit isLoading=isLoading sort=sort as |et|}} - {{#et.column property="updatedAt" as |record column|}} + {{#component et.column property="updatedAt" as |record column|}} {{#if record.updatedAt}} {{moment-format record.updatedAt 'MM/DD/YYYY'}} {{else}} {{moment-format record.createdAt 'MM/DD/YYYY'}} {{/if}} - {{/et.column}} + {{/component}} {{/ember-tabular}} {{#link-to 'index' class="link-index"}} diff --git a/tests/dummy/app/templates/index.hbs b/tests/dummy/app/templates/index.hbs index 1001cba..32250de 100644 --- a/tests/dummy/app/templates/index.hbs +++ b/tests/dummy/app/templates/index.hbs @@ -5,27 +5,27 @@
    Example #2

    Table - Column Select

    {{#ember-tabular class="table-column-select" modelName="user" sort=sort1 columnOrder=orderConfig as |et|}} - {{#et.column property="emailAddress" isCustom=true as |record column|}} + {{#component et.column property="emailAddress" isCustom=true as |record column|}} {{get record column.property}} - {{/et.column}} + {{/component}} - {{#et.column property="isAdmin" list=adminContent isCustom=true as |record|}} + {{#component et.column property="isAdmin" list=adminContent isCustom=true as |record|}} {{#if record.isAdmin}} Yes {{else}} No {{/if}} - {{/et.column}} - {{et.column property="password" isActive=false isCustom=false filter=false sort=false}} - {{et.column property="createdAt" isActive=false isCustom=false filter=false sort=false}} - {{#et.column property="updatedAt" label="Last Updated" isCustom=true type="date" as |record column|}} + {{/component}} + {{component et.column property="password" isActive=false isCustom=false filter=false sort=false}} + {{component et.column property="createdAt" isActive=false isCustom=false filter=false sort=false}} + {{#component et.column property="updatedAt" label="Last Updated" isCustom=true type="date" as |record column|}} {{#if record.updatedAt}} {{moment-format record.updatedAt 'MM/DD/YYYY'}} {{else}} {{moment-format record.createdAt 'MM/DD/YYYY'}} {{/if}} - {{/et.column}} - {{#et.column + {{/component}} + {{#component et.column property="actions" isCustom=true filter=false @@ -34,80 +34,80 @@ {{#link-to "index" class="btn btn-default btn-xs" role="button"}} Edit {{/link-to}} - {{/et.column}} + {{/component}} {{/ember-tabular}}
    Example #3

    Table - Override Columns/Templates

    {{#ember-tabular class="table-override-columns-template" columns=columns modelName="user" record=users as |et|}} - {{#et.column property="username" as |record column|}} + {{#component et.column property="username" as |record column|}} {{record.username}} - {{/et.column}} - {{#et.column property="emailAddress" as |record column|}} + {{/component}} + {{#component et.column property="emailAddress" as |record column|}} {{record.emailAddress}} - {{/et.column}} - {{#et.column property="firstName" as |record column|}} + {{/component}} + {{#component et.column property="firstName" as |record column|}} {{record.firstName}} - {{/et.column}} - {{#et.column property="lastName" as |record column|}} + {{/component}} + {{#component et.column property="lastName" as |record column|}} {{record.lastName}} - {{/et.column}} - {{#et.column property="isAdmin" as |record column|}} + {{/component}} + {{#component et.column property="isAdmin" as |record column|}} {{#if record.isAdmin}} Yes {{else}} No {{/if}} - {{/et.column}} - {{#et.column property="updatedAt" as |record column|}} + {{/component}} + {{#component et.column property="updatedAt" as |record column|}} {{#if record.updatedAt}} {{moment-format record.updatedAt 'MM/DD/YYYY'}} {{else}} {{moment-format record.createdAt 'MM/DD/YYYY'}} {{/if}} - {{/et.column}} - {{#et.column property="actions" as |record column|}} + {{/component}} + {{#component et.column property="actions" as |record column|}} {{#link-to "index" class="btn btn-default btn-xs" role="button"}} Edit {{/link-to}} - {{/et.column}} + {{/component}} {{/ember-tabular}}
    Example #3

    Table - Persist Filtering

    {{#ember-tabular class="table-persist" columns=columns modelName="user" record=users4 filter=filter3 persistFiltering=true sort=sort4 as |et|}} - {{#et.column property="username" as |record column|}} + {{#component et.column property="username" as |record column|}} {{record.username}} - {{/et.column}} - {{#et.column property="emailAddress" as |record column|}} + {{/component}} + {{#component et.column property="emailAddress" as |record column|}} {{record.emailAddress}} - {{/et.column}} - {{#et.column property="firstName" as |record column|}} + {{/component}} + {{#component et.column property="firstName" as |record column|}} {{record.firstName}} - {{/et.column}} - {{#et.column property="lastName" as |record column|}} + {{/component}} + {{#component et.column property="lastName" as |record column|}} {{record.lastName}} - {{/et.column}} - {{#et.column property="isAdmin" as |record column|}} + {{/component}} + {{#component et.column property="isAdmin" as |record column|}} {{#if record.isAdmin}} Yes {{else}} No {{/if}} - {{/et.column}} - {{#et.column property="updatedAt" as |record column|}} + {{/component}} + {{#component et.column property="updatedAt" as |record column|}} {{#if record.updatedAt}} {{moment-format record.updatedAt 'MM/DD/YYYY'}} {{else}} {{moment-format record.createdAt 'MM/DD/YYYY'}} {{/if}} - {{/et.column}} - {{#et.column property="actions" as |record column|}} + {{/component}} + {{#component et.column property="actions" as |record column|}} {{#link-to "index" class="btn btn-default btn-xs" role="button"}} Edit {{/link-to}} - {{/et.column}} + {{/component}} {{/ember-tabular}}
    Example #4
    @@ -116,11 +116,11 @@ {{#if et.isHeader}} {{ember-tabular-global-filter filter=filter filterProperty="username" filterPlaceholder="Search by Username"}} {{/if}} - {{et.column property="username" isCustom=false filter=false sort=false}} - {{et.column property="emailAddress" isCustom=false filter=false sort=false}} - {{et.column property="password" isActive=false isCustom=false filter=false sort=false}} - {{et.column property="createdAt" isActive=false isCustom=false filter=false sort=false}} - {{et.column property="updatedAt" isActive=false isCustom=false filter=false sort=false}} + {{component et.column property="username" isCustom=false filter=false sort=false}} + {{component et.column property="emailAddress" isCustom=false filter=false sort=false}} + {{component et.column property="password" isActive=false isCustom=false filter=false sort=false}} + {{component et.column property="createdAt" isActive=false isCustom=false filter=false sort=false}} + {{component et.column property="updatedAt" isActive=false isCustom=false filter=false sort=false}} {{/ember-tabular}}
    Example #5
    @@ -154,7 +154,7 @@
    Example #6

    Table - Select Row

    {{#ember-tabular class="table-select-row" modelName="user" sort="username" isColumnSelect=false as |et|}} - {{et.column property="checked" selectable=true isCustom=false filter=false sort=false}} + {{component et.column property="checked" selectable=true isCustom=false filter=false sort=false}} {{/ember-tabular}}
    Example #7
    From d33661c2920c87097d67f51596110627f05f7f31 Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Tue, 17 Oct 2017 14:49:03 -0400 Subject: [PATCH 068/105] Refactor to make the registry of columns more efficient, do not re-use the ember-tabular-columns, create a separate component to handle this Reference issue #88 --- .../ember-tabular-column-register.js | 57 +++++++++++++++++++ addon/components/ember-tabular-column.js | 42 +------------- .../ember-tabular-column-register.hbs | 0 addon/templates/components/ember-tabular.hbs | 8 +-- .../ember-tabular-column-register.js | 3 + 5 files changed, 66 insertions(+), 44 deletions(-) create mode 100644 addon/components/ember-tabular-column-register.js create mode 100644 addon/templates/components/ember-tabular-column-register.hbs create mode 100644 app/components/ember-tabular-column-register.js diff --git a/addon/components/ember-tabular-column-register.js b/addon/components/ember-tabular-column-register.js new file mode 100644 index 0000000..2be8866 --- /dev/null +++ b/addon/components/ember-tabular-column-register.js @@ -0,0 +1,57 @@ +import Ember from 'ember'; +import layout from 'ember-tabular/templates/components/ember-tabular-column-register'; +import EmberTabularHelpers from 'ember-tabular/mixins/components/ember-tabular-helpers'; + +/** +* Generates a column object used within ember tabular table headings. +* Registers the user defined column with a global registry where tabular will auto-register the remaining attributes on the defined model. +* +* @class EmberTabularColumnRegister +*/ +export default Ember.Component.extend(EmberTabularHelpers, { + layout, + /** + * @property tagName + * @type String + * @default '' + */ + tagName: '', + action: null, + registry: null, + init() { + this._super(...arguments); + const registry = this.get('registry'); + const property = this.get('property'); + const selectable = this.get('selectable'); + const label = this.get('label') || this._formatColumnLabel(property); + const isActive = this._checkIfUndefined(this.get('isActive'), true); + const isCustom = this.get('isCustom') || false; + const filter = this._checkIfUndefined(this.get('filter'), true); + const list = this.get('list') || null; + const sort = this._checkIfUndefined(this.get('sort'), true); + const type = this.get('type') || 'text'; + let column = { + property: property, + selectable: selectable, + label: label, + isActive: isActive, + isCustomTemplate: isCustom, + filter: filter, + list: list, + sort: sort, + type: type, + }; + if (typeof this.get('isCustom') !== 'undefined' && registry) { + let item = registry.find((el) => { + return el.property === property; + }); + if (!item) { + // pass action up to ember-tabular to add column to registry + this.get('addToRegistry')(column); + } + } + }, + _checkIfUndefined(property, defaultValue) { + return typeof property !== 'undefined' ? property : defaultValue; + }, +}); diff --git a/addon/components/ember-tabular-column.js b/addon/components/ember-tabular-column.js index 718ffd7..80aafeb 100644 --- a/addon/components/ember-tabular-column.js +++ b/addon/components/ember-tabular-column.js @@ -1,9 +1,8 @@ import Ember from 'ember'; import layout from 'ember-tabular/templates/components/ember-tabular-column'; -import EmberTabularHelpers from 'ember-tabular/mixins/components/ember-tabular-helpers'; /** -* Generates a column object used within ember tabular table headings +* Generates a column object. * Sets sensible defaults which can be overwritten when setting up the template * for ember tabular * @@ -28,7 +27,7 @@ import EmberTabularHelpers from 'ember-tabular/mixins/components/ember-tabular-h * * @class EmberTabularColumn */ -export default Ember.Component.extend(EmberTabularHelpers, { +export default Ember.Component.extend({ layout, /** * @property tagName @@ -37,7 +36,6 @@ export default Ember.Component.extend(EmberTabularHelpers, { */ tagName: '', action: null, - registry: null, hasProperty: Ember.computed('property', 'column', function () { const property = this.get('property'); const column = this.get('column'); @@ -46,40 +44,4 @@ export default Ember.Component.extend(EmberTabularHelpers, { } return false; }), - init() { - this._super(...arguments); - const registry = this.get('registry'); - const property = this.get('property'); - const selectable = this.get('selectable'); - const label = this.get('label') || this._formatColumnLabel(property); - const isActive = this._checkIfUndefined(this.get('isActive'), true); - const isCustom = this.get('isCustom') || false; - const filter = this._checkIfUndefined(this.get('filter'), true); - const list = this.get('list') || null; - const sort = this._checkIfUndefined(this.get('sort'), true); - const type = this.get('type') || 'text'; - let column = { - property: property, - selectable: selectable, - label: label, - isActive: isActive, - isCustomTemplate: isCustom, - filter: filter, - list: list, - sort: sort, - type: type, - }; - if (typeof this.get('isCustom') !== 'undefined' && registry) { - let item = registry.find((el) => { - return el.property === property; - }); - if (!item) { - // pass action up to ember-tabular to add column to registry - this.get('addToRegistry')(column); - } - } - }, - _checkIfUndefined(property, defaultValue) { - return typeof property !== 'undefined' ? property : defaultValue; - }, }); diff --git a/addon/templates/components/ember-tabular-column-register.hbs b/addon/templates/components/ember-tabular-column-register.hbs new file mode 100644 index 0000000..e69de29 diff --git a/addon/templates/components/ember-tabular.hbs b/addon/templates/components/ember-tabular.hbs index 6074aeb..f0c3259 100644 --- a/addon/templates/components/ember-tabular.hbs +++ b/addon/templates/components/ember-tabular.hbs @@ -70,11 +70,11 @@
    {{#if record}} {{#each record as |row|}} + {{!-- required outside of columns loop to trigger the render of the custom yielded columns --}} + {{yield (hash + column=(component "ember-tabular-column-register" registry=registry addToRegistry=(action "addToRegistry")) + )}} - {{!-- required outside of columns loop to trigger the render of the custom yielded columns --}} - {{yield (hash - column=(component "ember-tabular-column" registry=registry addToRegistry=(action "addToRegistry")) - )}} {{#each columns as |column|}} {{#if column.isActive}} {{#if (compare-with columns "property" column.property "isCustomTemplate")}} diff --git a/app/components/ember-tabular-column-register.js b/app/components/ember-tabular-column-register.js new file mode 100644 index 0000000..efe63f3 --- /dev/null +++ b/app/components/ember-tabular-column-register.js @@ -0,0 +1,3 @@ +import EmberTabularColumnRegister from 'ember-tabular/components/ember-tabular-column-register'; + +export default EmberTabularColumnRegister; From ecdc2c3eddbfca7de295da795ceac2c4294d2a12 Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Tue, 17 Oct 2017 14:51:56 -0400 Subject: [PATCH 069/105] Upgrade to ember-cli 2.15.1 --- circle.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/circle.yml b/circle.yml index 73d0b41..f5a3121 100644 --- a/circle.yml +++ b/circle.yml @@ -6,7 +6,7 @@ machine: dependencies: pre: - npm install -g npm@5.0.2 - - npm install -g ember-cli@2.13.2 + - npm install -g ember-cli@2.15.1 - npm install -g phantomjs@2.1.1 - npm install - bower install From 662ffdf072d104c900f71e3a101e402ad56b9503 Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Tue, 17 Oct 2017 15:42:08 -0400 Subject: [PATCH 070/105] Upgrade to ember-cli 2.15.1, use Chrome as the preferred test --- .travis.yml | 21 +++++++++++++-------- circle.yml | 1 - ember-cli-build.js | 13 +++++++------ package.json | 14 +++++++------- testem.js | 23 +++++++++++++++-------- tests/dummy/app/app.js | 6 +----- tests/dummy/app/index.html | 4 ++-- tests/dummy/config/targets.js | 1 - tests/helpers/module-for-acceptance.js | 4 ++-- 9 files changed, 47 insertions(+), 40 deletions(-) diff --git a/.travis.yml b/.travis.yml index 72f90c9..6678f3c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,18 +1,26 @@ --- language: node_js node_js: - - "6" + # we recommend testing addons with the same minimum supported node version as Ember CLI + # so that your addon works for all apps + - "4" sudo: false +dist: trusty + +addons: + chrome: stable cache: directories: - $HOME/.npm env: - # we recommend testing LTS's and latest stable release (bonus points to beta/canary) + # we recommend new addons test the current and previous LTS + # as well as latest stable release (bonus points to beta/canary) - EMBER_TRY_SCENARIO=ember-lts-2.4 - EMBER_TRY_SCENARIO=ember-lts-2.8 + - EMBER_TRY_SCENARIO=ember-lts-2.12 - EMBER_TRY_SCENARIO=ember-release - EMBER_TRY_SCENARIO=ember-beta - EMBER_TRY_SCENARIO=ember-canary @@ -25,13 +33,10 @@ matrix: before_install: - npm config set spin false - - npm install -g phantomjs-prebuilt - - phantomjs --version - -install: - - npm install + - npm install -g npm@4 + - npm --version script: # Usually, it's ok to finish the test scenario without reverting # to the addon's original dependency state, skipping "cleanup". - - node_modules/.bin/ember try:one $EMBER_TRY_SCENARIO test --skip-cleanup + - node_modules/.bin/ember try:one $EMBER_TRY_SCENARIO --skip-cleanup diff --git a/circle.yml b/circle.yml index f5a3121..547b325 100644 --- a/circle.yml +++ b/circle.yml @@ -7,7 +7,6 @@ dependencies: pre: - npm install -g npm@5.0.2 - npm install -g ember-cli@2.15.1 - - npm install -g phantomjs@2.1.1 - npm install - bower install override: diff --git a/ember-cli-build.js b/ember-cli-build.js index 2b869f9..f14ffc0 100644 --- a/ember-cli-build.js +++ b/ember-cli-build.js @@ -1,12 +1,13 @@ /* eslint-env node */ -var EmberAddon = require('ember-cli/lib/broccoli/ember-addon'); -var Funnel = require('broccoli-funnel'); -var mergeTrees = require('broccoli-merge-trees'); +'use strict'; +const EmberAddon = require('ember-cli/lib/broccoli/ember-addon'); +let Funnel = require('broccoli-funnel'); +let mergeTrees = require('broccoli-merge-trees'); module.exports = function(defaults) { - var environment = process.env.EMBER_ENV; + let environment = process.env.EMBER_ENV; - var app = new EmberAddon(defaults, { + let app = new EmberAddon(defaults, { 'ember-cli-babel': { includePolyfill: environment === 'test', }, @@ -25,7 +26,7 @@ module.exports = function(defaults) { behave. You most likely want to be modifying `./index.js` or app's build file */ // Copy non-compiled bootstrap dependency - var vendor = new Funnel('bower_components/bootstrap/dist/css/', { + let vendor = new Funnel('bower_components/bootstrap/dist/css/', { srcDir: '/', include: ['bootstrap.css.map'], destDir: '/assets' diff --git a/package.json b/package.json index 613cc88..1b69047 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ }, "repository": "", "engines": { - "node": ">= 4" + "node": "^4.5 || 6.* || >= 7.*" }, "author": "", "license": "Apache-2.0", @@ -24,15 +24,15 @@ "ember-ajax": "2.5.2", "ember-cli": "2.15.1", "ember-cli-app-version": "3.0.0", - "ember-cli-dependency-checker": "1.3.0", + "ember-cli-dependency-checker": "2.0.0", "ember-cli-inject-live-reload": "1.7.0", "ember-cli-mirage": "0.3.2", "ember-cli-moment-shim": "3.1.0", "ember-cli-qunit": "4.0.0", - "ember-cli-shims": "1.0.2", + "ember-cli-shims": "1.1.0", "ember-cli-sri": "2.1.1", "ember-cli-uglify": "1.2.0", - "ember-data": "2.13.1", + "ember-data": "2.15.3", "ember-drag-drop": "0.4.5", "ember-drag-drop-polyfill": "0.0.2", "ember-export-application-global": "2.0.0", @@ -40,7 +40,7 @@ "ember-moment": "7.3.0", "ember-power-select": "1.9.4", "ember-resolver": "4.5.0", - "ember-source": "2.13.4", + "ember-source": "2.15.0", "loader.js": "4.6.0" }, "keywords": [ @@ -52,8 +52,8 @@ ], "dependencies": { "ember-cli-babel": "6.8.2", - "ember-cli-htmlbars": "1.1.1", - "ember-cli-htmlbars-inline-precompile": "0.4.3", + "ember-cli-htmlbars": "2.0.1", + "ember-cli-htmlbars-inline-precompile": "1.0.0", "pagination-pager": "2.4.1", "ember-truth-helpers": "1.2.0", "ember-power-select": "1.9.4", diff --git a/testem.js b/testem.js index b234048..a40a530 100644 --- a/testem.js +++ b/testem.js @@ -1,12 +1,19 @@ /* eslint-env node */ module.exports = { - "test_page": "tests/index.html?hidepassed", - "disable_watching": true, - "launch_in_ci": [ - "PhantomJS" + test_page: 'tests/index.html?hidepassed', + disable_watching: true, + launch_in_ci: [ + 'Chrome' ], - "launch_in_dev": [ - "PhantomJS", - "Chrome" - ] + launch_in_dev: [ + 'Chrome' + ], + browser_args: { + Chrome: [ + '--disable-gpu', + '--headless', + '--remote-debugging-port=9222', + '--window-size=1440,900' + ] + } }; diff --git a/tests/dummy/app/app.js b/tests/dummy/app/app.js index 831ad61..c15f935 100644 --- a/tests/dummy/app/app.js +++ b/tests/dummy/app/app.js @@ -3,11 +3,7 @@ import Resolver from './resolver'; import loadInitializers from 'ember-load-initializers'; import config from './config/environment'; -let App; - -Ember.MODEL_FACTORY_INJECTIONS = true; - -App = Ember.Application.extend({ +const App = Ember.Application.extend({ modulePrefix: config.modulePrefix, podModulePrefix: config.podModulePrefix, Resolver diff --git a/tests/dummy/app/index.html b/tests/dummy/app/index.html index 5120bd7..61400b2 100644 --- a/tests/dummy/app/index.html +++ b/tests/dummy/app/index.html @@ -9,8 +9,8 @@ {{content-for "head"}} - - + + {{content-for "head-footer"}} diff --git a/tests/dummy/config/targets.js b/tests/dummy/config/targets.js index 2bebfac..df7664c 100644 --- a/tests/dummy/config/targets.js +++ b/tests/dummy/config/targets.js @@ -1,5 +1,4 @@ /* eslint-env node */ - module.exports = { browsers: [ 'ie 9', diff --git a/tests/helpers/module-for-acceptance.js b/tests/helpers/module-for-acceptance.js index 76996fd..5a1a583 100644 --- a/tests/helpers/module-for-acceptance.js +++ b/tests/helpers/module-for-acceptance.js @@ -3,7 +3,7 @@ import Ember from 'ember'; import startApp from '../helpers/start-app'; import destroyApp from '../helpers/destroy-app'; -const { RSVP: { Promise } } = Ember; +const { RSVP: { resolve } } = Ember; export default function(name, options = {}) { module(name, { @@ -17,7 +17,7 @@ export default function(name, options = {}) { afterEach() { let afterEach = options.afterEach && options.afterEach.apply(this, arguments); - return Promise.resolve(afterEach).then(() => destroyApp(this.application)); + return resolve(afterEach).then(() => destroyApp(this.application)); } }); } From 9a57822420308bbcbb17d15c1da6e85706ffe913 Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Sat, 21 Oct 2017 13:14:11 -0400 Subject: [PATCH 071/105] Add ember-font-awesome --- bower.json | 2 -- index.js | 19 ------------------- package.json | 1 + 3 files changed, 1 insertion(+), 21 deletions(-) diff --git a/bower.json b/bower.json index f2aac7d..dd111fc 100644 --- a/bower.json +++ b/bower.json @@ -1,9 +1,7 @@ { "name": "ember-tabular", "dependencies": { - "Faker": "~3.0.0", "bootstrap": "3.3.5", - "font-awesome": "4.6.2", "drag-drop-polyfill": "2.0.0-beta.3" } } diff --git a/index.js b/index.js index 7ae4f81..cb6974a 100644 --- a/index.js +++ b/index.js @@ -9,24 +9,5 @@ module.exports = { this._super.included.apply(this, arguments); app.import('vendor/app.css'); - app.import(app.bowerDirectory + '/font-awesome/css/font-awesome.css'); }, - postprocessTree: function( type, tree ) { - // extract font-awesome fonts and place into /fonts directory - var fonts = new Funnel( 'bower_components/font-awesome', { - srcDir: 'fonts', - destDir: '/fonts', - include: [ 'fontawesome-webfont.*' ] - }); - - return mergeTrees( - [ - tree, - fonts - ], - { - overwrite: true - } - ); - } }; diff --git a/package.json b/package.json index 1b69047..99bea0a 100644 --- a/package.json +++ b/package.json @@ -56,6 +56,7 @@ "ember-cli-htmlbars-inline-precompile": "1.0.0", "pagination-pager": "2.4.1", "ember-truth-helpers": "1.2.0", + "ember-font-awesome": "^4.0.0-alpha.13", "ember-power-select": "1.9.4", "ember-drag-drop": "0.4.5", "broccoli-merge-trees": "2.0.0", From 353d02dffc8491439ca50c2adac2095fba1b7328 Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Sat, 21 Oct 2017 13:23:00 -0400 Subject: [PATCH 072/105] Do not duplicate dependencies --- blueprints/ember-tabular/index.js | 9 --------- package.json | 4 ---- 2 files changed, 13 deletions(-) diff --git a/blueprints/ember-tabular/index.js b/blueprints/ember-tabular/index.js index e1e6ebd..b3479d9 100644 --- a/blueprints/ember-tabular/index.js +++ b/blueprints/ember-tabular/index.js @@ -1,12 +1,3 @@ module.exports = { normalizeEntityName() {}, - - afterInstall() { - return this.addBowerPackagesToProject([ - { - name: 'font-awesome', - target: '4.6.2', - }, - ]); - }, }; diff --git a/package.json b/package.json index 99bea0a..f32bd93 100644 --- a/package.json +++ b/package.json @@ -19,8 +19,6 @@ "license": "Apache-2.0", "devDependencies": { "broccoli-asset-rev": "2.5.0", - "broccoli-funnel": "1.2.0", - "broccoli-merge-trees": "2.0.0", "ember-ajax": "2.5.2", "ember-cli": "2.15.1", "ember-cli-app-version": "3.0.0", @@ -33,12 +31,10 @@ "ember-cli-sri": "2.1.1", "ember-cli-uglify": "1.2.0", "ember-data": "2.15.3", - "ember-drag-drop": "0.4.5", "ember-drag-drop-polyfill": "0.0.2", "ember-export-application-global": "2.0.0", "ember-load-initializers": "1.0.0", "ember-moment": "7.3.0", - "ember-power-select": "1.9.4", "ember-resolver": "4.5.0", "ember-source": "2.15.0", "loader.js": "4.6.0" From c10cea19defae5a27bd810b0a13bb886851452d3 Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Mon, 23 Oct 2017 13:24:43 -0400 Subject: [PATCH 073/105] Resolve issue between ember-cli2.15 and circle, also improve coverage for older version of ember (2.4) --- addon/components/ember-tabular-row-checkbox.js | 10 ++++++++-- circle.yml | 9 +++++++-- config/ember-try.js | 12 ++++++++++++ tests/acceptance/relationships-test.js | 8 ++++---- 4 files changed, 31 insertions(+), 8 deletions(-) diff --git a/addon/components/ember-tabular-row-checkbox.js b/addon/components/ember-tabular-row-checkbox.js index e0cc530..127915e 100644 --- a/addon/components/ember-tabular-row-checkbox.js +++ b/addon/components/ember-tabular-row-checkbox.js @@ -28,10 +28,16 @@ export default Ember.Component.extend({ let previousIndex = this.get('previousIndex'); if (e.shiftKey) { + // ensure we set checked first + model.toggleProperty('checked'); if (currentIndex < previousIndex) { - collection.slice(currentIndex, previousIndex + 1).setEach('checked', this.toggleProperty('model.checked')); + collection.slice(currentIndex, previousIndex + 1).forEach((item, index) => { + item.set('checked', model.get('checked')); + }); } else { - collection.slice(previousIndex, currentIndex + 1).setEach('checked', this.toggleProperty('model.checked')); + collection.slice(previousIndex, currentIndex + 1).forEach((item, index) => { + item.set('checked', model.get('checked')); + }); } } else { this.toggleProperty('model.checked'); diff --git a/circle.yml b/circle.yml index 547b325..641c7f6 100644 --- a/circle.yml +++ b/circle.yml @@ -1,14 +1,19 @@ # circle.yml machine: node: - version: 5.1.0 + version: 6.11.0 dependencies: pre: - - npm install -g npm@5.0.2 + - npm install -g npm@5.4.2 + - npm install -g bower - npm install -g ember-cli@2.15.1 - npm install - bower install override: - npm i - bower i + +test: + override: + - JOBS=2 npm test \ No newline at end of file diff --git a/config/ember-try.js b/config/ember-try.js index f4b3718..ce7e14f 100644 --- a/config/ember-try.js +++ b/config/ember-try.js @@ -12,6 +12,12 @@ module.exports = { } }, npm: { + dependencies: { + 'ember-font-awesome': null + }, + peerDependencies: { + 'ember-font-awesome': '^3.0.0' + }, devDependencies: { 'ember-source': null } @@ -28,6 +34,12 @@ module.exports = { } }, npm: { + dependencies: { + 'ember-font-awesome': null + }, + peerDependencies: { + 'ember-font-awesome': '^3.0.0' + }, devDependencies: { 'ember-source': null } diff --git a/tests/acceptance/relationships-test.js b/tests/acceptance/relationships-test.js index 50ab7a0..43df059 100644 --- a/tests/acceptance/relationships-test.js +++ b/tests/acceptance/relationships-test.js @@ -28,7 +28,7 @@ test('Check for expected url when filtering relationships', function(assert) { andThen(function() { click('.table-override-columns-template table .btn-toggle-filter:eq(0)'); - fillIn('.table-override-columns-template table thead tr:eq(1) th:eq(0) input', 'Testing Relationships'); + fillIn('.table-override-columns-template table thead tr:eq(1) th:eq(0) input', 'Testing'); find('.table-override-columns-template table thead tr:eq(1) th:eq(0) input').trigger('keyup'); }); @@ -37,7 +37,7 @@ test('Check for expected url when filtering relationships', function(assert) { assert.equal(request.status, 200); assert.equal(request.method, 'GET'); - assert.equal(request.url, '/users?filter%5Baccount.username%5D=Testing%20Relationships&page%5Blimit%5D=10&page%5Boffset%5D=0&sort=username', 'URL has relationship in dot notation'); + assert.equal(request.url, '/users?filter%5Baccount.username%5D=Testing&page%5Blimit%5D=10&page%5Boffset%5D=0&sort=username', 'URL has relationship in dot notation'); }); andThen(function() { @@ -47,7 +47,7 @@ test('Check for expected url when filtering relationships', function(assert) { andThen(function() { // make another request to the relationship - fillIn('.table-override-columns-template table thead tr:eq(1) th:eq(0) input', 'Testing Relationships 2'); + fillIn('.table-override-columns-template table thead tr:eq(1) th:eq(0) input', 'Testing2'); find('.table-override-columns-template table thead tr:eq(1) th:eq(0) input').trigger('keyup'); }); @@ -56,6 +56,6 @@ test('Check for expected url when filtering relationships', function(assert) { assert.equal(request.status, 200); assert.equal(request.method, 'GET'); - assert.equal(request.url, '/users?filter%5Baccount.username%5D=Testing%20Relationships%202&page%5Blimit%5D=10&page%5Boffset%5D=0&sort=username', 'URL has retained dot notation'); + assert.equal(request.url, '/users?filter%5Baccount.username%5D=Testing2&page%5Blimit%5D=10&page%5Boffset%5D=0&sort=username', 'URL has retained dot notation'); }); }); From 2043d950d82eb08a8ab2758cf2c8744f95b28abc Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Mon, 23 Oct 2017 22:53:32 -0400 Subject: [PATCH 074/105] Improve formatColumnLabel, to format dot notation --- addon/mixins/components/ember-tabular-helpers.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/addon/mixins/components/ember-tabular-helpers.js b/addon/mixins/components/ember-tabular-helpers.js index 88f9f67..1429905 100644 --- a/addon/mixins/components/ember-tabular-helpers.js +++ b/addon/mixins/components/ember-tabular-helpers.js @@ -2,7 +2,12 @@ import Ember from 'ember'; export default Ember.Mixin.create({ _formatColumnLabel(text) { - let result = text.replace(/([A-Z])/g, ' $1'); + let results = text.split('.'); + // ensure first character is capitalized + let result = results.map((str) => { + return str.charAt(0).toUpperCase() + str.slice(1); + }).join(' '); + result = result.replace(/([A-Z])/g, ' $1'); return result.charAt(0).toUpperCase() + result.slice(1); }, }); From d6551c14bee765f2382abc0e3b44c30422e1bf9a Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Mon, 23 Oct 2017 23:48:23 -0400 Subject: [PATCH 075/105] Refactor formatting label based on property --- addon/mixins/components/ember-tabular-helpers.js | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/addon/mixins/components/ember-tabular-helpers.js b/addon/mixins/components/ember-tabular-helpers.js index 1429905..5f6daaa 100644 --- a/addon/mixins/components/ember-tabular-helpers.js +++ b/addon/mixins/components/ember-tabular-helpers.js @@ -2,12 +2,14 @@ import Ember from 'ember'; export default Ember.Mixin.create({ _formatColumnLabel(text) { - let results = text.split('.'); + // split any camelCase => camel Case + let result = text.replace(/([A-Z])/g, ' $1'); + let results = result.split('.'); // ensure first character is capitalized - let result = results.map((str) => { + result = results.map((str) => { return str.charAt(0).toUpperCase() + str.slice(1); }).join(' '); - result = result.replace(/([A-Z])/g, ' $1'); - return result.charAt(0).toUpperCase() + result.slice(1); + // replace all double-whitespaces with single + return result.replace(/ +(?= )/g, ''); }, }); From 9fb534b574db46acd578ea8e64c914137e66dc48 Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Tue, 24 Oct 2017 00:12:23 -0400 Subject: [PATCH 076/105] Allow user to set a class on ember-tabular-column and pass it through to the TD --- addon/components/ember-tabular-column-register.js | 2 ++ addon/templates/components/ember-tabular-column.hbs | 6 +++--- addon/templates/components/ember-tabular.hbs | 4 ++-- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/addon/components/ember-tabular-column-register.js b/addon/components/ember-tabular-column-register.js index 2be8866..98b37b7 100644 --- a/addon/components/ember-tabular-column-register.js +++ b/addon/components/ember-tabular-column-register.js @@ -30,6 +30,7 @@ export default Ember.Component.extend(EmberTabularHelpers, { const list = this.get('list') || null; const sort = this._checkIfUndefined(this.get('sort'), true); const type = this.get('type') || 'text'; + const columnClass = this._checkIfUndefined(this.get('class'), null); let column = { property: property, selectable: selectable, @@ -40,6 +41,7 @@ export default Ember.Component.extend(EmberTabularHelpers, { list: list, sort: sort, type: type, + class: columnClass, }; if (typeof this.get('isCustom') !== 'undefined' && registry) { let item = registry.find((el) => { diff --git a/addon/templates/components/ember-tabular-column.hbs b/addon/templates/components/ember-tabular-column.hbs index 78331b0..ac59702 100644 --- a/addon/templates/components/ember-tabular-column.hbs +++ b/addon/templates/components/ember-tabular-column.hbs @@ -1,13 +1,13 @@ {{#if hasProperty}} {{#if hasBlock}} - + {{else if column.selectable}} - {{else}} - + {{/if}} {{/if}} diff --git a/addon/templates/components/ember-tabular.hbs b/addon/templates/components/ember-tabular.hbs index f0c3259..3a83fbf 100644 --- a/addon/templates/components/ember-tabular.hbs +++ b/addon/templates/components/ember-tabular.hbs @@ -79,10 +79,10 @@ {{#if column.isActive}} {{#if (compare-with columns "property" column.property "isCustomTemplate")}} {{yield (hash - column=(component "ember-tabular-column" column=column record=row property=property collection=record) + column=(component "ember-tabular-column" column=column record=row property=property collection=record class=column.class) )}} {{else}} - {{ember-tabular-column column=column record=row property=column.property collection=record}} + {{ember-tabular-column column=column record=row property=column.property collection=record class=column.class}} {{/if}} {{/if}} {{/each}} From a2d1629d0d6f7ac3aab4f26d28000a9ef9bc5c03 Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Tue, 24 Oct 2017 12:43:33 -0400 Subject: [PATCH 077/105] When setting the default valus of the registryDiff, reference the columnOrder to set isActive Reference issue #149 --- addon/components/ember-tabular.js | 11 ++++++++++- tests/acceptance/basic-test.js | 1 + tests/dummy/app/controllers/index.js | 7 +++++++ tests/dummy/app/templates/index.hbs | 5 +---- 4 files changed, 19 insertions(+), 5 deletions(-) diff --git a/addon/components/ember-tabular.js b/addon/components/ember-tabular.js index 2bc3752..5d49729 100644 --- a/addon/components/ember-tabular.js +++ b/addon/components/ember-tabular.js @@ -228,6 +228,7 @@ export default Ember.Component.extend(EmberTabularHelpers, { /** * If you want to set a specific order but you do not want to completely replace the `columns`, you can pass a simple array of properties to determine the order of the columns. + * Note: You must include all attributes you want displayed, if any attributes are omitted then their column will be set to isActive=false, hiding them from display. * ```js [ @@ -273,7 +274,7 @@ export default Ember.Component.extend(EmberTabularHelpers, { let attribute = { property: property, label: this._formatColumnLabel(property), - isActive: true, + isActive: this.checkConfigForColumn(property), isCustomTemplate: false, filter: true, sort: true, @@ -291,6 +292,14 @@ export default Ember.Component.extend(EmberTabularHelpers, { return registryDiff; }), + checkConfigForColumn(property) { + const columnOrder = this.get('columnOrder'); + if (columnOrder && columnOrder.indexOf(property) === -1) { + return false; + } + return true; + }, + /** * Whether to display the panel to select different table columns. * diff --git a/tests/acceptance/basic-test.js b/tests/acceptance/basic-test.js index a9f3ae8..e3ff046 100644 --- a/tests/acceptance/basic-test.js +++ b/tests/acceptance/basic-test.js @@ -514,6 +514,7 @@ test('Check for expected content after filtering (.table-basic-global-filter)', assert.equal(cells.eq(2).text().trim(), 'John', 'Check for first name'); assert.equal(cells.eq(3).text().trim(), 'McClane', 'Check for last name'); assert.equal(cells.eq(4).text().trim(), 'true', 'Check for is admin'); + assert.equal(cells.eq(5).length, 0, 'Check for no more columns'); assert.equal(find('.table-basic-global-filter table tbody tr').length, 1, 'Check for 1 item in table'); }); diff --git a/tests/dummy/app/controllers/index.js b/tests/dummy/app/controllers/index.js index dc286b9..6ce08cf 100644 --- a/tests/dummy/app/controllers/index.js +++ b/tests/dummy/app/controllers/index.js @@ -24,6 +24,13 @@ export default Ember.Controller.extend({ 'updatedAt', 'actions', ], + hideOmittedConfig: [ + 'username', + 'emailAddress', + 'firstName', + 'lastName', + 'isAdmin', + ], columnsConfig: [ { property: 'emailAddress', diff --git a/tests/dummy/app/templates/index.hbs b/tests/dummy/app/templates/index.hbs index 32250de..7269a96 100644 --- a/tests/dummy/app/templates/index.hbs +++ b/tests/dummy/app/templates/index.hbs @@ -112,15 +112,12 @@
    Example #4

    Table - Basic - Global Filter

    -{{#ember-tabular class="table-basic-global-filter" modelName="user" record=users2 filter=filter as |et|}} +{{#ember-tabular class="table-basic-global-filter" modelName="user" record=users2 filter=filter columnOrder=hideOmittedConfig as |et|}} {{#if et.isHeader}} {{ember-tabular-global-filter filter=filter filterProperty="username" filterPlaceholder="Search by Username"}} {{/if}} {{component et.column property="username" isCustom=false filter=false sort=false}} {{component et.column property="emailAddress" isCustom=false filter=false sort=false}} - {{component et.column property="password" isActive=false isCustom=false filter=false sort=false}} - {{component et.column property="createdAt" isActive=false isCustom=false filter=false sort=false}} - {{component et.column property="updatedAt" isActive=false isCustom=false filter=false sort=false}} {{/ember-tabular}}
    Example #5
    From ea981019edb7664e86ff83b98b7c2963fb949a4e Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Tue, 24 Oct 2017 15:39:14 -0400 Subject: [PATCH 078/105] Add wrapperHeader and wrapperFooter as additional yields --- addon/components/ember-tabular.js | 6 ++++++ addon/templates/components/ember-tabular.hbs | 6 ++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/addon/components/ember-tabular.js b/addon/components/ember-tabular.js index 5d49729..2bf4a76 100644 --- a/addon/components/ember-tabular.js +++ b/addon/components/ember-tabular.js @@ -100,12 +100,18 @@ export default Ember.Component.extend(EmberTabularHelpers, { header: { isHeader: true, }, + wrapperHeader: { + isWrapperHeader: true, + }, body: { isBody: true, }, footer: { isFooter: true, }, + wrapperFooter: { + isWrapperFooter: true, + }, /** * Model to be requested using `makeRequest: true`. diff --git a/addon/templates/components/ember-tabular.hbs b/addon/templates/components/ember-tabular.hbs index 3a83fbf..4097210 100644 --- a/addon/templates/components/ember-tabular.hbs +++ b/addon/templates/components/ember-tabular.hbs @@ -16,7 +16,8 @@ {{yield header}}
    -
    {{yield record column}}{{yield record column}} +
    {{ember-tabular-row-checkbox name="checked" model=record collection=collection}}
    {{get record column.property}}{{get record column.property}}
    + {{yield wrapperHeader}} +
    {{#if columns}} @@ -102,12 +103,13 @@ {{/if}}
    + {{yield wrapperFooter}} {{yield footer}}
    -
    +
    {{#if isColumnSelect}} {{ember-tabular-column-select columns=columns}} {{/if}} From 0fd106478530a80c2f186b7f97f0089b88a98242 Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Tue, 24 Oct 2017 15:40:22 -0400 Subject: [PATCH 079/105] Fix indent --- addon/templates/components/ember-tabular.hbs | 146 +++++++++---------- 1 file changed, 73 insertions(+), 73 deletions(-) diff --git a/addon/templates/components/ember-tabular.hbs b/addon/templates/components/ember-tabular.hbs index 4097210..bba4ceb 100644 --- a/addon/templates/components/ember-tabular.hbs +++ b/addon/templates/components/ember-tabular.hbs @@ -18,90 +18,90 @@
    {{yield wrapperHeader}} - {{#if columns}} - - - {{#each columns as |header|}} - {{#if header.isActive}} - {{#if header.property}} - - {{else}} - - {{/if}} - {{/if}} - {{/each}} - - {{#if isColumnFilters}} - {{#if showFilterRow}} - - {{#each columns as |header|}} - {{#if header.isActive}} - {{#if header.filter}} - {{ember-tabular-filter modelName=modelName columns=columns property=header.property record=record query=query filter=filter header=header}} - {{else}} - - {{/if}} + {{#if columns}} + + + {{#each columns as |header|}} + {{#if header.isActive}} + {{#if header.property}} + + {{#if header.sort}} +
    + {{header.label}} +
    + {{else if header.selectable}} +
    + +
    + {{else}} +
    + {{header.label}} +
    + {{/if}} + + {{else}} + + {{/if}} {{/if}} - {{/if}} - - {{/if}} - - {{#if record}} - {{#each record as |row|}} - {{!-- required outside of columns loop to trigger the render of the custom yielded columns --}} - {{yield (hash - column=(component "ember-tabular-column-register" registry=registry addToRegistry=(action "addToRegistry")) - )}} + {{/each}} + + {{#if isColumnFilters}} + {{#if showFilterRow}} - {{#each columns as |column|}} - {{#if column.isActive}} - {{#if (compare-with columns "property" column.property "isCustomTemplate")}} - {{yield (hash - column=(component "ember-tabular-column" column=column record=row property=property collection=record class=column.class) - )}} + {{#each columns as |header|}} + {{#if header.isActive}} + {{#if header.filter}} + {{ember-tabular-filter modelName=modelName columns=columns property=header.property record=record query=query filter=filter header=header}} {{else}} - {{ember-tabular-column column=column record=row property=column.property collection=record class=column.class}} + {{/if}} {{/if}} {{/each}} - {{/each}} - {{ember-tabular-footer registryComplete=(action "registryComplete")}} - {{else}} + {{/if}} + {{/if}} + + {{/if}} + + {{#if record}} + {{#each record as |row|}} + {{!-- required outside of columns loop to trigger the render of the custom yielded columns --}} + {{yield (hash + column=(component "ember-tabular-column-register" registry=registry addToRegistry=(action "addToRegistry")) + )}} - + {{/each}} - {{/if}} - + {{/each}} + {{ember-tabular-footer registryComplete=(action "registryComplete")}} + {{else}} + + + + {{/if}} +
    - {{#if header.filter}} - - {{/if}} - {{#if header.sort}} -
    - {{header.label}} -
    - {{else if header.selectable}} -
    - -
    - {{else}} -
    - {{header.label}} -
    - {{/if}} -
    {{header.label}}
    {{!-- Blank to reserve table column --}}
    + {{#if header.filter}} + {{/if}} - {{/each}} -
    {{header.label}}
    {{!-- Blank to reserve table column --}}
    - {{#if isRecordLoaded}} - {{tableLoadedMessage}} - {{else}} - Loading... + {{#each columns as |column|}} + {{#if column.isActive}} + {{#if (compare-with columns "property" column.property "isCustomTemplate")}} + {{yield (hash + column=(component "ember-tabular-column" column=column record=row property=property collection=record class=column.class) + )}} + {{else}} + {{ember-tabular-column column=column record=row property=column.property collection=record class=column.class}} + {{/if}} {{/if}} -
    + {{#if isRecordLoaded}} + {{tableLoadedMessage}} + {{else}} + Loading... + {{/if}} +
    {{yield wrapperFooter}}
    From effd2bbc916586995b0fdc75e47ac5a6962013fb Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Wed, 25 Oct 2017 00:53:36 -0400 Subject: [PATCH 080/105] Refactor to run updateSortUI on didRender to catch when tabular generates columns --- addon/components/ember-tabular.js | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/addon/components/ember-tabular.js b/addon/components/ember-tabular.js index 2bf4a76..3f31732 100644 --- a/addon/components/ember-tabular.js +++ b/addon/components/ember-tabular.js @@ -761,6 +761,7 @@ export default Ember.Component.extend(EmberTabularHelpers, { /** * Runs on init to setup the table header default columns. + * Runs if the `columns` are passed in from controller. * * @method setColumnDefaults */ @@ -783,6 +784,7 @@ export default Ember.Component.extend(EmberTabularHelpers, { /** * Runs on init to set the default sort param. + * Sets the defaultSort when `columns` is passed in from controller * * @method defaultSort */ @@ -930,20 +932,17 @@ export default Ember.Component.extend(EmberTabularHelpers, { * @method updateSortUI * @param sortProperty {String} */ - updateSortUI: Ember.on('didInsertElement', function (sortProperty) { + updateSortUI: Ember.on('didRender', function (sortProperty) { if (this.get('sort') || sortProperty) { const _this = this; const $table = this.$(); const sort = this.get('sort'); - let property, - classProperty, - $tableHeader; // convert property to camelCase - property = sort.replace(/^-/, ''); + let property = sort.replace(/^-/, ''); // convert relationships - classProperty = property.replace(/\./g, '-'); - $tableHeader = $table.find(`#${classProperty}`); + let classProperty = property.replace(/\./g, '-'); + let $tableHeader = $table.find(`#${classProperty}`); // Remove all classes on th.sortable but sortable class $table.find('th').removeClass(function (i, group) { From 09935e7211f5fbd73406c19c1e9c7b035f5d80ab Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Thu, 26 Oct 2017 21:08:11 -0400 Subject: [PATCH 081/105] Shorten isCustomTemplate to isCustom, make isCustom consistent --- .../ember-tabular-column-register.js | 2 +- addon/components/ember-tabular.js | 2 +- addon/templates/components/ember-tabular.hbs | 2 +- tests/dummy/app/controllers/example4.js | 2 +- tests/dummy/app/controllers/index.js | 20 +++++++++---------- 5 files changed, 14 insertions(+), 14 deletions(-) diff --git a/addon/components/ember-tabular-column-register.js b/addon/components/ember-tabular-column-register.js index 98b37b7..cb83fdd 100644 --- a/addon/components/ember-tabular-column-register.js +++ b/addon/components/ember-tabular-column-register.js @@ -36,7 +36,7 @@ export default Ember.Component.extend(EmberTabularHelpers, { selectable: selectable, label: label, isActive: isActive, - isCustomTemplate: isCustom, + isCustom: isCustom, filter: filter, list: list, sort: sort, diff --git a/addon/components/ember-tabular.js b/addon/components/ember-tabular.js index 3f31732..f447341 100644 --- a/addon/components/ember-tabular.js +++ b/addon/components/ember-tabular.js @@ -281,7 +281,7 @@ export default Ember.Component.extend(EmberTabularHelpers, { property: property, label: this._formatColumnLabel(property), isActive: this.checkConfigForColumn(property), - isCustomTemplate: false, + isCustom: false, filter: true, sort: true, type: 'text', diff --git a/addon/templates/components/ember-tabular.hbs b/addon/templates/components/ember-tabular.hbs index bba4ceb..ab594fc 100644 --- a/addon/templates/components/ember-tabular.hbs +++ b/addon/templates/components/ember-tabular.hbs @@ -78,7 +78,7 @@ {{#each columns as |column|}} {{#if column.isActive}} - {{#if (compare-with columns "property" column.property "isCustomTemplate")}} + {{#if (compare-with columns "property" column.property "isCustom")}} {{yield (hash column=(component "ember-tabular-column" column=column record=row property=property collection=record class=column.class) )}} diff --git a/tests/dummy/app/controllers/example4.js b/tests/dummy/app/controllers/example4.js index 42f6938..6c8c31d 100644 --- a/tests/dummy/app/controllers/example4.js +++ b/tests/dummy/app/controllers/example4.js @@ -30,7 +30,7 @@ export default Ember.Controller.extend({ property: 'updatedAt', label: 'Last Updated', isActive: true, - isCustomTemplate: true, + isCustom: true, filter: false, }, ], diff --git a/tests/dummy/app/controllers/index.js b/tests/dummy/app/controllers/index.js index 6ce08cf..cbdb1a8 100644 --- a/tests/dummy/app/controllers/index.js +++ b/tests/dummy/app/controllers/index.js @@ -34,11 +34,11 @@ export default Ember.Controller.extend({ columnsConfig: [ { property: 'emailAddress', - isCustomTemplate: true, + isCustom: true, }, { property: 'updatedAt', - isCustomTemplate: true, + isCustom: true, }, { property: 'password', @@ -55,7 +55,7 @@ export default Ember.Controller.extend({ { label: 'Actions', property: 'actions', - isCustomTemplate: true, + isCustom: true, isActive: true, filter: false, sort: false, @@ -66,31 +66,31 @@ export default Ember.Controller.extend({ property: 'username', label: 'Username', defaultSort: 'username', - isCustomTemplate: true, + isCustom: true, isActive: true, }, { property: 'emailAddress', label: 'Email', - isCustomTemplate: true, + isCustom: true, isActive: true, }, { property: 'firstName', label: 'First Name', - isCustomTemplate: true, + isCustom: true, isActive: true, }, { property: 'lastName', label: 'Last Name', - isCustomTemplate: true, + isCustom: true, isActive: true, }, { property: 'isAdmin', label: 'Is Admin', - isCustomTemplate: true, + isCustom: true, isActive: true, list: [ { @@ -106,7 +106,7 @@ export default Ember.Controller.extend({ { property: 'updatedAt', label: 'Last Updated', - isCustomTemplate: true, + isCustom: true, isActive: true, type: 'date', sort: false, @@ -114,7 +114,7 @@ export default Ember.Controller.extend({ { property: 'actions', label: 'Actions', - isCustomTemplate: true, + isCustom: true, filter: false, sort: false, isActive: true, From 67c1bbe8b11a9b5e2acea7ad45780ccde07184af Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Fri, 27 Oct 2017 15:40:34 -0400 Subject: [PATCH 082/105] Clean up dummy template --- tests/dummy/app/templates/index.hbs | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/tests/dummy/app/templates/index.hbs b/tests/dummy/app/templates/index.hbs index 7269a96..27ecde5 100644 --- a/tests/dummy/app/templates/index.hbs +++ b/tests/dummy/app/templates/index.hbs @@ -20,9 +20,9 @@ {{component et.column property="createdAt" isActive=false isCustom=false filter=false sort=false}} {{#component et.column property="updatedAt" label="Last Updated" isCustom=true type="date" as |record column|}} {{#if record.updatedAt}} - {{moment-format record.updatedAt 'MM/DD/YYYY'}} + {{moment-format record.updatedAt "MM/DD/YYYY"}} {{else}} - {{moment-format record.createdAt 'MM/DD/YYYY'}} + {{moment-format record.createdAt "MM/DD/YYYY"}} {{/if}} {{/component}} {{#component et.column @@ -61,9 +61,9 @@ {{/component}} {{#component et.column property="updatedAt" as |record column|}} {{#if record.updatedAt}} - {{moment-format record.updatedAt 'MM/DD/YYYY'}} + {{moment-format record.updatedAt "MM/DD/YYYY"}} {{else}} - {{moment-format record.createdAt 'MM/DD/YYYY'}} + {{moment-format record.createdAt "MM/DD/YYYY"}} {{/if}} {{/component}} {{#component et.column property="actions" as |record column|}} @@ -74,7 +74,7 @@ {{/ember-tabular}} -
    Example #3
    +
    Example #4

    Table - Persist Filtering

    {{#ember-tabular class="table-persist" columns=columns modelName="user" record=users4 filter=filter3 persistFiltering=true sort=sort4 as |et|}} {{#component et.column property="username" as |record column|}} @@ -98,9 +98,9 @@ {{/component}} {{#component et.column property="updatedAt" as |record column|}} {{#if record.updatedAt}} - {{moment-format record.updatedAt 'MM/DD/YYYY'}} + {{moment-format record.updatedAt "MM/DD/YYYY"}} {{else}} - {{moment-format record.createdAt 'MM/DD/YYYY'}} + {{moment-format record.createdAt "MM/DD/YYYY"}} {{/if}} {{/component}} {{#component et.column property="actions" as |record column|}} @@ -110,7 +110,7 @@ {{/component}} {{/ember-tabular}} -
    Example #4
    +
    Example #5

    Table - Basic - Global Filter

    {{#ember-tabular class="table-basic-global-filter" modelName="user" record=users2 filter=filter columnOrder=hideOmittedConfig as |et|}} {{#if et.isHeader}} @@ -120,7 +120,7 @@ {{component et.column property="emailAddress" isCustom=false filter=false sort=false}} {{/ember-tabular}} -
    Example #5
    +
    Example #6

    Table - Basic - Dropdown Filter / Date Filter

    {{#ember-tabular class="table-basic-global-date-filter" modelName="user" record=users3 filter=filter2 columns=columnsForDropdownFilter isColumnSelect=false as |et|}} {{#if et.isHeader}} @@ -129,7 +129,7 @@ {{#ember-tabular-dropdown-filter filter=filter2 filterProperty="isAdmin" label="Is Admin" searchFilter=isAdminFilter}} {{#power-select options=adminContent - selected=(find-by adminContent 'value' isAdminFilter) + selected=(find-by adminContent "value" isAdminFilter) searchField="label" searchEnabled=false placeholder="Select to filter" @@ -148,13 +148,13 @@ {{/if}} {{/ember-tabular}} -
    Example #6
    +
    Example #7

    Table - Select Row

    {{#ember-tabular class="table-select-row" modelName="user" sort="username" isColumnSelect=false as |et|}} {{component et.column property="checked" selectable=true isCustom=false filter=false sort=false}} {{/ember-tabular}} -
    Example #7
    -{{#link-to 'example4' class="link-ex4"}} +
    Example #8
    +{{#link-to "example4" class="link-ex4"}} Route Binds Model to Table {{/link-to}} From 1787c7bb47d91ea7699b0e116d44aac98608a0de Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Fri, 27 Oct 2017 16:33:18 -0400 Subject: [PATCH 083/105] Create sub component for loading logic --- addon/components/ember-tabular-loading.js | 24 +++++++++++++++++++ .../components/ember-tabular-loading.hbs | 10 ++++++++ app/components/ember-tabular-loading.js | 3 +++ 3 files changed, 37 insertions(+) create mode 100644 addon/components/ember-tabular-loading.js create mode 100644 addon/templates/components/ember-tabular-loading.hbs create mode 100644 app/components/ember-tabular-loading.js diff --git a/addon/components/ember-tabular-loading.js b/addon/components/ember-tabular-loading.js new file mode 100644 index 0000000..2e6ef17 --- /dev/null +++ b/addon/components/ember-tabular-loading.js @@ -0,0 +1,24 @@ +import Ember from 'ember'; +import layout from 'ember-tabular/templates/components/ember-tabular-loading'; + +/** +* Generates loading copy +* +* +* @class EmberTabularColumn +*/ +export default Ember.Component.extend({ + layout, + /** + * @property tagName + * @type String + * @default '' + */ + tagName: '', + action: null, + actions: { + registryComplete(value) { + this.get('registryComplete')(value); + }, + }, +}); diff --git a/addon/templates/components/ember-tabular-loading.hbs b/addon/templates/components/ember-tabular-loading.hbs new file mode 100644 index 0000000..be38a02 --- /dev/null +++ b/addon/templates/components/ember-tabular-loading.hbs @@ -0,0 +1,10 @@ + + + {{#if isRecordLoaded}} + {{tableLoadedMessage}} + {{ember-tabular-registry registryComplete=registryComplete}} + {{else}} + Loading... + {{/if}} + + diff --git a/app/components/ember-tabular-loading.js b/app/components/ember-tabular-loading.js new file mode 100644 index 0000000..9e1d096 --- /dev/null +++ b/app/components/ember-tabular-loading.js @@ -0,0 +1,3 @@ +import EmberTabularLoading from 'ember-tabular/components/ember-tabular-loading'; + +export default EmberTabularLoading; From 155caa00cbc13bb9fbb5540b5aa2ff27c0e73a7e Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Fri, 27 Oct 2017 16:35:13 -0400 Subject: [PATCH 084/105] Rename ember-tabular-footer to registry and restructure how the registry is built and fix issue where slight delay would cause loading to dissapear --- ...ar-footer.js => ember-tabular-registry.js} | 0 addon/components/ember-tabular.js | 10 ++- addon/templates/components/ember-tabular.hbs | 81 ++++++++++--------- app/components/ember-tabular-footer.js | 3 - app/components/ember-tabular-registry.js | 3 + tests/acceptance/basic-test.js | 4 +- tests/unit/ember-tabular-test.js | 2 +- 7 files changed, 54 insertions(+), 49 deletions(-) rename addon/components/{ember-tabular-footer.js => ember-tabular-registry.js} (100%) delete mode 100644 app/components/ember-tabular-footer.js create mode 100644 app/components/ember-tabular-registry.js diff --git a/addon/components/ember-tabular-footer.js b/addon/components/ember-tabular-registry.js similarity index 100% rename from addon/components/ember-tabular-footer.js rename to addon/components/ember-tabular-registry.js diff --git a/addon/components/ember-tabular.js b/addon/components/ember-tabular.js index f447341..25e9f58 100644 --- a/addon/components/ember-tabular.js +++ b/addon/components/ember-tabular.js @@ -228,6 +228,9 @@ export default Ember.Component.extend(EmberTabularHelpers, { return columnOrder.indexOf(a.property) < columnOrder.indexOf(b.property) ? -1 : 1; }); } + Ember.run.next(() => { + this.set('isLoading', false); + }); } return columns; }), @@ -714,7 +717,7 @@ export default Ember.Component.extend(EmberTabularHelpers, { * @type Function */ isRecordLoaded: Ember.computed('errors', 'record', 'record.isFulfilled', 'record.isLoaded', - 'modelName', function () { + 'modelName', 'columns', function () { // If record array isLoaded but empty if (this.get('record.isLoaded')) { return true; @@ -735,7 +738,6 @@ export default Ember.Component.extend(EmberTabularHelpers, { if (this.get('record') === null && this.get('modelName') === null) { return true; } - return false; }), @@ -849,7 +851,9 @@ export default Ember.Component.extend(EmberTabularHelpers, { function (data) { if (!this.isDestroyed || !this.isDestroying) { data = this.normalize(data, params); - this.set('isLoading', false); + if (!Ember.isEmpty(this.get('columns'))) { + this.set('isLoading', false); + } this.set('record', data); } }.bind(this), diff --git a/addon/templates/components/ember-tabular.hbs b/addon/templates/components/ember-tabular.hbs index ab594fc..6819707 100644 --- a/addon/templates/components/ember-tabular.hbs +++ b/addon/templates/components/ember-tabular.hbs @@ -70,36 +70,35 @@ {{/if}} {{#if record}} - {{#each record as |row|}} - {{!-- required outside of columns loop to trigger the render of the custom yielded columns --}} - {{yield (hash - column=(component "ember-tabular-column-register" registry=registry addToRegistry=(action "addToRegistry")) - )}} - - {{#each columns as |column|}} - {{#if column.isActive}} - {{#if (compare-with columns "property" column.property "isCustom")}} - {{yield (hash - column=(component "ember-tabular-column" column=column record=row property=property collection=record class=column.class) - )}} - {{else}} - {{ember-tabular-column column=column record=row property=column.property collection=record class=column.class}} + {{yield (hash + column=(component "ember-tabular-column-register" registry=registry addToRegistry=(action "addToRegistry")) + )}} + {{ember-tabular-registry registryComplete=(action "registryComplete")}} + {{#if (and record columns)}} + {{#each record as |row|}} + + {{#each columns as |column|}} + {{#if column.isActive}} + {{#if (compare-with columns "property" column.property "isCustom")}} + {{yield (hash + column=(component "ember-tabular-column" column=column record=row property=property collection=record class=column.class) + )}} + {{else}} + {{ember-tabular-column column=column record=row property=column.property collection=record class=column.class}} + {{/if}} {{/if}} - {{/if}} - {{/each}} + {{/each}} + + {{/each}} + {{else}} + + + Loading... + - {{/each}} - {{ember-tabular-footer registryComplete=(action "registryComplete")}} + {{/if}} {{else}} - - - {{#if isRecordLoaded}} - {{tableLoadedMessage}} - {{else}} - Loading... - {{/if}} - - + {{ember-tabular-loading isRecordLoaded=isRecordLoaded columnLength=columnLength tableLoadedMessage=tableLoadedMessage registryComplete=(action "registryComplete")}} {{/if}} @@ -108,18 +107,20 @@ {{yield footer}} -
    -
    - {{#if isColumnSelect}} - {{ember-tabular-column-select columns=columns}} +{{#if columns}} +
    +
    + {{#if isColumnSelect}} + {{ember-tabular-column-select columns=columns}} + {{/if}} + +
    + {{#if isDropdownLimit}} +
    + {{ember-tabular-dropdown-limit limit=limit record=record count=pageLimit}} +
    {{/if}} -
    - {{#if isDropdownLimit}} -
    - {{ember-tabular-dropdown-limit limit=limit record=record count=pageLimit}} -
    - {{/if}} -
    +{{/if}} diff --git a/app/components/ember-tabular-footer.js b/app/components/ember-tabular-footer.js deleted file mode 100644 index a37d3fc..0000000 --- a/app/components/ember-tabular-footer.js +++ /dev/null @@ -1,3 +0,0 @@ -import EmberTabularFooter from 'ember-tabular/components/ember-tabular-footer'; - -export default EmberTabularFooter; diff --git a/app/components/ember-tabular-registry.js b/app/components/ember-tabular-registry.js new file mode 100644 index 0000000..1a0f78b --- /dev/null +++ b/app/components/ember-tabular-registry.js @@ -0,0 +1,3 @@ +import EmberTabularRegistry from 'ember-tabular/components/ember-tabular-registry'; + +export default EmberTabularRegistry; diff --git a/tests/acceptance/basic-test.js b/tests/acceptance/basic-test.js index e3ff046..aaf512a 100644 --- a/tests/acceptance/basic-test.js +++ b/tests/acceptance/basic-test.js @@ -24,7 +24,7 @@ test('Check table pagination - 0 pages (.table-default)', function(assert) { let cells = find('.table-default table tbody tr').eq(0).find('td'); assert.equal(find('.table-default table tbody tr').length, 1, 'Check for 1 items in table'); - assert.equal(cells.eq(0).html().trim(), 'No Data.', 'No Data.'); + assertIn(assert, cells.eq(0).html().trim(), 'No Data.', 'No Data.'); assert.equal(find('.table-default .pagination').hasClass('hidden'), true, 'Pagination is hidden'); }); }); @@ -210,7 +210,7 @@ test('Check table rendering for no data or loading (.table-default)', function(a andThen(function() { let cells = find('.table-default table tbody tr').eq(0).find('td'); - assert.equal(cells.eq(0).html().trim(), 'No Data.', 'No Data.'); + assertIn(assert, cells.eq(0).html().trim(), 'No Data.', 'No Data.'); }); }); diff --git a/tests/unit/ember-tabular-test.js b/tests/unit/ember-tabular-test.js index 6c8c67c..050daf7 100644 --- a/tests/unit/ember-tabular-test.js +++ b/tests/unit/ember-tabular-test.js @@ -63,7 +63,7 @@ let columns = [ moduleForComponent('ember-tabular', 'Unit | Component | ember table jsonapi', { unit: true, - needs: ['helper:dot-to-dash-filter', 'component:ember-tabular-filter', 'component:ember-tabular-footer', 'helper:and', 'component:pagination-pager', 'component:ember-tabular-column-select', 'component:sortable-objects', 'service:dragCoordinator', 'component:draggable-object', 'helper:compare-with', 'component:ember-tabular-column'], + needs: ['helper:dot-to-dash-filter', 'component:ember-tabular-filter', 'component:ember-tabular-registry', 'helper:and', 'component:pagination-pager', 'component:ember-tabular-column-select', 'component:sortable-objects', 'service:dragCoordinator', 'component:draggable-object', 'helper:compare-with', 'component:ember-tabular-column'], beforeEach: function() { component = this.subject({ record: model, From 6e866eb0cc1c742dfc067990d294140c2525cc91 Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Fri, 3 Nov 2017 14:39:00 -0400 Subject: [PATCH 085/105] Fix loading icon appearing over loading text --- addon/templates/components/ember-tabular-loading.hbs | 2 +- addon/templates/components/ember-tabular.hbs | 2 +- vendor/app.css | 6 +++++- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/addon/templates/components/ember-tabular-loading.hbs b/addon/templates/components/ember-tabular-loading.hbs index be38a02..5e48d8c 100644 --- a/addon/templates/components/ember-tabular-loading.hbs +++ b/addon/templates/components/ember-tabular-loading.hbs @@ -1,5 +1,5 @@ - + {{#if isRecordLoaded}} {{tableLoadedMessage}} {{ember-tabular-registry registryComplete=registryComplete}} diff --git a/addon/templates/components/ember-tabular.hbs b/addon/templates/components/ember-tabular.hbs index 6819707..605e667 100644 --- a/addon/templates/components/ember-tabular.hbs +++ b/addon/templates/components/ember-tabular.hbs @@ -92,7 +92,7 @@ {{/each}} {{else}} - + Loading... diff --git a/vendor/app.css b/vendor/app.css index 3c9e634..222fbd8 100644 --- a/vendor/app.css +++ b/vendor/app.css @@ -119,7 +119,7 @@ content: "\f021"; position: absolute; top: 50%; - margin-top:-10px; + margin-top:-30px; left:50%; margin-left:-10px; display: inline-block; @@ -144,6 +144,10 @@ background:rgba(255,255,255,0.7); z-index:1; } +.ember-tabular .td-loading{ + height:80px; + vertical-align:middle; +} @keyframes spin { from { From 356ae64951a26f8b8bf129f32e2fcd39c6cffd5d Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Fri, 3 Nov 2017 14:59:53 -0400 Subject: [PATCH 086/105] Add options to column-select --- addon/components/ember-tabular-column-select.js | 4 +++- addon/templates/components/ember-tabular-column-select.hbs | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/addon/components/ember-tabular-column-select.js b/addon/components/ember-tabular-column-select.js index dac9a0d..9baf942 100644 --- a/addon/components/ember-tabular-column-select.js +++ b/addon/components/ember-tabular-column-select.js @@ -15,8 +15,10 @@ export default Ember.Component.extend({ * @default 'div' */ tagName: 'div', - classNames: ['btn-group', 'btn-group-column-select'], + classNames: ['btn-group', 'btn-group-column-select', 'dropup'], columns: null, + btnCopy: 'Columns', + useIcon: true, actions: { toggleColumn(column) { diff --git a/addon/templates/components/ember-tabular-column-select.hbs b/addon/templates/components/ember-tabular-column-select.hbs index 4b31db5..65a3385 100644 --- a/addon/templates/components/ember-tabular-column-select.hbs +++ b/addon/templates/components/ember-tabular-column-select.hbs @@ -1,5 +1,5 @@ {{#sortable-objects sortableObjectList=columns sortEndAction="sortEndAction" sortingScope="a" class="dropdown-menu pull-left" tagName="ul"}} {{#each columns as |column|}} From 762f152952dbd05575824797c5fff28c6b0ecea0 Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Fri, 3 Nov 2017 15:34:19 -0400 Subject: [PATCH 087/105] Allow clicking within the column select and not closing the window --- addon/components/ember-tabular-column-select.js | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/addon/components/ember-tabular-column-select.js b/addon/components/ember-tabular-column-select.js index 9baf942..964604c 100644 --- a/addon/components/ember-tabular-column-select.js +++ b/addon/components/ember-tabular-column-select.js @@ -20,6 +20,23 @@ export default Ember.Component.extend({ btnCopy: 'Columns', useIcon: true, + didInsertElement() { + this._super(...arguments); + this.$().on({ + 'shown.bs.dropdown': function() { + $(this).data('closable', false); + }, + 'click': function(event) { + $(this).data('closable', false); + }, + 'hide.bs.dropdown': function(event) { + let temp = $(this).data('closable'); + $(this).data('closable', true); + return temp; + } + }); + }, + actions: { toggleColumn(column) { if (column.isActive) { From ef9ca783632f2120a2046a67f5d935a243b1e94a Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Fri, 3 Nov 2017 16:36:05 -0400 Subject: [PATCH 088/105] Refactor to prevent need to doubleclick to close dropdown --- .../components/ember-tabular-column-select.js | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/addon/components/ember-tabular-column-select.js b/addon/components/ember-tabular-column-select.js index 964604c..82c18bf 100644 --- a/addon/components/ember-tabular-column-select.js +++ b/addon/components/ember-tabular-column-select.js @@ -22,17 +22,19 @@ export default Ember.Component.extend({ didInsertElement() { this._super(...arguments); + // prevent dropdown from closing when clicking within this.$().on({ - 'shown.bs.dropdown': function() { - $(this).data('closable', false); + 'click': function(e) { + if ($(e.target).closest('.dropdown-toggle').length) { + $(this).data('closable', true); + } else { + $(this).data('closable', false); + } }, - 'click': function(event) { - $(this).data('closable', false); - }, - 'hide.bs.dropdown': function(event) { - let temp = $(this).data('closable'); + 'hide.bs.dropdown': function(e) { + let hide = $(this).data('closable'); $(this).data('closable', true); - return temp; + return hide; } }); }, From f6a30ede182646e61eaeda3f0b0f58a7ee4ef1c4 Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Wed, 8 Nov 2017 15:58:58 -0500 Subject: [PATCH 089/105] Ensure we display errors caused within ember-tabular request() to the user instead of swallowing them Reference issue #98 --- addon/components/ember-tabular.js | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/addon/components/ember-tabular.js b/addon/components/ember-tabular.js index 25e9f58..8c9f5ae 100644 --- a/addon/components/ember-tabular.js +++ b/addon/components/ember-tabular.js @@ -848,7 +848,7 @@ export default Ember.Component.extend(EmberTabularHelpers, { params = this.serialize(params); return this.get('store').query(modelName, params).then( - function (data) { + (data) => { if (!this.isDestroyed || !this.isDestroying) { data = this.normalize(data, params); if (!Ember.isEmpty(this.get('columns'))) { @@ -856,12 +856,12 @@ export default Ember.Component.extend(EmberTabularHelpers, { } this.set('record', data); } - }.bind(this), - function (errors) { + }, + (errors) => { if (!this.isDestroyed || !this.isDestroying) { this.failure(errors); } - }.bind(this) + } ); }, @@ -996,6 +996,10 @@ export default Ember.Component.extend(EmberTabularHelpers, { // Set per field errors if found if ('errors' in response) { this.set('errors', response.errors); + } else { + // attempt to catch/display errors that are outside of the expected format + // preventing them from being swalled by ember-tabular + throw new Error(response); } }, From 85b0090716c64cb9cf5f7cfdaaca5e5e2d78ac04 Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Wed, 29 Nov 2017 12:11:08 -0500 Subject: [PATCH 090/105] Fix deprecation warning in recent ember-cli versions around Ember.String.dasherize/camelize --- addon/components/ember-tabular.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/addon/components/ember-tabular.js b/addon/components/ember-tabular.js index 8c9f5ae..c500ed5 100644 --- a/addon/components/ember-tabular.js +++ b/addon/components/ember-tabular.js @@ -1,6 +1,7 @@ import Ember from 'ember'; import layout from 'ember-tabular/templates/components/ember-tabular'; import EmberTabularHelpers from 'ember-tabular/mixins/components/ember-tabular-helpers'; +import { dasherize, camelize } from 'ember-inflector'; /** * ## Basic Usage @@ -570,7 +571,7 @@ export default Ember.Component.extend(EmberTabularHelpers, { // ?filter[lastName]&sort=isAdmin // (pseudo code) if (property) { - return Ember.String.camelize(property); + return camelize(property); } return null; @@ -584,7 +585,7 @@ export default Ember.Component.extend(EmberTabularHelpers, { */ serializeProperty(property) { if (property) { - return Ember.String.dasherize(property); + return dasherize(property); } return null; @@ -693,7 +694,7 @@ export default Ember.Component.extend(EmberTabularHelpers, { */ normalizeProperty(property) { if (property) { - return Ember.String.camelize(property); + return camelize(property); } return null; From 21b3f300a93cee13d03d5a8bc0b1d053c4c63c8a Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Wed, 29 Nov 2017 12:30:27 -0500 Subject: [PATCH 091/105] Revert "Fix deprecation warning in recent ember-cli versions around Ember.String.dasherize/camelize" This reverts commit 85b0090716c64cb9cf5f7cfdaaca5e5e2d78ac04. --- addon/components/ember-tabular.js | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/addon/components/ember-tabular.js b/addon/components/ember-tabular.js index c500ed5..8c9f5ae 100644 --- a/addon/components/ember-tabular.js +++ b/addon/components/ember-tabular.js @@ -1,7 +1,6 @@ import Ember from 'ember'; import layout from 'ember-tabular/templates/components/ember-tabular'; import EmberTabularHelpers from 'ember-tabular/mixins/components/ember-tabular-helpers'; -import { dasherize, camelize } from 'ember-inflector'; /** * ## Basic Usage @@ -571,7 +570,7 @@ export default Ember.Component.extend(EmberTabularHelpers, { // ?filter[lastName]&sort=isAdmin // (pseudo code) if (property) { - return camelize(property); + return Ember.String.camelize(property); } return null; @@ -585,7 +584,7 @@ export default Ember.Component.extend(EmberTabularHelpers, { */ serializeProperty(property) { if (property) { - return dasherize(property); + return Ember.String.dasherize(property); } return null; @@ -694,7 +693,7 @@ export default Ember.Component.extend(EmberTabularHelpers, { */ normalizeProperty(property) { if (property) { - return camelize(property); + return Ember.String.camelize(property); } return null; From 382cef5986bbaaed838908ed4c0d9d70cc7127c9 Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Wed, 6 Dec 2017 01:16:02 -0500 Subject: [PATCH 092/105] Pushes undefined columns sort to the back of the list instead of the front Reference issue #100 --- addon/components/ember-tabular.js | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/addon/components/ember-tabular.js b/addon/components/ember-tabular.js index 8c9f5ae..efe6cc0 100644 --- a/addon/components/ember-tabular.js +++ b/addon/components/ember-tabular.js @@ -210,7 +210,7 @@ export default Ember.Component.extend(EmberTabularHelpers, { * @default null */ columns: Ember.computed('registry', 'registryDiff', 'registryDone', 'columnOrder', function () { - const columns = Ember.A(); + let columns = Ember.A(); // only output columns array when registry is done if (this.get('registryDone')) { const registry = this.get('registry'); @@ -224,9 +224,18 @@ export default Ember.Component.extend(EmberTabularHelpers, { // sort the colums array by columnOrder if (columnOrder) { - columns.sort((a, b) => { + // break out the excludes so we can add them to the end + let excludes = []; + let includes = columns.filter((el) => { + if (columnOrder.indexOf(el.property) > -1) { + return el; + } + excludes.push(el); + }); + includes.sort((a, b) => { return columnOrder.indexOf(a.property) < columnOrder.indexOf(b.property) ? -1 : 1; }); + columns = includes.concat(excludes); } Ember.run.next(() => { this.set('isLoading', false); From d189bef176d9d54176886c7551d94b160733061c Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Fri, 8 Dec 2017 15:10:16 -0500 Subject: [PATCH 093/105] WIP, attempt to save columnOrder and allow it to persist within controller --- addon/components/ember-tabular.js | 21 ++++++++++++++++++++- tests/acceptance/basic-test.js | 21 +++++++++++++++++++++ tests/dummy/app/templates/index.hbs | 8 +++++--- 3 files changed, 46 insertions(+), 4 deletions(-) diff --git a/addon/components/ember-tabular.js b/addon/components/ember-tabular.js index efe6cc0..0ff6b92 100644 --- a/addon/components/ember-tabular.js +++ b/addon/components/ember-tabular.js @@ -209,13 +209,14 @@ export default Ember.Component.extend(EmberTabularHelpers, { * @type Array * @default null */ - columns: Ember.computed('registry', 'registryDiff', 'registryDone', 'columnOrder', function () { + columns: Ember.computed('registry', 'registryDiff', 'registryDone', function () { let columns = Ember.A(); // only output columns array when registry is done if (this.get('registryDone')) { const registry = this.get('registry'); const registryDiff = this.get('registryDiff'); const columnOrder = this.get('columnOrder'); + console.log('columns columnOrder', columnOrder); if (registry && registryDiff) { columns.pushObjects(registry); @@ -244,6 +245,23 @@ export default Ember.Component.extend(EmberTabularHelpers, { return columns; }), + saveColumnOrder: Ember.observer('columns', 'columns.@each.isActive', function () { + const columns = this.get('columns'); + console.log('saveColumnOrder', columns); + // filter out columns that are not active + let filterColumns = columns.filter((el) => { + if (el.isActive) { + return el; + } + }); + // only return array of properties + let columnOrder = filterColumns.map((el) => { + return el.property; + }); + console.log('saveColumnOrder columnOrder', columnOrder); + this.set('columnOrder', columnOrder); + }), + /** * If you want to set a specific order but you do not want to completely replace the `columns`, you can pass a simple array of properties to determine the order of the columns. * Note: You must include all attributes you want displayed, if any attributes are omitted then their column will be set to isActive=false, hiding them from display. @@ -312,6 +330,7 @@ export default Ember.Component.extend(EmberTabularHelpers, { checkConfigForColumn(property) { const columnOrder = this.get('columnOrder'); + console.log('checkConfigForColumn', property, columnOrder.indexOf(property)); if (columnOrder && columnOrder.indexOf(property) === -1) { return false; } diff --git a/tests/acceptance/basic-test.js b/tests/acceptance/basic-test.js index aaf512a..7f6c7f9 100644 --- a/tests/acceptance/basic-test.js +++ b/tests/acceptance/basic-test.js @@ -528,6 +528,27 @@ test('Check for expected content after filtering (.table-basic-global-filter)', }); }); +test('Check for proper order of ommitted columns from orderColumn within column select list(.table-basic-global-filter)', function(assert) { + server.loadFixtures('users'); + visit('/'); + + andThen(function() { + assert.equal(currentPath(), 'index'); + + let columnSelectItem = find('.table-basic-global-filter .btn-group-column-select .dropdown-menu > li'); + + assert.equal(columnSelectItem.length, 8, 'Check for 8 items in column select list'); + assert.equal(columnSelectItem.eq(0).text().trim(), 'Username', 'Check for username'); + assert.equal(columnSelectItem.eq(1).text().trim(), 'Email Address', 'Check for email'); + assert.equal(columnSelectItem.eq(2).text().trim(), 'First Name', 'Check for first name'); + assert.equal(columnSelectItem.eq(3).text().trim(), 'Last Name', 'Check for last name'); + assert.equal(columnSelectItem.eq(4).text().trim(), 'Is Admin', 'Check for is admin'); + assert.equal(columnSelectItem.eq(5).text().trim(), 'Password', 'Check for password, item not within columnOrder'); + assert.equal(columnSelectItem.eq(6).text().trim(), 'Created At', 'Check for created at, item not within columnOrder'); + assert.equal(columnSelectItem.eq(7).text().trim(), 'Updated At', 'Check for updated at, item not within columnOrder'); + }); +}); + test('Check for clearFilter action success (.table-default)', function(assert) { server.loadFixtures('users'); visit('/'); diff --git a/tests/dummy/app/templates/index.hbs b/tests/dummy/app/templates/index.hbs index 27ecde5..14688c7 100644 --- a/tests/dummy/app/templates/index.hbs +++ b/tests/dummy/app/templates/index.hbs @@ -1,6 +1,6 @@ -
    Example #1
    +{{!--
    Example #1

    Table - Default

    -{{ember-tabular class="table-default" modelName="user" sort=sort2 isColumnSelect=false}} +{{ember-tabular class="table-default" modelName="user" sort=sort2 isColumnSelect=false}} --}}
    Example #2

    Table - Column Select

    @@ -37,7 +37,7 @@ {{/component}} {{/ember-tabular}} -
    Example #3
    +{{!--
    Example #3

    Table - Override Columns/Templates

    {{#ember-tabular class="table-override-columns-template" columns=columns modelName="user" record=users as |et|}} {{#component et.column property="username" as |record column|}} @@ -154,6 +154,8 @@ {{component et.column property="checked" selectable=true isCustom=false filter=false sort=false}} {{/ember-tabular}} + --}} +
    Example #8
    {{#link-to "example4" class="link-ex4"}} Route Binds Model to Table From 88787d1e3aaa4d22692aad12b8eed022cd159898 Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Fri, 8 Dec 2017 15:32:24 -0500 Subject: [PATCH 094/105] Allow columns to be set and registered even when there is no table data Reference issue #99 --- addon/templates/components/ember-tabular.hbs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/addon/templates/components/ember-tabular.hbs b/addon/templates/components/ember-tabular.hbs index 605e667..7788d3d 100644 --- a/addon/templates/components/ember-tabular.hbs +++ b/addon/templates/components/ember-tabular.hbs @@ -69,11 +69,11 @@ {{/if}} + {{yield (hash + column=(component "ember-tabular-column-register" registry=registry addToRegistry=(action "addToRegistry")) + )}} + {{ember-tabular-registry registryComplete=(action "registryComplete")}} {{#if record}} - {{yield (hash - column=(component "ember-tabular-column-register" registry=registry addToRegistry=(action "addToRegistry")) - )}} - {{ember-tabular-registry registryComplete=(action "registryComplete")}} {{#if (and record columns)}} {{#each record as |row|}} From 0a9629e763e726a8b55cd23f516424cee8ae01c3 Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Mon, 11 Dec 2017 01:47:54 -0500 Subject: [PATCH 095/105] Make columnOrder the main source for displaying columns if it is used, pass this into the individual column to check for display Reference issue #101 --- addon/components/ember-tabular-column-register.js | 13 ++++++++++++- addon/components/ember-tabular.js | 10 +++------- addon/templates/components/ember-tabular.hbs | 2 +- tests/dummy/app/controllers/index.js | 2 -- tests/dummy/app/templates/index.hbs | 12 +++++------- 5 files changed, 21 insertions(+), 18 deletions(-) diff --git a/addon/components/ember-tabular-column-register.js b/addon/components/ember-tabular-column-register.js index cb83fdd..a5491d6 100644 --- a/addon/components/ember-tabular-column-register.js +++ b/addon/components/ember-tabular-column-register.js @@ -18,13 +18,14 @@ export default Ember.Component.extend(EmberTabularHelpers, { tagName: '', action: null, registry: null, + columnOrder: null, init() { this._super(...arguments); const registry = this.get('registry'); const property = this.get('property'); const selectable = this.get('selectable'); const label = this.get('label') || this._formatColumnLabel(property); - const isActive = this._checkIfUndefined(this.get('isActive'), true); + const isActive = this._checkConfigForColumn(property); const isCustom = this.get('isCustom') || false; const filter = this._checkIfUndefined(this.get('filter'), true); const list = this.get('list') || null; @@ -56,4 +57,14 @@ export default Ember.Component.extend(EmberTabularHelpers, { _checkIfUndefined(property, defaultValue) { return typeof property !== 'undefined' ? property : defaultValue; }, + _checkConfigForColumn(property) { + const columnOrder = this.get('columnOrder'); + if (columnOrder) { + if (columnOrder.indexOf(property) === -1) { + return false; + } + return true; + } + return this._checkIfUndefined(this.get('isActive'), true); + }, }); diff --git a/addon/components/ember-tabular.js b/addon/components/ember-tabular.js index 0ff6b92..0deaafb 100644 --- a/addon/components/ember-tabular.js +++ b/addon/components/ember-tabular.js @@ -216,7 +216,6 @@ export default Ember.Component.extend(EmberTabularHelpers, { const registry = this.get('registry'); const registryDiff = this.get('registryDiff'); const columnOrder = this.get('columnOrder'); - console.log('columns columnOrder', columnOrder); if (registry && registryDiff) { columns.pushObjects(registry); @@ -247,7 +246,6 @@ export default Ember.Component.extend(EmberTabularHelpers, { saveColumnOrder: Ember.observer('columns', 'columns.@each.isActive', function () { const columns = this.get('columns'); - console.log('saveColumnOrder', columns); // filter out columns that are not active let filterColumns = columns.filter((el) => { if (el.isActive) { @@ -255,16 +253,15 @@ export default Ember.Component.extend(EmberTabularHelpers, { } }); // only return array of properties - let columnOrder = filterColumns.map((el) => { + let newColumnOrder = filterColumns.map((el) => { return el.property; }); - console.log('saveColumnOrder columnOrder', columnOrder); - this.set('columnOrder', columnOrder); + this.set('columnOrder', newColumnOrder); }), /** * If you want to set a specific order but you do not want to completely replace the `columns`, you can pass a simple array of properties to determine the order of the columns. - * Note: You must include all attributes you want displayed, if any attributes are omitted then their column will be set to isActive=false, hiding them from display. + * Note: You must include all attributes you want displayed, if any attributes are omitted then their column will be set to isActive=false, hiding them from display. If this property is shared with a long lived object (controller/service/etc), it will persist. * ```js [ @@ -330,7 +327,6 @@ export default Ember.Component.extend(EmberTabularHelpers, { checkConfigForColumn(property) { const columnOrder = this.get('columnOrder'); - console.log('checkConfigForColumn', property, columnOrder.indexOf(property)); if (columnOrder && columnOrder.indexOf(property) === -1) { return false; } diff --git a/addon/templates/components/ember-tabular.hbs b/addon/templates/components/ember-tabular.hbs index 7788d3d..a7f5125 100644 --- a/addon/templates/components/ember-tabular.hbs +++ b/addon/templates/components/ember-tabular.hbs @@ -70,7 +70,7 @@ {{/if}} {{yield (hash - column=(component "ember-tabular-column-register" registry=registry addToRegistry=(action "addToRegistry")) + column=(component "ember-tabular-column-register" registry=registry columnOrder=columnOrder addToRegistry=(action "addToRegistry")) )}} {{ember-tabular-registry registryComplete=(action "registryComplete")}} {{#if record}} diff --git a/tests/dummy/app/controllers/index.js b/tests/dummy/app/controllers/index.js index cbdb1a8..4122d31 100644 --- a/tests/dummy/app/controllers/index.js +++ b/tests/dummy/app/controllers/index.js @@ -16,11 +16,9 @@ export default Ember.Controller.extend({ orderConfig: [ 'username', 'emailAddress', - 'password', 'firstName', 'lastName', 'isAdmin', - 'createdAt', 'updatedAt', 'actions', ], diff --git a/tests/dummy/app/templates/index.hbs b/tests/dummy/app/templates/index.hbs index 14688c7..1644895 100644 --- a/tests/dummy/app/templates/index.hbs +++ b/tests/dummy/app/templates/index.hbs @@ -1,6 +1,6 @@ -{{!--
    Example #1
    +
    Example #1

    Table - Default

    -{{ember-tabular class="table-default" modelName="user" sort=sort2 isColumnSelect=false}} --}} +{{ember-tabular class="table-default" modelName="user" sort=sort2 isColumnSelect=false}}
    Example #2

    Table - Column Select

    @@ -16,8 +16,8 @@ No {{/if}} {{/component}} - {{component et.column property="password" isActive=false isCustom=false filter=false sort=false}} - {{component et.column property="createdAt" isActive=false isCustom=false filter=false sort=false}} + {{component et.column property="password" isCustom=false filter=false sort=false}} + {{component et.column property="createdAt" isCustom=false filter=false sort=false}} {{#component et.column property="updatedAt" label="Last Updated" isCustom=true type="date" as |record column|}} {{#if record.updatedAt}} {{moment-format record.updatedAt "MM/DD/YYYY"}} @@ -37,7 +37,7 @@ {{/component}} {{/ember-tabular}} -{{!--
    Example #3
    +
    Example #3

    Table - Override Columns/Templates

    {{#ember-tabular class="table-override-columns-template" columns=columns modelName="user" record=users as |et|}} {{#component et.column property="username" as |record column|}} @@ -154,8 +154,6 @@ {{component et.column property="checked" selectable=true isCustom=false filter=false sort=false}} {{/ember-tabular}} - --}} -
    Example #8
    {{#link-to "example4" class="link-ex4"}} Route Binds Model to Table From d00dff3cc43a9324d26cc712700bb4ce8a045dd0 Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Mon, 11 Dec 2017 01:55:27 -0500 Subject: [PATCH 096/105] Add test to verify that columnOrder can persist --- tests/acceptance/basic-test.js | 36 ++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/tests/acceptance/basic-test.js b/tests/acceptance/basic-test.js index 7f6c7f9..5cfdbb1 100644 --- a/tests/acceptance/basic-test.js +++ b/tests/acceptance/basic-test.js @@ -730,6 +730,42 @@ test('Check for persistent filters on transition (.table-persist)', function(ass }); }); +test('Check for persistent columnOrder (isActive) on transition (.table-column-select)', function(assert) { + server.loadFixtures('users'); + visit('/'); + + andThen(function() { + assert.equal(currentPath(), 'index'); + assert.equal(find('.table-column-select table thead tr:eq(0) th:last-child').text().trim(), 'Actions', 'Check for last column in table being Actions'); + }); + + andThen(function() { + click('.table-column-select .btn-group-column-select button'); + // click password + click('.table-column-select .btn-group-column-select li:eq(7) a'); + }); + + andThen(function() { + assert.equal(find('.table-column-select table thead tr:eq(0) th:last-child').text().trim(), 'Password', 'Check for last column in table being Password'); + }); + + andThen(function() { + // transition to different page + click('.link-ex4'); + }); + + andThen(function() { + assert.equal(currentPath(), 'example4'); + // transition back to index + click('.link-index'); + }); + + andThen(function() { + assert.equal(currentPath(), 'index'); + assert.equal(find('.table-column-select table thead tr:eq(0) th:last-child').text().trim(), 'Password', 'Check for last column in table being Password'); + }); +}); + test('Check for expected request count when transitioning', function(assert) { server.loadFixtures('users'); visit('/'); From 91dc90801cef9021c4361a4172e6650d3a248eaa Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Mon, 11 Dec 2017 12:20:17 -0500 Subject: [PATCH 097/105] Fix issue that may trigger calling set on destroyed object --- addon/components/ember-tabular.js | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/addon/components/ember-tabular.js b/addon/components/ember-tabular.js index 0deaafb..a5ff121 100644 --- a/addon/components/ember-tabular.js +++ b/addon/components/ember-tabular.js @@ -917,12 +917,16 @@ export default Ember.Component.extend(EmberTabularHelpers, { this.toggleProperty('showFilterRow'); }, registryComplete(value) { - // tells ember-tabular that the custom registry is complete - this.set('registryDone', value); + if (!this.isDestroyed || !this.isDestroying) { + // tells ember-tabular that the custom registry is complete + this.set('registryDone', value); + } }, addToRegistry(column) { - // adds column to registry coming from ember-tabular-column - this.get('registry').addObject(column); + if (!this.isDestroyed || !this.isDestroying) { + // adds column to registry coming from ember-tabular-column + this.get('registry').addObject(column); + } }, }, From b75e52dcf5bd29edc345e18c3c8e7bcbad99998a Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Mon, 7 May 2018 10:22:33 -0400 Subject: [PATCH 098/105] Setup page reset if filter is changed Reference issue #102 --- addon/components/ember-tabular.js | 5 +++++ tests/acceptance/basic-test.js | 36 +++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/addon/components/ember-tabular.js b/addon/components/ember-tabular.js index a5ff121..43c9e7b 100644 --- a/addon/components/ember-tabular.js +++ b/addon/components/ember-tabular.js @@ -834,6 +834,11 @@ export default Ember.Component.extend(EmberTabularHelpers, { } }, + filterChanged: Ember.observer('filter.@each.value', function () { + // reset page to 1 if filter changes + this.set('page', 1); + }), + /** * Constructs the query object to be used in `request`. * diff --git a/tests/acceptance/basic-test.js b/tests/acceptance/basic-test.js index 5cfdbb1..648c3d6 100644 --- a/tests/acceptance/basic-test.js +++ b/tests/acceptance/basic-test.js @@ -84,6 +84,42 @@ test('Check for expected content (.table-column-select)', function(assert) { }); }); +test('Check for pagination reset after filter change (.table-column-select)', function(assert) { + server.createList('user', 25, { + isAdmin: true, + }); + server.createList('user', 5, { + isAdmin: false, + }); + visit('/'); + + andThen(function() { + assert.equal(currentPath(), 'index'); + + click('.table-column-select .pagination li:eq(2) a'); + }); + + andThen(function() { + let request = getPretenderRequest(server, 'GET', 'users')[0]; + assert.equal(request.url, '/users?page%5Blimit%5D=10&page%5Boffset%5D=10&sort=username', 'Expected for offset 10 in URL'); + + assert.equal(find('.table-column-select table tbody tr').length, 10, 'Check for 10 items in table'); + }); + + andThen(function() { + click('.table-override-columns-template table .btn-toggle-filter:eq(0)'); + // filter by is-admin + selectChoose('.table-override-columns-template .ember-tabular-ember-power-select', 'Yes'); + }); + + andThen(function() { + let request = getPretenderRequest(server, 'GET', 'users')[0]; + assert.equal(request.url, '/users?filter%5Bis-admin%5D=true&page%5Blimit%5D=10&page%5Boffset%5D=0&sort=username', 'Expected query params in URL but page is reset to 1, offset 0'); + + assert.equal(find('.table-column-select table tbody tr').length, 10, 'Check for 10 items in table'); + }); +}); + test('Check for hidden column after interacting with column-select component (.table-column-select)', function(assert) { server.loadFixtures('users'); visit('/'); From daff84c6bbe6d6c8d8b834c01ef843a3c86b601c Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Thu, 19 Jul 2018 14:33:28 -0400 Subject: [PATCH 099/105] Setup onFiltering event that fires when an input or dropdown is focused within the thead filters --- addon/components/ember-tabular-filter.js | 3 +++ addon/components/ember-tabular.js | 6 +++++- .../components/ember-tabular-filter.hbs | 3 ++- addon/templates/components/ember-tabular.hbs | 2 +- tests/dummy/app/controllers/index.js | 5 ++++- tests/dummy/app/templates/index.hbs | 2 +- tests/integration/ember-tabular-test.js | 21 +++++++++++++++++++ 7 files changed, 37 insertions(+), 5 deletions(-) diff --git a/addon/components/ember-tabular-filter.js b/addon/components/ember-tabular-filter.js index 526339b..6db6fe6 100644 --- a/addon/components/ember-tabular-filter.js +++ b/addon/components/ember-tabular-filter.js @@ -52,6 +52,9 @@ export default Ember.Component.extend({ this.set('headerFilter', null); } }, + focusFilter() { + this.get('focusFilter')(); + }, }, setHeaderFilter: Ember.on('init', function () { const filter = this.get('filter'); diff --git a/addon/components/ember-tabular.js b/addon/components/ember-tabular.js index 43c9e7b..a14b08e 100644 --- a/addon/components/ember-tabular.js +++ b/addon/components/ember-tabular.js @@ -16,7 +16,7 @@ import EmberTabularHelpers from 'ember-tabular/mixins/components/ember-tabular-h * * @class EmberTabular */ -export default Ember.Component.extend(EmberTabularHelpers, { +export default Ember.Component.extend(Ember.Evented, EmberTabularHelpers, { layout, store: Ember.inject.service('store'), action: null, @@ -933,6 +933,10 @@ export default Ember.Component.extend(EmberTabularHelpers, { this.get('registry').addObject(column); } }, + triggerOnFilterFocus() { + // trigger the event onFiltering + this.trigger('onFiltering'); + }, }, /** diff --git a/addon/templates/components/ember-tabular-filter.hbs b/addon/templates/components/ember-tabular-filter.hbs index 54043dc..2e38c26 100644 --- a/addon/templates/components/ember-tabular-filter.hbs +++ b/addon/templates/components/ember-tabular-filter.hbs @@ -8,11 +8,12 @@ triggerClass="ember-tabular-ember-power-select" allowClear=true onchange=(action "setHeaderFilter") + onfocus=(action "focusFilter") as |option|}} {{option.label}} {{/power-select}} {{else}} - {{input value=headerFilter type=header.type class=(concat "form-control filter " header.type) placeholder=inputPlaceholder}} + {{input value=headerFilter focus-in="focusFilter" type=header.type class=(concat "form-control filter " header.type) placeholder=inputPlaceholder}} {{#if isClearable}} {{/if}} diff --git a/addon/templates/components/ember-tabular.hbs b/addon/templates/components/ember-tabular.hbs index a7f5125..556b6d0 100644 --- a/addon/templates/components/ember-tabular.hbs +++ b/addon/templates/components/ember-tabular.hbs @@ -57,7 +57,7 @@ {{#each columns as |header|}} {{#if header.isActive}} {{#if header.filter}} - {{ember-tabular-filter modelName=modelName columns=columns property=header.property record=record query=query filter=filter header=header}} + {{ember-tabular-filter modelName=modelName columns=columns property=header.property record=record query=query filter=filter header=header focusFilter=(action "triggerOnFilterFocus")}} {{else}} {{!-- Blank to reserve table column --}} {{/if}} diff --git a/tests/dummy/app/controllers/index.js b/tests/dummy/app/controllers/index.js index 4122d31..2acb7bd 100644 --- a/tests/dummy/app/controllers/index.js +++ b/tests/dummy/app/controllers/index.js @@ -1,6 +1,6 @@ import Ember from 'ember'; -export default Ember.Controller.extend({ +export default Ember.Controller.extend(Ember.Evented, { users: null, users2: null, users3: null, @@ -176,4 +176,7 @@ export default Ember.Controller.extend({ } ]; }), + onFiltering: Ember.on('onFiltering', function () { + console.log('detected event from component'); + }), }); diff --git a/tests/dummy/app/templates/index.hbs b/tests/dummy/app/templates/index.hbs index 1644895..efad730 100644 --- a/tests/dummy/app/templates/index.hbs +++ b/tests/dummy/app/templates/index.hbs @@ -1,6 +1,6 @@
    Example #1

    Table - Default

    -{{ember-tabular class="table-default" modelName="user" sort=sort2 isColumnSelect=false}} +{{ember-tabular class="table-default" modelName="user" sort=sort2 isColumnSelect=false onFiltering=onFiltering}}
    Example #2

    Table - Column Select

    diff --git a/tests/integration/ember-tabular-test.js b/tests/integration/ember-tabular-test.js index 74911b6..f9e47cf 100644 --- a/tests/integration/ember-tabular-test.js +++ b/tests/integration/ember-tabular-test.js @@ -1,5 +1,6 @@ import { moduleForComponent, test } from 'ember-qunit'; import hbs from 'htmlbars-inline-precompile'; +import Ember from 'ember'; let record = [ { @@ -320,3 +321,23 @@ test('Do not render specific column', function(assert) { assert.equal($component.find('thead tr th').length, 4, 'Username is hidden, only 4 columns are rendering'); assert.equal($component.find('tbody tr:eq(0) td').length, 4, 'Tbody columns match the thead columns, username is hidden'); }); + +test('Emits onFiltering events', function(assert) { + assert.expect(3); + this.set('columns', columns); + this.set('onFilteringChange', () => { + assert.ok(true, 'onFiltering event was triggered'); + }); + this.render(hbs` + {{ember-tabular columns=columns record=record makeRequest=false isDropdownLimit=false onFiltering=onFilteringChange}} + `); + // Set record after render b/c of component this.reset() + this.set('record', record); + + var $component = this.$(); + assert.equal($component.find('thead tr th:eq(0)').text().trim(), 'Username', 'Username is the first column'); + assert.equal($component.find('thead tr th').length, 7, 'All columns are rendering'); + + $component.find('thead .btn-toggle-filter:eq(0)').click(); + $component.find('thead input:eq(0)').focus(); +}); From 1249e4fd7e23eb522382e01b713952e5f8d0c0af Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Mon, 13 Aug 2018 14:39:06 -0400 Subject: [PATCH 100/105] Setup ember-tabular-thead component to make to easier overriding/extending --- addon/components/ember-tabular-thead.js | 16 + .../components/ember-tabular-thead.hbs | 50 + addon/templates/components/ember-tabular.hbs | 64 +- app/components/ember-tabular-thead.js | 3 + package-lock.json | 12559 ++++++++++++++++ tests/unit/ember-tabular-test.js | 2 +- 6 files changed, 12643 insertions(+), 51 deletions(-) create mode 100644 addon/components/ember-tabular-thead.js create mode 100644 addon/templates/components/ember-tabular-thead.hbs create mode 100644 app/components/ember-tabular-thead.js create mode 100644 package-lock.json diff --git a/addon/components/ember-tabular-thead.js b/addon/components/ember-tabular-thead.js new file mode 100644 index 0000000..e8b07a5 --- /dev/null +++ b/addon/components/ember-tabular-thead.js @@ -0,0 +1,16 @@ +import Ember from 'ember'; +import layout from 'ember-tabular/templates/components/ember-tabular-thead'; + +/** +* +* @class EmberTabularThead +*/ +export default Ember.Component.extend({ + /** + * @property tagName + * @type String + * @default '' + */ + tagName: '', + layout +}); diff --git a/addon/templates/components/ember-tabular-thead.hbs b/addon/templates/components/ember-tabular-thead.hbs new file mode 100644 index 0000000..304ccdc --- /dev/null +++ b/addon/templates/components/ember-tabular-thead.hbs @@ -0,0 +1,50 @@ +{{#if columns}} + + + {{#each columns as |header|}} + {{#if header.isActive}} + {{#if header.property}} + + {{#if header.filter}} + + {{/if}} + {{#if header.sort}} +
    + {{header.label}} +
    + {{else if header.selectable}} +
    + +
    + {{else}} +
    + {{header.label}} +
    + {{/if}} + + {{else}} + {{header.label}} + {{/if}} + {{/if}} + {{/each}} + + {{#if isColumnFilters}} + {{#if showFilterRow}} + + {{#each columns as |header|}} + {{#if header.isActive}} + {{#if header.filter}} + {{ember-tabular-filter modelName=modelName columns=columns property=header.property record=record query=query filter=filter header=header focusFilter=focusFilter}} + {{else}} + {{!-- Blank to reserve table column --}} + {{/if}} + {{/if}} + {{/each}} + + {{/if}} + {{/if}} + +{{/if}} \ No newline at end of file diff --git a/addon/templates/components/ember-tabular.hbs b/addon/templates/components/ember-tabular.hbs index 556b6d0..251a58a 100644 --- a/addon/templates/components/ember-tabular.hbs +++ b/addon/templates/components/ember-tabular.hbs @@ -18,56 +18,20 @@
    {{yield wrapperHeader}} - {{#if columns}} - - - {{#each columns as |header|}} - {{#if header.isActive}} - {{#if header.property}} - - {{else}} - - {{/if}} - {{/if}} - {{/each}} - - {{#if isColumnFilters}} - {{#if showFilterRow}} - - {{#each columns as |header|}} - {{#if header.isActive}} - {{#if header.filter}} - {{ember-tabular-filter modelName=modelName columns=columns property=header.property record=record query=query filter=filter header=header focusFilter=(action "triggerOnFilterFocus")}} - {{else}} - - {{/if}} - {{/if}} - {{/each}} - - {{/if}} - {{/if}} - - {{/if}} + {{ember-tabular-thead + columns=columns + isColumnFilters=isColumnFilters + showFilterRow=showFilterRow + sortableClass=sortableClass + modelName=modelName + record=record + query=query + filter=filter + allChecked=allChecked + toggleFilterRow=(action "toggleFilterRow") + sortBy=(action "sortBy") + focusFilter=(action "triggerOnFilterFocus") + }} {{yield (hash column=(component "ember-tabular-column-register" registry=registry columnOrder=columnOrder addToRegistry=(action "addToRegistry")) diff --git a/app/components/ember-tabular-thead.js b/app/components/ember-tabular-thead.js new file mode 100644 index 0000000..cd18947 --- /dev/null +++ b/app/components/ember-tabular-thead.js @@ -0,0 +1,3 @@ +import EmberTabularThead from 'ember-tabular/components/ember-tabular-thead'; + +export default EmberTabularThead; diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..ea93537 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,12559 @@ +{ + "name": "ember-tabular", + "version": "0.2.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@ember-decorators/argument": { + "version": "0.8.15", + "resolved": "https://registry.npmjs.org/@ember-decorators/argument/-/argument-0.8.15.tgz", + "integrity": "sha512-sK5y2Jjwb4v+QzvCRpspeWKnVylYY1+HQ62Di5Ub09SvGm890YHJs72pZwT5wYovkSq0J+UPRkgXwn1eSmyQDQ==", + "requires": { + "babel-plugin-filter-imports": "^1.1.1", + "broccoli-funnel": "^2.0.1", + "ember-cli-babel": "^6.3.0", + "ember-cli-version-checker": "^2.0.0", + "ember-compatibility-helpers": "^1.0.0-beta.2", + "ember-get-config": "^0.2.3", + "ember-source-channel-url": "^1.0.1", + "ember-try": "^0.2.23" + }, + "dependencies": { + "broccoli-funnel": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/broccoli-funnel/-/broccoli-funnel-2.0.1.tgz", + "integrity": "sha512-C8Lnp9TVsSSiZMGEF16C0dCiNg2oJqUKwuZ1K4kVC6qRPG/2Cj/rtB5kRCC9qEbwqhX71bDbfHROx0L3J7zXQg==", + "requires": { + "array-equal": "^1.0.0", + "blank-object": "^1.0.1", + "broccoli-plugin": "^1.3.0", + "debug": "^2.2.0", + "fast-ordered-set": "^1.0.0", + "fs-tree-diff": "^0.5.3", + "heimdalljs": "^0.2.0", + "minimatch": "^3.0.0", + "mkdirp": "^0.5.0", + "path-posix": "^1.0.0", + "rimraf": "^2.4.3", + "symlink-or-copy": "^1.0.0", + "walk-sync": "^0.3.1" + } + } + } + }, + "@ember-decorators/babel-transforms": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@ember-decorators/babel-transforms/-/babel-transforms-2.0.1.tgz", + "integrity": "sha512-+VoryB8dJuzxuepOf8kNs1MXfvhDeGctvaNc26cfnEhiVD2gU1itI+Vwsy1bKVelRST47fy6inON0KgLdUzbgQ==", + "requires": { + "babel-plugin-transform-class-properties": "^6.24.1", + "babel-plugin-transform-decorators-legacy": "^1.3.4", + "ember-cli-babel": "^6.6.0", + "ember-cli-version-checker": "^2.1.0" + } + }, + "@glimmer/compiler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@glimmer/compiler/-/compiler-0.27.0.tgz", + "integrity": "sha1-skBCdSpTFx1cs9mpWinfwPMU7Sw=", + "requires": { + "@glimmer/interfaces": "^0.27.0", + "@glimmer/syntax": "^0.27.0", + "@glimmer/util": "^0.27.0", + "@glimmer/wire-format": "^0.27.0", + "simple-html-tokenizer": "^0.3.0" + } + }, + "@glimmer/di": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@glimmer/di/-/di-0.2.0.tgz", + "integrity": "sha1-c7/Upu5BSKgL8JLopdKbysnUzn4=", + "dev": true + }, + "@glimmer/interfaces": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@glimmer/interfaces/-/interfaces-0.27.0.tgz", + "integrity": "sha1-RzzaPIzKY2mJ+zELT/248U/65ck=", + "requires": { + "@glimmer/wire-format": "^0.27.0" + } + }, + "@glimmer/node": { + "version": "0.25.7", + "resolved": "https://registry.npmjs.org/@glimmer/node/-/node-0.25.7.tgz", + "integrity": "sha1-MD8CuIwAlaJrLZBHf0LuyrdSt+Y=", + "dev": true, + "requires": { + "@glimmer/runtime": "^0.25.7", + "simple-dom": "^0.3.0" + } + }, + "@glimmer/object": { + "version": "0.25.7", + "resolved": "https://registry.npmjs.org/@glimmer/object/-/object-0.25.7.tgz", + "integrity": "sha1-JZTWnTC8+uGCtHxJ++JMx6x4ZsQ=", + "dev": true, + "requires": { + "@glimmer/object-reference": "^0.25.7", + "@glimmer/util": "^0.25.7" + }, + "dependencies": { + "@glimmer/util": { + "version": "0.25.7", + "resolved": "https://registry.npmjs.org/@glimmer/util/-/util-0.25.7.tgz", + "integrity": "sha1-g/djWvn7+3EUyXnol9Uaa5RVdI4=", + "dev": true + } + } + }, + "@glimmer/object-reference": { + "version": "0.25.7", + "resolved": "https://registry.npmjs.org/@glimmer/object-reference/-/object-reference-0.25.7.tgz", + "integrity": "sha1-4d5rqSriLVkMFhQRh+FshmfYE2w=", + "dev": true, + "requires": { + "@glimmer/reference": "^0.25.7", + "@glimmer/util": "^0.25.7" + }, + "dependencies": { + "@glimmer/util": { + "version": "0.25.7", + "resolved": "https://registry.npmjs.org/@glimmer/util/-/util-0.25.7.tgz", + "integrity": "sha1-g/djWvn7+3EUyXnol9Uaa5RVdI4=", + "dev": true + } + } + }, + "@glimmer/reference": { + "version": "0.25.7", + "resolved": "https://registry.npmjs.org/@glimmer/reference/-/reference-0.25.7.tgz", + "integrity": "sha1-EEOM5Zo4ZHkYBhxq4PzUWE1vIdM=", + "dev": true, + "requires": { + "@glimmer/util": "^0.25.7" + }, + "dependencies": { + "@glimmer/util": { + "version": "0.25.7", + "resolved": "https://registry.npmjs.org/@glimmer/util/-/util-0.25.7.tgz", + "integrity": "sha1-g/djWvn7+3EUyXnol9Uaa5RVdI4=", + "dev": true + } + } + }, + "@glimmer/resolver": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@glimmer/resolver/-/resolver-0.4.3.tgz", + "integrity": "sha512-UhX6vlZbWRMq6pCquSC3wfWLM9kO0PhQPD1dZ3XnyZkmsvEE94Cq+EncA9JalUuevKoJrfUFRvrZ0xaz+yar3g==", + "dev": true, + "requires": { + "@glimmer/di": "^0.2.0" + } + }, + "@glimmer/runtime": { + "version": "0.25.7", + "resolved": "https://registry.npmjs.org/@glimmer/runtime/-/runtime-0.25.7.tgz", + "integrity": "sha1-q89XtqqJFD20jLseKbDsKfJ1lqc=", + "dev": true, + "requires": { + "@glimmer/interfaces": "^0.25.7", + "@glimmer/object": "^0.25.7", + "@glimmer/object-reference": "^0.25.7", + "@glimmer/reference": "^0.25.7", + "@glimmer/util": "^0.25.7", + "@glimmer/wire-format": "^0.25.7" + }, + "dependencies": { + "@glimmer/interfaces": { + "version": "0.25.7", + "resolved": "https://registry.npmjs.org/@glimmer/interfaces/-/interfaces-0.25.7.tgz", + "integrity": "sha1-e+udlg9CnggPrKsQFsaMHCRMVQM=", + "dev": true, + "requires": { + "@glimmer/wire-format": "^0.25.7" + } + }, + "@glimmer/util": { + "version": "0.25.7", + "resolved": "https://registry.npmjs.org/@glimmer/util/-/util-0.25.7.tgz", + "integrity": "sha1-g/djWvn7+3EUyXnol9Uaa5RVdI4=", + "dev": true + }, + "@glimmer/wire-format": { + "version": "0.25.7", + "resolved": "https://registry.npmjs.org/@glimmer/wire-format/-/wire-format-0.25.7.tgz", + "integrity": "sha1-1vaOE44RNzmEnuWb4vcDLBMzwRA=", + "dev": true, + "requires": { + "@glimmer/util": "^0.25.7" + } + } + } + }, + "@glimmer/syntax": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@glimmer/syntax/-/syntax-0.27.0.tgz", + "integrity": "sha1-5TEzcnz0Zah4egfH6mYKkWievcI=", + "requires": { + "@glimmer/interfaces": "^0.27.0", + "@glimmer/util": "^0.27.0", + "handlebars": "^4.0.6", + "simple-html-tokenizer": "^0.3.0" + } + }, + "@glimmer/util": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@glimmer/util/-/util-0.27.0.tgz", + "integrity": "sha1-5uJnebS3ztiZ7Ddse5SdDxb5I4M=" + }, + "@glimmer/wire-format": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@glimmer/wire-format/-/wire-format-0.27.0.tgz", + "integrity": "sha1-HRcpgU2le5ny275xj3FFYllISxE=", + "requires": { + "@glimmer/util": "^0.27.0" + } + }, + "@sindresorhus/is": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.7.0.tgz", + "integrity": "sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==" + }, + "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 + }, + "accepts": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", + "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", + "dev": true, + "requires": { + "mime-types": "~2.1.18", + "negotiator": "0.6.1" + } + }, + "acorn": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.5.3.tgz", + "integrity": "sha512-jd5MkIUlbbmb07nXH0DT3y7rDVtkzDi4XZOUVWAer8ajmF/DTSSbl5oNFyDOl/OXA33Bl79+ypHhl2pN20VeOQ==" + }, + "after": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/after/-/after-0.8.1.tgz", + "integrity": "sha1-q11PuIP1loFtNRX495HAr0ht1ic=", + "dev": true + }, + "align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "requires": { + "kind-of": "^3.0.2", + "longest": "^1.0.1", + "repeat-string": "^1.5.2" + } + }, + "alter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/alter/-/alter-0.2.0.tgz", + "integrity": "sha1-x1iICGF1cgNKrmJICvJrHU0cs80=", + "requires": { + "stable": "~0.1.3" + } + }, + "amd-name-resolver": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/amd-name-resolver/-/amd-name-resolver-0.0.7.tgz", + "integrity": "sha1-gUMBrf6KLxCfboTV6TUZbvtmlhU=", + "requires": { + "ensure-posix-path": "^1.0.1" + } + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" + }, + "ansi-escapes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", + "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "ansicolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.2.1.tgz", + "integrity": "sha1-vgiVmQl7dKXJxKhKDNvNtivYeu8=", + "dev": true + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + } + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "dev": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + }, + "dependencies": { + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + } + } + }, + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "^1.0.1" + } + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", + "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=" + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + }, + "array-to-error": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-to-error/-/array-to-error-1.1.1.tgz", + "integrity": "sha1-1ogSkm0UCXogVXmmZ+6vGFakTAc=", + "dev": true, + "requires": { + "array-to-sentence": "^1.1.0" + } + }, + "array-to-sentence": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-to-sentence/-/array-to-sentence-1.1.0.tgz", + "integrity": "sha1-yASVba+lMjJJWyBalFJ1OiWNOfw=", + "dev": true + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "arraybuffer.slice": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz", + "integrity": "sha1-8zshWfBTKj8xB6JywMz70a0peco=", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "ast-traverse": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ast-traverse/-/ast-traverse-0.1.1.tgz", + "integrity": "sha1-ac8rg4bxnc2hux4F1o/jWdiJfeY=" + }, + "ast-types": { + "version": "0.9.6", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.9.6.tgz", + "integrity": "sha1-ECyenpAF0+fjgpvwxPok7oYu6bk=" + }, + "async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", + "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", + "requires": { + "lodash": "^4.17.10" + } + }, + "async-disk-cache": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/async-disk-cache/-/async-disk-cache-1.3.3.tgz", + "integrity": "sha512-GyaWSbDAZCltxSobtj1m1ptXa0+zSdjWs3sM4IqnvhoRwMDHW5786sXQ1RiXbR3ZGuQe6NXMB4N0vUmW163cew==", + "requires": { + "debug": "^2.1.3", + "heimdalljs": "^0.2.3", + "istextorbinary": "2.1.0", + "mkdirp": "^0.5.0", + "rimraf": "^2.5.3", + "rsvp": "^3.0.18", + "username-sync": "1.0.1" + } + }, + "async-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", + "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", + "dev": true + }, + "async-promise-queue": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/async-promise-queue/-/async-promise-queue-1.0.4.tgz", + "integrity": "sha512-GQ5X3DT+TefYuFPHdvIPXFTlKnh39U7dwtl+aUBGeKjMea9nBpv3c91DXgeyBQmY07vQ97f3Sr9XHqkamEameQ==", + "requires": { + "async": "^2.4.1", + "debug": "^2.6.8" + } + }, + "atob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.1.tgz", + "integrity": "sha1-ri1acpR38onWDdf5amMUoi3Wwio=", + "dev": true + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "requires": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + } + }, + "babel-core": { + "version": "6.26.3", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", + "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", + "requires": { + "babel-code-frame": "^6.26.0", + "babel-generator": "^6.26.0", + "babel-helpers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-register": "^6.26.0", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "convert-source-map": "^1.5.1", + "debug": "^2.6.9", + "json5": "^0.5.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.4", + "path-is-absolute": "^1.0.1", + "private": "^0.1.8", + "slash": "^1.0.0", + "source-map": "^0.5.7" + } + }, + "babel-generator": { + "version": "6.26.1", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", + "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", + "requires": { + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "detect-indent": "^4.0.0", + "jsesc": "^1.3.0", + "lodash": "^4.17.4", + "source-map": "^0.5.7", + "trim-right": "^1.0.1" + }, + "dependencies": { + "jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=" + } + } + }, + "babel-helper-builder-binary-assignment-operator-visitor": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", + "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", + "requires": { + "babel-helper-explode-assignable-expression": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-helper-call-delegate": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", + "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", + "requires": { + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-define-map": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", + "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", + "requires": { + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" + } + }, + "babel-helper-explode-assignable-expression": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", + "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", + "requires": { + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", + "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", + "requires": { + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-get-function-arity": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", + "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-helper-hoist-variables": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", + "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-helper-optimise-call-expression": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", + "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-helper-regex": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", + "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", + "requires": { + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" + } + }, + "babel-helper-remap-async-to-generator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", + "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", + "requires": { + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-replace-supers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", + "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", + "requires": { + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helpers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", + "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", + "requires": { + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-check-es2015-constants": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", + "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-constant-folding": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-plugin-constant-folding/-/babel-plugin-constant-folding-1.0.1.tgz", + "integrity": "sha1-g2HTZMmORJw2kr26Ue/whEKQqo4=" + }, + "babel-plugin-dead-code-elimination": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/babel-plugin-dead-code-elimination/-/babel-plugin-dead-code-elimination-1.0.2.tgz", + "integrity": "sha1-X3xFEnTc18zNv7s+C4XdKBIfD2U=" + }, + "babel-plugin-debug-macros": { + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/babel-plugin-debug-macros/-/babel-plugin-debug-macros-0.1.11.tgz", + "integrity": "sha512-hZw5qNNGAR02Y+yBUrtsnJHh8OXavkayPRqKGAXnIm4t5rWVpj3ArwsC7TWdpZsBguQvHAeyTxZ7s23yY60HHg==", + "requires": { + "semver": "^5.3.0" + } + }, + "babel-plugin-ember-modules-api-polyfill": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/babel-plugin-ember-modules-api-polyfill/-/babel-plugin-ember-modules-api-polyfill-2.3.0.tgz", + "integrity": "sha512-cv5ZimF5X52uW7Ul83UUxtsFZE6rZYkMv6qWnAeiDLT1/KtpVrTkJpwzDlvJ/FhKJZ43ih4GbFbhuhBKKT7vIw==", + "requires": { + "ember-rfc176-data": "^0.3.0" + } + }, + "babel-plugin-eval": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-plugin-eval/-/babel-plugin-eval-1.0.1.tgz", + "integrity": "sha1-ovrtJc5r5preS/7CY/cBaRlZUNo=" + }, + "babel-plugin-feature-flags": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/babel-plugin-feature-flags/-/babel-plugin-feature-flags-0.3.1.tgz", + "integrity": "sha1-nIJ8+aTrmhn3JcyyOehcqwIDb8E=", + "dev": true + }, + "babel-plugin-filter-imports": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/babel-plugin-filter-imports/-/babel-plugin-filter-imports-1.1.2.tgz", + "integrity": "sha512-BpXJV3fndKEP1D9Yhwpz4NIjM/d1FYpdx4E4KmUPnTIFUxXNj0QEAY18MXVzEyYi2EWEVhoOG2CmclDfdMj5ew==", + "requires": { + "babel-types": "^6.26.0", + "lodash": "^4.17.10" + } + }, + "babel-plugin-htmlbars-inline-precompile": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/babel-plugin-htmlbars-inline-precompile/-/babel-plugin-htmlbars-inline-precompile-0.2.4.tgz", + "integrity": "sha1-VLSBaEMrvAPx8m8ukJDLIivHjHU=" + }, + "babel-plugin-inline-environment-variables": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-plugin-inline-environment-variables/-/babel-plugin-inline-environment-variables-1.0.1.tgz", + "integrity": "sha1-H1jOkSB61qgmqL9kX6/mj/X+P/4=" + }, + "babel-plugin-jscript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/babel-plugin-jscript/-/babel-plugin-jscript-1.0.4.tgz", + "integrity": "sha1-jzQsOCduh6R9X6CovT1etsytj8w=" + }, + "babel-plugin-member-expression-literals": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-plugin-member-expression-literals/-/babel-plugin-member-expression-literals-1.0.1.tgz", + "integrity": "sha1-zF7bD6qNyScXDnTW0cAkQAIWJNM=" + }, + "babel-plugin-property-literals": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-plugin-property-literals/-/babel-plugin-property-literals-1.0.1.tgz", + "integrity": "sha1-AlIwGQAZKYCxwRjv6kjOk6q4MzY=" + }, + "babel-plugin-proto-to-assign": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/babel-plugin-proto-to-assign/-/babel-plugin-proto-to-assign-1.0.4.tgz", + "integrity": "sha1-xJ56/QL1d7xNoF6i3wAiUM980SM=", + "requires": { + "lodash": "^3.9.3" + }, + "dependencies": { + "lodash": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=" + } + } + }, + "babel-plugin-react-constant-elements": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/babel-plugin-react-constant-elements/-/babel-plugin-react-constant-elements-1.0.3.tgz", + "integrity": "sha1-lGc26DeEKcvDSdz/YvUcFDs041o=" + }, + "babel-plugin-react-display-name": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/babel-plugin-react-display-name/-/babel-plugin-react-display-name-1.0.3.tgz", + "integrity": "sha1-dU/jiSboQkpOexWrbqYTne4FFPw=" + }, + "babel-plugin-remove-console": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-plugin-remove-console/-/babel-plugin-remove-console-1.0.1.tgz", + "integrity": "sha1-2PJFVsOgUAXUKqqv0neH9T/wE6c=" + }, + "babel-plugin-remove-debugger": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-plugin-remove-debugger/-/babel-plugin-remove-debugger-1.0.1.tgz", + "integrity": "sha1-/S6jzWGkKK0fO5yJiC/0KT6MFMc=" + }, + "babel-plugin-runtime": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/babel-plugin-runtime/-/babel-plugin-runtime-1.0.7.tgz", + "integrity": "sha1-v3x9lm3Vbs1cF/ocslPJrLflSq8=" + }, + "babel-plugin-syntax-async-functions": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", + "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=" + }, + "babel-plugin-syntax-class-properties": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz", + "integrity": "sha1-1+sjt5oxf4VDlixQW4J8fWysJ94=" + }, + "babel-plugin-syntax-decorators": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz", + "integrity": "sha1-MSVjtNvePMgGzuPkFszurd0RrAs=" + }, + "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", + "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=" + }, + "babel-plugin-syntax-trailing-function-commas": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", + "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=" + }, + "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", + "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", + "requires": { + "babel-helper-remap-async-to-generator": "^6.24.1", + "babel-plugin-syntax-async-functions": "^6.8.0", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-class-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz", + "integrity": "sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=", + "requires": { + "babel-helper-function-name": "^6.24.1", + "babel-plugin-syntax-class-properties": "^6.8.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-decorators-legacy": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-decorators-legacy/-/babel-plugin-transform-decorators-legacy-1.3.4.tgz", + "integrity": "sha1-dBtY9sW86eYCfgiC2cmU8E82aSU=", + "requires": { + "babel-plugin-syntax-decorators": "^6.1.18", + "babel-runtime": "^6.2.0", + "babel-template": "^6.3.0" + } + }, + "babel-plugin-transform-es2015-arrow-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", + "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-block-scoped-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", + "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-block-scoping": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", + "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", + "requires": { + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" + } + }, + "babel-plugin-transform-es2015-classes": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", + "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", + "requires": { + "babel-helper-define-map": "^6.24.1", + "babel-helper-function-name": "^6.24.1", + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-helper-replace-supers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-computed-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", + "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", + "requires": { + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-destructuring": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", + "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-duplicate-keys": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", + "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-for-of": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", + "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", + "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", + "requires": { + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", + "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-modules-amd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", + "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", + "requires": { + "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-modules-commonjs": { + "version": "6.26.2", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz", + "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", + "requires": { + "babel-plugin-transform-strict-mode": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-types": "^6.26.0" + } + }, + "babel-plugin-transform-es2015-modules-systemjs": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", + "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", + "requires": { + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-modules-umd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", + "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", + "requires": { + "babel-plugin-transform-es2015-modules-amd": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-object-super": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", + "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", + "requires": { + "babel-helper-replace-supers": "^6.24.1", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-parameters": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", + "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", + "requires": { + "babel-helper-call-delegate": "^6.24.1", + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-shorthand-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", + "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-spread": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", + "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-sticky-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", + "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", + "requires": { + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-template-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", + "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-typeof-symbol": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", + "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-unicode-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", + "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", + "requires": { + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "regexpu-core": "^2.0.0" + } + }, + "babel-plugin-transform-exponentiation-operator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", + "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", + "requires": { + "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1", + "babel-plugin-syntax-exponentiation-operator": "^6.8.0", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-regenerator": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", + "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", + "requires": { + "regenerator-transform": "^0.10.0" + } + }, + "babel-plugin-transform-strict-mode": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", + "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-undeclared-variables-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/babel-plugin-undeclared-variables-check/-/babel-plugin-undeclared-variables-check-1.0.2.tgz", + "integrity": "sha1-XPGqU52BP/ZOmWQSkK9iCWX2Xe4=", + "requires": { + "leven": "^1.0.2" + } + }, + "babel-plugin-undefined-to-void": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/babel-plugin-undefined-to-void/-/babel-plugin-undefined-to-void-1.1.6.tgz", + "integrity": "sha1-f1eO+LeN+uYAM4XYQXph7aBuL4E=" + }, + "babel-polyfill": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz", + "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=", + "requires": { + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "regenerator-runtime": "^0.10.5" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", + "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=" + } + } + }, + "babel-preset-env": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.7.0.tgz", + "integrity": "sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg==", + "requires": { + "babel-plugin-check-es2015-constants": "^6.22.0", + "babel-plugin-syntax-trailing-function-commas": "^6.22.0", + "babel-plugin-transform-async-to-generator": "^6.22.0", + "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoping": "^6.23.0", + "babel-plugin-transform-es2015-classes": "^6.23.0", + "babel-plugin-transform-es2015-computed-properties": "^6.22.0", + "babel-plugin-transform-es2015-destructuring": "^6.23.0", + "babel-plugin-transform-es2015-duplicate-keys": "^6.22.0", + "babel-plugin-transform-es2015-for-of": "^6.23.0", + "babel-plugin-transform-es2015-function-name": "^6.22.0", + "babel-plugin-transform-es2015-literals": "^6.22.0", + "babel-plugin-transform-es2015-modules-amd": "^6.22.0", + "babel-plugin-transform-es2015-modules-commonjs": "^6.23.0", + "babel-plugin-transform-es2015-modules-systemjs": "^6.23.0", + "babel-plugin-transform-es2015-modules-umd": "^6.23.0", + "babel-plugin-transform-es2015-object-super": "^6.22.0", + "babel-plugin-transform-es2015-parameters": "^6.23.0", + "babel-plugin-transform-es2015-shorthand-properties": "^6.22.0", + "babel-plugin-transform-es2015-spread": "^6.22.0", + "babel-plugin-transform-es2015-sticky-regex": "^6.22.0", + "babel-plugin-transform-es2015-template-literals": "^6.22.0", + "babel-plugin-transform-es2015-typeof-symbol": "^6.23.0", + "babel-plugin-transform-es2015-unicode-regex": "^6.22.0", + "babel-plugin-transform-exponentiation-operator": "^6.22.0", + "babel-plugin-transform-regenerator": "^6.22.0", + "browserslist": "^3.2.6", + "invariant": "^2.2.2", + "semver": "^5.3.0" + } + }, + "babel-register": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", + "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", + "requires": { + "babel-core": "^6.26.0", + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "home-or-tmp": "^2.0.0", + "lodash": "^4.17.4", + "mkdirp": "^0.5.1", + "source-map-support": "^0.4.15" + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "requires": { + "babel-runtime": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "lodash": "^4.17.4" + } + }, + "babel-traverse": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "requires": { + "babel-code-frame": "^6.26.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "debug": "^2.6.8", + "globals": "^9.18.0", + "invariant": "^2.2.2", + "lodash": "^4.17.4" + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "requires": { + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + } + }, + "babel6-plugin-strip-class-callcheck": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/babel6-plugin-strip-class-callcheck/-/babel6-plugin-strip-class-callcheck-6.0.0.tgz", + "integrity": "sha1-3oQcGr6705943gr/ssmlLuIo/d8=", + "dev": true + }, + "babel6-plugin-strip-heimdall": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/babel6-plugin-strip-heimdall/-/babel6-plugin-strip-heimdall-6.0.1.tgz", + "integrity": "sha1-NfgO3ewff//cAJgR371G2ZZQcrY=", + "dev": true + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==" + }, + "backbone": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/backbone/-/backbone-1.3.3.tgz", + "integrity": "sha1-TMgOp8sWMaxHSInOQPL4vGg7KZk=", + "dev": true, + "requires": { + "underscore": ">=1.8.3" + } + }, + "backo2": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", + "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "base64-arraybuffer": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", + "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=", + "dev": true + }, + "base64id": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-0.1.0.tgz", + "integrity": "sha1-As4P3u4M709ACA4ec+g08LG/zj8=", + "dev": true + }, + "basic-auth": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.0.tgz", + "integrity": "sha1-AV2z81PgLlY3d1X5YnQuiYHnu7o=", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", + "dev": true + } + } + }, + "better-assert": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", + "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", + "dev": true, + "requires": { + "callsite": "1.0.0" + } + }, + "binary-extensions": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz", + "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=", + "dev": true + }, + "binaryextensions": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/binaryextensions/-/binaryextensions-2.1.1.tgz", + "integrity": "sha512-XBaoWE9RW8pPdPQNibZsW2zh8TW6gcarXp1FZPwT8Uop8ScSNldJEWf2k9l3HeTqdrEwsOsFcq74RiJECW34yA==" + }, + "blank-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/blank-object/-/blank-object-1.0.2.tgz", + "integrity": "sha1-+ZB5P76ajI3QE/syGUIL7IHV9Lk=" + }, + "blob": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz", + "integrity": "sha1-vPEwUspURj8w+fx+lbmkdjCpSSE=", + "dev": true + }, + "bluebird": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.11.0.tgz", + "integrity": "sha1-U0uQM8AiyVecVro7Plpcqvu2UOE=" + }, + "body": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/body/-/body-5.1.0.tgz", + "integrity": "sha1-5LoM5BCkaTYyM2dgnstOZVMSUGk=", + "dev": true, + "requires": { + "continuable-cache": "^0.3.1", + "error": "^7.0.0", + "raw-body": "~1.1.0", + "safe-json-parse": "~1.0.1" + }, + "dependencies": { + "bytes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-1.0.0.tgz", + "integrity": "sha1-NWnt6Lo0MV+rmcPpLLBMciDeH6g=", + "dev": true + }, + "raw-body": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-1.1.7.tgz", + "integrity": "sha1-HQJ8K/oRasxmI7yo8AAWVyqH1CU=", + "dev": true, + "requires": { + "bytes": "1", + "string_decoder": "0.10" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, + "body-parser": { + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", + "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", + "dev": true, + "requires": { + "bytes": "3.0.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.1", + "http-errors": "~1.6.2", + "iconv-lite": "0.4.19", + "on-finished": "~2.3.0", + "qs": "6.5.1", + "raw-body": "2.3.2", + "type-is": "~1.6.15" + }, + "dependencies": { + "iconv-lite": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", + "dev": true + } + } + }, + "bower-config": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/bower-config/-/bower-config-1.4.1.tgz", + "integrity": "sha1-hf2d82fCuNu9DKpMXyutQM2Ewsw=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.3", + "mout": "^1.0.0", + "optimist": "^0.6.1", + "osenv": "^0.1.3", + "untildify": "^2.1.0" + } + }, + "bower-endpoint-parser": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/bower-endpoint-parser/-/bower-endpoint-parser-0.2.2.tgz", + "integrity": "sha1-ALVlrb+rby01rd3pd+l5Yqy8s/Y=", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + } + }, + "breakable": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/breakable/-/breakable-1.0.0.tgz", + "integrity": "sha1-eEp5eRWjjq0nutRWtVcstLuqeME=" + }, + "broccoli": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/broccoli/-/broccoli-1.1.4.tgz", + "integrity": "sha1-sCOwKLhm9EftFDQQB5Ye/QP3JRw=", + "dev": true, + "requires": { + "broccoli-node-info": "1.1.0", + "broccoli-slow-trees": "2.0.0", + "broccoli-source": "^1.1.0", + "commander": "^2.5.0", + "connect": "^3.3.3", + "copy-dereference": "^1.0.0", + "findup-sync": "^1.0.0", + "handlebars": "^4.0.4", + "heimdalljs-logger": "^0.1.7", + "mime": "^1.2.11", + "rimraf": "^2.4.3", + "rsvp": "^3.5.0", + "sane": "^1.4.1", + "tmp": "0.0.31", + "underscore.string": "^3.2.2" + }, + "dependencies": { + "broccoli-slow-trees": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/broccoli-slow-trees/-/broccoli-slow-trees-2.0.0.tgz", + "integrity": "sha1-l0Gv6ZJ4et1krsf3yCEd/MBYJ40=", + "dev": true + }, + "findup-sync": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-1.0.0.tgz", + "integrity": "sha1-b35LV7buOkA3tEFOrt6j9Y9x4Ow=", + "dev": true, + "requires": { + "detect-file": "^0.1.0", + "is-glob": "^2.0.1", + "micromatch": "^2.3.7", + "resolve-dir": "^0.1.0" + } + }, + "tmp": { + "version": "0.0.31", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.31.tgz", + "integrity": "sha1-jzirlDjhcxXl29izZX6L+yd65Kc=", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.1" + } + } + } + }, + "broccoli-asset-rev": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/broccoli-asset-rev/-/broccoli-asset-rev-2.5.0.tgz", + "integrity": "sha1-9fZurJYr+fCGKGkh8Orqq20A2Bk=", + "dev": true, + "requires": { + "broccoli-asset-rewrite": "^1.1.0", + "broccoli-filter": "^1.2.2", + "json-stable-stringify": "^1.0.0", + "matcher-collection": "^1.0.1", + "rsvp": "^3.0.6" + } + }, + "broccoli-asset-rewrite": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/broccoli-asset-rewrite/-/broccoli-asset-rewrite-1.1.0.tgz", + "integrity": "sha1-d6XaVhV6oxjFkRMkXouvtGF/iDA=", + "dev": true, + "requires": { + "broccoli-filter": "^1.2.3" + } + }, + "broccoli-babel-transpiler": { + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/broccoli-babel-transpiler/-/broccoli-babel-transpiler-6.4.3.tgz", + "integrity": "sha1-BuOZKY1BcAzcENZ1sdgIqJ72stA=", + "requires": { + "babel-core": "^6.26.0", + "broccoli-funnel": "^2.0.1", + "broccoli-merge-trees": "^2.0.0", + "broccoli-persistent-filter": "^1.4.3", + "clone": "^2.0.0", + "hash-for-dep": "^1.2.3", + "heimdalljs-logger": "^0.1.7", + "json-stable-stringify": "^1.0.0", + "rsvp": "^4.8.2", + "workerpool": "^2.3.0" + }, + "dependencies": { + "broccoli-funnel": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/broccoli-funnel/-/broccoli-funnel-2.0.1.tgz", + "integrity": "sha512-C8Lnp9TVsSSiZMGEF16C0dCiNg2oJqUKwuZ1K4kVC6qRPG/2Cj/rtB5kRCC9qEbwqhX71bDbfHROx0L3J7zXQg==", + "requires": { + "array-equal": "^1.0.0", + "blank-object": "^1.0.1", + "broccoli-plugin": "^1.3.0", + "debug": "^2.2.0", + "fast-ordered-set": "^1.0.0", + "fs-tree-diff": "^0.5.3", + "heimdalljs": "^0.2.0", + "minimatch": "^3.0.0", + "mkdirp": "^0.5.0", + "path-posix": "^1.0.0", + "rimraf": "^2.4.3", + "symlink-or-copy": "^1.0.0", + "walk-sync": "^0.3.1" + } + }, + "rsvp": { + "version": "4.8.2", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.2.tgz", + "integrity": "sha512-8CU1Wjxvzt6bt8zln+hCjyieneU9s0LRW+lPRsjyVCY8Vm1kTbK7btBIrCGg6yY9U4undLDm/b1hKEEi1tLypg==" + } + } + }, + "broccoli-brocfile-loader": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/broccoli-brocfile-loader/-/broccoli-brocfile-loader-0.18.0.tgz", + "integrity": "sha1-LoYCHIBcNP/I0povtyHPJz6Bnks=", + "dev": true, + "requires": { + "findup-sync": "^0.4.2" + } + }, + "broccoli-builder": { + "version": "0.18.14", + "resolved": "https://registry.npmjs.org/broccoli-builder/-/broccoli-builder-0.18.14.tgz", + "integrity": "sha1-S3ni+ETeEaThuBbD9Jxt9HdsMS0=", + "dev": true, + "requires": { + "broccoli-node-info": "^1.1.0", + "heimdalljs": "^0.2.0", + "promise-map-series": "^0.2.1", + "quick-temp": "^0.1.2", + "rimraf": "^2.2.8", + "rsvp": "^3.0.17", + "silent-error": "^1.0.1" + } + }, + "broccoli-caching-writer": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/broccoli-caching-writer/-/broccoli-caching-writer-3.0.3.tgz", + "integrity": "sha1-C9LJapc41qarWQ8HujXFFX19tHY=", + "dev": true, + "requires": { + "broccoli-kitchen-sink-helpers": "^0.3.1", + "broccoli-plugin": "^1.2.1", + "debug": "^2.1.1", + "rimraf": "^2.2.8", + "rsvp": "^3.0.17", + "walk-sync": "^0.3.0" + } + }, + "broccoli-clean-css": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/broccoli-clean-css/-/broccoli-clean-css-1.1.0.tgz", + "integrity": "sha1-nbFD2a9+CuecJuOsWpuy1yDqGfo=", + "dev": true, + "requires": { + "broccoli-persistent-filter": "^1.1.6", + "clean-css-promise": "^0.1.0", + "inline-source-map-comment": "^1.0.5", + "json-stable-stringify": "^1.0.0" + } + }, + "broccoli-concat": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/broccoli-concat/-/broccoli-concat-3.2.2.tgz", + "integrity": "sha1-hv/cUmButZC6n2uJTF7HoBb1t7k=", + "dev": true, + "requires": { + "broccoli-kitchen-sink-helpers": "^0.3.1", + "broccoli-plugin": "^1.3.0", + "broccoli-stew": "^1.3.3", + "ensure-posix-path": "^1.0.2", + "fast-sourcemap-concat": "^1.0.1", + "find-index": "^1.1.0", + "fs-extra": "^1.0.0", + "fs-tree-diff": "^0.5.6", + "lodash.merge": "^4.3.0", + "lodash.omit": "^4.1.0", + "lodash.uniq": "^4.2.0", + "walk-sync": "^0.3.1" + }, + "dependencies": { + "fs-extra": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz", + "integrity": "sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.0" + } + } + } + }, + "broccoli-config-loader": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/broccoli-config-loader/-/broccoli-config-loader-1.0.1.tgz", + "integrity": "sha512-MDKYQ50rxhn+g17DYdfzfEM9DjTuSGu42Db37A8TQHQe8geYEcUZ4SQqZRgzdAI3aRQNlA1yBHJfOeGmOjhLIg==", + "dev": true, + "requires": { + "broccoli-caching-writer": "^3.0.3" + } + }, + "broccoli-config-replace": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/broccoli-config-replace/-/broccoli-config-replace-1.1.2.tgz", + "integrity": "sha1-bqh52SpbrWNNETKbUfxfSq/anAA=", + "dev": true, + "requires": { + "broccoli-kitchen-sink-helpers": "^0.3.1", + "broccoli-plugin": "^1.2.0", + "debug": "^2.2.0", + "fs-extra": "^0.24.0" + }, + "dependencies": { + "fs-extra": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.24.0.tgz", + "integrity": "sha1-1OQ0KpZnXLeEZjOmCZJJMytTmVI=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "path-is-absolute": "^1.0.0", + "rimraf": "^2.2.8" + } + } + } + }, + "broccoli-debug": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/broccoli-debug/-/broccoli-debug-0.6.4.tgz", + "integrity": "sha512-CixMUndBqTljCc26i6ubhBrGbAWXpWBsGJFce6ZOr76Tul2Ev1xxM0tmf7OjSzdYhkr5BrPd/CNbR9VMPi+NBg==", + "requires": { + "broccoli-plugin": "^1.2.1", + "fs-tree-diff": "^0.5.2", + "heimdalljs": "^0.2.1", + "heimdalljs-logger": "^0.1.7", + "symlink-or-copy": "^1.1.8", + "tree-sync": "^1.2.2" + } + }, + "broccoli-file-creator": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/broccoli-file-creator/-/broccoli-file-creator-1.2.0.tgz", + "integrity": "sha512-l9zthHg6bAtnOfRr/ieZ1srRQEsufMZID7xGYRW3aBDv3u/3Eux+Iawl10tAGYE5pL9YB4n5X4vxkp6iNOoZ9g==", + "requires": { + "broccoli-plugin": "^1.1.0", + "mkdirp": "^0.5.1" + } + }, + "broccoli-filter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/broccoli-filter/-/broccoli-filter-1.3.0.tgz", + "integrity": "sha512-VXJXw7eBfG82CFxaBDjYmyN7V72D4In2zwLVQJd/h3mBfF3CMdRTsv2L20lmRTtCv1sAHcB+LgMso90e/KYiLw==", + "requires": { + "broccoli-kitchen-sink-helpers": "^0.3.1", + "broccoli-plugin": "^1.0.0", + "copy-dereference": "^1.0.0", + "debug": "^2.2.0", + "mkdirp": "^0.5.1", + "promise-map-series": "^0.2.1", + "rsvp": "^3.0.18", + "symlink-or-copy": "^1.0.1", + "walk-sync": "^0.3.1" + } + }, + "broccoli-funnel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/broccoli-funnel/-/broccoli-funnel-1.2.0.tgz", + "integrity": "sha1-zdw6/F/xaFqAI0iP/3TOb7WlEpY=", + "requires": { + "array-equal": "^1.0.0", + "blank-object": "^1.0.1", + "broccoli-plugin": "^1.3.0", + "debug": "^2.2.0", + "exists-sync": "0.0.4", + "fast-ordered-set": "^1.0.0", + "fs-tree-diff": "^0.5.3", + "heimdalljs": "^0.2.0", + "minimatch": "^3.0.0", + "mkdirp": "^0.5.0", + "path-posix": "^1.0.0", + "rimraf": "^2.4.3", + "symlink-or-copy": "^1.0.0", + "walk-sync": "^0.3.1" + } + }, + "broccoli-funnel-reducer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/broccoli-funnel-reducer/-/broccoli-funnel-reducer-1.0.0.tgz", + "integrity": "sha1-ETZbKnha7JsXlyo234fu8kxcwOo=", + "dev": true + }, + "broccoli-kitchen-sink-helpers": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/broccoli-kitchen-sink-helpers/-/broccoli-kitchen-sink-helpers-0.3.1.tgz", + "integrity": "sha1-d8fBgZS5ZkFj7E/O4nk0RJJuDAY=", + "requires": { + "glob": "^5.0.10", + "mkdirp": "^0.5.1" + }, + "dependencies": { + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } + } + }, + "broccoli-merge-trees": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/broccoli-merge-trees/-/broccoli-merge-trees-2.0.0.tgz", + "integrity": "sha1-EK6kbdXOvMi499WlTwqEpPC7kLk=", + "requires": { + "broccoli-plugin": "^1.3.0", + "merge-trees": "^1.0.1" + } + }, + "broccoli-middleware": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/broccoli-middleware/-/broccoli-middleware-1.2.1.tgz", + "integrity": "sha1-oh8lX4v+WiHC8PvyQXrd2dJMlDY=", + "dev": true, + "requires": { + "handlebars": "^4.0.4", + "mime-types": "^2.1.18" + } + }, + "broccoli-node-info": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/broccoli-node-info/-/broccoli-node-info-1.1.0.tgz", + "integrity": "sha1-OqLjHgflvbUW3SUhT3xFuhxFlBI=", + "dev": true + }, + "broccoli-persistent-filter": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/broccoli-persistent-filter/-/broccoli-persistent-filter-1.4.3.tgz", + "integrity": "sha512-JwNLDvvXJlhUmr+CHcbVhCyp33NbCIAITjQZmJY9e8QzANXh3jpFWlhSFvkWghwKA8rTAKcXkW12agtiZjxr4g==", + "requires": { + "async-disk-cache": "^1.2.1", + "async-promise-queue": "^1.0.3", + "broccoli-plugin": "^1.0.0", + "fs-tree-diff": "^0.5.2", + "hash-for-dep": "^1.0.2", + "heimdalljs": "^0.2.1", + "heimdalljs-logger": "^0.1.7", + "mkdirp": "^0.5.1", + "promise-map-series": "^0.2.1", + "rimraf": "^2.6.1", + "rsvp": "^3.0.18", + "symlink-or-copy": "^1.0.1", + "walk-sync": "^0.3.1" + } + }, + "broccoli-plugin": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/broccoli-plugin/-/broccoli-plugin-1.3.0.tgz", + "integrity": "sha1-vucEqOQtoIy1jlE6qkNu+38O8e4=", + "requires": { + "promise-map-series": "^0.2.1", + "quick-temp": "^0.1.3", + "rimraf": "^2.3.4", + "symlink-or-copy": "^1.1.8" + } + }, + "broccoli-rollup": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/broccoli-rollup/-/broccoli-rollup-1.3.0.tgz", + "integrity": "sha1-Q6CneYVVurVCFwCetHCk/1oFbfA=", + "dev": true, + "requires": { + "broccoli-plugin": "^1.2.1", + "es6-map": "^0.1.4", + "fs-extra": "^0.30.0", + "fs-tree-diff": "^0.5.2", + "heimdalljs": "^0.2.1", + "heimdalljs-logger": "^0.1.7", + "md5-hex": "^1.3.0", + "node-modules-path": "^1.0.1", + "rollup": "^0.41.4", + "symlink-or-copy": "^1.1.8", + "walk-sync": "^0.3.1" + }, + "dependencies": { + "fs-extra": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", + "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.0", + "path-is-absolute": "^1.0.0", + "rimraf": "^2.2.8" + } + } + } + }, + "broccoli-slow-trees": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/broccoli-slow-trees/-/broccoli-slow-trees-3.0.1.tgz", + "integrity": "sha1-m/Kp4vjrPtOj8qvd6YjaQ3zNybQ=", + "dev": true, + "requires": { + "heimdalljs": "^0.2.1" + } + }, + "broccoli-source": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/broccoli-source/-/broccoli-source-1.1.0.tgz", + "integrity": "sha1-VPDoLItz9GWAy7xPV48LMvyo+Ak=" + }, + "broccoli-sri-hash": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/broccoli-sri-hash/-/broccoli-sri-hash-2.1.2.tgz", + "integrity": "sha1-vGmQXtejga0yXMDQLe0HEyjr8/M=", + "dev": true, + "requires": { + "broccoli-caching-writer": "^2.2.0", + "mkdirp": "^0.5.1", + "rsvp": "^3.1.0", + "sri-toolbox": "^0.2.0", + "symlink-or-copy": "^1.0.1" + }, + "dependencies": { + "broccoli-caching-writer": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/broccoli-caching-writer/-/broccoli-caching-writer-2.3.1.tgz", + "integrity": "sha1-uTz1j5Jk8AMHWGjbBXdPTn8lvQc=", + "dev": true, + "requires": { + "broccoli-kitchen-sink-helpers": "^0.2.5", + "broccoli-plugin": "1.1.0", + "debug": "^2.1.1", + "rimraf": "^2.2.8", + "rsvp": "^3.0.17", + "walk-sync": "^0.2.5" + } + }, + "broccoli-kitchen-sink-helpers": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/broccoli-kitchen-sink-helpers/-/broccoli-kitchen-sink-helpers-0.2.9.tgz", + "integrity": "sha1-peCYbtjXb7WYS2jD8EUNOpbjbsw=", + "dev": true, + "requires": { + "glob": "^5.0.10", + "mkdirp": "^0.5.1" + } + }, + "broccoli-plugin": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/broccoli-plugin/-/broccoli-plugin-1.1.0.tgz", + "integrity": "sha1-c+LPoF+OoeP8FCDEDD2efcckvwI=", + "dev": true, + "requires": { + "promise-map-series": "^0.2.1", + "quick-temp": "^0.1.3", + "rimraf": "^2.3.4", + "symlink-or-copy": "^1.0.1" + } + }, + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "dev": true, + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "walk-sync": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/walk-sync/-/walk-sync-0.2.7.tgz", + "integrity": "sha1-tJvk7mhnZXrrc2l4tWop0Q+jmWk=", + "dev": true, + "requires": { + "ensure-posix-path": "^1.0.0", + "matcher-collection": "^1.0.0" + } + } + } + }, + "broccoli-stew": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/broccoli-stew/-/broccoli-stew-1.5.0.tgz", + "integrity": "sha1-16+MGFEdzlEOSdMIpi5Zd/RhiDw=", + "dev": true, + "requires": { + "broccoli-debug": "^0.6.1", + "broccoli-funnel": "^1.0.1", + "broccoli-merge-trees": "^1.0.0", + "broccoli-persistent-filter": "^1.1.6", + "broccoli-plugin": "^1.3.0", + "chalk": "^1.1.3", + "debug": "^2.4.0", + "ensure-posix-path": "^1.0.1", + "fs-extra": "^2.0.0", + "minimatch": "^3.0.2", + "resolve": "^1.1.6", + "rsvp": "^3.0.16", + "symlink-or-copy": "^1.1.8", + "walk-sync": "^0.3.0" + }, + "dependencies": { + "broccoli-merge-trees": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/broccoli-merge-trees/-/broccoli-merge-trees-1.2.4.tgz", + "integrity": "sha1-oAFRm7UGfwZYnZGvopQkRaLQ/bU=", + "dev": true, + "requires": { + "broccoli-plugin": "^1.3.0", + "can-symlink": "^1.0.0", + "fast-ordered-set": "^1.0.2", + "fs-tree-diff": "^0.5.4", + "heimdalljs": "^0.2.1", + "heimdalljs-logger": "^0.1.7", + "rimraf": "^2.4.3", + "symlink-or-copy": "^1.0.0" + } + }, + "fs-extra": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-2.1.2.tgz", + "integrity": "sha1-BGxwFjzvmq1GsOSn+kZ/si1x3jU=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0" + } + } + } + }, + "broccoli-string-replace": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/broccoli-string-replace/-/broccoli-string-replace-0.1.2.tgz", + "integrity": "sha1-HtkvhWgK+NUDAjkl51Tk4zZ2uR8=", + "dev": true, + "requires": { + "broccoli-persistent-filter": "^1.1.5", + "minimatch": "^3.0.3" + } + }, + "broccoli-test-helper": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/broccoli-test-helper/-/broccoli-test-helper-1.2.0.tgz", + "integrity": "sha512-e2Oy3jollR8Vlo40SMYDV8XsGslwznTUGtVTeKfC2teTm+ukCecIj/mXvMLe2H7G4HJbUQqnS5nOQuUOXAZSpA==", + "dev": true, + "requires": { + "broccoli": "^1.1.0", + "fixturify": "^0.3.2", + "fs-tree-diff": "^0.5.6", + "mktemp": "^0.4.0", + "rimraf": "^2.5.4", + "walk-sync": "^0.3.1" + } + }, + "broccoli-uglify-sourcemap": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/broccoli-uglify-sourcemap/-/broccoli-uglify-sourcemap-1.5.2.tgz", + "integrity": "sha1-BPhKsNtTkDH6hozPpWPJky1Qzts=", + "dev": true, + "requires": { + "broccoli-plugin": "^1.2.1", + "debug": "^2.2.0", + "lodash.merge": "^4.5.1", + "matcher-collection": "^1.0.0", + "mkdirp": "^0.5.0", + "source-map-url": "^0.3.0", + "symlink-or-copy": "^1.0.1", + "uglify-js": "^2.7.0", + "walk-sync": "^0.1.3" + }, + "dependencies": { + "walk-sync": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/walk-sync/-/walk-sync-0.1.3.tgz", + "integrity": "sha1-igcmGgC9ps+xviXp8QD61XVG9YM=", + "dev": true + } + } + }, + "broccoli-unwatched-tree": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/broccoli-unwatched-tree/-/broccoli-unwatched-tree-0.1.3.tgz", + "integrity": "sha1-qw+4IPYThFv2eoA7qtgg9oseOq4=", + "dev": true, + "requires": { + "broccoli-source": "^1.1.0" + } + }, + "browserslist": { + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-3.2.8.tgz", + "integrity": "sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==", + "requires": { + "caniuse-lite": "^1.0.30000844", + "electron-to-chromium": "^1.3.47" + } + }, + "bser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.0.0.tgz", + "integrity": "sha1-mseNPtXZFYBP2HrLFYvHlxR6Fxk=", + "dev": true, + "requires": { + "node-int64": "^0.4.0" + } + }, + "buffer-from": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.0.tgz", + "integrity": "sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ==", + "dev": true + }, + "builtins": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", + "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=", + "dev": true + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "cacheable-request": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-2.1.4.tgz", + "integrity": "sha1-DYCIAbY0KtM8kd+dC0TcCbkeXD0=", + "requires": { + "clone-response": "1.0.2", + "get-stream": "3.0.0", + "http-cache-semantics": "3.8.1", + "keyv": "3.0.0", + "lowercase-keys": "1.0.0", + "normalize-url": "2.0.1", + "responselike": "1.0.2" + }, + "dependencies": { + "lowercase-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", + "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=" + } + } + }, + "calculate-cache-key-for-tree": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/calculate-cache-key-for-tree/-/calculate-cache-key-for-tree-1.1.0.tgz", + "integrity": "sha1-DD5CycE088neU1jA8WeTYn6pdtY=", + "dev": true, + "requires": { + "json-stable-stringify": "^1.0.1" + } + }, + "callsite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", + "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=", + "dev": true + }, + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=" + }, + "can-symlink": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/can-symlink/-/can-symlink-1.0.0.tgz", + "integrity": "sha1-l7YH2KhLtsbiKLkC2GTstZS50hk=", + "requires": { + "tmp": "0.0.28" + } + }, + "caniuse-lite": { + "version": "1.0.30000846", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000846.tgz", + "integrity": "sha512-qxUOHr5mTaadWH1ap0ueivHd8x42Bnemcn+JutVr7GWmm2bU4zoBhjuv5QdXgALQnnT626lOQros7cCDf8PwCg==" + }, + "capture-exit": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-1.2.0.tgz", + "integrity": "sha1-HF/MSJ/QqwDU8ax64QcuMXP7q28=", + "dev": true, + "requires": { + "rsvp": "^3.3.3" + } + }, + "cardinal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-1.0.0.tgz", + "integrity": "sha1-UOIcGwqjdyn5N33vGWtanOyTLuk=", + "dev": true, + "requires": { + "ansicolors": "~0.2.1", + "redeyed": "~1.0.0" + } + }, + "center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "requires": { + "align-text": "^0.1.3", + "lazy-cache": "^1.0.3" + } + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "charm": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/charm/-/charm-1.0.2.tgz", + "integrity": "sha1-it02cVOm2aWBMxBSxAkJkdqZXjU=", + "dev": true, + "requires": { + "inherits": "^2.0.1" + } + }, + "chokidar": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.6.1.tgz", + "integrity": "sha1-L0RHq16W5Q+z14n9kNTHLg5McMI=", + "dev": true, + "requires": { + "anymatch": "^1.3.0", + "async-each": "^1.0.0", + "fsevents": "^1.0.0", + "glob-parent": "^2.0.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^2.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0" + }, + "dependencies": { + "anymatch": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", + "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", + "dev": true, + "requires": { + "micromatch": "^2.1.5", + "normalize-path": "^2.0.0" + } + } + } + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "clean-base-url": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clean-base-url/-/clean-base-url-1.0.0.tgz", + "integrity": "sha1-yQHPCiC5ckNbDszVLQVoJKQ1G3s=", + "dev": true + }, + "clean-css": { + "version": "3.4.28", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-3.4.28.tgz", + "integrity": "sha1-vxlF6C/ICPVWlebd6uwBQA79A/8=", + "dev": true, + "requires": { + "commander": "2.8.x", + "source-map": "0.4.x" + }, + "dependencies": { + "commander": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", + "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", + "dev": true, + "requires": { + "graceful-readlink": ">= 1.0.0" + } + }, + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, + "clean-css-promise": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/clean-css-promise/-/clean-css-promise-0.1.1.tgz", + "integrity": "sha1-Q/PSyN/LK/BxSBJSzZt2QzwI7ss=", + "dev": true, + "requires": { + "array-to-error": "^1.0.0", + "clean-css": "^3.4.5", + "pinkie-promise": "^2.0.0" + } + }, + "cli-cursor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", + "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", + "dev": true, + "requires": { + "restore-cursor": "^1.0.1" + } + }, + "cli-spinners": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-0.1.2.tgz", + "integrity": "sha1-u3ZNiOGF+54eaiofGXcjGPYF4xw=", + "dev": true + }, + "cli-table": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.1.tgz", + "integrity": "sha1-9TsFJmqLGguTSz0IIebi3FkUriM=", + "dev": true, + "requires": { + "colors": "1.0.3" + }, + "dependencies": { + "colors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", + "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=", + "dev": true + } + } + }, + "cli-table2": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/cli-table2/-/cli-table2-0.2.0.tgz", + "integrity": "sha1-LR738hig54biFFQFYtS9F3/jLZc=", + "requires": { + "colors": "^1.1.2", + "lodash": "^3.10.1", + "string-width": "^1.0.1" + }, + "dependencies": { + "lodash": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=" + } + } + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true + }, + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "requires": { + "center-align": "^0.1.1", + "right-align": "^0.1.1", + "wordwrap": "0.0.2" + } + }, + "clone": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz", + "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=" + }, + "clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "requires": { + "mimic-response": "^1.0.0" + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color-convert": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", + "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", + "requires": { + "color-name": "^1.1.1" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "colors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.0.tgz", + "integrity": "sha512-EDpX3a7wHMWFA7PUHWPHNWqOxIIRSJetuwl0AS5Oi/5FMV8kWm69RTlgm00GKjBO1xFHMtBbL49yRtMMdticBw==", + "optional": true + }, + "commander": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", + "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==" + }, + "common-tags": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz", + "integrity": "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==", + "dev": true + }, + "commoner": { + "version": "0.10.8", + "resolved": "https://registry.npmjs.org/commoner/-/commoner-0.10.8.tgz", + "integrity": "sha1-NPw2cs0kOT6LtH5wyqApOBH08sU=", + "requires": { + "commander": "^2.5.0", + "detective": "^4.3.1", + "glob": "^5.0.15", + "graceful-fs": "^4.1.2", + "iconv-lite": "^0.4.5", + "mkdirp": "^0.5.0", + "private": "^0.1.6", + "q": "^1.1.2", + "recast": "^0.11.17" + }, + "dependencies": { + "esprima": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=" + }, + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "recast": { + "version": "0.11.23", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.11.23.tgz", + "integrity": "sha1-RR/TAEqx5N+bTktmN2sqIZEkYtM=", + "requires": { + "ast-types": "0.9.6", + "esprima": "~3.1.0", + "private": "~0.1.5", + "source-map": "~0.5.0" + } + } + } + }, + "component-bind": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", + "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=", + "dev": true + }, + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "component-inherit": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", + "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", + "dev": true + }, + "compressible": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.13.tgz", + "integrity": "sha1-DRAgq5JLL9tNYnmHXH1tq6a6p6k=", + "dev": true, + "requires": { + "mime-db": ">= 1.33.0 < 2" + } + }, + "compression": { + "version": "1.7.2", + "resolved": "http://registry.npmjs.org/compression/-/compression-1.7.2.tgz", + "integrity": "sha1-qv+81qr4VLROuygDU9WtFlH1mmk=", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "bytes": "3.0.0", + "compressible": "~2.0.13", + "debug": "2.6.9", + "on-headers": "~1.0.1", + "safe-buffer": "5.1.1", + "vary": "~1.1.2" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", + "dev": true + } + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "configstore": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz", + "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==", + "dev": true, + "requires": { + "dot-prop": "^4.1.0", + "graceful-fs": "^4.1.2", + "make-dir": "^1.0.0", + "unique-string": "^1.0.0", + "write-file-atomic": "^2.0.0", + "xdg-basedir": "^3.0.0" + } + }, + "connect": { + "version": "3.6.6", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz", + "integrity": "sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ=", + "dev": true, + "requires": { + "debug": "2.6.9", + "finalhandler": "1.1.0", + "parseurl": "~1.3.2", + "utils-merge": "1.0.1" + }, + "dependencies": { + "finalhandler": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", + "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.1", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.3.1", + "unpipe": "~1.0.0" + } + }, + "statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", + "dev": true + } + } + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "dev": true + }, + "console-ui": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/console-ui/-/console-ui-1.0.3.tgz", + "integrity": "sha1-McUkRhtjQidp+eicFzSV2ROTchw=", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "inquirer": "^1.2.3", + "ora": "^0.2.0", + "through": "^2.3.8" + } + }, + "consolidate": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/consolidate/-/consolidate-0.14.5.tgz", + "integrity": "sha1-WiUEe8dvcwcmZ8jLUsmJiI9JTGM=", + "dev": true, + "requires": { + "bluebird": "^3.1.1" + }, + "dependencies": { + "bluebird": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", + "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==", + "dev": true + } + } + }, + "content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=", + "dev": true + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true + }, + "continuable-cache": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/continuable-cache/-/continuable-cache-0.3.1.tgz", + "integrity": "sha1-vXJ6f67XfnH/OYWskzUakSczrQ8=", + "dev": true + }, + "convert-source-map": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", + "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=" + }, + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, + "copy-dereference": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/copy-dereference/-/copy-dereference-1.0.0.tgz", + "integrity": "sha1-axMYZUIP2BtBO6mUtE02VTERUrY=" + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "core-js": { + "version": "2.5.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", + "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==" + }, + "core-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/core-object/-/core-object-1.1.0.tgz", + "integrity": "sha1-htY5GHM8+doaWq5ynmLAqI5mrQo=" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "crypto-random-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", + "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", + "dev": true + }, + "d": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", + "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", + "dev": true, + "requires": { + "es5-ext": "^0.10.9" + } + }, + "dag-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dag-map/-/dag-map-2.0.2.tgz", + "integrity": "sha1-lxS0ct6CoYQ94vuptodpOMq0TGg=", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" + }, + "decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "requires": { + "mimic-response": "^1.0.0" + } + }, + "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 + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "defined": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" + }, + "defs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/defs/-/defs-1.1.1.tgz", + "integrity": "sha1-siYJ8sehG6ej2xFoBcE5scr/qdI=", + "requires": { + "alter": "~0.2.0", + "ast-traverse": "~0.1.1", + "breakable": "~1.0.0", + "esprima-fb": "~15001.1001.0-dev-harmony-fb", + "simple-fmt": "~0.1.0", + "simple-is": "~0.2.0", + "stringmap": "~0.2.2", + "stringset": "~0.2.1", + "tryor": "~0.1.2", + "yargs": "~3.27.0" + } + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "dev": true + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, + "detect-file": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-0.1.0.tgz", + "integrity": "sha1-STXe39lIhkjgBrASlWbpOGcR6mM=", + "dev": true, + "requires": { + "fs-exists-sync": "^0.1.0" + } + }, + "detect-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "requires": { + "repeating": "^2.0.0" + } + }, + "detective": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/detective/-/detective-4.7.1.tgz", + "integrity": "sha512-H6PmeeUcZloWtdt4DAkFyzFL94arpHr3NOwwmVILFiy+9Qd4JTxxXrzfyGk/lmct2qVGBwTSwSXagqu2BxmWig==", + "requires": { + "acorn": "^5.2.1", + "defined": "^1.0.0" + } + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "dot-prop": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", + "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", + "dev": true, + "requires": { + "is-obj": "^1.0.0" + } + }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" + }, + "editions": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/editions/-/editions-1.3.4.tgz", + "integrity": "sha512-gzao+mxnYDzIysXKMQi/+M1mjy/rjestjg6OPoYTtI+3Izp23oiGZitsl9lPDPiTGXbcSIk1iJWhliSaglxnUg==" + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.48", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.48.tgz", + "integrity": "sha1-07DYWTgUBE4JLs4hCPw6ya6kuQA=" + }, + "ember-ajax": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/ember-ajax/-/ember-ajax-2.5.2.tgz", + "integrity": "sha1-rv1vhgsDq3XJfnPtQQqp43HqiMY=", + "dev": true, + "requires": { + "ember-cli-babel": "^5.1.5" + }, + "dependencies": { + "babel-core": { + "version": "5.8.38", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-5.8.38.tgz", + "integrity": "sha1-H8ruedfmG3ULALjlT238nQr4ZVg=", + "dev": true, + "requires": { + "babel-plugin-constant-folding": "^1.0.1", + "babel-plugin-dead-code-elimination": "^1.0.2", + "babel-plugin-eval": "^1.0.1", + "babel-plugin-inline-environment-variables": "^1.0.1", + "babel-plugin-jscript": "^1.0.4", + "babel-plugin-member-expression-literals": "^1.0.1", + "babel-plugin-property-literals": "^1.0.1", + "babel-plugin-proto-to-assign": "^1.0.3", + "babel-plugin-react-constant-elements": "^1.0.3", + "babel-plugin-react-display-name": "^1.0.3", + "babel-plugin-remove-console": "^1.0.1", + "babel-plugin-remove-debugger": "^1.0.1", + "babel-plugin-runtime": "^1.0.7", + "babel-plugin-undeclared-variables-check": "^1.0.2", + "babel-plugin-undefined-to-void": "^1.1.6", + "babylon": "^5.8.38", + "bluebird": "^2.9.33", + "chalk": "^1.0.0", + "convert-source-map": "^1.1.0", + "core-js": "^1.0.0", + "debug": "^2.1.1", + "detect-indent": "^3.0.0", + "esutils": "^2.0.0", + "fs-readdir-recursive": "^0.1.0", + "globals": "^6.4.0", + "home-or-tmp": "^1.0.0", + "is-integer": "^1.0.4", + "js-tokens": "1.0.1", + "json5": "^0.4.0", + "lodash": "^3.10.0", + "minimatch": "^2.0.3", + "output-file-sync": "^1.1.0", + "path-exists": "^1.0.0", + "path-is-absolute": "^1.0.0", + "private": "^0.1.6", + "regenerator": "0.8.40", + "regexpu": "^1.3.0", + "repeating": "^1.1.2", + "resolve": "^1.1.6", + "shebang-regex": "^1.0.0", + "slash": "^1.0.0", + "source-map": "^0.5.0", + "source-map-support": "^0.2.10", + "to-fast-properties": "^1.0.0", + "trim-right": "^1.0.0", + "try-resolve": "^1.0.0" + } + }, + "babylon": { + "version": "5.8.38", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-5.8.38.tgz", + "integrity": "sha1-7JsSCxG/bM1Bc6GL8hfmC3mFn/0=", + "dev": true + }, + "broccoli-babel-transpiler": { + "version": "5.7.4", + "resolved": "https://registry.npmjs.org/broccoli-babel-transpiler/-/broccoli-babel-transpiler-5.7.4.tgz", + "integrity": "sha512-gI14Pqc4qbmn5RW4SuAmybLiOoYW59D+HzQyhY6WdaGMAjikKBwJN0p17phyvafQ+kvG0mUiMd83lgHLeATnEA==", + "dev": true, + "requires": { + "babel-core": "^5.0.0", + "broccoli-funnel": "^1.0.0", + "broccoli-merge-trees": "^1.0.0", + "broccoli-persistent-filter": "^1.4.2", + "clone": "^0.2.0", + "hash-for-dep": "^1.0.2", + "heimdalljs-logger": "^0.1.7", + "json-stable-stringify": "^1.0.0", + "rsvp": "^3.5.0", + "workerpool": "^2.3.0" + }, + "dependencies": { + "clone": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", + "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", + "dev": true + } + } + }, + "broccoli-merge-trees": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/broccoli-merge-trees/-/broccoli-merge-trees-1.2.4.tgz", + "integrity": "sha1-oAFRm7UGfwZYnZGvopQkRaLQ/bU=", + "dev": true, + "requires": { + "broccoli-plugin": "^1.3.0", + "can-symlink": "^1.0.0", + "fast-ordered-set": "^1.0.2", + "fs-tree-diff": "^0.5.4", + "heimdalljs": "^0.2.1", + "heimdalljs-logger": "^0.1.7", + "rimraf": "^2.4.3", + "symlink-or-copy": "^1.0.0" + } + }, + "core-js": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", + "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=", + "dev": true + }, + "detect-indent": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-3.0.1.tgz", + "integrity": "sha1-ncXl3bzu+DJXZLlFGwK8bVQIT3U=", + "dev": true, + "requires": { + "get-stdin": "^4.0.1", + "minimist": "^1.1.0", + "repeating": "^1.1.0" + } + }, + "ember-cli-babel": { + "version": "5.2.8", + "resolved": "https://registry.npmjs.org/ember-cli-babel/-/ember-cli-babel-5.2.8.tgz", + "integrity": "sha512-Mt9OOB5RaZwjde+LYef8EgwNVCAzsYDv4ktshblaXxr4m/Xm5/7/rxEu42RNrYkoy/qWpT9uhaD+JKK4riMf+w==", + "dev": true, + "requires": { + "broccoli-babel-transpiler": "^5.6.2", + "broccoli-funnel": "^1.0.0", + "clone": "^2.0.0", + "ember-cli-version-checker": "^1.0.2", + "resolve": "^1.1.2" + } + }, + "ember-cli-version-checker": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/ember-cli-version-checker/-/ember-cli-version-checker-1.3.1.tgz", + "integrity": "sha1-C8LRNMgwFC2mS/lieg7e0QthrnI=", + "dev": true, + "requires": { + "semver": "^5.3.0" + } + }, + "globals": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/globals/-/globals-6.4.1.tgz", + "integrity": "sha1-hJgDKzttHMge68X3lpDY/in6v08=", + "dev": true + }, + "home-or-tmp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-1.0.0.tgz", + "integrity": "sha1-S58eQIAMPlDGwn94FnavzOcfOYU=", + "dev": true, + "requires": { + "os-tmpdir": "^1.0.1", + "user-home": "^1.1.1" + } + }, + "js-tokens": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-1.0.1.tgz", + "integrity": "sha1-zENaXIuUrRWst5gxQPyAGCyJrq4=", + "dev": true + }, + "json5": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.4.0.tgz", + "integrity": "sha1-BUNS5MTIDIbAkjh31EneF2pzLI0=", + "dev": true + }, + "lodash": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", + "dev": true + }, + "minimatch": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", + "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", + "dev": true, + "requires": { + "brace-expansion": "^1.0.0" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "repeating": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-1.1.3.tgz", + "integrity": "sha1-PUEUIYh3U3SU+X93+Xhfq4EPpKw=", + "dev": true, + "requires": { + "is-finite": "^1.0.0" + } + }, + "source-map-support": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.2.10.tgz", + "integrity": "sha1-6lo5AKHByyUJagrozFwrSxDe09w=", + "dev": true, + "requires": { + "source-map": "0.1.32" + }, + "dependencies": { + "source-map": { + "version": "0.1.32", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.32.tgz", + "integrity": "sha1-yLbBZ3l7pHQKjqMyUhYv8IWRsmY=", + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + } + } + } + } + } + }, + "ember-ast-helpers": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/ember-ast-helpers/-/ember-ast-helpers-0.3.5.tgz", + "integrity": "sha512-ZtaGAUDvRX13G9D4t4WbTMhcUzqsw6KqhcHreIiZi3ZhRFlSZ3BumgyJ6buDZj+tCBLiQsxRv7l5AY6imqNR6Q==", + "requires": { + "@glimmer/compiler": "^0.27.0", + "@glimmer/syntax": "^0.27.0" + } + }, + "ember-basic-dropdown": { + "version": "0.33.10", + "resolved": "https://registry.npmjs.org/ember-basic-dropdown/-/ember-basic-dropdown-0.33.10.tgz", + "integrity": "sha512-GKByT4DqlbcnvyYInJeiG7S+WVOYkuFN952Gy5ZWoki4cpAhaNMGUXs5yTiDqF6PucwK4m3XPE9aIAp9dN3WlA==", + "requires": { + "ember-cli-babel": "^6.8.2", + "ember-cli-htmlbars": "^2.0.3", + "ember-native-dom-helpers": "^0.5.4", + "ember-wormhole": "^0.5.2" + }, + "dependencies": { + "ember-cli-htmlbars": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/ember-cli-htmlbars/-/ember-cli-htmlbars-2.0.3.tgz", + "integrity": "sha512-oyWtJebOwxAqWZwMc0NKFJ8FJdxVixM7zl0FaXq1vTAG6bOgnU7yAhXEASlaO5f+PptZueZfOpdpvRwZW/Gk1A==", + "requires": { + "broccoli-persistent-filter": "^1.0.3", + "hash-for-dep": "^1.0.2", + "json-stable-stringify": "^1.0.0", + "strip-bom": "^3.0.0" + } + } + } + }, + "ember-cli": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/ember-cli/-/ember-cli-2.15.1.tgz", + "integrity": "sha1-dzrdPMGOUGjxxfQ6d1RO+icS5Hs=", + "dev": true, + "requires": { + "amd-name-resolver": "0.0.7", + "babel-plugin-transform-es2015-modules-amd": "^6.24.0", + "bower-config": "^1.3.0", + "bower-endpoint-parser": "0.2.2", + "broccoli-babel-transpiler": "^6.0.0", + "broccoli-brocfile-loader": "^0.18.0", + "broccoli-builder": "^0.18.8", + "broccoli-concat": "^3.2.2", + "broccoli-config-loader": "^1.0.0", + "broccoli-config-replace": "^1.1.2", + "broccoli-funnel": "^1.0.6", + "broccoli-funnel-reducer": "^1.0.0", + "broccoli-merge-trees": "^2.0.0", + "broccoli-middleware": "^1.0.0", + "broccoli-source": "^1.1.0", + "broccoli-stew": "^1.2.0", + "calculate-cache-key-for-tree": "^1.0.0", + "capture-exit": "^1.1.0", + "chalk": "^1.1.3", + "clean-base-url": "^1.0.0", + "compression": "^1.4.4", + "configstore": "^3.0.0", + "console-ui": "^1.0.2", + "core-object": "^3.1.3", + "dag-map": "^2.0.2", + "deep-freeze": "^0.0.1", + "diff": "^3.2.0", + "ember-cli-broccoli-sane-watcher": "^2.0.4", + "ember-cli-is-package-missing": "^1.0.0", + "ember-cli-legacy-blueprints": "^0.1.2", + "ember-cli-lodash-subset": "^1.0.11", + "ember-cli-normalize-entity-name": "^1.0.0", + "ember-cli-preprocess-registry": "^3.1.0", + "ember-cli-string-utils": "^1.0.0", + "ember-try": "^0.2.15", + "ensure-posix-path": "^1.0.2", + "execa": "^0.7.0", + "exists-sync": "0.0.4", + "exit": "^0.1.2", + "express": "^4.12.3", + "filesize": "^3.1.3", + "find-up": "^2.1.0", + "fs-extra": "^3.0.0", + "fs-tree-diff": "^0.5.2", + "get-caller-file": "^1.0.0", + "git-repo-info": "^1.4.1", + "glob": "7.1.1", + "heimdalljs": "^0.2.3", + "heimdalljs-fs-monitor": "^0.1.0", + "heimdalljs-graph": "^0.3.1", + "heimdalljs-logger": "^0.1.7", + "http-proxy": "^1.9.0", + "inflection": "^1.7.0", + "is-git-url": "^1.0.0", + "isbinaryfile": "^3.0.0", + "js-yaml": "^3.6.1", + "json-stable-stringify": "^1.0.1", + "leek": "0.0.24", + "lodash.template": "^4.2.5", + "markdown-it": "^8.3.0", + "markdown-it-terminal": "0.1.0", + "minimatch": "^3.0.0", + "morgan": "^1.8.1", + "node-modules-path": "^1.0.0", + "nopt": "^3.0.6", + "npm-package-arg": "^4.1.1", + "portfinder": "^1.0.7", + "promise-map-series": "^0.2.1", + "quick-temp": "^0.1.8", + "resolve": "^1.3.0", + "rsvp": "^3.3.3", + "sane": "^1.6.0", + "semver": "^5.1.1", + "silent-error": "^1.0.0", + "sort-package-json": "^1.4.0", + "symlink-or-copy": "^1.1.8", + "temp": "0.8.3", + "testem": "^1.18.0", + "tiny-lr": "^1.0.3", + "tree-sync": "^1.2.1", + "uuid": "^3.0.0", + "validate-npm-package-name": "^3.0.0", + "walk-sync": "^0.3.0", + "yam": "0.0.22" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "core-object": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/core-object/-/core-object-3.1.5.tgz", + "integrity": "sha512-sA2/4+/PZ/KV6CKgjrVrrUVBKCkdDO02CUlQ0YKTQoYUwPYNOtOAcWlbYhd5v/1JqYaA6oZ4sDlOU4ppVw6Wbg==", + "dev": true, + "requires": { + "chalk": "^2.0.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + } + } + }, + "fs-extra": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz", + "integrity": "sha1-N5TzeMWLNC6n27sjCVEJxLO2IpE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^3.0.0", + "universalify": "^0.1.0" + } + }, + "glob": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", + "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.2", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "jsonfile": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", + "integrity": "sha1-pezG9l9T9mLEQVx2daAzHQmS7GY=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "ember-cli-app-version": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ember-cli-app-version/-/ember-cli-app-version-3.0.0.tgz", + "integrity": "sha1-1nozrux70DGH++csVmPa3sTDNoo=", + "dev": true, + "requires": { + "ember-cli-babel": "^6.0.0-beta.7", + "ember-cli-htmlbars": "^1.0.0", + "git-repo-version": "0.4.1" + }, + "dependencies": { + "ember-cli-htmlbars": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/ember-cli-htmlbars/-/ember-cli-htmlbars-1.3.4.tgz", + "integrity": "sha512-5lycG6z35QHr3WZF1OkVvT+N/GGAVuemtM6m8NUgBWoeA2TqOgPFRcI0eRqoLA0HAfe0R2MReKmMI7y1LEM1+w==", + "dev": true, + "requires": { + "broccoli-persistent-filter": "^1.0.3", + "ember-cli-version-checker": "^1.0.2", + "hash-for-dep": "^1.0.2", + "json-stable-stringify": "^1.0.0", + "strip-bom": "^2.0.0" + } + }, + "ember-cli-version-checker": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/ember-cli-version-checker/-/ember-cli-version-checker-1.3.1.tgz", + "integrity": "sha1-C8LRNMgwFC2mS/lieg7e0QthrnI=", + "dev": true, + "requires": { + "semver": "^5.3.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + } + } + }, + "ember-cli-babel": { + "version": "6.8.2", + "resolved": "https://registry.npmjs.org/ember-cli-babel/-/ember-cli-babel-6.8.2.tgz", + "integrity": "sha1-6sJ4WWT0dD9MgVzVPGKI8AzAh9c=", + "requires": { + "amd-name-resolver": "0.0.7", + "babel-plugin-debug-macros": "^0.1.11", + "babel-plugin-ember-modules-api-polyfill": "^2.0.1", + "babel-plugin-transform-es2015-modules-amd": "^6.24.0", + "babel-polyfill": "^6.16.0", + "babel-preset-env": "^1.5.1", + "broccoli-babel-transpiler": "^6.1.2", + "broccoli-debug": "^0.6.2", + "broccoli-funnel": "^1.0.0", + "broccoli-source": "^1.1.0", + "clone": "^2.0.0", + "ember-cli-version-checker": "^2.0.0" + } + }, + "ember-cli-broccoli-sane-watcher": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ember-cli-broccoli-sane-watcher/-/ember-cli-broccoli-sane-watcher-2.1.1.tgz", + "integrity": "sha512-fG2AbvtNVXoV05wf2svN8SoEnpZrMbxL6t7g+a1FSySfe0lkTvF94s8Zwa5fJKyQV8/HyKD8iWQcJGOp3DxPKA==", + "dev": true, + "requires": { + "broccoli-slow-trees": "^3.0.1", + "heimdalljs": "^0.2.1", + "heimdalljs-logger": "^0.1.7", + "rsvp": "^3.0.18", + "sane": "^2.4.1" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "sane": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/sane/-/sane-2.5.2.tgz", + "integrity": "sha1-tNwYYcIbQn6SlQej51HiosuKs/o=", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "capture-exit": "^1.2.0", + "exec-sh": "^0.2.0", + "fb-watchman": "^2.0.0", + "fsevents": "^1.2.3", + "micromatch": "^3.1.4", + "minimist": "^1.1.1", + "walker": "~1.0.5", + "watch": "~0.18.0" + } + } + } + }, + "ember-cli-dependency-checker": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ember-cli-dependency-checker/-/ember-cli-dependency-checker-2.0.0.tgz", + "integrity": "sha1-8vL/FErM50R83n4Khmbb/lApo1U=", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "is-git-url": "^1.0.0", + "semver": "^5.3.0" + } + }, + "ember-cli-get-component-path-option": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ember-cli-get-component-path-option/-/ember-cli-get-component-path-option-1.0.0.tgz", + "integrity": "sha1-DXtZVVni+QUKvtgE8djv8bCLx3E=", + "dev": true + }, + "ember-cli-get-dependency-depth": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ember-cli-get-dependency-depth/-/ember-cli-get-dependency-depth-1.0.0.tgz", + "integrity": "sha1-4K/s+CotUvAPKKtGgpUoGuw2jRE=", + "dev": true + }, + "ember-cli-htmlbars": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ember-cli-htmlbars/-/ember-cli-htmlbars-2.0.1.tgz", + "integrity": "sha1-4eMzx+9MxUbGdzSZZUH9lMpEI8o=", + "requires": { + "broccoli-persistent-filter": "^1.0.3", + "hash-for-dep": "^1.0.2", + "json-stable-stringify": "^1.0.0", + "strip-bom": "^3.0.0" + } + }, + "ember-cli-htmlbars-inline-precompile": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ember-cli-htmlbars-inline-precompile/-/ember-cli-htmlbars-inline-precompile-1.0.0.tgz", + "integrity": "sha512-t4o19OSQN1dfla//dqWL1cZM5dLzaVUyZGFVrR+t1uMcP8ovPXF7+nCWFeKjjvQUqI0NVnUG77IC9THHeKpDjw==", + "requires": { + "babel-plugin-htmlbars-inline-precompile": "^0.2.3", + "ember-cli-version-checker": "^2.0.0", + "hash-for-dep": "^1.0.2", + "heimdalljs-logger": "^0.1.7", + "silent-error": "^1.1.0" + } + }, + "ember-cli-inject-live-reload": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ember-cli-inject-live-reload/-/ember-cli-inject-live-reload-1.7.0.tgz", + "integrity": "sha512-+0zOwJlf4iR5NcvyeU7E7xU1qDfniP/+mXfNTfAEhHO2eE9sjQvasKV84O1sIIyLk2LMIjFPbGt7uv5fQcIGwg==", + "dev": true + }, + "ember-cli-is-package-missing": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ember-cli-is-package-missing/-/ember-cli-is-package-missing-1.0.0.tgz", + "integrity": "sha1-bmGEyvuSY13ZPKbJRrEEKS1OM5A=", + "dev": true + }, + "ember-cli-legacy-blueprints": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/ember-cli-legacy-blueprints/-/ember-cli-legacy-blueprints-0.1.5.tgz", + "integrity": "sha1-k8FcokLsUQfWKor37DD2rFOPOtk=", + "dev": true, + "requires": { + "chalk": "^1.1.1", + "ember-cli-get-component-path-option": "^1.0.0", + "ember-cli-get-dependency-depth": "^1.0.0", + "ember-cli-is-package-missing": "^1.0.0", + "ember-cli-lodash-subset": "^1.0.7", + "ember-cli-normalize-entity-name": "^1.0.0", + "ember-cli-path-utils": "^1.0.0", + "ember-cli-string-utils": "^1.0.0", + "ember-cli-test-info": "^1.0.0", + "ember-cli-valid-component-name": "^1.0.0", + "ember-cli-version-checker": "^1.1.7", + "ember-router-generator": "^1.0.0", + "exists-sync": "0.0.3", + "fs-extra": "^0.24.0", + "inflection": "^1.7.1", + "rsvp": "^3.0.17", + "silent-error": "^1.0.0" + }, + "dependencies": { + "ember-cli-version-checker": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/ember-cli-version-checker/-/ember-cli-version-checker-1.3.1.tgz", + "integrity": "sha1-C8LRNMgwFC2mS/lieg7e0QthrnI=", + "dev": true, + "requires": { + "semver": "^5.3.0" + } + }, + "exists-sync": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/exists-sync/-/exists-sync-0.0.3.tgz", + "integrity": "sha1-uRAAC+27ETs3i4L19adjgQdiLc8=", + "dev": true + }, + "fs-extra": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.24.0.tgz", + "integrity": "sha1-1OQ0KpZnXLeEZjOmCZJJMytTmVI=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "path-is-absolute": "^1.0.0", + "rimraf": "^2.2.8" + } + } + } + }, + "ember-cli-lodash-subset": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/ember-cli-lodash-subset/-/ember-cli-lodash-subset-1.0.12.tgz", + "integrity": "sha1-ry5366XcsNd/MwjTpv19NFD25Tc=", + "dev": true + }, + "ember-cli-mirage": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/ember-cli-mirage/-/ember-cli-mirage-0.3.2.tgz", + "integrity": "sha1-22ct/NRCWAQfGPXp3dTcC2CGHDw=", + "dev": true, + "requires": { + "broccoli-funnel": "^1.0.2", + "broccoli-merge-trees": "^1.1.0", + "broccoli-unwatched-tree": "^0.1.1", + "chalk": "^1.1.1", + "ember-cli-babel": "^5.1.7", + "ember-cli-node-assets": "^0.1.4", + "ember-get-config": "0.2.1", + "ember-inflector": "^2.0.0", + "ember-lodash": "^4.17.3", + "exists-sync": "0.0.3", + "fake-xml-http-request": "^1.4.0", + "faker": "^3.0.0", + "pretender": "^1.4.2", + "route-recognizer": "^0.2.3" + }, + "dependencies": { + "babel-core": { + "version": "5.8.38", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-5.8.38.tgz", + "integrity": "sha1-H8ruedfmG3ULALjlT238nQr4ZVg=", + "dev": true, + "requires": { + "babel-plugin-constant-folding": "^1.0.1", + "babel-plugin-dead-code-elimination": "^1.0.2", + "babel-plugin-eval": "^1.0.1", + "babel-plugin-inline-environment-variables": "^1.0.1", + "babel-plugin-jscript": "^1.0.4", + "babel-plugin-member-expression-literals": "^1.0.1", + "babel-plugin-property-literals": "^1.0.1", + "babel-plugin-proto-to-assign": "^1.0.3", + "babel-plugin-react-constant-elements": "^1.0.3", + "babel-plugin-react-display-name": "^1.0.3", + "babel-plugin-remove-console": "^1.0.1", + "babel-plugin-remove-debugger": "^1.0.1", + "babel-plugin-runtime": "^1.0.7", + "babel-plugin-undeclared-variables-check": "^1.0.2", + "babel-plugin-undefined-to-void": "^1.1.6", + "babylon": "^5.8.38", + "bluebird": "^2.9.33", + "chalk": "^1.0.0", + "convert-source-map": "^1.1.0", + "core-js": "^1.0.0", + "debug": "^2.1.1", + "detect-indent": "^3.0.0", + "esutils": "^2.0.0", + "fs-readdir-recursive": "^0.1.0", + "globals": "^6.4.0", + "home-or-tmp": "^1.0.0", + "is-integer": "^1.0.4", + "js-tokens": "1.0.1", + "json5": "^0.4.0", + "lodash": "^3.10.0", + "minimatch": "^2.0.3", + "output-file-sync": "^1.1.0", + "path-exists": "^1.0.0", + "path-is-absolute": "^1.0.0", + "private": "^0.1.6", + "regenerator": "0.8.40", + "regexpu": "^1.3.0", + "repeating": "^1.1.2", + "resolve": "^1.1.6", + "shebang-regex": "^1.0.0", + "slash": "^1.0.0", + "source-map": "^0.5.0", + "source-map-support": "^0.2.10", + "to-fast-properties": "^1.0.0", + "trim-right": "^1.0.0", + "try-resolve": "^1.0.0" + } + }, + "babylon": { + "version": "5.8.38", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-5.8.38.tgz", + "integrity": "sha1-7JsSCxG/bM1Bc6GL8hfmC3mFn/0=", + "dev": true + }, + "broccoli-babel-transpiler": { + "version": "5.7.4", + "resolved": "https://registry.npmjs.org/broccoli-babel-transpiler/-/broccoli-babel-transpiler-5.7.4.tgz", + "integrity": "sha512-gI14Pqc4qbmn5RW4SuAmybLiOoYW59D+HzQyhY6WdaGMAjikKBwJN0p17phyvafQ+kvG0mUiMd83lgHLeATnEA==", + "dev": true, + "requires": { + "babel-core": "^5.0.0", + "broccoli-funnel": "^1.0.0", + "broccoli-merge-trees": "^1.0.0", + "broccoli-persistent-filter": "^1.4.2", + "clone": "^0.2.0", + "hash-for-dep": "^1.0.2", + "heimdalljs-logger": "^0.1.7", + "json-stable-stringify": "^1.0.0", + "rsvp": "^3.5.0", + "workerpool": "^2.3.0" + }, + "dependencies": { + "clone": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", + "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", + "dev": true + } + } + }, + "broccoli-merge-trees": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/broccoli-merge-trees/-/broccoli-merge-trees-1.2.4.tgz", + "integrity": "sha1-oAFRm7UGfwZYnZGvopQkRaLQ/bU=", + "dev": true, + "requires": { + "broccoli-plugin": "^1.3.0", + "can-symlink": "^1.0.0", + "fast-ordered-set": "^1.0.2", + "fs-tree-diff": "^0.5.4", + "heimdalljs": "^0.2.1", + "heimdalljs-logger": "^0.1.7", + "rimraf": "^2.4.3", + "symlink-or-copy": "^1.0.0" + } + }, + "core-js": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", + "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=", + "dev": true + }, + "detect-indent": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-3.0.1.tgz", + "integrity": "sha1-ncXl3bzu+DJXZLlFGwK8bVQIT3U=", + "dev": true, + "requires": { + "get-stdin": "^4.0.1", + "minimist": "^1.1.0", + "repeating": "^1.1.0" + } + }, + "ember-cli-babel": { + "version": "5.2.8", + "resolved": "https://registry.npmjs.org/ember-cli-babel/-/ember-cli-babel-5.2.8.tgz", + "integrity": "sha512-Mt9OOB5RaZwjde+LYef8EgwNVCAzsYDv4ktshblaXxr4m/Xm5/7/rxEu42RNrYkoy/qWpT9uhaD+JKK4riMf+w==", + "dev": true, + "requires": { + "broccoli-babel-transpiler": "^5.6.2", + "broccoli-funnel": "^1.0.0", + "clone": "^2.0.0", + "ember-cli-version-checker": "^1.0.2", + "resolve": "^1.1.2" + } + }, + "ember-cli-version-checker": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/ember-cli-version-checker/-/ember-cli-version-checker-1.3.1.tgz", + "integrity": "sha1-C8LRNMgwFC2mS/lieg7e0QthrnI=", + "dev": true, + "requires": { + "semver": "^5.3.0" + } + }, + "ember-get-config": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/ember-get-config/-/ember-get-config-0.2.1.tgz", + "integrity": "sha1-oTJczu/LRTTHj8bMsr6Ho/7aaBc=", + "dev": true, + "requires": { + "broccoli-file-creator": "^1.1.1", + "ember-cli-babel": "^5.1.6" + } + }, + "exists-sync": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/exists-sync/-/exists-sync-0.0.3.tgz", + "integrity": "sha1-uRAAC+27ETs3i4L19adjgQdiLc8=", + "dev": true + }, + "globals": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/globals/-/globals-6.4.1.tgz", + "integrity": "sha1-hJgDKzttHMge68X3lpDY/in6v08=", + "dev": true + }, + "home-or-tmp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-1.0.0.tgz", + "integrity": "sha1-S58eQIAMPlDGwn94FnavzOcfOYU=", + "dev": true, + "requires": { + "os-tmpdir": "^1.0.1", + "user-home": "^1.1.1" + } + }, + "js-tokens": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-1.0.1.tgz", + "integrity": "sha1-zENaXIuUrRWst5gxQPyAGCyJrq4=", + "dev": true + }, + "json5": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.4.0.tgz", + "integrity": "sha1-BUNS5MTIDIbAkjh31EneF2pzLI0=", + "dev": true + }, + "lodash": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", + "dev": true + }, + "minimatch": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", + "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", + "dev": true, + "requires": { + "brace-expansion": "^1.0.0" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "repeating": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-1.1.3.tgz", + "integrity": "sha1-PUEUIYh3U3SU+X93+Xhfq4EPpKw=", + "dev": true, + "requires": { + "is-finite": "^1.0.0" + } + }, + "source-map-support": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.2.10.tgz", + "integrity": "sha1-6lo5AKHByyUJagrozFwrSxDe09w=", + "dev": true, + "requires": { + "source-map": "0.1.32" + }, + "dependencies": { + "source-map": { + "version": "0.1.32", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.32.tgz", + "integrity": "sha1-yLbBZ3l7pHQKjqMyUhYv8IWRsmY=", + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + } + } + } + } + } + }, + "ember-cli-moment-shim": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/ember-cli-moment-shim/-/ember-cli-moment-shim-3.1.0.tgz", + "integrity": "sha1-7Go5oNy0ut6vbct0psBbC8V29yE=", + "dev": true, + "requires": { + "broccoli-funnel": "^1.1.0", + "broccoli-merge-trees": "^2.0.0", + "broccoli-stew": "^1.4.0", + "chalk": "^1.1.3", + "ember-cli-babel": "^5.1.7", + "exists-sync": "^0.0.4", + "lodash.defaults": "^4.2.0", + "moment": "^2.18.1", + "moment-timezone": "~0.5.11" + }, + "dependencies": { + "babel-core": { + "version": "5.8.38", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-5.8.38.tgz", + "integrity": "sha1-H8ruedfmG3ULALjlT238nQr4ZVg=", + "dev": true, + "requires": { + "babel-plugin-constant-folding": "^1.0.1", + "babel-plugin-dead-code-elimination": "^1.0.2", + "babel-plugin-eval": "^1.0.1", + "babel-plugin-inline-environment-variables": "^1.0.1", + "babel-plugin-jscript": "^1.0.4", + "babel-plugin-member-expression-literals": "^1.0.1", + "babel-plugin-property-literals": "^1.0.1", + "babel-plugin-proto-to-assign": "^1.0.3", + "babel-plugin-react-constant-elements": "^1.0.3", + "babel-plugin-react-display-name": "^1.0.3", + "babel-plugin-remove-console": "^1.0.1", + "babel-plugin-remove-debugger": "^1.0.1", + "babel-plugin-runtime": "^1.0.7", + "babel-plugin-undeclared-variables-check": "^1.0.2", + "babel-plugin-undefined-to-void": "^1.1.6", + "babylon": "^5.8.38", + "bluebird": "^2.9.33", + "chalk": "^1.0.0", + "convert-source-map": "^1.1.0", + "core-js": "^1.0.0", + "debug": "^2.1.1", + "detect-indent": "^3.0.0", + "esutils": "^2.0.0", + "fs-readdir-recursive": "^0.1.0", + "globals": "^6.4.0", + "home-or-tmp": "^1.0.0", + "is-integer": "^1.0.4", + "js-tokens": "1.0.1", + "json5": "^0.4.0", + "lodash": "^3.10.0", + "minimatch": "^2.0.3", + "output-file-sync": "^1.1.0", + "path-exists": "^1.0.0", + "path-is-absolute": "^1.0.0", + "private": "^0.1.6", + "regenerator": "0.8.40", + "regexpu": "^1.3.0", + "repeating": "^1.1.2", + "resolve": "^1.1.6", + "shebang-regex": "^1.0.0", + "slash": "^1.0.0", + "source-map": "^0.5.0", + "source-map-support": "^0.2.10", + "to-fast-properties": "^1.0.0", + "trim-right": "^1.0.0", + "try-resolve": "^1.0.0" + } + }, + "babylon": { + "version": "5.8.38", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-5.8.38.tgz", + "integrity": "sha1-7JsSCxG/bM1Bc6GL8hfmC3mFn/0=", + "dev": true + }, + "broccoli-babel-transpiler": { + "version": "5.7.4", + "resolved": "https://registry.npmjs.org/broccoli-babel-transpiler/-/broccoli-babel-transpiler-5.7.4.tgz", + "integrity": "sha512-gI14Pqc4qbmn5RW4SuAmybLiOoYW59D+HzQyhY6WdaGMAjikKBwJN0p17phyvafQ+kvG0mUiMd83lgHLeATnEA==", + "dev": true, + "requires": { + "babel-core": "^5.0.0", + "broccoli-funnel": "^1.0.0", + "broccoli-merge-trees": "^1.0.0", + "broccoli-persistent-filter": "^1.4.2", + "clone": "^0.2.0", + "hash-for-dep": "^1.0.2", + "heimdalljs-logger": "^0.1.7", + "json-stable-stringify": "^1.0.0", + "rsvp": "^3.5.0", + "workerpool": "^2.3.0" + }, + "dependencies": { + "broccoli-merge-trees": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/broccoli-merge-trees/-/broccoli-merge-trees-1.2.4.tgz", + "integrity": "sha1-oAFRm7UGfwZYnZGvopQkRaLQ/bU=", + "dev": true, + "requires": { + "broccoli-plugin": "^1.3.0", + "can-symlink": "^1.0.0", + "fast-ordered-set": "^1.0.2", + "fs-tree-diff": "^0.5.4", + "heimdalljs": "^0.2.1", + "heimdalljs-logger": "^0.1.7", + "rimraf": "^2.4.3", + "symlink-or-copy": "^1.0.0" + } + }, + "clone": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", + "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", + "dev": true + } + } + }, + "core-js": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", + "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=", + "dev": true + }, + "detect-indent": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-3.0.1.tgz", + "integrity": "sha1-ncXl3bzu+DJXZLlFGwK8bVQIT3U=", + "dev": true, + "requires": { + "get-stdin": "^4.0.1", + "minimist": "^1.1.0", + "repeating": "^1.1.0" + } + }, + "ember-cli-babel": { + "version": "5.2.8", + "resolved": "https://registry.npmjs.org/ember-cli-babel/-/ember-cli-babel-5.2.8.tgz", + "integrity": "sha512-Mt9OOB5RaZwjde+LYef8EgwNVCAzsYDv4ktshblaXxr4m/Xm5/7/rxEu42RNrYkoy/qWpT9uhaD+JKK4riMf+w==", + "dev": true, + "requires": { + "broccoli-babel-transpiler": "^5.6.2", + "broccoli-funnel": "^1.0.0", + "clone": "^2.0.0", + "ember-cli-version-checker": "^1.0.2", + "resolve": "^1.1.2" + } + }, + "ember-cli-version-checker": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/ember-cli-version-checker/-/ember-cli-version-checker-1.3.1.tgz", + "integrity": "sha1-C8LRNMgwFC2mS/lieg7e0QthrnI=", + "dev": true, + "requires": { + "semver": "^5.3.0" + } + }, + "globals": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/globals/-/globals-6.4.1.tgz", + "integrity": "sha1-hJgDKzttHMge68X3lpDY/in6v08=", + "dev": true + }, + "home-or-tmp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-1.0.0.tgz", + "integrity": "sha1-S58eQIAMPlDGwn94FnavzOcfOYU=", + "dev": true, + "requires": { + "os-tmpdir": "^1.0.1", + "user-home": "^1.1.1" + } + }, + "js-tokens": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-1.0.1.tgz", + "integrity": "sha1-zENaXIuUrRWst5gxQPyAGCyJrq4=", + "dev": true + }, + "json5": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.4.0.tgz", + "integrity": "sha1-BUNS5MTIDIbAkjh31EneF2pzLI0=", + "dev": true + }, + "lodash": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", + "dev": true + }, + "lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=", + "dev": true + }, + "minimatch": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", + "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", + "dev": true, + "requires": { + "brace-expansion": "^1.0.0" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "repeating": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-1.1.3.tgz", + "integrity": "sha1-PUEUIYh3U3SU+X93+Xhfq4EPpKw=", + "dev": true, + "requires": { + "is-finite": "^1.0.0" + } + }, + "source-map-support": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.2.10.tgz", + "integrity": "sha1-6lo5AKHByyUJagrozFwrSxDe09w=", + "dev": true, + "requires": { + "source-map": "0.1.32" + }, + "dependencies": { + "source-map": { + "version": "0.1.32", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.32.tgz", + "integrity": "sha1-yLbBZ3l7pHQKjqMyUhYv8IWRsmY=", + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + } + } + } + } + } + }, + "ember-cli-node-assets": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/ember-cli-node-assets/-/ember-cli-node-assets-0.1.6.tgz", + "integrity": "sha1-ZIiilJBIyAGtbZ4zdTx7zjL8EUY=", + "dev": true, + "requires": { + "broccoli-funnel": "^1.0.1", + "broccoli-merge-trees": "^1.1.1", + "broccoli-unwatched-tree": "^0.1.1", + "debug": "^2.2.0", + "lodash": "^4.5.1", + "resolve": "^1.1.7" + }, + "dependencies": { + "broccoli-merge-trees": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/broccoli-merge-trees/-/broccoli-merge-trees-1.2.4.tgz", + "integrity": "sha1-oAFRm7UGfwZYnZGvopQkRaLQ/bU=", + "dev": true, + "requires": { + "broccoli-plugin": "^1.3.0", + "can-symlink": "^1.0.0", + "fast-ordered-set": "^1.0.2", + "fs-tree-diff": "^0.5.4", + "heimdalljs": "^0.2.1", + "heimdalljs-logger": "^0.1.7", + "rimraf": "^2.4.3", + "symlink-or-copy": "^1.0.0" + } + } + } + }, + "ember-cli-normalize-entity-name": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ember-cli-normalize-entity-name/-/ember-cli-normalize-entity-name-1.0.0.tgz", + "integrity": "sha1-CxT3vLxZmqEXtf3cgeT9A8S61bc=", + "dev": true, + "requires": { + "silent-error": "^1.0.0" + } + }, + "ember-cli-path-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ember-cli-path-utils/-/ember-cli-path-utils-1.0.0.tgz", + "integrity": "sha1-Tjmvi1UwHN3FAXc5t3qAT7ogce0=", + "dev": true + }, + "ember-cli-preprocess-registry": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/ember-cli-preprocess-registry/-/ember-cli-preprocess-registry-3.1.1.tgz", + "integrity": "sha1-OEVsIcTStklFhQz57Gjba6dpKIo=", + "dev": true, + "requires": { + "broccoli-clean-css": "^1.1.0", + "broccoli-funnel": "^1.0.0", + "broccoli-merge-trees": "^1.0.0", + "debug": "^2.2.0", + "ember-cli-lodash-subset": "^1.0.7", + "exists-sync": "0.0.3", + "process-relative-require": "^1.0.0", + "silent-error": "^1.0.0" + }, + "dependencies": { + "broccoli-merge-trees": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/broccoli-merge-trees/-/broccoli-merge-trees-1.2.4.tgz", + "integrity": "sha1-oAFRm7UGfwZYnZGvopQkRaLQ/bU=", + "dev": true, + "requires": { + "broccoli-plugin": "^1.3.0", + "can-symlink": "^1.0.0", + "fast-ordered-set": "^1.0.2", + "fs-tree-diff": "^0.5.4", + "heimdalljs": "^0.2.1", + "heimdalljs-logger": "^0.1.7", + "rimraf": "^2.4.3", + "symlink-or-copy": "^1.0.0" + } + }, + "exists-sync": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/exists-sync/-/exists-sync-0.0.3.tgz", + "integrity": "sha1-uRAAC+27ETs3i4L19adjgQdiLc8=", + "dev": true + } + } + }, + "ember-cli-qunit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/ember-cli-qunit/-/ember-cli-qunit-4.0.0.tgz", + "integrity": "sha1-HwAiRppb1k9ie4ECiAol6U5TOjs=", + "dev": true, + "requires": { + "broccoli-funnel": "^1.0.1", + "broccoli-merge-trees": "^2.0.0", + "ember-cli-babel": "^6.0.0-beta.7", + "ember-cli-test-loader": "^2.0.0", + "ember-cli-version-checker": "^1.1.4", + "ember-qunit": "^2.1.3", + "qunit-notifications": "^0.1.1", + "qunitjs": "^2.0.1", + "resolve": "^1.1.6", + "silent-error": "^1.0.0" + }, + "dependencies": { + "ember-cli-version-checker": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/ember-cli-version-checker/-/ember-cli-version-checker-1.3.1.tgz", + "integrity": "sha1-C8LRNMgwFC2mS/lieg7e0QthrnI=", + "dev": true, + "requires": { + "semver": "^5.3.0" + } + } + } + }, + "ember-cli-shims": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ember-cli-shims/-/ember-cli-shims-1.1.0.tgz", + "integrity": "sha1-DjuKBIvoZbT4HMgdOX/x7rE/dbY=", + "dev": true, + "requires": { + "ember-cli-babel": "^6.0.0-beta.7", + "ember-cli-version-checker": "^1.2.0", + "silent-error": "^1.0.1" + }, + "dependencies": { + "ember-cli-version-checker": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/ember-cli-version-checker/-/ember-cli-version-checker-1.3.1.tgz", + "integrity": "sha1-C8LRNMgwFC2mS/lieg7e0QthrnI=", + "dev": true, + "requires": { + "semver": "^5.3.0" + } + } + } + }, + "ember-cli-sri": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ember-cli-sri/-/ember-cli-sri-2.1.1.tgz", + "integrity": "sha1-lxYgk0pLkYPPeSPMA+F4uDqpB/0=", + "dev": true, + "requires": { + "broccoli-sri-hash": "^2.1.0" + } + }, + "ember-cli-string-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ember-cli-string-utils/-/ember-cli-string-utils-1.1.0.tgz", + "integrity": "sha1-ObZ3/CgF9VFzc1N2/O8njqpEUqE=", + "dev": true + }, + "ember-cli-test-info": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ember-cli-test-info/-/ember-cli-test-info-1.0.0.tgz", + "integrity": "sha1-7U6WDySel1I8+JHkrtIHLOhFd7Q=", + "dev": true, + "requires": { + "ember-cli-string-utils": "^1.0.0" + } + }, + "ember-cli-test-loader": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ember-cli-test-loader/-/ember-cli-test-loader-2.2.0.tgz", + "integrity": "sha512-mlSXX9SciIRwGkFTX6XGyJYp4ry6oCFZRxh5jJ7VH8UXLTNx2ZACtDTwaWtNhYrWXgKyiDUvmD8enD56aePWRA==", + "dev": true, + "requires": { + "ember-cli-babel": "^6.8.1" + } + }, + "ember-cli-uglify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ember-cli-uglify/-/ember-cli-uglify-1.2.0.tgz", + "integrity": "sha1-MgjDK1S8J4MFbouw1c/pu68X/7I=", + "dev": true, + "requires": { + "broccoli-uglify-sourcemap": "^1.0.0" + } + }, + "ember-cli-valid-component-name": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ember-cli-valid-component-name/-/ember-cli-valid-component-name-1.0.0.tgz", + "integrity": "sha1-cVUM44fgIzBl8wswsVEKot++h+8=", + "dev": true, + "requires": { + "silent-error": "^1.0.0" + } + }, + "ember-cli-version-checker": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ember-cli-version-checker/-/ember-cli-version-checker-2.1.2.tgz", + "integrity": "sha512-sjkHGr4IGXnO3EUcY21380Xo9Qf6bC8HWH4D62bVnrQop/8uha5XgMQRoAflMCeH6suMrezQL287JUoYc2smEw==", + "requires": { + "resolve": "^1.3.3", + "semver": "^5.3.0" + } + }, + "ember-compatibility-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ember-compatibility-helpers/-/ember-compatibility-helpers-1.0.0.tgz", + "integrity": "sha512-eXNA6Cl/a1oYFfML6sHLo7o5Yl3afJjvLvcUbfBFB7dsIFjToKAS+KngIrQoZ0xSlfSwlZXxgyTk/toC/14AjA==", + "requires": { + "babel-plugin-debug-macros": "^0.1.11", + "ember-cli-version-checker": "^2.1.1", + "semver": "^5.4.1" + } + }, + "ember-concurrency": { + "version": "0.8.19", + "resolved": "https://registry.npmjs.org/ember-concurrency/-/ember-concurrency-0.8.19.tgz", + "integrity": "sha1-cbnBdboHeGUxACnLS9uIDhfVFV4=", + "requires": { + "babel-core": "^6.24.1", + "ember-cli-babel": "^6.8.2", + "ember-maybe-import-regenerator": "^0.1.5" + } + }, + "ember-data": { + "version": "2.15.3", + "resolved": "https://registry.npmjs.org/ember-data/-/ember-data-2.15.3.tgz", + "integrity": "sha512-fa4tkVhkecNR5vJ+LghSPo/D84t5QnRJhWmd3Surl+MInuvuGt6pwvvyD0hwknd2vAQzkotxri4bnDYXjNIZpQ==", + "dev": true, + "requires": { + "amd-name-resolver": "0.0.7", + "babel-plugin-feature-flags": "^0.3.1", + "babel-plugin-filter-imports": "^0.3.1", + "babel-plugin-transform-es2015-block-scoping": "^6.24.1", + "babel6-plugin-strip-class-callcheck": "^6.0.0", + "babel6-plugin-strip-heimdall": "^6.0.1", + "broccoli-babel-transpiler": "^6.0.0", + "broccoli-debug": "^0.6.2", + "broccoli-file-creator": "^1.0.0", + "broccoli-funnel": "^1.2.0", + "broccoli-merge-trees": "^1.0.0", + "broccoli-rollup": "^1.2.0", + "broccoli-test-helper": "^1.2.0", + "calculate-cache-key-for-tree": "^1.1.0", + "chalk": "^1.1.1", + "co": "^4.6.0", + "common-tags": "^1.4.0", + "ember-cli-babel": "^6.4.1", + "ember-cli-path-utils": "^1.0.0", + "ember-cli-string-utils": "^1.0.0", + "ember-cli-test-info": "^1.0.0", + "ember-cli-version-checker": "^1.1.4", + "ember-inflector": "^2.0.0", + "ember-runtime-enumerable-includes-polyfill": "^2.0.0", + "exists-sync": "0.0.3", + "git-repo-info": "^1.1.2", + "heimdalljs": "^0.3.0", + "inflection": "^1.8.0", + "npm-git-info": "^1.0.0", + "semver": "^5.1.0", + "silent-error": "^1.0.0", + "testem": "1.15.0" + }, + "dependencies": { + "babel-plugin-filter-imports": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/babel-plugin-filter-imports/-/babel-plugin-filter-imports-0.3.1.tgz", + "integrity": "sha1-54WbVohrF13SYWQl0neyGeIJ6os=", + "dev": true + }, + "bluebird": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", + "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==", + "dev": true + }, + "broccoli-merge-trees": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/broccoli-merge-trees/-/broccoli-merge-trees-1.2.4.tgz", + "integrity": "sha1-oAFRm7UGfwZYnZGvopQkRaLQ/bU=", + "dev": true, + "requires": { + "broccoli-plugin": "^1.3.0", + "can-symlink": "^1.0.0", + "fast-ordered-set": "^1.0.2", + "fs-tree-diff": "^0.5.4", + "heimdalljs": "^0.2.1", + "heimdalljs-logger": "^0.1.7", + "rimraf": "^2.4.3", + "symlink-or-copy": "^1.0.0" + }, + "dependencies": { + "heimdalljs": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/heimdalljs/-/heimdalljs-0.2.5.tgz", + "integrity": "sha1-aqVDCO7nk7ZCz/nPlHgURfN3MKw=", + "dev": true, + "requires": { + "rsvp": "~3.2.1" + } + } + } + }, + "ember-cli-version-checker": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/ember-cli-version-checker/-/ember-cli-version-checker-1.3.1.tgz", + "integrity": "sha1-C8LRNMgwFC2mS/lieg7e0QthrnI=", + "dev": true, + "requires": { + "semver": "^5.3.0" + } + }, + "exists-sync": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/exists-sync/-/exists-sync-0.0.3.tgz", + "integrity": "sha1-uRAAC+27ETs3i4L19adjgQdiLc8=", + "dev": true + }, + "heimdalljs": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/heimdalljs/-/heimdalljs-0.3.3.tgz", + "integrity": "sha1-6S0sb3f9RtW/ULYQ0orTF1UFTQs=", + "dev": true, + "requires": { + "rsvp": "~3.2.1" + } + }, + "rsvp": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-3.2.1.tgz", + "integrity": "sha1-B8tKXfJa3Z6Cbrxn3Mn9idsn2Eo=", + "dev": true + }, + "testem": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/testem/-/testem-1.15.0.tgz", + "integrity": "sha1-LjqeesKfFqIPcY6wxLEuekSQBnU=", + "dev": true, + "requires": { + "backbone": "^1.1.2", + "bluebird": "^3.4.6", + "charm": "^1.0.0", + "commander": "^2.6.0", + "consolidate": "^0.14.0", + "cross-spawn": "^5.0.0", + "express": "^4.10.7", + "fireworm": "^0.7.0", + "glob": "^7.0.4", + "http-proxy": "^1.13.1", + "js-yaml": "^3.2.5", + "lodash.assignin": "^4.1.0", + "lodash.clonedeep": "^4.4.1", + "lodash.find": "^4.5.1", + "mkdirp": "^0.5.1", + "mustache": "^2.2.1", + "node-notifier": "^5.0.1", + "npmlog": "^4.0.0", + "printf": "^0.2.3", + "rimraf": "^2.4.4", + "socket.io": "1.6.0", + "spawn-args": "^0.2.0", + "styled_string": "0.0.1", + "tap-parser": "^5.1.0", + "xmldom": "^0.1.19" + } + } + } + }, + "ember-drag-drop": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/ember-drag-drop/-/ember-drag-drop-0.4.5.tgz", + "integrity": "sha1-ELUH6CSZxZEBJuMeIMFQvAR+5n0=", + "requires": { + "ember-cli-babel": "^5.2.4" + }, + "dependencies": { + "babel-core": { + "version": "5.8.38", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-5.8.38.tgz", + "integrity": "sha1-H8ruedfmG3ULALjlT238nQr4ZVg=", + "requires": { + "babel-plugin-constant-folding": "^1.0.1", + "babel-plugin-dead-code-elimination": "^1.0.2", + "babel-plugin-eval": "^1.0.1", + "babel-plugin-inline-environment-variables": "^1.0.1", + "babel-plugin-jscript": "^1.0.4", + "babel-plugin-member-expression-literals": "^1.0.1", + "babel-plugin-property-literals": "^1.0.1", + "babel-plugin-proto-to-assign": "^1.0.3", + "babel-plugin-react-constant-elements": "^1.0.3", + "babel-plugin-react-display-name": "^1.0.3", + "babel-plugin-remove-console": "^1.0.1", + "babel-plugin-remove-debugger": "^1.0.1", + "babel-plugin-runtime": "^1.0.7", + "babel-plugin-undeclared-variables-check": "^1.0.2", + "babel-plugin-undefined-to-void": "^1.1.6", + "babylon": "^5.8.38", + "bluebird": "^2.9.33", + "chalk": "^1.0.0", + "convert-source-map": "^1.1.0", + "core-js": "^1.0.0", + "debug": "^2.1.1", + "detect-indent": "^3.0.0", + "esutils": "^2.0.0", + "fs-readdir-recursive": "^0.1.0", + "globals": "^6.4.0", + "home-or-tmp": "^1.0.0", + "is-integer": "^1.0.4", + "js-tokens": "1.0.1", + "json5": "^0.4.0", + "lodash": "^3.10.0", + "minimatch": "^2.0.3", + "output-file-sync": "^1.1.0", + "path-exists": "^1.0.0", + "path-is-absolute": "^1.0.0", + "private": "^0.1.6", + "regenerator": "0.8.40", + "regexpu": "^1.3.0", + "repeating": "^1.1.2", + "resolve": "^1.1.6", + "shebang-regex": "^1.0.0", + "slash": "^1.0.0", + "source-map": "^0.5.0", + "source-map-support": "^0.2.10", + "to-fast-properties": "^1.0.0", + "trim-right": "^1.0.0", + "try-resolve": "^1.0.0" + } + }, + "babylon": { + "version": "5.8.38", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-5.8.38.tgz", + "integrity": "sha1-7JsSCxG/bM1Bc6GL8hfmC3mFn/0=" + }, + "broccoli-babel-transpiler": { + "version": "5.7.4", + "resolved": "https://registry.npmjs.org/broccoli-babel-transpiler/-/broccoli-babel-transpiler-5.7.4.tgz", + "integrity": "sha512-gI14Pqc4qbmn5RW4SuAmybLiOoYW59D+HzQyhY6WdaGMAjikKBwJN0p17phyvafQ+kvG0mUiMd83lgHLeATnEA==", + "requires": { + "babel-core": "^5.0.0", + "broccoli-funnel": "^1.0.0", + "broccoli-merge-trees": "^1.0.0", + "broccoli-persistent-filter": "^1.4.2", + "clone": "^0.2.0", + "hash-for-dep": "^1.0.2", + "heimdalljs-logger": "^0.1.7", + "json-stable-stringify": "^1.0.0", + "rsvp": "^3.5.0", + "workerpool": "^2.3.0" + }, + "dependencies": { + "clone": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", + "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=" + } + } + }, + "broccoli-merge-trees": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/broccoli-merge-trees/-/broccoli-merge-trees-1.2.4.tgz", + "integrity": "sha1-oAFRm7UGfwZYnZGvopQkRaLQ/bU=", + "requires": { + "broccoli-plugin": "^1.3.0", + "can-symlink": "^1.0.0", + "fast-ordered-set": "^1.0.2", + "fs-tree-diff": "^0.5.4", + "heimdalljs": "^0.2.1", + "heimdalljs-logger": "^0.1.7", + "rimraf": "^2.4.3", + "symlink-or-copy": "^1.0.0" + } + }, + "core-js": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", + "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=" + }, + "detect-indent": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-3.0.1.tgz", + "integrity": "sha1-ncXl3bzu+DJXZLlFGwK8bVQIT3U=", + "requires": { + "get-stdin": "^4.0.1", + "minimist": "^1.1.0", + "repeating": "^1.1.0" + } + }, + "ember-cli-babel": { + "version": "5.2.8", + "resolved": "https://registry.npmjs.org/ember-cli-babel/-/ember-cli-babel-5.2.8.tgz", + "integrity": "sha512-Mt9OOB5RaZwjde+LYef8EgwNVCAzsYDv4ktshblaXxr4m/Xm5/7/rxEu42RNrYkoy/qWpT9uhaD+JKK4riMf+w==", + "requires": { + "broccoli-babel-transpiler": "^5.6.2", + "broccoli-funnel": "^1.0.0", + "clone": "^2.0.0", + "ember-cli-version-checker": "^1.0.2", + "resolve": "^1.1.2" + } + }, + "ember-cli-version-checker": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/ember-cli-version-checker/-/ember-cli-version-checker-1.3.1.tgz", + "integrity": "sha1-C8LRNMgwFC2mS/lieg7e0QthrnI=", + "requires": { + "semver": "^5.3.0" + } + }, + "globals": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/globals/-/globals-6.4.1.tgz", + "integrity": "sha1-hJgDKzttHMge68X3lpDY/in6v08=" + }, + "home-or-tmp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-1.0.0.tgz", + "integrity": "sha1-S58eQIAMPlDGwn94FnavzOcfOYU=", + "requires": { + "os-tmpdir": "^1.0.1", + "user-home": "^1.1.1" + } + }, + "js-tokens": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-1.0.1.tgz", + "integrity": "sha1-zENaXIuUrRWst5gxQPyAGCyJrq4=" + }, + "json5": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.4.0.tgz", + "integrity": "sha1-BUNS5MTIDIbAkjh31EneF2pzLI0=" + }, + "lodash": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=" + }, + "minimatch": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", + "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", + "requires": { + "brace-expansion": "^1.0.0" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "repeating": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-1.1.3.tgz", + "integrity": "sha1-PUEUIYh3U3SU+X93+Xhfq4EPpKw=", + "requires": { + "is-finite": "^1.0.0" + } + }, + "source-map-support": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.2.10.tgz", + "integrity": "sha1-6lo5AKHByyUJagrozFwrSxDe09w=", + "requires": { + "source-map": "0.1.32" + }, + "dependencies": { + "source-map": { + "version": "0.1.32", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.32.tgz", + "integrity": "sha1-yLbBZ3l7pHQKjqMyUhYv8IWRsmY=", + "requires": { + "amdefine": ">=0.0.4" + } + } + } + } + } + }, + "ember-drag-drop-polyfill": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/ember-drag-drop-polyfill/-/ember-drag-drop-polyfill-0.0.2.tgz", + "integrity": "sha1-3onHa2716Uzz7XMdXc0jfDO/j2w=", + "dev": true, + "requires": { + "broccoli-stew": "^1.4.0", + "ember-cli-babel": "6.0.0-beta.9", + "ember-get-config": "^0.2.1" + }, + "dependencies": { + "amd-name-resolver": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/amd-name-resolver/-/amd-name-resolver-0.0.6.tgz", + "integrity": "sha1-0+S6Lfyqsdggwb6d6UfGeCjP5ZU=", + "dev": true, + "requires": { + "ensure-posix-path": "^1.0.1" + } + }, + "ember-cli-babel": { + "version": "6.0.0-beta.9", + "resolved": "https://registry.npmjs.org/ember-cli-babel/-/ember-cli-babel-6.0.0-beta.9.tgz", + "integrity": "sha1-tZfVLxLUQpzVcWtV90nr9hRLexY=", + "dev": true, + "requires": { + "amd-name-resolver": "0.0.6", + "babel-plugin-transform-es2015-modules-amd": "^6.24.0", + "babel-polyfill": "^6.16.0", + "babel-preset-env": "^1.2.0", + "broccoli-babel-transpiler": "^6.0.0", + "broccoli-funnel": "^1.0.0", + "broccoli-source": "^1.1.0", + "clone": "^2.0.0", + "ember-cli-version-checker": "^1.2.0" + } + }, + "ember-cli-version-checker": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/ember-cli-version-checker/-/ember-cli-version-checker-1.3.1.tgz", + "integrity": "sha1-C8LRNMgwFC2mS/lieg7e0QthrnI=", + "dev": true, + "requires": { + "semver": "^5.3.0" + } + } + } + }, + "ember-export-application-global": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ember-export-application-global/-/ember-export-application-global-2.0.0.tgz", + "integrity": "sha1-jW12GayKGj+MQwA1Sesh6+1oW9I=", + "dev": true, + "requires": { + "ember-cli-babel": "^6.0.0-beta.7" + } + }, + "ember-font-awesome": { + "version": "4.0.0-rc.4", + "resolved": "https://registry.npmjs.org/ember-font-awesome/-/ember-font-awesome-4.0.0-rc.4.tgz", + "integrity": "sha1-fUt/u0AeIa/rcGjLtCrI2KhIc/c=", + "requires": { + "@ember-decorators/argument": "^0.8.13", + "@ember-decorators/babel-transforms": "^2.0.1", + "broccoli-filter": "^1.2.4", + "broccoli-funnel": "^2.0.1", + "chalk": "^2.3.0", + "ember-ast-helpers": "0.3.5", + "ember-cli-babel": "^6.11.0", + "ember-cli-htmlbars": "^2.0.2", + "font-awesome": "^4.7.0", + "fs-readdir-recursive": "^1.1.0", + "postcss": "^6.0.14", + "sync-disk-cache": "^1.3.2" + }, + "dependencies": { + "amd-name-resolver": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/amd-name-resolver/-/amd-name-resolver-1.2.0.tgz", + "integrity": "sha512-hlSTWGS1t6/xq5YCed7YALg7tKZL3rkl7UwEZ/eCIkn8JxmM6fU6Qs/1hwtjQqfuYxlffuUcgYEm0f5xP4YKaA==", + "requires": { + "ensure-posix-path": "^1.0.1" + } + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "broccoli-funnel": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/broccoli-funnel/-/broccoli-funnel-2.0.1.tgz", + "integrity": "sha512-C8Lnp9TVsSSiZMGEF16C0dCiNg2oJqUKwuZ1K4kVC6qRPG/2Cj/rtB5kRCC9qEbwqhX71bDbfHROx0L3J7zXQg==", + "requires": { + "array-equal": "^1.0.0", + "blank-object": "^1.0.1", + "broccoli-plugin": "^1.3.0", + "debug": "^2.2.0", + "fast-ordered-set": "^1.0.0", + "fs-tree-diff": "^0.5.3", + "heimdalljs": "^0.2.0", + "minimatch": "^3.0.0", + "mkdirp": "^0.5.0", + "path-posix": "^1.0.0", + "rimraf": "^2.4.3", + "symlink-or-copy": "^1.0.0", + "walk-sync": "^0.3.1" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "ember-cli-babel": { + "version": "6.14.1", + "resolved": "https://registry.npmjs.org/ember-cli-babel/-/ember-cli-babel-6.14.1.tgz", + "integrity": "sha512-dnbc3fwwQphjRoQCflS0zpJHjJ54HDzcCv0FFDxUfMSxLFU/ccC/DRRtuB50WUY/n1Y6zgd66ezTXB+G82KBnw==", + "requires": { + "amd-name-resolver": "1.2.0", + "babel-plugin-debug-macros": "^0.1.11", + "babel-plugin-ember-modules-api-polyfill": "^2.3.0", + "babel-plugin-transform-es2015-modules-amd": "^6.24.0", + "babel-polyfill": "^6.26.0", + "babel-preset-env": "^1.7.0", + "broccoli-babel-transpiler": "^6.4.2", + "broccoli-debug": "^0.6.4", + "broccoli-funnel": "^2.0.0", + "broccoli-source": "^1.1.0", + "clone": "^2.0.0", + "ember-cli-version-checker": "^2.1.2", + "semver": "^5.5.0" + } + }, + "ember-cli-htmlbars": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/ember-cli-htmlbars/-/ember-cli-htmlbars-2.0.3.tgz", + "integrity": "sha512-oyWtJebOwxAqWZwMc0NKFJ8FJdxVixM7zl0FaXq1vTAG6bOgnU7yAhXEASlaO5f+PptZueZfOpdpvRwZW/Gk1A==", + "requires": { + "broccoli-persistent-filter": "^1.0.3", + "hash-for-dep": "^1.0.2", + "json-stable-stringify": "^1.0.0", + "strip-bom": "^3.0.0" + } + }, + "fs-readdir-recursive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", + "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==" + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "ember-get-config": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/ember-get-config/-/ember-get-config-0.2.4.tgz", + "integrity": "sha1-EYSSoqA9c+RgBO13eSiUICH+Hs0=", + "requires": { + "broccoli-file-creator": "^1.1.1", + "ember-cli-babel": "^6.3.0" + } + }, + "ember-inflector": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/ember-inflector/-/ember-inflector-2.3.0.tgz", + "integrity": "sha1-lHl+ug7qmNkCqh5doPCu72BTMX8=", + "dev": true, + "requires": { + "ember-cli-babel": "^6.0.0" + } + }, + "ember-load-initializers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ember-load-initializers/-/ember-load-initializers-1.0.0.tgz", + "integrity": "sha1-SRnq8G9t/sp+E0Yz2MBabJkh5uc=", + "dev": true, + "requires": { + "ember-cli-babel": "^6.0.0-beta.7" + } + }, + "ember-lodash": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/ember-lodash/-/ember-lodash-4.18.0.tgz", + "integrity": "sha1-Rd5wDWpPaPHNYoiNkLUKpkd7moM=", + "dev": true, + "requires": { + "broccoli-debug": "^0.6.1", + "broccoli-funnel": "^2.0.1", + "broccoli-merge-trees": "^2.0.0", + "broccoli-string-replace": "^0.1.1", + "ember-cli-babel": "^6.10.0", + "lodash-es": "^4.17.4" + }, + "dependencies": { + "amd-name-resolver": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/amd-name-resolver/-/amd-name-resolver-1.2.0.tgz", + "integrity": "sha512-hlSTWGS1t6/xq5YCed7YALg7tKZL3rkl7UwEZ/eCIkn8JxmM6fU6Qs/1hwtjQqfuYxlffuUcgYEm0f5xP4YKaA==", + "dev": true, + "requires": { + "ensure-posix-path": "^1.0.1" + } + }, + "broccoli-funnel": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/broccoli-funnel/-/broccoli-funnel-2.0.1.tgz", + "integrity": "sha512-C8Lnp9TVsSSiZMGEF16C0dCiNg2oJqUKwuZ1K4kVC6qRPG/2Cj/rtB5kRCC9qEbwqhX71bDbfHROx0L3J7zXQg==", + "dev": true, + "requires": { + "array-equal": "^1.0.0", + "blank-object": "^1.0.1", + "broccoli-plugin": "^1.3.0", + "debug": "^2.2.0", + "fast-ordered-set": "^1.0.0", + "fs-tree-diff": "^0.5.3", + "heimdalljs": "^0.2.0", + "minimatch": "^3.0.0", + "mkdirp": "^0.5.0", + "path-posix": "^1.0.0", + "rimraf": "^2.4.3", + "symlink-or-copy": "^1.0.0", + "walk-sync": "^0.3.1" + } + }, + "ember-cli-babel": { + "version": "6.14.1", + "resolved": "https://registry.npmjs.org/ember-cli-babel/-/ember-cli-babel-6.14.1.tgz", + "integrity": "sha512-dnbc3fwwQphjRoQCflS0zpJHjJ54HDzcCv0FFDxUfMSxLFU/ccC/DRRtuB50WUY/n1Y6zgd66ezTXB+G82KBnw==", + "dev": true, + "requires": { + "amd-name-resolver": "1.2.0", + "babel-plugin-debug-macros": "^0.1.11", + "babel-plugin-ember-modules-api-polyfill": "^2.3.0", + "babel-plugin-transform-es2015-modules-amd": "^6.24.0", + "babel-polyfill": "^6.26.0", + "babel-preset-env": "^1.7.0", + "broccoli-babel-transpiler": "^6.4.2", + "broccoli-debug": "^0.6.4", + "broccoli-funnel": "^2.0.0", + "broccoli-source": "^1.1.0", + "clone": "^2.0.0", + "ember-cli-version-checker": "^2.1.2", + "semver": "^5.5.0" + } + } + } + }, + "ember-macro-helpers": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/ember-macro-helpers/-/ember-macro-helpers-0.4.0.tgz", + "integrity": "sha1-kUZwABR4/MzMuEgZrKdjDMRFJsg=", + "dev": true, + "requires": { + "ember-cli-babel": "^5.1.7" + }, + "dependencies": { + "babel-core": { + "version": "5.8.38", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-5.8.38.tgz", + "integrity": "sha1-H8ruedfmG3ULALjlT238nQr4ZVg=", + "dev": true, + "requires": { + "babel-plugin-constant-folding": "^1.0.1", + "babel-plugin-dead-code-elimination": "^1.0.2", + "babel-plugin-eval": "^1.0.1", + "babel-plugin-inline-environment-variables": "^1.0.1", + "babel-plugin-jscript": "^1.0.4", + "babel-plugin-member-expression-literals": "^1.0.1", + "babel-plugin-property-literals": "^1.0.1", + "babel-plugin-proto-to-assign": "^1.0.3", + "babel-plugin-react-constant-elements": "^1.0.3", + "babel-plugin-react-display-name": "^1.0.3", + "babel-plugin-remove-console": "^1.0.1", + "babel-plugin-remove-debugger": "^1.0.1", + "babel-plugin-runtime": "^1.0.7", + "babel-plugin-undeclared-variables-check": "^1.0.2", + "babel-plugin-undefined-to-void": "^1.1.6", + "babylon": "^5.8.38", + "bluebird": "^2.9.33", + "chalk": "^1.0.0", + "convert-source-map": "^1.1.0", + "core-js": "^1.0.0", + "debug": "^2.1.1", + "detect-indent": "^3.0.0", + "esutils": "^2.0.0", + "fs-readdir-recursive": "^0.1.0", + "globals": "^6.4.0", + "home-or-tmp": "^1.0.0", + "is-integer": "^1.0.4", + "js-tokens": "1.0.1", + "json5": "^0.4.0", + "lodash": "^3.10.0", + "minimatch": "^2.0.3", + "output-file-sync": "^1.1.0", + "path-exists": "^1.0.0", + "path-is-absolute": "^1.0.0", + "private": "^0.1.6", + "regenerator": "0.8.40", + "regexpu": "^1.3.0", + "repeating": "^1.1.2", + "resolve": "^1.1.6", + "shebang-regex": "^1.0.0", + "slash": "^1.0.0", + "source-map": "^0.5.0", + "source-map-support": "^0.2.10", + "to-fast-properties": "^1.0.0", + "trim-right": "^1.0.0", + "try-resolve": "^1.0.0" + } + }, + "babylon": { + "version": "5.8.38", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-5.8.38.tgz", + "integrity": "sha1-7JsSCxG/bM1Bc6GL8hfmC3mFn/0=", + "dev": true + }, + "broccoli-babel-transpiler": { + "version": "5.7.4", + "resolved": "https://registry.npmjs.org/broccoli-babel-transpiler/-/broccoli-babel-transpiler-5.7.4.tgz", + "integrity": "sha512-gI14Pqc4qbmn5RW4SuAmybLiOoYW59D+HzQyhY6WdaGMAjikKBwJN0p17phyvafQ+kvG0mUiMd83lgHLeATnEA==", + "dev": true, + "requires": { + "babel-core": "^5.0.0", + "broccoli-funnel": "^1.0.0", + "broccoli-merge-trees": "^1.0.0", + "broccoli-persistent-filter": "^1.4.2", + "clone": "^0.2.0", + "hash-for-dep": "^1.0.2", + "heimdalljs-logger": "^0.1.7", + "json-stable-stringify": "^1.0.0", + "rsvp": "^3.5.0", + "workerpool": "^2.3.0" + }, + "dependencies": { + "clone": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", + "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", + "dev": true + } + } + }, + "broccoli-merge-trees": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/broccoli-merge-trees/-/broccoli-merge-trees-1.2.4.tgz", + "integrity": "sha1-oAFRm7UGfwZYnZGvopQkRaLQ/bU=", + "dev": true, + "requires": { + "broccoli-plugin": "^1.3.0", + "can-symlink": "^1.0.0", + "fast-ordered-set": "^1.0.2", + "fs-tree-diff": "^0.5.4", + "heimdalljs": "^0.2.1", + "heimdalljs-logger": "^0.1.7", + "rimraf": "^2.4.3", + "symlink-or-copy": "^1.0.0" + } + }, + "core-js": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", + "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=", + "dev": true + }, + "detect-indent": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-3.0.1.tgz", + "integrity": "sha1-ncXl3bzu+DJXZLlFGwK8bVQIT3U=", + "dev": true, + "requires": { + "get-stdin": "^4.0.1", + "minimist": "^1.1.0", + "repeating": "^1.1.0" + } + }, + "ember-cli-babel": { + "version": "5.2.8", + "resolved": "https://registry.npmjs.org/ember-cli-babel/-/ember-cli-babel-5.2.8.tgz", + "integrity": "sha512-Mt9OOB5RaZwjde+LYef8EgwNVCAzsYDv4ktshblaXxr4m/Xm5/7/rxEu42RNrYkoy/qWpT9uhaD+JKK4riMf+w==", + "dev": true, + "requires": { + "broccoli-babel-transpiler": "^5.6.2", + "broccoli-funnel": "^1.0.0", + "clone": "^2.0.0", + "ember-cli-version-checker": "^1.0.2", + "resolve": "^1.1.2" + } + }, + "ember-cli-version-checker": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/ember-cli-version-checker/-/ember-cli-version-checker-1.3.1.tgz", + "integrity": "sha1-C8LRNMgwFC2mS/lieg7e0QthrnI=", + "dev": true, + "requires": { + "semver": "^5.3.0" + } + }, + "globals": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/globals/-/globals-6.4.1.tgz", + "integrity": "sha1-hJgDKzttHMge68X3lpDY/in6v08=", + "dev": true + }, + "home-or-tmp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-1.0.0.tgz", + "integrity": "sha1-S58eQIAMPlDGwn94FnavzOcfOYU=", + "dev": true, + "requires": { + "os-tmpdir": "^1.0.1", + "user-home": "^1.1.1" + } + }, + "js-tokens": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-1.0.1.tgz", + "integrity": "sha1-zENaXIuUrRWst5gxQPyAGCyJrq4=", + "dev": true + }, + "json5": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.4.0.tgz", + "integrity": "sha1-BUNS5MTIDIbAkjh31EneF2pzLI0=", + "dev": true + }, + "lodash": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", + "dev": true + }, + "minimatch": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", + "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", + "dev": true, + "requires": { + "brace-expansion": "^1.0.0" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "repeating": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-1.1.3.tgz", + "integrity": "sha1-PUEUIYh3U3SU+X93+Xhfq4EPpKw=", + "dev": true, + "requires": { + "is-finite": "^1.0.0" + } + }, + "source-map-support": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.2.10.tgz", + "integrity": "sha1-6lo5AKHByyUJagrozFwrSxDe09w=", + "dev": true, + "requires": { + "source-map": "0.1.32" + }, + "dependencies": { + "source-map": { + "version": "0.1.32", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.32.tgz", + "integrity": "sha1-yLbBZ3l7pHQKjqMyUhYv8IWRsmY=", + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + } + } + } + } + } + }, + "ember-maybe-import-regenerator": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/ember-maybe-import-regenerator/-/ember-maybe-import-regenerator-0.1.6.tgz", + "integrity": "sha1-NdQYKK+m1qWbwNo85H80xXPXdso=", + "requires": { + "broccoli-funnel": "^1.0.1", + "broccoli-merge-trees": "^1.0.0", + "ember-cli-babel": "^6.0.0-beta.4", + "regenerator-runtime": "^0.9.5" + }, + "dependencies": { + "broccoli-merge-trees": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/broccoli-merge-trees/-/broccoli-merge-trees-1.2.4.tgz", + "integrity": "sha1-oAFRm7UGfwZYnZGvopQkRaLQ/bU=", + "requires": { + "broccoli-plugin": "^1.3.0", + "can-symlink": "^1.0.0", + "fast-ordered-set": "^1.0.2", + "fs-tree-diff": "^0.5.4", + "heimdalljs": "^0.2.1", + "heimdalljs-logger": "^0.1.7", + "rimraf": "^2.4.3", + "symlink-or-copy": "^1.0.0" + } + }, + "regenerator-runtime": { + "version": "0.9.6", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.9.6.tgz", + "integrity": "sha1-0z65XQ0gAaS+OWWXB8UbDLcc4Ck=" + } + } + }, + "ember-moment": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/ember-moment/-/ember-moment-7.3.0.tgz", + "integrity": "sha1-kOoY0jHYXht15F8Vsn0zuQiq0f0=", + "dev": true, + "requires": { + "ember-cli-babel": "^5.1.6", + "ember-macro-helpers": "^0.4.0" + }, + "dependencies": { + "babel-core": { + "version": "5.8.38", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-5.8.38.tgz", + "integrity": "sha1-H8ruedfmG3ULALjlT238nQr4ZVg=", + "dev": true, + "requires": { + "babel-plugin-constant-folding": "^1.0.1", + "babel-plugin-dead-code-elimination": "^1.0.2", + "babel-plugin-eval": "^1.0.1", + "babel-plugin-inline-environment-variables": "^1.0.1", + "babel-plugin-jscript": "^1.0.4", + "babel-plugin-member-expression-literals": "^1.0.1", + "babel-plugin-property-literals": "^1.0.1", + "babel-plugin-proto-to-assign": "^1.0.3", + "babel-plugin-react-constant-elements": "^1.0.3", + "babel-plugin-react-display-name": "^1.0.3", + "babel-plugin-remove-console": "^1.0.1", + "babel-plugin-remove-debugger": "^1.0.1", + "babel-plugin-runtime": "^1.0.7", + "babel-plugin-undeclared-variables-check": "^1.0.2", + "babel-plugin-undefined-to-void": "^1.1.6", + "babylon": "^5.8.38", + "bluebird": "^2.9.33", + "chalk": "^1.0.0", + "convert-source-map": "^1.1.0", + "core-js": "^1.0.0", + "debug": "^2.1.1", + "detect-indent": "^3.0.0", + "esutils": "^2.0.0", + "fs-readdir-recursive": "^0.1.0", + "globals": "^6.4.0", + "home-or-tmp": "^1.0.0", + "is-integer": "^1.0.4", + "js-tokens": "1.0.1", + "json5": "^0.4.0", + "lodash": "^3.10.0", + "minimatch": "^2.0.3", + "output-file-sync": "^1.1.0", + "path-exists": "^1.0.0", + "path-is-absolute": "^1.0.0", + "private": "^0.1.6", + "regenerator": "0.8.40", + "regexpu": "^1.3.0", + "repeating": "^1.1.2", + "resolve": "^1.1.6", + "shebang-regex": "^1.0.0", + "slash": "^1.0.0", + "source-map": "^0.5.0", + "source-map-support": "^0.2.10", + "to-fast-properties": "^1.0.0", + "trim-right": "^1.0.0", + "try-resolve": "^1.0.0" + } + }, + "babylon": { + "version": "5.8.38", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-5.8.38.tgz", + "integrity": "sha1-7JsSCxG/bM1Bc6GL8hfmC3mFn/0=", + "dev": true + }, + "broccoli-babel-transpiler": { + "version": "5.7.4", + "resolved": "https://registry.npmjs.org/broccoli-babel-transpiler/-/broccoli-babel-transpiler-5.7.4.tgz", + "integrity": "sha512-gI14Pqc4qbmn5RW4SuAmybLiOoYW59D+HzQyhY6WdaGMAjikKBwJN0p17phyvafQ+kvG0mUiMd83lgHLeATnEA==", + "dev": true, + "requires": { + "babel-core": "^5.0.0", + "broccoli-funnel": "^1.0.0", + "broccoli-merge-trees": "^1.0.0", + "broccoli-persistent-filter": "^1.4.2", + "clone": "^0.2.0", + "hash-for-dep": "^1.0.2", + "heimdalljs-logger": "^0.1.7", + "json-stable-stringify": "^1.0.0", + "rsvp": "^3.5.0", + "workerpool": "^2.3.0" + }, + "dependencies": { + "clone": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", + "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", + "dev": true + } + } + }, + "broccoli-merge-trees": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/broccoli-merge-trees/-/broccoli-merge-trees-1.2.4.tgz", + "integrity": "sha1-oAFRm7UGfwZYnZGvopQkRaLQ/bU=", + "dev": true, + "requires": { + "broccoli-plugin": "^1.3.0", + "can-symlink": "^1.0.0", + "fast-ordered-set": "^1.0.2", + "fs-tree-diff": "^0.5.4", + "heimdalljs": "^0.2.1", + "heimdalljs-logger": "^0.1.7", + "rimraf": "^2.4.3", + "symlink-or-copy": "^1.0.0" + } + }, + "core-js": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", + "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=", + "dev": true + }, + "detect-indent": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-3.0.1.tgz", + "integrity": "sha1-ncXl3bzu+DJXZLlFGwK8bVQIT3U=", + "dev": true, + "requires": { + "get-stdin": "^4.0.1", + "minimist": "^1.1.0", + "repeating": "^1.1.0" + } + }, + "ember-cli-babel": { + "version": "5.2.8", + "resolved": "https://registry.npmjs.org/ember-cli-babel/-/ember-cli-babel-5.2.8.tgz", + "integrity": "sha512-Mt9OOB5RaZwjde+LYef8EgwNVCAzsYDv4ktshblaXxr4m/Xm5/7/rxEu42RNrYkoy/qWpT9uhaD+JKK4riMf+w==", + "dev": true, + "requires": { + "broccoli-babel-transpiler": "^5.6.2", + "broccoli-funnel": "^1.0.0", + "clone": "^2.0.0", + "ember-cli-version-checker": "^1.0.2", + "resolve": "^1.1.2" + } + }, + "ember-cli-version-checker": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/ember-cli-version-checker/-/ember-cli-version-checker-1.3.1.tgz", + "integrity": "sha1-C8LRNMgwFC2mS/lieg7e0QthrnI=", + "dev": true, + "requires": { + "semver": "^5.3.0" + } + }, + "globals": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/globals/-/globals-6.4.1.tgz", + "integrity": "sha1-hJgDKzttHMge68X3lpDY/in6v08=", + "dev": true + }, + "home-or-tmp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-1.0.0.tgz", + "integrity": "sha1-S58eQIAMPlDGwn94FnavzOcfOYU=", + "dev": true, + "requires": { + "os-tmpdir": "^1.0.1", + "user-home": "^1.1.1" + } + }, + "js-tokens": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-1.0.1.tgz", + "integrity": "sha1-zENaXIuUrRWst5gxQPyAGCyJrq4=", + "dev": true + }, + "json5": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.4.0.tgz", + "integrity": "sha1-BUNS5MTIDIbAkjh31EneF2pzLI0=", + "dev": true + }, + "lodash": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", + "dev": true + }, + "minimatch": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", + "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", + "dev": true, + "requires": { + "brace-expansion": "^1.0.0" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "repeating": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-1.1.3.tgz", + "integrity": "sha1-PUEUIYh3U3SU+X93+Xhfq4EPpKw=", + "dev": true, + "requires": { + "is-finite": "^1.0.0" + } + }, + "source-map-support": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.2.10.tgz", + "integrity": "sha1-6lo5AKHByyUJagrozFwrSxDe09w=", + "dev": true, + "requires": { + "source-map": "0.1.32" + }, + "dependencies": { + "source-map": { + "version": "0.1.32", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.32.tgz", + "integrity": "sha1-yLbBZ3l7pHQKjqMyUhYv8IWRsmY=", + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + } + } + } + } + } + }, + "ember-native-dom-helpers": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/ember-native-dom-helpers/-/ember-native-dom-helpers-0.5.10.tgz", + "integrity": "sha512-bPJX49vlgnBGwFn/3WJPPJjjyd7/atvzW5j01u1dbyFf3bXvHg9Rs1qaZJdk8js0qZ1FINadIEC9vWtgN3w7tg==", + "requires": { + "broccoli-funnel": "^1.1.0", + "ember-cli-babel": "^6.6.0" + } + }, + "ember-power-select": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/ember-power-select/-/ember-power-select-1.9.4.tgz", + "integrity": "sha1-NWfIXz3vqdk2Mnfko5inlfaRVfc=", + "requires": { + "ember-basic-dropdown": "^0.33.1", + "ember-cli-babel": "^6.6.0", + "ember-cli-htmlbars": "^2.0.1", + "ember-concurrency": "^0.8.1", + "ember-text-measurer": "^0.3.3", + "ember-truth-helpers": "^1.3.0" + }, + "dependencies": { + "babel-core": { + "version": "5.8.38", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-5.8.38.tgz", + "integrity": "sha1-H8ruedfmG3ULALjlT238nQr4ZVg=", + "requires": { + "babel-plugin-constant-folding": "^1.0.1", + "babel-plugin-dead-code-elimination": "^1.0.2", + "babel-plugin-eval": "^1.0.1", + "babel-plugin-inline-environment-variables": "^1.0.1", + "babel-plugin-jscript": "^1.0.4", + "babel-plugin-member-expression-literals": "^1.0.1", + "babel-plugin-property-literals": "^1.0.1", + "babel-plugin-proto-to-assign": "^1.0.3", + "babel-plugin-react-constant-elements": "^1.0.3", + "babel-plugin-react-display-name": "^1.0.3", + "babel-plugin-remove-console": "^1.0.1", + "babel-plugin-remove-debugger": "^1.0.1", + "babel-plugin-runtime": "^1.0.7", + "babel-plugin-undeclared-variables-check": "^1.0.2", + "babel-plugin-undefined-to-void": "^1.1.6", + "babylon": "^5.8.38", + "bluebird": "^2.9.33", + "chalk": "^1.0.0", + "convert-source-map": "^1.1.0", + "core-js": "^1.0.0", + "debug": "^2.1.1", + "detect-indent": "^3.0.0", + "esutils": "^2.0.0", + "fs-readdir-recursive": "^0.1.0", + "globals": "^6.4.0", + "home-or-tmp": "^1.0.0", + "is-integer": "^1.0.4", + "js-tokens": "1.0.1", + "json5": "^0.4.0", + "lodash": "^3.10.0", + "minimatch": "^2.0.3", + "output-file-sync": "^1.1.0", + "path-exists": "^1.0.0", + "path-is-absolute": "^1.0.0", + "private": "^0.1.6", + "regenerator": "0.8.40", + "regexpu": "^1.3.0", + "repeating": "^1.1.2", + "resolve": "^1.1.6", + "shebang-regex": "^1.0.0", + "slash": "^1.0.0", + "source-map": "^0.5.0", + "source-map-support": "^0.2.10", + "to-fast-properties": "^1.0.0", + "trim-right": "^1.0.0", + "try-resolve": "^1.0.0" + } + }, + "babylon": { + "version": "5.8.38", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-5.8.38.tgz", + "integrity": "sha1-7JsSCxG/bM1Bc6GL8hfmC3mFn/0=" + }, + "broccoli-babel-transpiler": { + "version": "5.7.4", + "resolved": "https://registry.npmjs.org/broccoli-babel-transpiler/-/broccoli-babel-transpiler-5.7.4.tgz", + "integrity": "sha512-gI14Pqc4qbmn5RW4SuAmybLiOoYW59D+HzQyhY6WdaGMAjikKBwJN0p17phyvafQ+kvG0mUiMd83lgHLeATnEA==", + "requires": { + "babel-core": "^5.0.0", + "broccoli-funnel": "^1.0.0", + "broccoli-merge-trees": "^1.0.0", + "broccoli-persistent-filter": "^1.4.2", + "clone": "^0.2.0", + "hash-for-dep": "^1.0.2", + "heimdalljs-logger": "^0.1.7", + "json-stable-stringify": "^1.0.0", + "rsvp": "^3.5.0", + "workerpool": "^2.3.0" + }, + "dependencies": { + "clone": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", + "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=" + } + } + }, + "broccoli-merge-trees": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/broccoli-merge-trees/-/broccoli-merge-trees-1.2.4.tgz", + "integrity": "sha1-oAFRm7UGfwZYnZGvopQkRaLQ/bU=", + "requires": { + "broccoli-plugin": "^1.3.0", + "can-symlink": "^1.0.0", + "fast-ordered-set": "^1.0.2", + "fs-tree-diff": "^0.5.4", + "heimdalljs": "^0.2.1", + "heimdalljs-logger": "^0.1.7", + "rimraf": "^2.4.3", + "symlink-or-copy": "^1.0.0" + } + }, + "core-js": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", + "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=" + }, + "detect-indent": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-3.0.1.tgz", + "integrity": "sha1-ncXl3bzu+DJXZLlFGwK8bVQIT3U=", + "requires": { + "get-stdin": "^4.0.1", + "minimist": "^1.1.0", + "repeating": "^1.1.0" + } + }, + "ember-cli-version-checker": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/ember-cli-version-checker/-/ember-cli-version-checker-1.3.1.tgz", + "integrity": "sha1-C8LRNMgwFC2mS/lieg7e0QthrnI=", + "requires": { + "semver": "^5.3.0" + } + }, + "ember-truth-helpers": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ember-truth-helpers/-/ember-truth-helpers-1.3.0.tgz", + "integrity": "sha1-btn4POmkn1K7QW1V4idCYzmmTGA=", + "requires": { + "ember-cli-babel": "^5.1.6" + }, + "dependencies": { + "ember-cli-babel": { + "version": "5.2.8", + "resolved": "https://registry.npmjs.org/ember-cli-babel/-/ember-cli-babel-5.2.8.tgz", + "integrity": "sha512-Mt9OOB5RaZwjde+LYef8EgwNVCAzsYDv4ktshblaXxr4m/Xm5/7/rxEu42RNrYkoy/qWpT9uhaD+JKK4riMf+w==", + "requires": { + "broccoli-babel-transpiler": "^5.6.2", + "broccoli-funnel": "^1.0.0", + "clone": "^2.0.0", + "ember-cli-version-checker": "^1.0.2", + "resolve": "^1.1.2" + } + } + } + }, + "globals": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/globals/-/globals-6.4.1.tgz", + "integrity": "sha1-hJgDKzttHMge68X3lpDY/in6v08=" + }, + "home-or-tmp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-1.0.0.tgz", + "integrity": "sha1-S58eQIAMPlDGwn94FnavzOcfOYU=", + "requires": { + "os-tmpdir": "^1.0.1", + "user-home": "^1.1.1" + } + }, + "js-tokens": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-1.0.1.tgz", + "integrity": "sha1-zENaXIuUrRWst5gxQPyAGCyJrq4=" + }, + "json5": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.4.0.tgz", + "integrity": "sha1-BUNS5MTIDIbAkjh31EneF2pzLI0=" + }, + "lodash": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=" + }, + "minimatch": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", + "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", + "requires": { + "brace-expansion": "^1.0.0" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "repeating": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-1.1.3.tgz", + "integrity": "sha1-PUEUIYh3U3SU+X93+Xhfq4EPpKw=", + "requires": { + "is-finite": "^1.0.0" + } + }, + "source-map-support": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.2.10.tgz", + "integrity": "sha1-6lo5AKHByyUJagrozFwrSxDe09w=", + "requires": { + "source-map": "0.1.32" + }, + "dependencies": { + "source-map": { + "version": "0.1.32", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.32.tgz", + "integrity": "sha1-yLbBZ3l7pHQKjqMyUhYv8IWRsmY=", + "requires": { + "amdefine": ">=0.0.4" + } + } + } + } + } + }, + "ember-qunit": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ember-qunit/-/ember-qunit-2.2.0.tgz", + "integrity": "sha512-iMQT1ZCgSQpiK/VTbJjeQWNzsi4742wmPe08pzgEAf9lCruy9s3tmviz4fF98jDlPdV8w5LMIkkXQX7L2eTp6g==", + "dev": true, + "requires": { + "ember-test-helpers": "^0.6.3" + } + }, + "ember-resolver": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/ember-resolver/-/ember-resolver-4.5.0.tgz", + "integrity": "sha512-BX8yvFWIbrh1IVZmpIY/14WUb7nD8tQzT5s0aUG/Nwq2LVqD/uNAEPcsq0XS2gLvKawwDQEQN30ptcvJApQBhA==", + "dev": true, + "requires": { + "@glimmer/resolver": "^0.4.1", + "babel-plugin-debug-macros": "^0.1.10", + "broccoli-funnel": "^1.1.0", + "broccoli-merge-trees": "^2.0.0", + "ember-cli-babel": "^6.8.1", + "ember-cli-version-checker": "^2.0.0", + "resolve": "^1.3.3" + } + }, + "ember-rfc176-data": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/ember-rfc176-data/-/ember-rfc176-data-0.3.3.tgz", + "integrity": "sha1-J/ugjVQKdGOkNmxI6qGcWkSXGjk=" + }, + "ember-router-generator": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/ember-router-generator/-/ember-router-generator-1.2.3.tgz", + "integrity": "sha1-jtLKhv8yM2MSD8FCeBkeno8TFe4=", + "dev": true, + "requires": { + "recast": "^0.11.3" + }, + "dependencies": { + "esprima": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", + "dev": true + }, + "recast": { + "version": "0.11.23", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.11.23.tgz", + "integrity": "sha1-RR/TAEqx5N+bTktmN2sqIZEkYtM=", + "dev": true, + "requires": { + "ast-types": "0.9.6", + "esprima": "~3.1.0", + "private": "~0.1.5", + "source-map": "~0.5.0" + } + } + } + }, + "ember-runtime-enumerable-includes-polyfill": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ember-runtime-enumerable-includes-polyfill/-/ember-runtime-enumerable-includes-polyfill-2.1.0.tgz", + "integrity": "sha512-au18iI8VbEDYn3jLFZzETnKN5ciPgCUxMRucEP3jkq7qZ6sE0FVKpWMPY/h9tTND3VOBJt6fgPpEBJoJVCUudg==", + "dev": true, + "requires": { + "ember-cli-babel": "^6.9.0", + "ember-cli-version-checker": "^2.1.0" + }, + "dependencies": { + "amd-name-resolver": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/amd-name-resolver/-/amd-name-resolver-1.2.0.tgz", + "integrity": "sha512-hlSTWGS1t6/xq5YCed7YALg7tKZL3rkl7UwEZ/eCIkn8JxmM6fU6Qs/1hwtjQqfuYxlffuUcgYEm0f5xP4YKaA==", + "dev": true, + "requires": { + "ensure-posix-path": "^1.0.1" + } + }, + "broccoli-funnel": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/broccoli-funnel/-/broccoli-funnel-2.0.1.tgz", + "integrity": "sha512-C8Lnp9TVsSSiZMGEF16C0dCiNg2oJqUKwuZ1K4kVC6qRPG/2Cj/rtB5kRCC9qEbwqhX71bDbfHROx0L3J7zXQg==", + "dev": true, + "requires": { + "array-equal": "^1.0.0", + "blank-object": "^1.0.1", + "broccoli-plugin": "^1.3.0", + "debug": "^2.2.0", + "fast-ordered-set": "^1.0.0", + "fs-tree-diff": "^0.5.3", + "heimdalljs": "^0.2.0", + "minimatch": "^3.0.0", + "mkdirp": "^0.5.0", + "path-posix": "^1.0.0", + "rimraf": "^2.4.3", + "symlink-or-copy": "^1.0.0", + "walk-sync": "^0.3.1" + } + }, + "ember-cli-babel": { + "version": "6.14.1", + "resolved": "https://registry.npmjs.org/ember-cli-babel/-/ember-cli-babel-6.14.1.tgz", + "integrity": "sha512-dnbc3fwwQphjRoQCflS0zpJHjJ54HDzcCv0FFDxUfMSxLFU/ccC/DRRtuB50WUY/n1Y6zgd66ezTXB+G82KBnw==", + "dev": true, + "requires": { + "amd-name-resolver": "1.2.0", + "babel-plugin-debug-macros": "^0.1.11", + "babel-plugin-ember-modules-api-polyfill": "^2.3.0", + "babel-plugin-transform-es2015-modules-amd": "^6.24.0", + "babel-polyfill": "^6.26.0", + "babel-preset-env": "^1.7.0", + "broccoli-babel-transpiler": "^6.4.2", + "broccoli-debug": "^0.6.4", + "broccoli-funnel": "^2.0.0", + "broccoli-source": "^1.1.0", + "clone": "^2.0.0", + "ember-cli-version-checker": "^2.1.2", + "semver": "^5.5.0" + } + } + } + }, + "ember-source": { + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/ember-source/-/ember-source-2.15.0.tgz", + "integrity": "sha1-kBy+Or7gkpI3Kwb2qo3TQmg74tU=", + "dev": true, + "requires": { + "@glimmer/compiler": "^0.25.3", + "@glimmer/node": "^0.25.3", + "@glimmer/reference": "^0.25.3", + "@glimmer/runtime": "^0.25.3", + "@glimmer/util": "^0.25.3", + "broccoli-funnel": "^1.2.0", + "broccoli-merge-trees": "^2.0.0", + "ember-cli-get-component-path-option": "^1.0.0", + "ember-cli-is-package-missing": "^1.0.0", + "ember-cli-normalize-entity-name": "^1.0.0", + "ember-cli-path-utils": "^1.0.0", + "ember-cli-string-utils": "^1.1.0", + "ember-cli-test-info": "^1.0.0", + "ember-cli-valid-component-name": "^1.0.0", + "ember-cli-version-checker": "^1.3.1", + "ember-router-generator": "^1.2.3", + "handlebars": "^4.0.6", + "jquery": "^3.2.1", + "resolve": "^1.3.3", + "rsvp": "^3.6.1", + "simple-dom": "^0.3.0", + "simple-html-tokenizer": "^0.4.1" + }, + "dependencies": { + "@glimmer/compiler": { + "version": "0.25.7", + "resolved": "https://registry.npmjs.org/@glimmer/compiler/-/compiler-0.25.7.tgz", + "integrity": "sha1-GPJZ7wbFAwDxYNdOqzHxj5ge6uc=", + "dev": true, + "requires": { + "@glimmer/interfaces": "^0.25.7", + "@glimmer/syntax": "^0.25.7", + "@glimmer/util": "^0.25.7", + "@glimmer/wire-format": "^0.25.7", + "simple-html-tokenizer": "^0.3.0" + }, + "dependencies": { + "simple-html-tokenizer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/simple-html-tokenizer/-/simple-html-tokenizer-0.3.0.tgz", + "integrity": "sha1-m4tVWdgOMxpUTdE91ZOC5dDZRBE=", + "dev": true + } + } + }, + "@glimmer/interfaces": { + "version": "0.25.7", + "resolved": "https://registry.npmjs.org/@glimmer/interfaces/-/interfaces-0.25.7.tgz", + "integrity": "sha1-e+udlg9CnggPrKsQFsaMHCRMVQM=", + "dev": true, + "requires": { + "@glimmer/wire-format": "^0.25.7" + } + }, + "@glimmer/syntax": { + "version": "0.25.7", + "resolved": "https://registry.npmjs.org/@glimmer/syntax/-/syntax-0.25.7.tgz", + "integrity": "sha1-ZnbIWbckQWQ9L2JWoFIJVX6XDe4=", + "dev": true, + "requires": { + "@glimmer/interfaces": "^0.25.7", + "@glimmer/util": "^0.25.7", + "handlebars": "^4.0.6", + "simple-html-tokenizer": "^0.3.0" + }, + "dependencies": { + "simple-html-tokenizer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/simple-html-tokenizer/-/simple-html-tokenizer-0.3.0.tgz", + "integrity": "sha1-m4tVWdgOMxpUTdE91ZOC5dDZRBE=", + "dev": true + } + } + }, + "@glimmer/util": { + "version": "0.25.7", + "resolved": "https://registry.npmjs.org/@glimmer/util/-/util-0.25.7.tgz", + "integrity": "sha1-g/djWvn7+3EUyXnol9Uaa5RVdI4=", + "dev": true + }, + "@glimmer/wire-format": { + "version": "0.25.7", + "resolved": "https://registry.npmjs.org/@glimmer/wire-format/-/wire-format-0.25.7.tgz", + "integrity": "sha1-1vaOE44RNzmEnuWb4vcDLBMzwRA=", + "dev": true, + "requires": { + "@glimmer/util": "^0.25.7" + } + }, + "ember-cli-version-checker": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/ember-cli-version-checker/-/ember-cli-version-checker-1.3.1.tgz", + "integrity": "sha1-C8LRNMgwFC2mS/lieg7e0QthrnI=", + "dev": true, + "requires": { + "semver": "^5.3.0" + } + }, + "simple-html-tokenizer": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/simple-html-tokenizer/-/simple-html-tokenizer-0.4.3.tgz", + "integrity": "sha512-OpUzgR+P/Qsu6ztZehr4PxvTbV4sDW91hAqc2tnz4fjuFTqErWIUdUMbnzX+19F4IEpSSfa0vCAz5xJSs0LpPw==", + "dev": true + } + } + }, + "ember-source-channel-url": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ember-source-channel-url/-/ember-source-channel-url-1.1.0.tgz", + "integrity": "sha512-y1RVXmyqrdX6zq9ZejpPt7ohKNGuLMBEKaOUyxFWcYAM5gvLuo6xFerwNmXEBbu4e3//GaoasjodXi6Cl+ddUQ==", + "requires": { + "got": "^8.0.1" + } + }, + "ember-test-helpers": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/ember-test-helpers/-/ember-test-helpers-0.6.3.tgz", + "integrity": "sha1-+GTN9vTnXz+HaNZTd4W1q26C2Qc=", + "dev": true + }, + "ember-text-measurer": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/ember-text-measurer/-/ember-text-measurer-0.3.3.tgz", + "integrity": "sha1-B2KAmnHC4fLmCrAMU8brG2PJ+WM=", + "requires": { + "ember-cli-babel": "^5.1.6" + }, + "dependencies": { + "babel-core": { + "version": "5.8.38", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-5.8.38.tgz", + "integrity": "sha1-H8ruedfmG3ULALjlT238nQr4ZVg=", + "requires": { + "babel-plugin-constant-folding": "^1.0.1", + "babel-plugin-dead-code-elimination": "^1.0.2", + "babel-plugin-eval": "^1.0.1", + "babel-plugin-inline-environment-variables": "^1.0.1", + "babel-plugin-jscript": "^1.0.4", + "babel-plugin-member-expression-literals": "^1.0.1", + "babel-plugin-property-literals": "^1.0.1", + "babel-plugin-proto-to-assign": "^1.0.3", + "babel-plugin-react-constant-elements": "^1.0.3", + "babel-plugin-react-display-name": "^1.0.3", + "babel-plugin-remove-console": "^1.0.1", + "babel-plugin-remove-debugger": "^1.0.1", + "babel-plugin-runtime": "^1.0.7", + "babel-plugin-undeclared-variables-check": "^1.0.2", + "babel-plugin-undefined-to-void": "^1.1.6", + "babylon": "^5.8.38", + "bluebird": "^2.9.33", + "chalk": "^1.0.0", + "convert-source-map": "^1.1.0", + "core-js": "^1.0.0", + "debug": "^2.1.1", + "detect-indent": "^3.0.0", + "esutils": "^2.0.0", + "fs-readdir-recursive": "^0.1.0", + "globals": "^6.4.0", + "home-or-tmp": "^1.0.0", + "is-integer": "^1.0.4", + "js-tokens": "1.0.1", + "json5": "^0.4.0", + "lodash": "^3.10.0", + "minimatch": "^2.0.3", + "output-file-sync": "^1.1.0", + "path-exists": "^1.0.0", + "path-is-absolute": "^1.0.0", + "private": "^0.1.6", + "regenerator": "0.8.40", + "regexpu": "^1.3.0", + "repeating": "^1.1.2", + "resolve": "^1.1.6", + "shebang-regex": "^1.0.0", + "slash": "^1.0.0", + "source-map": "^0.5.0", + "source-map-support": "^0.2.10", + "to-fast-properties": "^1.0.0", + "trim-right": "^1.0.0", + "try-resolve": "^1.0.0" + } + }, + "babylon": { + "version": "5.8.38", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-5.8.38.tgz", + "integrity": "sha1-7JsSCxG/bM1Bc6GL8hfmC3mFn/0=" + }, + "broccoli-babel-transpiler": { + "version": "5.7.4", + "resolved": "https://registry.npmjs.org/broccoli-babel-transpiler/-/broccoli-babel-transpiler-5.7.4.tgz", + "integrity": "sha512-gI14Pqc4qbmn5RW4SuAmybLiOoYW59D+HzQyhY6WdaGMAjikKBwJN0p17phyvafQ+kvG0mUiMd83lgHLeATnEA==", + "requires": { + "babel-core": "^5.0.0", + "broccoli-funnel": "^1.0.0", + "broccoli-merge-trees": "^1.0.0", + "broccoli-persistent-filter": "^1.4.2", + "clone": "^0.2.0", + "hash-for-dep": "^1.0.2", + "heimdalljs-logger": "^0.1.7", + "json-stable-stringify": "^1.0.0", + "rsvp": "^3.5.0", + "workerpool": "^2.3.0" + }, + "dependencies": { + "clone": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", + "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=" + } + } + }, + "broccoli-merge-trees": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/broccoli-merge-trees/-/broccoli-merge-trees-1.2.4.tgz", + "integrity": "sha1-oAFRm7UGfwZYnZGvopQkRaLQ/bU=", + "requires": { + "broccoli-plugin": "^1.3.0", + "can-symlink": "^1.0.0", + "fast-ordered-set": "^1.0.2", + "fs-tree-diff": "^0.5.4", + "heimdalljs": "^0.2.1", + "heimdalljs-logger": "^0.1.7", + "rimraf": "^2.4.3", + "symlink-or-copy": "^1.0.0" + } + }, + "core-js": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", + "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=" + }, + "detect-indent": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-3.0.1.tgz", + "integrity": "sha1-ncXl3bzu+DJXZLlFGwK8bVQIT3U=", + "requires": { + "get-stdin": "^4.0.1", + "minimist": "^1.1.0", + "repeating": "^1.1.0" + } + }, + "ember-cli-babel": { + "version": "5.2.8", + "resolved": "https://registry.npmjs.org/ember-cli-babel/-/ember-cli-babel-5.2.8.tgz", + "integrity": "sha512-Mt9OOB5RaZwjde+LYef8EgwNVCAzsYDv4ktshblaXxr4m/Xm5/7/rxEu42RNrYkoy/qWpT9uhaD+JKK4riMf+w==", + "requires": { + "broccoli-babel-transpiler": "^5.6.2", + "broccoli-funnel": "^1.0.0", + "clone": "^2.0.0", + "ember-cli-version-checker": "^1.0.2", + "resolve": "^1.1.2" + } + }, + "ember-cli-version-checker": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/ember-cli-version-checker/-/ember-cli-version-checker-1.3.1.tgz", + "integrity": "sha1-C8LRNMgwFC2mS/lieg7e0QthrnI=", + "requires": { + "semver": "^5.3.0" + } + }, + "globals": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/globals/-/globals-6.4.1.tgz", + "integrity": "sha1-hJgDKzttHMge68X3lpDY/in6v08=" + }, + "home-or-tmp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-1.0.0.tgz", + "integrity": "sha1-S58eQIAMPlDGwn94FnavzOcfOYU=", + "requires": { + "os-tmpdir": "^1.0.1", + "user-home": "^1.1.1" + } + }, + "js-tokens": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-1.0.1.tgz", + "integrity": "sha1-zENaXIuUrRWst5gxQPyAGCyJrq4=" + }, + "json5": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.4.0.tgz", + "integrity": "sha1-BUNS5MTIDIbAkjh31EneF2pzLI0=" + }, + "lodash": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=" + }, + "minimatch": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", + "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", + "requires": { + "brace-expansion": "^1.0.0" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "repeating": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-1.1.3.tgz", + "integrity": "sha1-PUEUIYh3U3SU+X93+Xhfq4EPpKw=", + "requires": { + "is-finite": "^1.0.0" + } + }, + "source-map-support": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.2.10.tgz", + "integrity": "sha1-6lo5AKHByyUJagrozFwrSxDe09w=", + "requires": { + "source-map": "0.1.32" + }, + "dependencies": { + "source-map": { + "version": "0.1.32", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.32.tgz", + "integrity": "sha1-yLbBZ3l7pHQKjqMyUhYv8IWRsmY=", + "requires": { + "amdefine": ">=0.0.4" + } + } + } + } + } + }, + "ember-truth-helpers": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ember-truth-helpers/-/ember-truth-helpers-1.2.0.tgz", + "integrity": "sha1-5jz/6qghGIKuYalYgW/e03kNBls=", + "requires": { + "ember-cli-babel": "^5.1.5" + }, + "dependencies": { + "babel-core": { + "version": "5.8.38", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-5.8.38.tgz", + "integrity": "sha1-H8ruedfmG3ULALjlT238nQr4ZVg=", + "requires": { + "babel-plugin-constant-folding": "^1.0.1", + "babel-plugin-dead-code-elimination": "^1.0.2", + "babel-plugin-eval": "^1.0.1", + "babel-plugin-inline-environment-variables": "^1.0.1", + "babel-plugin-jscript": "^1.0.4", + "babel-plugin-member-expression-literals": "^1.0.1", + "babel-plugin-property-literals": "^1.0.1", + "babel-plugin-proto-to-assign": "^1.0.3", + "babel-plugin-react-constant-elements": "^1.0.3", + "babel-plugin-react-display-name": "^1.0.3", + "babel-plugin-remove-console": "^1.0.1", + "babel-plugin-remove-debugger": "^1.0.1", + "babel-plugin-runtime": "^1.0.7", + "babel-plugin-undeclared-variables-check": "^1.0.2", + "babel-plugin-undefined-to-void": "^1.1.6", + "babylon": "^5.8.38", + "bluebird": "^2.9.33", + "chalk": "^1.0.0", + "convert-source-map": "^1.1.0", + "core-js": "^1.0.0", + "debug": "^2.1.1", + "detect-indent": "^3.0.0", + "esutils": "^2.0.0", + "fs-readdir-recursive": "^0.1.0", + "globals": "^6.4.0", + "home-or-tmp": "^1.0.0", + "is-integer": "^1.0.4", + "js-tokens": "1.0.1", + "json5": "^0.4.0", + "lodash": "^3.10.0", + "minimatch": "^2.0.3", + "output-file-sync": "^1.1.0", + "path-exists": "^1.0.0", + "path-is-absolute": "^1.0.0", + "private": "^0.1.6", + "regenerator": "0.8.40", + "regexpu": "^1.3.0", + "repeating": "^1.1.2", + "resolve": "^1.1.6", + "shebang-regex": "^1.0.0", + "slash": "^1.0.0", + "source-map": "^0.5.0", + "source-map-support": "^0.2.10", + "to-fast-properties": "^1.0.0", + "trim-right": "^1.0.0", + "try-resolve": "^1.0.0" + } + }, + "babylon": { + "version": "5.8.38", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-5.8.38.tgz", + "integrity": "sha1-7JsSCxG/bM1Bc6GL8hfmC3mFn/0=" + }, + "broccoli-babel-transpiler": { + "version": "5.7.4", + "resolved": "https://registry.npmjs.org/broccoli-babel-transpiler/-/broccoli-babel-transpiler-5.7.4.tgz", + "integrity": "sha512-gI14Pqc4qbmn5RW4SuAmybLiOoYW59D+HzQyhY6WdaGMAjikKBwJN0p17phyvafQ+kvG0mUiMd83lgHLeATnEA==", + "requires": { + "babel-core": "^5.0.0", + "broccoli-funnel": "^1.0.0", + "broccoli-merge-trees": "^1.0.0", + "broccoli-persistent-filter": "^1.4.2", + "clone": "^0.2.0", + "hash-for-dep": "^1.0.2", + "heimdalljs-logger": "^0.1.7", + "json-stable-stringify": "^1.0.0", + "rsvp": "^3.5.0", + "workerpool": "^2.3.0" + }, + "dependencies": { + "clone": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", + "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=" + } + } + }, + "broccoli-merge-trees": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/broccoli-merge-trees/-/broccoli-merge-trees-1.2.4.tgz", + "integrity": "sha1-oAFRm7UGfwZYnZGvopQkRaLQ/bU=", + "requires": { + "broccoli-plugin": "^1.3.0", + "can-symlink": "^1.0.0", + "fast-ordered-set": "^1.0.2", + "fs-tree-diff": "^0.5.4", + "heimdalljs": "^0.2.1", + "heimdalljs-logger": "^0.1.7", + "rimraf": "^2.4.3", + "symlink-or-copy": "^1.0.0" + } + }, + "core-js": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", + "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=" + }, + "detect-indent": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-3.0.1.tgz", + "integrity": "sha1-ncXl3bzu+DJXZLlFGwK8bVQIT3U=", + "requires": { + "get-stdin": "^4.0.1", + "minimist": "^1.1.0", + "repeating": "^1.1.0" + } + }, + "ember-cli-babel": { + "version": "5.2.8", + "resolved": "https://registry.npmjs.org/ember-cli-babel/-/ember-cli-babel-5.2.8.tgz", + "integrity": "sha512-Mt9OOB5RaZwjde+LYef8EgwNVCAzsYDv4ktshblaXxr4m/Xm5/7/rxEu42RNrYkoy/qWpT9uhaD+JKK4riMf+w==", + "requires": { + "broccoli-babel-transpiler": "^5.6.2", + "broccoli-funnel": "^1.0.0", + "clone": "^2.0.0", + "ember-cli-version-checker": "^1.0.2", + "resolve": "^1.1.2" + } + }, + "ember-cli-version-checker": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/ember-cli-version-checker/-/ember-cli-version-checker-1.3.1.tgz", + "integrity": "sha1-C8LRNMgwFC2mS/lieg7e0QthrnI=", + "requires": { + "semver": "^5.3.0" + } + }, + "globals": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/globals/-/globals-6.4.1.tgz", + "integrity": "sha1-hJgDKzttHMge68X3lpDY/in6v08=" + }, + "home-or-tmp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-1.0.0.tgz", + "integrity": "sha1-S58eQIAMPlDGwn94FnavzOcfOYU=", + "requires": { + "os-tmpdir": "^1.0.1", + "user-home": "^1.1.1" + } + }, + "js-tokens": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-1.0.1.tgz", + "integrity": "sha1-zENaXIuUrRWst5gxQPyAGCyJrq4=" + }, + "json5": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.4.0.tgz", + "integrity": "sha1-BUNS5MTIDIbAkjh31EneF2pzLI0=" + }, + "lodash": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=" + }, + "minimatch": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", + "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", + "requires": { + "brace-expansion": "^1.0.0" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "repeating": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-1.1.3.tgz", + "integrity": "sha1-PUEUIYh3U3SU+X93+Xhfq4EPpKw=", + "requires": { + "is-finite": "^1.0.0" + } + }, + "source-map-support": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.2.10.tgz", + "integrity": "sha1-6lo5AKHByyUJagrozFwrSxDe09w=", + "requires": { + "source-map": "0.1.32" + }, + "dependencies": { + "source-map": { + "version": "0.1.32", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.32.tgz", + "integrity": "sha1-yLbBZ3l7pHQKjqMyUhYv8IWRsmY=", + "requires": { + "amdefine": ">=0.0.4" + } + } + } + } + } + }, + "ember-try": { + "version": "0.2.23", + "resolved": "https://registry.npmjs.org/ember-try/-/ember-try-0.2.23.tgz", + "integrity": "sha512-kmVNsSFFafGinFhERMox3SXHoU+V1td1538SbhpslPtf7S2BZYr7JdAwOCIRoRtpcWeNdYgdQGzJZxNvUc8aLg==", + "requires": { + "chalk": "^1.0.0", + "cli-table2": "^0.2.0", + "core-object": "^1.1.0", + "debug": "^2.2.0", + "ember-try-config": "^2.2.0", + "extend": "^3.0.0", + "fs-extra": "^0.26.0", + "promise-map-series": "^0.2.1", + "resolve": "^1.1.6", + "rimraf": "^2.3.2", + "rsvp": "^3.0.17", + "semver": "^5.1.0" + } + }, + "ember-try-config": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ember-try-config/-/ember-try-config-2.2.0.tgz", + "integrity": "sha1-a+CvbHGUmBPgKseTVk/dv4M2uAc=", + "requires": { + "lodash": "^4.6.1", + "node-fetch": "^1.3.3", + "rsvp": "^3.2.1", + "semver": "^5.1.0" + } + }, + "ember-wormhole": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/ember-wormhole/-/ember-wormhole-0.5.4.tgz", + "integrity": "sha1-lo6A8JNJT0rtJm51CvpjkZxhOD0=", + "requires": { + "ember-cli-babel": "^6.10.0", + "ember-cli-htmlbars": "^2.0.1" + }, + "dependencies": { + "amd-name-resolver": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/amd-name-resolver/-/amd-name-resolver-1.2.0.tgz", + "integrity": "sha512-hlSTWGS1t6/xq5YCed7YALg7tKZL3rkl7UwEZ/eCIkn8JxmM6fU6Qs/1hwtjQqfuYxlffuUcgYEm0f5xP4YKaA==", + "requires": { + "ensure-posix-path": "^1.0.1" + } + }, + "broccoli-funnel": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/broccoli-funnel/-/broccoli-funnel-2.0.1.tgz", + "integrity": "sha512-C8Lnp9TVsSSiZMGEF16C0dCiNg2oJqUKwuZ1K4kVC6qRPG/2Cj/rtB5kRCC9qEbwqhX71bDbfHROx0L3J7zXQg==", + "requires": { + "array-equal": "^1.0.0", + "blank-object": "^1.0.1", + "broccoli-plugin": "^1.3.0", + "debug": "^2.2.0", + "fast-ordered-set": "^1.0.0", + "fs-tree-diff": "^0.5.3", + "heimdalljs": "^0.2.0", + "minimatch": "^3.0.0", + "mkdirp": "^0.5.0", + "path-posix": "^1.0.0", + "rimraf": "^2.4.3", + "symlink-or-copy": "^1.0.0", + "walk-sync": "^0.3.1" + } + }, + "ember-cli-babel": { + "version": "6.14.1", + "resolved": "https://registry.npmjs.org/ember-cli-babel/-/ember-cli-babel-6.14.1.tgz", + "integrity": "sha512-dnbc3fwwQphjRoQCflS0zpJHjJ54HDzcCv0FFDxUfMSxLFU/ccC/DRRtuB50WUY/n1Y6zgd66ezTXB+G82KBnw==", + "requires": { + "amd-name-resolver": "1.2.0", + "babel-plugin-debug-macros": "^0.1.11", + "babel-plugin-ember-modules-api-polyfill": "^2.3.0", + "babel-plugin-transform-es2015-modules-amd": "^6.24.0", + "babel-polyfill": "^6.26.0", + "babel-preset-env": "^1.7.0", + "broccoli-babel-transpiler": "^6.4.2", + "broccoli-debug": "^0.6.4", + "broccoli-funnel": "^2.0.0", + "broccoli-source": "^1.1.0", + "clone": "^2.0.0", + "ember-cli-version-checker": "^2.1.2", + "semver": "^5.5.0" + } + } + } + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true + }, + "encoding": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", + "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", + "requires": { + "iconv-lite": "~0.4.13" + } + }, + "engine.io": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-1.8.0.tgz", + "integrity": "sha1-PutfJky3XbvsG6rqJtYfWk6s4qo=", + "dev": true, + "requires": { + "accepts": "1.3.3", + "base64id": "0.1.0", + "cookie": "0.3.1", + "debug": "2.3.3", + "engine.io-parser": "1.3.1", + "ws": "1.1.1" + }, + "dependencies": { + "accepts": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.3.tgz", + "integrity": "sha1-w8p0NJOGSMPg2cHjKN1otiLChMo=", + "dev": true, + "requires": { + "mime-types": "~2.1.11", + "negotiator": "0.6.1" + } + }, + "debug": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "dev": true, + "requires": { + "ms": "0.7.2" + } + }, + "ms": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", + "dev": true + } + } + }, + "engine.io-client": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-1.8.0.tgz", + "integrity": "sha1-e3MOQSdBQIdZbZvjyI0rxf22z1w=", + "dev": true, + "requires": { + "component-emitter": "1.2.1", + "component-inherit": "0.0.3", + "debug": "2.3.3", + "engine.io-parser": "1.3.1", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "parsejson": "0.0.3", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "ws": "1.1.1", + "xmlhttprequest-ssl": "1.5.3", + "yeast": "0.1.2" + }, + "dependencies": { + "debug": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "dev": true, + "requires": { + "ms": "0.7.2" + } + }, + "ms": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", + "dev": true + } + } + }, + "engine.io-parser": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-1.3.1.tgz", + "integrity": "sha1-lVTxrjMQfW+9FwylRm0vgz9qB88=", + "dev": true, + "requires": { + "after": "0.8.1", + "arraybuffer.slice": "0.0.6", + "base64-arraybuffer": "0.1.5", + "blob": "0.0.4", + "has-binary": "0.1.6", + "wtf-8": "1.0.0" + }, + "dependencies": { + "has-binary": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/has-binary/-/has-binary-0.1.6.tgz", + "integrity": "sha1-JTJvOc+k9hath4eJTjryz7x7bhA=", + "dev": true, + "requires": { + "isarray": "0.0.1" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + } + } + }, + "ensure-posix-path": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/ensure-posix-path/-/ensure-posix-path-1.0.2.tgz", + "integrity": "sha1-pls+QtC3HPxYXrd0+ZQ8jZuRsMI=" + }, + "entities": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", + "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=", + "dev": true + }, + "error": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/error/-/error-7.0.2.tgz", + "integrity": "sha1-pfdf/02ZJhJt2sDqXcOOaJFTywI=", + "dev": true, + "requires": { + "string-template": "~0.2.1", + "xtend": "~4.0.0" + } + }, + "es5-ext": { + "version": "0.10.44", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.44.tgz", + "integrity": "sha512-TO4Vt9IhW3FzDKLDOpoA8VS9BCV4b9WTf6BqvMOgfoa8wX73F3Kh3y2J7yTstTaXlQ0k1vq4DH2vw6RSs42z+g==", + "dev": true, + "requires": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.1", + "next-tick": "1" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "es6-map": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", + "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", + "es6-set": "~0.1.5", + "es6-symbol": "~3.1.1", + "event-emitter": "~0.3.5" + } + }, + "es6-set": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", + "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", + "es6-symbol": "3.1.1", + "event-emitter": "~0.3.5" + } + }, + "es6-symbol": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", + "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "esprima-fb": { + "version": "15001.1001.0-dev-harmony-fb", + "resolved": "https://registry.npmjs.org/esprima-fb/-/esprima-fb-15001.1001.0-dev-harmony-fb.tgz", + "integrity": "sha1-Q761fsJujPI3092LM+QlM1d/Jlk=" + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true + }, + "event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "eventemitter3": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.0.tgz", + "integrity": "sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA==", + "dev": true + }, + "events-to-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/events-to-array/-/events-to-array-1.1.2.tgz", + "integrity": "sha1-LUH1Y+H+QA7Uli/hpNXGp1Od9/Y=", + "dev": true + }, + "exec-sh": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.2.1.tgz", + "integrity": "sha512-aLt95pexaugVtQerpmE51+4QfWrNc304uez7jvj6fWnN8GeEHpttB8F36n8N7uVhUMbH/1enbxQ9HImZ4w/9qg==", + "dev": true, + "requires": { + "merge": "^1.1.3" + } + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "exists-stat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/exists-stat/-/exists-stat-1.0.0.tgz", + "integrity": "sha1-BmDjUlouidnkRhKUQMJy7foktSk=", + "dev": true + }, + "exists-sync": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/exists-sync/-/exists-sync-0.0.4.tgz", + "integrity": "sha1-l0TCxCjMA7AQYNtFTUsS8O88iHk=" + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true + }, + "exit-hook": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", + "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=", + "dev": true + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "^0.1.0" + } + }, + "expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "dev": true, + "requires": { + "fill-range": "^2.1.0" + } + }, + "expand-tilde": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-1.2.2.tgz", + "integrity": "sha1-C4HrqJflo9MdHD0QL48BRB5VlEk=", + "dev": true, + "requires": { + "os-homedir": "^1.0.1" + } + }, + "express": { + "version": "4.16.3", + "resolved": "https://registry.npmjs.org/express/-/express-4.16.3.tgz", + "integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=", + "dev": true, + "requires": { + "accepts": "~1.3.5", + "array-flatten": "1.1.1", + "body-parser": "1.18.2", + "content-disposition": "0.5.2", + "content-type": "~1.0.4", + "cookie": "0.3.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.1.1", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.3", + "qs": "6.5.1", + "range-parser": "~1.2.0", + "safe-buffer": "5.1.1", + "send": "0.16.2", + "serve-static": "1.13.2", + "setprototypeof": "1.1.0", + "statuses": "~1.4.0", + "type-is": "~1.6.16", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", + "dev": true + } + } + }, + "extend": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "external-editor": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-1.1.1.tgz", + "integrity": "sha1-Etew24UPf/fnCBuvQAVwAGDEYAs=", + "dev": true, + "requires": { + "extend": "^3.0.0", + "spawn-sync": "^1.0.15", + "tmp": "^0.0.29" + }, + "dependencies": { + "tmp": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.29.tgz", + "integrity": "sha1-8lEl/w3Z2jzLDC3Tce4SiLuRKMA=", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.1" + } + } + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "fake-xml-http-request": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/fake-xml-http-request/-/fake-xml-http-request-1.6.0.tgz", + "integrity": "sha512-99XPwwSg89BfzPuv4XCpZxn3EbauMCgAQCxq9MzrvS6DFD73OON6AnUTicL4A0HZtYMBwCZBWVnRqGjZDgQkTg==", + "dev": true + }, + "faker": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/faker/-/faker-3.1.0.tgz", + "integrity": "sha1-D5CPr05uwCUk5UpX5DLFwBPgjJ8=", + "dev": true + }, + "fast-ordered-set": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fast-ordered-set/-/fast-ordered-set-1.0.3.tgz", + "integrity": "sha1-P7s2Y097555PftvbSjV97iXRhOs=", + "requires": { + "blank-object": "^1.0.1" + } + }, + "fast-sourcemap-concat": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-sourcemap-concat/-/fast-sourcemap-concat-1.3.0.tgz", + "integrity": "sha512-MDYZ7lIkj4cnZA+bEaom7rUuoEXuYKBpcwjK+4PghvZtSjjTD8DGD8Ch/7EqNNozM6EwR2uYdorYBKmdBvM7FA==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "fs-extra": "^0.30.0", + "heimdalljs-logger": "^0.1.7", + "memory-streams": "^0.1.0", + "mkdirp": "^0.5.0", + "source-map": "^0.4.2", + "source-map-url": "^0.3.0", + "sourcemap-validator": "^1.0.5" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "fs-extra": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", + "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.0", + "path-is-absolute": "^1.0.0", + "rimraf": "^2.2.8" + } + }, + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + } + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "faye-websocket": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", + "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "fb-watchman": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.0.tgz", + "integrity": "sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg=", + "dev": true, + "requires": { + "bser": "^2.0.0" + } + }, + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" + } + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", + "dev": true + }, + "filesize": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.6.1.tgz", + "integrity": "sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==", + "dev": true + }, + "fill-range": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", + "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", + "dev": true, + "requires": { + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^3.0.0", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" + } + }, + "finalhandler": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", + "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.4.0", + "unpipe": "~1.0.0" + } + }, + "find-index": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-index/-/find-index-1.1.0.tgz", + "integrity": "sha1-UwB8ec0wBA1oFteUWOiDfVxXBe8=", + "dev": true + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "findup-sync": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.4.3.tgz", + "integrity": "sha1-QAQ5Kee8YK3wt/SCfExudaDeyhI=", + "dev": true, + "requires": { + "detect-file": "^0.1.0", + "is-glob": "^2.0.1", + "micromatch": "^2.3.7", + "resolve-dir": "^0.1.0" + } + }, + "fireworm": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/fireworm/-/fireworm-0.7.1.tgz", + "integrity": "sha1-zPIPeUHxCIg/zduZOD2+bhhhx1g=", + "dev": true, + "requires": { + "async": "~0.2.9", + "is-type": "0.0.1", + "lodash.debounce": "^3.1.1", + "lodash.flatten": "^3.0.2", + "minimatch": "^3.0.2" + }, + "dependencies": { + "async": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", + "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=", + "dev": true + } + } + }, + "fixturify": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/fixturify/-/fixturify-0.3.4.tgz", + "integrity": "sha512-Gx+KSB25b6gMc4bf7UFRTA85uE0iZR+RYur0JHh6dg4AGBh0EksOv4FCHyM7XpGmiJO7Bc7oV7vxENQBT+2WEQ==", + "dev": true, + "requires": { + "fs-extra": "^0.30.0", + "matcher-collection": "^1.0.4" + }, + "dependencies": { + "fs-extra": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", + "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.0", + "path-is-absolute": "^1.0.0", + "rimraf": "^2.2.8" + } + } + } + }, + "follow-redirects": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.0.tgz", + "integrity": "sha512-fdrt472/9qQ6Kgjvb935ig6vJCuofpBUD14f9Vb+SLlm7xIe4Qva5gey8EKtv8lp7ahE1wilg3xL1znpVGtZIA==", + "dev": true, + "requires": { + "debug": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "font-awesome": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/font-awesome/-/font-awesome-4.7.0.tgz", + "integrity": "sha1-j6jPBBGhoxr9B7BtKQK7n8gVoTM=" + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "dev": true, + "requires": { + "for-in": "^1.0.1" + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "dev": true + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "fs-exists-sync": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz", + "integrity": "sha1-mC1ok6+RjnLQjeyehnP/K1qNat0=", + "dev": true + }, + "fs-extra": { + "version": "0.26.7", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.26.7.tgz", + "integrity": "sha1-muH92UiXeY7at20JGM9C0MMYT6k=", + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.0", + "path-is-absolute": "^1.0.0", + "rimraf": "^2.2.8" + } + }, + "fs-readdir-recursive": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-0.1.2.tgz", + "integrity": "sha1-MVtPuMHKW4xH3v7zGdBz2tNWgFk=" + }, + "fs-tree-diff": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/fs-tree-diff/-/fs-tree-diff-0.5.7.tgz", + "integrity": "sha512-dJwDX6NBH7IfdfFjZAdHCZ6fIKc8LwR7kzqUhYRFJuX4g9ctG/7cuqJuwegGQsyLEykp6Z4krq+yIFMQlt7d9Q==", + "requires": { + "heimdalljs-logger": "^0.1.7", + "object-assign": "^4.1.0", + "path-posix": "^1.0.0", + "symlink-or-copy": "^1.1.8" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fsevents": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz", + "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==", + "dev": true, + "optional": true, + "requires": { + "nan": "^2.9.2", + "node-pre-gyp": "^0.10.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "debug": { + "version": "2.6.9", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.21", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": "^2.1.0" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true + }, + "minipass": { + "version": "2.2.4", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "^5.1.1", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.2.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "^2.1.2", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.10.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.0", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.1.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.1.10", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.7", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "^0.5.1", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.6.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "^7.0.5" + } + }, + "safe-buffer": { + "version": "5.1.1", + "bundled": true, + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "5.5.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.0.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.2.4", + "minizlib": "^1.1.0", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.1", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "yallist": { + "version": "3.0.2", + "bundled": true, + "dev": true + } + } + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "dev": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "get-caller-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", + "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=", + "dev": true + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=" + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "git-repo-info": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/git-repo-info/-/git-repo-info-1.4.1.tgz", + "integrity": "sha1-KgcoIyVKr2L88HZgB9e2ZRvUGUM=", + "dev": true + }, + "git-repo-version": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/git-repo-version/-/git-repo-version-0.4.1.tgz", + "integrity": "sha1-dfq5oKTshHB1Ww7qf9qm+dQUU78=", + "dev": true, + "requires": { + "git-repo-info": "~1.2.0" + }, + "dependencies": { + "git-repo-info": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/git-repo-info/-/git-repo-info-1.2.0.tgz", + "integrity": "sha1-Q9hRPgSiTdRBMwovfGZVpwn9uvI=", + "dev": true + } + } + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true, + "requires": { + "glob-parent": "^2.0.0", + "is-glob": "^2.0.0" + } + }, + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "requires": { + "is-glob": "^2.0.0" + } + }, + "global-modules": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-0.2.3.tgz", + "integrity": "sha1-6lo77ULG1s6ZWk+KEmm12uIjgo0=", + "dev": true, + "requires": { + "global-prefix": "^0.1.4", + "is-windows": "^0.2.0" + } + }, + "global-prefix": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-0.1.5.tgz", + "integrity": "sha1-jTvGuNo8qBEqFg2NSW/wRiv+948=", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.0", + "ini": "^1.3.4", + "is-windows": "^0.2.0", + "which": "^1.2.12" + } + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==" + }, + "got": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/got/-/got-8.3.1.tgz", + "integrity": "sha512-tiLX+bnYm5A56T5N/n9Xo89vMaO1mrS9qoDqj3u/anVooqGozvY/HbXzEpDfbNeKsHCBpK40gSbz8wGYSp3i1w==", + "requires": { + "@sindresorhus/is": "^0.7.0", + "cacheable-request": "^2.1.1", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "into-stream": "^3.1.0", + "is-retry-allowed": "^1.1.0", + "isurl": "^1.0.0-alpha5", + "lowercase-keys": "^1.0.0", + "mimic-response": "^1.0.0", + "p-cancelable": "^0.4.0", + "p-timeout": "^2.0.1", + "pify": "^3.0.0", + "safe-buffer": "^5.1.1", + "timed-out": "^4.0.1", + "url-parse-lax": "^3.0.0", + "url-to-options": "^1.0.1" + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" + }, + "graceful-readlink": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", + "dev": true + }, + "growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", + "dev": true + }, + "handlebars": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz", + "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=", + "requires": { + "async": "^1.4.0", + "optimist": "^0.6.1", + "source-map": "^0.4.4", + "uglify-js": "^2.6" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" + }, + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "has-binary": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/has-binary/-/has-binary-0.1.7.tgz", + "integrity": "sha1-aOYesWIQyVRaClzOBqhzkS/h5ow=", + "dev": true, + "requires": { + "isarray": "0.0.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + } + } + }, + "has-cors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", + "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "has-symbol-support-x": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", + "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==" + }, + "has-to-string-tag-x": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", + "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==", + "requires": { + "has-symbol-support-x": "^1.4.1" + } + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hash-for-dep": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/hash-for-dep/-/hash-for-dep-1.2.3.tgz", + "integrity": "sha512-NE//rDaCFpWHViw30YM78OAGBShU+g4dnUGY3UWGyEzPOGYg/ptOjk32nEc+bC1xz+RfK5UIs6lOL6eQdrV4Ow==", + "requires": { + "broccoli-kitchen-sink-helpers": "^0.3.1", + "heimdalljs": "^0.2.3", + "heimdalljs-logger": "^0.1.7", + "resolve": "^1.4.0" + } + }, + "heimdalljs": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/heimdalljs/-/heimdalljs-0.2.5.tgz", + "integrity": "sha1-aqVDCO7nk7ZCz/nPlHgURfN3MKw=", + "requires": { + "rsvp": "~3.2.1" + }, + "dependencies": { + "rsvp": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-3.2.1.tgz", + "integrity": "sha1-B8tKXfJa3Z6Cbrxn3Mn9idsn2Eo=" + } + } + }, + "heimdalljs-fs-monitor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/heimdalljs-fs-monitor/-/heimdalljs-fs-monitor-0.1.1.tgz", + "integrity": "sha512-ZGBhHnA8av9fUwJNscuRXkAHC/T4a3glLDrv/vT973J8Yk0QHGzK/4vpnky9u+t4au3ogI9SWBk45ydk4F9iuw==", + "dev": true, + "requires": { + "heimdalljs": "^0.2.0", + "heimdalljs-logger": "^0.1.7" + } + }, + "heimdalljs-graph": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/heimdalljs-graph/-/heimdalljs-graph-0.3.4.tgz", + "integrity": "sha512-2DXgPIxdatgtBOjlh5qeVeHIGMTC2V9ujEvUhVJBVOVwqnU41g1OuGaRugLi6rvk0E+u1koYkfPeptybV8ZJ4g==", + "dev": true + }, + "heimdalljs-logger": { + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/heimdalljs-logger/-/heimdalljs-logger-0.1.9.tgz", + "integrity": "sha1-12raTkW3u294b8nAEKaOsuL68XY=", + "requires": { + "debug": "^2.2.0", + "heimdalljs": "^0.2.0" + } + }, + "home-or-tmp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", + "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.1" + } + }, + "homedir-polyfill": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", + "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", + "dev": true, + "requires": { + "parse-passwd": "^1.0.0" + } + }, + "hosted-git-info": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.0.tgz", + "integrity": "sha512-lIbgIIQA3lz5XaB6vxakj6sDHADJiZadYEJB+FgA+C4nubM1NwcuvUr9EJPmnH1skZqpqUzWborWo8EIUi0Sdw==", + "dev": true + }, + "http-cache-semantics": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", + "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==" + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "http-parser-js": { + "version": "0.4.13", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.13.tgz", + "integrity": "sha1-O9bW/ebjFyyTNMOzO2wZPYD+ETc=", + "dev": true + }, + "http-proxy": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.17.0.tgz", + "integrity": "sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g==", + "dev": true, + "requires": { + "eventemitter3": "^3.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "iconv-lite": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", + "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", + "dev": true + }, + "inflection": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.12.0.tgz", + "integrity": "sha1-ogCTVlbW9fa8TcdQLhrstwMihBY=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "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 + }, + "inline-source-map-comment": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/inline-source-map-comment/-/inline-source-map-comment-1.0.5.tgz", + "integrity": "sha1-UKikTCp5DfrEQbXJTszVRiY1+vY=", + "dev": true, + "requires": { + "chalk": "^1.0.0", + "get-stdin": "^4.0.1", + "minimist": "^1.1.1", + "sum-up": "^1.0.1", + "xtend": "^4.0.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "inquirer": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-1.2.3.tgz", + "integrity": "sha1-TexvMvN+97sLLtPx0aXD9UUHSRg=", + "dev": true, + "requires": { + "ansi-escapes": "^1.1.0", + "chalk": "^1.0.0", + "cli-cursor": "^1.0.1", + "cli-width": "^2.0.0", + "external-editor": "^1.1.0", + "figures": "^1.3.5", + "lodash": "^4.3.0", + "mute-stream": "0.0.6", + "pinkie-promise": "^2.0.0", + "run-async": "^2.2.0", + "rx": "^4.1.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.0", + "through": "^2.3.6" + } + }, + "into-stream": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-3.1.0.tgz", + "integrity": "sha1-lvsKk2wSur1v8XUqF9BWFqvQlMY=", + "requires": { + "from2": "^2.1.1", + "p-is-promise": "^1.1.0" + } + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "requires": { + "loose-envify": "^1.0.0" + } + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" + }, + "ipaddr.js": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.6.0.tgz", + "integrity": "sha1-4/o1e3c9phnybpXwSdBVxyeW+Gs=", + "dev": true + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", + "dev": true + }, + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "dev": true, + "requires": { + "is-primitive": "^2.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "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=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-git-url": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-git-url/-/is-git-url-1.0.0.tgz", + "integrity": "sha1-U/aEzRQyhbUsMkS05vKCU1J69ms=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "is-integer": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-integer/-/is-integer-1.0.7.tgz", + "integrity": "sha1-a96Bqs3feLZZtmKdYpytxRqIbVw=", + "requires": { + "is-finite": "^1.0.0" + } + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true + }, + "is-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz", + "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=" + }, + "is-odd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz", + "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==", + "dev": true, + "requires": { + "is-number": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true + } + } + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", + "dev": true + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", + "dev": true + }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "dev": true + }, + "is-retry-allowed": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", + "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=" + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "is-type": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/is-type/-/is-type-0.0.1.tgz", + "integrity": "sha1-9lHYXDZdRJVdFKUdjXBh8/a0d5w=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0" + } + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "is-windows": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz", + "integrity": "sha1-3hqm1j6indJIc3tp8f+LgALSEIw=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isbinaryfile": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.2.tgz", + "integrity": "sha1-Sj6XTsDLqQBNP8bN5yCeppNopiE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + }, + "istextorbinary": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/istextorbinary/-/istextorbinary-2.1.0.tgz", + "integrity": "sha1-2+0qb1G+L3R1to+JRlgRFBt1iHQ=", + "requires": { + "binaryextensions": "1 || 2", + "editions": "^1.1.1", + "textextensions": "1 || 2" + } + }, + "isurl": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", + "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", + "requires": { + "has-to-string-tag-x": "^1.2.0", + "is-object": "^1.0.1" + } + }, + "jquery": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.3.1.tgz", + "integrity": "sha512-Ubldcmxp5np52/ENotGxlLe6aGMvmF4R8S6tZjsP6Knsaxd/xp3Zrh50cG93lR6nPXyUFwzN3ZSOQI0wRJNdGg==", + "dev": true + }, + "js-reporters": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/js-reporters/-/js-reporters-1.2.0.tgz", + "integrity": "sha1-fPLLaYGWaEeQNQ0MTKB/Su2ewX4=", + "dev": true + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" + }, + "js-yaml": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.11.0.tgz", + "integrity": "sha512-saJstZWv7oNeOyBh3+Dx1qWzhW0+e6/8eDzo7p5rDFqxntSztloLtuKu+Ejhtq82jsilwOIZYsCz+lIjthg1Hw==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "dependencies": { + "esprima": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", + "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", + "dev": true + } + } + }, + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" + }, + "json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=" + }, + "json-stable-stringify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "requires": { + "jsonify": "~0.0.0" + } + }, + "json3": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", + "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", + "dev": true + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" + }, + "jsonfile": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" + }, + "keyv": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.0.0.tgz", + "integrity": "sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA==", + "requires": { + "json-buffer": "3.0.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + }, + "klaw": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", + "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", + "requires": { + "graceful-fs": "^4.1.9" + } + }, + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "requires": { + "invert-kv": "^1.0.0" + } + }, + "leek": { + "version": "0.0.24", + "resolved": "https://registry.npmjs.org/leek/-/leek-0.0.24.tgz", + "integrity": "sha1-5ADlfw5g2O8r1NBo3EKKVDRdvNo=", + "dev": true, + "requires": { + "debug": "^2.1.0", + "lodash.assign": "^3.2.0", + "rsvp": "^3.0.21" + } + }, + "leven": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/leven/-/leven-1.0.2.tgz", + "integrity": "sha1-kUS27ryl8dBoAWnxpncNzqYLdcM=" + }, + "linkify-it": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.0.3.tgz", + "integrity": "sha1-2UpGSPmxwXnWT6lykSaL22zpQ08=", + "dev": true, + "requires": { + "uc.micro": "^1.0.1" + } + }, + "livereload-js": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-2.3.0.tgz", + "integrity": "sha512-j1R0/FeGa64Y+NmqfZhyoVRzcFlOZ8sNlKzHjh4VvLULFACZhn68XrX5DFg2FhMvSMJmROuFxRSa560ECWKBMg==", + "dev": true + }, + "loader.js": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/loader.js/-/loader.js-4.6.0.tgz", + "integrity": "sha512-NjAnzMq/BM2VlXA9er0Nx1Runocgi+hEU53ENhCtTx82GX6/l9NXwfIqg81om6QvmhUlv2zH+4R+N+wOoeXytQ==", + "dev": true + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "dependencies": { + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + } + } + }, + "lodash": { + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==" + }, + "lodash-es": { + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.10.tgz", + "integrity": "sha512-iesFYPmxYYGTcmQK0sL8bX3TGHyM6b2qREaB4kamHfQyfPJP0xgoGxp19nsH16nsfquLdiyKyX3mQkfiSGV8Rg==", + "dev": true + }, + "lodash._baseassign": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", + "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", + "dev": true, + "requires": { + "lodash._basecopy": "^3.0.0", + "lodash.keys": "^3.0.0" + }, + "dependencies": { + "lodash.keys": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "dev": true, + "requires": { + "lodash._getnative": "^3.0.0", + "lodash.isarguments": "^3.0.0", + "lodash.isarray": "^3.0.0" + } + } + } + }, + "lodash._basebind": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/lodash._basebind/-/lodash._basebind-2.3.0.tgz", + "integrity": "sha1-K1vEUqDhBhQ7IYafIzvbWHQX0kg=", + "dev": true, + "requires": { + "lodash._basecreate": "~2.3.0", + "lodash._setbinddata": "~2.3.0", + "lodash.isobject": "~2.3.0" + } + }, + "lodash._basecopy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", + "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", + "dev": true + }, + "lodash._basecreate": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-2.3.0.tgz", + "integrity": "sha1-m4ioak3P97fzxh2Dovz8BnHsneA=", + "dev": true, + "requires": { + "lodash._renative": "~2.3.0", + "lodash.isobject": "~2.3.0", + "lodash.noop": "~2.3.0" + } + }, + "lodash._basecreatecallback": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/lodash._basecreatecallback/-/lodash._basecreatecallback-2.3.0.tgz", + "integrity": "sha1-N7KrF1kaM56YjbMln81GAZ16w2I=", + "dev": true, + "requires": { + "lodash._setbinddata": "~2.3.0", + "lodash.bind": "~2.3.0", + "lodash.identity": "~2.3.0", + "lodash.support": "~2.3.0" + } + }, + "lodash._basecreatewrapper": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/lodash._basecreatewrapper/-/lodash._basecreatewrapper-2.3.0.tgz", + "integrity": "sha1-qgxhrZYETDkzN2ExSDqXWcNlEkc=", + "dev": true, + "requires": { + "lodash._basecreate": "~2.3.0", + "lodash._setbinddata": "~2.3.0", + "lodash._slice": "~2.3.0", + "lodash.isobject": "~2.3.0" + } + }, + "lodash._baseflatten": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/lodash._baseflatten/-/lodash._baseflatten-3.1.4.tgz", + "integrity": "sha1-B3D/gBMa9uNPO1EXlqe6UhTmX/c=", + "dev": true, + "requires": { + "lodash.isarguments": "^3.0.0", + "lodash.isarray": "^3.0.0" + } + }, + "lodash._bindcallback": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz", + "integrity": "sha1-5THCdkTPi1epnhftlbNcdIeJOS4=", + "dev": true + }, + "lodash._createassigner": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz", + "integrity": "sha1-g4pbri/aymOsIt7o4Z+k5taXCxE=", + "dev": true, + "requires": { + "lodash._bindcallback": "^3.0.0", + "lodash._isiterateecall": "^3.0.0", + "lodash.restparam": "^3.0.0" + } + }, + "lodash._createwrapper": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/lodash._createwrapper/-/lodash._createwrapper-2.3.0.tgz", + "integrity": "sha1-0arhEC2t9EDo4G/BM6bt1/4UYHU=", + "dev": true, + "requires": { + "lodash._basebind": "~2.3.0", + "lodash._basecreatewrapper": "~2.3.0", + "lodash.isfunction": "~2.3.0" + } + }, + "lodash._escapehtmlchar": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/lodash._escapehtmlchar/-/lodash._escapehtmlchar-2.3.0.tgz", + "integrity": "sha1-0D2mvYLu3zjcCltQPXQOzQ6JRZI=", + "dev": true, + "requires": { + "lodash._htmlescapes": "~2.3.0" + } + }, + "lodash._escapestringchar": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/lodash._escapestringchar/-/lodash._escapestringchar-2.3.0.tgz", + "integrity": "sha1-zOc65g/G2lXSv4oGecI8orqxSfw=", + "dev": true + }, + "lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", + "dev": true + }, + "lodash._htmlescapes": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/lodash._htmlescapes/-/lodash._htmlescapes-2.3.0.tgz", + "integrity": "sha1-HKmIY8rfH6HYLITzXzHkBVagTzo=", + "dev": true + }, + "lodash._isiterateecall": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", + "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", + "dev": true + }, + "lodash._objecttypes": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.3.0.tgz", + "integrity": "sha1-aj6jmH3W7rgCGy1cnDA1Scwrrh4=", + "dev": true + }, + "lodash._reinterpolate": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-2.3.0.tgz", + "integrity": "sha1-A+6dhcDlXL1ZDXFgiilb3aURKOw=", + "dev": true + }, + "lodash._renative": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/lodash._renative/-/lodash._renative-2.3.0.tgz", + "integrity": "sha1-d9jt1M7SbdWXH54Vpfdy5OMX+9M=", + "dev": true + }, + "lodash._reunescapedhtml": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/lodash._reunescapedhtml/-/lodash._reunescapedhtml-2.3.0.tgz", + "integrity": "sha1-25ILVax/P/glk5rOubosIxcT0k0=", + "dev": true, + "requires": { + "lodash._htmlescapes": "~2.3.0", + "lodash.keys": "~2.3.0" + } + }, + "lodash._setbinddata": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/lodash._setbinddata/-/lodash._setbinddata-2.3.0.tgz", + "integrity": "sha1-5WEEkKzRMnfVmFjZW18nJ/FQjwQ=", + "dev": true, + "requires": { + "lodash._renative": "~2.3.0", + "lodash.noop": "~2.3.0" + } + }, + "lodash._shimkeys": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/lodash._shimkeys/-/lodash._shimkeys-2.3.0.tgz", + "integrity": "sha1-YR+TFJ4+bHIQlrSHae8pU3rai6k=", + "dev": true, + "requires": { + "lodash._objecttypes": "~2.3.0" + } + }, + "lodash._slice": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/lodash._slice/-/lodash._slice-2.3.0.tgz", + "integrity": "sha1-FHGYEyhZly5GgMoppZkshVZpqlw=", + "dev": true + }, + "lodash.assign": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-3.2.0.tgz", + "integrity": "sha1-POnwI0tLIiPilrj6CsH+6OvKZPo=", + "dev": true, + "requires": { + "lodash._baseassign": "^3.0.0", + "lodash._createassigner": "^3.0.0", + "lodash.keys": "^3.0.0" + }, + "dependencies": { + "lodash.keys": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "dev": true, + "requires": { + "lodash._getnative": "^3.0.0", + "lodash.isarguments": "^3.0.0", + "lodash.isarray": "^3.0.0" + } + } + } + }, + "lodash.assignin": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assignin/-/lodash.assignin-4.2.0.tgz", + "integrity": "sha1-uo31+4QesKPoBEIysOJjqNxqKKI=", + "dev": true + }, + "lodash.bind": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/lodash.bind/-/lodash.bind-2.3.0.tgz", + "integrity": "sha1-wqjhi2jl7MFS4rFoJmEW/qWwFsw=", + "dev": true, + "requires": { + "lodash._createwrapper": "~2.3.0", + "lodash._renative": "~2.3.0", + "lodash._slice": "~2.3.0" + } + }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "dev": true + }, + "lodash.debounce": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-3.1.1.tgz", + "integrity": "sha1-gSIRw3ipTMKdWqTjNGzwv846ffU=", + "dev": true, + "requires": { + "lodash._getnative": "^3.0.0" + } + }, + "lodash.defaults": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-2.3.0.tgz", + "integrity": "sha1-qDKwAfE487uXIcKBmip8xa4h7SU=", + "dev": true, + "requires": { + "lodash._objecttypes": "~2.3.0", + "lodash.keys": "~2.3.0" + } + }, + "lodash.escape": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-2.3.0.tgz", + "integrity": "sha1-hEw4xY+EThNi6+lnJhWbYs9fKlg=", + "dev": true, + "requires": { + "lodash._escapehtmlchar": "~2.3.0", + "lodash._reunescapedhtml": "~2.3.0", + "lodash.keys": "~2.3.0" + } + }, + "lodash.find": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.find/-/lodash.find-4.6.0.tgz", + "integrity": "sha1-ywcE1Hq3F4n/oN6Ll92Sb7iLE7E=", + "dev": true + }, + "lodash.flatten": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-3.0.2.tgz", + "integrity": "sha1-3hz1d1j49EeTGdNcPpzGDEUBk4w=", + "dev": true, + "requires": { + "lodash._baseflatten": "^3.0.0", + "lodash._isiterateecall": "^3.0.0" + } + }, + "lodash.foreach": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-2.3.0.tgz", + "integrity": "sha1-CDQEyR6EbudyRf3512UZxosq8Wg=", + "dev": true, + "requires": { + "lodash._basecreatecallback": "~2.3.0", + "lodash.forown": "~2.3.0" + } + }, + "lodash.forown": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/lodash.forown/-/lodash.forown-2.3.0.tgz", + "integrity": "sha1-JPtKr4ANRfwtxgv+w84EyDajrX8=", + "dev": true, + "requires": { + "lodash._basecreatecallback": "~2.3.0", + "lodash._objecttypes": "~2.3.0", + "lodash.keys": "~2.3.0" + } + }, + "lodash.identity": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/lodash.identity/-/lodash.identity-2.3.0.tgz", + "integrity": "sha1-awGiEMlIU1XCqRO0i2cRIZoXPe0=", + "dev": true + }, + "lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", + "dev": true + }, + "lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", + "dev": true + }, + "lodash.isfunction": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-2.3.0.tgz", + "integrity": "sha1-aylz5HpkfPEucNZ2rqE2Q3BuUmc=", + "dev": true + }, + "lodash.isobject": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.3.0.tgz", + "integrity": "sha1-LhbT/Fg9qYMZaJU/LY5tc0NPZ5k=", + "dev": true, + "requires": { + "lodash._objecttypes": "~2.3.0" + } + }, + "lodash.keys": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.3.0.tgz", + "integrity": "sha1-s1D0+Syqn0WkouzwGEVM8vKK4lM=", + "dev": true, + "requires": { + "lodash._renative": "~2.3.0", + "lodash._shimkeys": "~2.3.0", + "lodash.isobject": "~2.3.0" + } + }, + "lodash.merge": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.1.tgz", + "integrity": "sha512-AOYza4+Hf5z1/0Hztxpm2/xiPZgi/cjMqdnKTUWTBSKchJlxXXuUSxCCl8rJlf4g6yww/j6mA8nC8Hw/EZWxKQ==", + "dev": true + }, + "lodash.noop": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/lodash.noop/-/lodash.noop-2.3.0.tgz", + "integrity": "sha1-MFnWKNUbv5N80qC2/Dp/ISpmnCw=", + "dev": true + }, + "lodash.omit": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.omit/-/lodash.omit-4.5.0.tgz", + "integrity": "sha1-brGa5aHuHdnfC5aeZs4Lf6MLXmA=", + "dev": true + }, + "lodash.restparam": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", + "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=", + "dev": true + }, + "lodash.support": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/lodash.support/-/lodash.support-2.3.0.tgz", + "integrity": "sha1-fq8DivTw1qq3drRKptz8gDNMm/0=", + "dev": true, + "requires": { + "lodash._renative": "~2.3.0" + } + }, + "lodash.template": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.4.0.tgz", + "integrity": "sha1-5zoDhcg1VZF0bgILmWecaQ5o+6A=", + "dev": true, + "requires": { + "lodash._reinterpolate": "~3.0.0", + "lodash.templatesettings": "^4.0.0" + }, + "dependencies": { + "lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", + "dev": true + }, + "lodash.templatesettings": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz", + "integrity": "sha1-K01OlbpEDZFf8IvImeRVNmZxMxY=", + "dev": true, + "requires": { + "lodash._reinterpolate": "~3.0.0" + } + } + } + }, + "lodash.templatesettings": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-2.3.0.tgz", + "integrity": "sha1-MD0TLDQnEAQNWhjvqi1XL9A/jNw=", + "dev": true, + "requires": { + "lodash._reinterpolate": "~2.3.0", + "lodash.escape": "~2.3.0" + } + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", + "dev": true + }, + "lodash.uniqby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz", + "integrity": "sha1-2ZwHpmnp5tJOE2Lf4mbGdhavEwI=", + "dev": true + }, + "lodash.values": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/lodash.values/-/lodash.values-2.3.0.tgz", + "integrity": "sha1-ypb75gogsLDsK6K6X8anZb0Uo7o=", + "dev": true, + "requires": { + "lodash.keys": "~2.3.0" + } + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=" + }, + "loose-envify": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", + "requires": { + "js-tokens": "^3.0.0" + } + }, + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" + }, + "lru-cache": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", + "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "makeerror": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", + "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "dev": true, + "requires": { + "tmpl": "1.0.x" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "markdown-it": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-8.4.1.tgz", + "integrity": "sha512-CzzqSSNkFRUf9vlWvhK1awpJreMRqdCrBvZ8DIoDWTOkESMIF741UPAhuAmbyWmdiFPA6WARNhnu2M6Nrhwa+A==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "entities": "~1.1.1", + "linkify-it": "^2.0.0", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" + } + }, + "markdown-it-terminal": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/markdown-it-terminal/-/markdown-it-terminal-0.1.0.tgz", + "integrity": "sha1-VFq9jdAcPWI1O/zqcdtYC1HSK9k=", + "dev": true, + "requires": { + "ansi-styles": "^3.0.0", + "cardinal": "^1.0.0", + "cli-table": "^0.3.1", + "lodash.merge": "^4.6.0", + "markdown-it": "^8.3.1" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + } + } + }, + "matcher-collection": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/matcher-collection/-/matcher-collection-1.0.5.tgz", + "integrity": "sha512-nUCmzKipcJEwYsBVAFh5P+d7JBuhJaW1xs85Hara9xuMLqtCVUrW6DSC0JVIkluxEH2W45nPBM/wjHtBXa/tYA==", + "requires": { + "minimatch": "^3.0.2" + } + }, + "math-random": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz", + "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=", + "dev": true + }, + "md5-hex": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/md5-hex/-/md5-hex-1.3.0.tgz", + "integrity": "sha1-0sSv6YPENwZiF5uMrRRSGRNQRsQ=", + "dev": true, + "requires": { + "md5-o-matic": "^0.1.1" + } + }, + "md5-o-matic": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/md5-o-matic/-/md5-o-matic-0.1.1.tgz", + "integrity": "sha1-givM1l4RfFFPqxdrJZRdVBAKA8M=", + "dev": true + }, + "mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=", + "dev": true + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true + }, + "memory-streams": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/memory-streams/-/memory-streams-0.1.3.tgz", + "integrity": "sha512-qVQ/CjkMyMInPaaRMrwWNDvf6boRZXaT/DbQeMYcCWuXPEBf1v8qChOc9OlEVQp2uOvRXa1Qu30fLmKhY6NipA==", + "dev": true, + "requires": { + "readable-stream": "~1.0.2" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, + "merge": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.0.tgz", + "integrity": "sha1-dTHjnUlJwoGma4xabgJl6LBYlNo=", + "dev": true + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true + }, + "merge-trees": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-trees/-/merge-trees-1.0.1.tgz", + "integrity": "sha1-zL5nRWl4f53vF/1G5lJfVwC70j4=", + "requires": { + "can-symlink": "^1.0.0", + "fs-tree-diff": "^0.5.4", + "heimdalljs": "^0.2.1", + "heimdalljs-logger": "^0.1.7", + "rimraf": "^2.4.3", + "symlink-or-copy": "^1.0.0" + } + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" + } + }, + "mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", + "dev": true + }, + "mime-db": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", + "dev": true + }, + "mime-types": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "dev": true, + "requires": { + "mime-db": "~1.33.0" + } + }, + "mimic-response": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.0.tgz", + "integrity": "sha1-3z02Uqc/3ta5sLJBRub9BSNTRY4=" + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + }, + "mixin-deep": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", + "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + } + }, + "mktemp": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/mktemp/-/mktemp-0.4.0.tgz", + "integrity": "sha1-bQUVYRyKjITkhKogABKbmOmB/ws=" + }, + "moment": { + "version": "2.22.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.22.1.tgz", + "integrity": "sha512-shJkRTSebXvsVqk56I+lkb2latjBs8I+pc2TzWc545y2iFnSjm7Wg0QMh+ZWcdSLQyGEau5jI8ocnmkyTgr9YQ==", + "dev": true + }, + "moment-timezone": { + "version": "0.5.17", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.17.tgz", + "integrity": "sha512-Y/JpVEWIOA9Gho4vO15MTnW1FCmHi3ypprrkUaxsZ1TKg3uqC8q/qMBjTddkHoiwwZN3qvZSr4zJP7x9V3LpXA==", + "dev": true, + "requires": { + "moment": ">= 2.9.0" + } + }, + "morgan": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.9.0.tgz", + "integrity": "sha1-0B+mxlhZt2/PMbPLU6OCGjEdgFE=", + "dev": true, + "requires": { + "basic-auth": "~2.0.0", + "debug": "2.6.9", + "depd": "~1.1.1", + "on-finished": "~2.3.0", + "on-headers": "~1.0.1" + } + }, + "mout": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mout/-/mout-1.1.0.tgz", + "integrity": "sha512-XsP0vf4As6BfqglxZqbqQ8SR6KQot2AgxvR0gG+WtUkf90vUXchMOZQtPf/Hml1rEffJupqL/tIrU6EYhsUQjw==", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "mustache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/mustache/-/mustache-2.3.0.tgz", + "integrity": "sha1-QCj3d4sXcIpImTCm5SrDvKDaQdA=", + "dev": true + }, + "mute-stream": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.6.tgz", + "integrity": "sha1-SJYrGeFp/R38JAs/HnMXYnu8R9s=", + "dev": true + }, + "nan": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", + "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==", + "dev": true, + "optional": true + }, + "nanomatch": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz", + "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-odd": "^2.0.0", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "negotiator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", + "dev": true + }, + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", + "dev": true + }, + "node-fetch": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", + "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", + "requires": { + "encoding": "^0.1.11", + "is-stream": "^1.0.1" + } + }, + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", + "dev": true + }, + "node-modules-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/node-modules-path/-/node-modules-path-1.0.1.tgz", + "integrity": "sha1-QAlrCM560OoUaAhjr0ScfHWl0cg=", + "dev": true + }, + "node-notifier": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.2.1.tgz", + "integrity": "sha512-MIBs+AAd6dJ2SklbbE8RUDRlIVhU8MaNLh1A9SUZDUHPiZkWLFde6UNwG41yQHZEToHgJMXqyVZ9UcS/ReOVTg==", + "dev": true, + "requires": { + "growly": "^1.3.0", + "semver": "^5.4.1", + "shellwords": "^0.1.1", + "which": "^1.3.0" + } + }, + "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" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "normalize-url": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-2.0.1.tgz", + "integrity": "sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==", + "requires": { + "prepend-http": "^2.0.0", + "query-string": "^5.0.1", + "sort-keys": "^2.0.0" + } + }, + "npm-git-info": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/npm-git-info/-/npm-git-info-1.0.3.tgz", + "integrity": "sha1-qTPELsMh6A02RuDW6ESv6UYw4dU=", + "dev": true + }, + "npm-package-arg": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-4.2.1.tgz", + "integrity": "sha1-WTMD/eqF98Qid18X+et2cPaA4+w=", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.5", + "semver": "^5.1.0" + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "dev": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-component": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", + "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "dev": true, + "requires": { + "for-own": "^0.1.4", + "is-extendable": "^0.1.1" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", + "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", + "dev": true + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "requires": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + } + }, + "options": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz", + "integrity": "sha1-7CLTEoBrtT5zF3Pnza788cZDEo8=", + "dev": true + }, + "ora": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/ora/-/ora-0.2.3.tgz", + "integrity": "sha1-N1J9Igrc1Tw5tzVx11QVbV22V6Q=", + "dev": true, + "requires": { + "chalk": "^1.1.1", + "cli-cursor": "^1.0.2", + "cli-spinners": "^0.1.2", + "object-assign": "^4.0.1" + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "requires": { + "lcid": "^1.0.0" + } + }, + "os-shim": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/os-shim/-/os-shim-0.1.3.tgz", + "integrity": "sha1-a2LDeRz3kJ6jXtRuF2WLtBfLORc=", + "dev": true + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "dev": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "output-file-sync": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/output-file-sync/-/output-file-sync-1.1.2.tgz", + "integrity": "sha1-0KM+7+YaIF+suQCS6CZZjVJFznY=", + "requires": { + "graceful-fs": "^4.1.4", + "mkdirp": "^0.5.1", + "object-assign": "^4.1.0" + } + }, + "p-cancelable": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.4.1.tgz", + "integrity": "sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ==" + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" + }, + "p-is-promise": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz", + "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=" + }, + "p-limit": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", + "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-timeout": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-2.0.1.tgz", + "integrity": "sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==", + "requires": { + "p-finally": "^1.0.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "pagination-pager": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/pagination-pager/-/pagination-pager-2.4.1.tgz", + "integrity": "sha1-66baYYh7c0eR5ckkjCNu33thN78=" + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "dev": true, + "requires": { + "glob-base": "^0.3.0", + "is-dotfile": "^1.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.0" + } + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true + }, + "parsejson": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/parsejson/-/parsejson-0.0.3.tgz", + "integrity": "sha1-q343WfIJ7OmUN5c/fQ8fZK4OZKs=", + "dev": true, + "requires": { + "better-assert": "~1.0.0" + } + }, + "parseqs": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", + "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", + "dev": true, + "requires": { + "better-assert": "~1.0.0" + } + }, + "parseuri": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", + "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", + "dev": true, + "requires": { + "better-assert": "~1.0.0" + } + }, + "parseurl": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-exists": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-1.0.0.tgz", + "integrity": "sha1-1aiZjrce83p0w06w2eum6HjuoIE=" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-parse": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", + "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=" + }, + "path-posix": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/path-posix/-/path-posix-1.0.0.tgz", + "integrity": "sha1-BrJhE/Vr6rBCVFojv6iAA8ysJg8=" + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "portfinder": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.13.tgz", + "integrity": "sha1-uzLs2HwnEErm7kS1o8y/Drsa7ek=", + "dev": true, + "requires": { + "async": "^1.5.2", + "debug": "^2.2.0", + "mkdirp": "0.5.x" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + } + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "postcss": { + "version": "6.0.22", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.22.tgz", + "integrity": "sha512-Toc9lLoUASwGqxBSJGTVcOQiDqjK+Z2XlWBg+IgYwQMY9vA2f7iMpXVc1GpPcfTSyM5lkxNo0oDwDRO+wm7XHA==", + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=" + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "dev": true + }, + "pretender": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/pretender/-/pretender-1.6.1.tgz", + "integrity": "sha1-d9HkKsjGspj1zUNTSodkXfA124w=", + "dev": true, + "requires": { + "fake-xml-http-request": "^1.6.0", + "route-recognizer": "^0.3.3" + }, + "dependencies": { + "route-recognizer": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/route-recognizer/-/route-recognizer-0.3.3.tgz", + "integrity": "sha1-HTZeJ/ppleCRZ199yUCowANTvSk=", + "dev": true + } + } + }, + "printf": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/printf/-/printf-0.2.5.tgz", + "integrity": "sha1-xDjKLKM+OSdnHbSracDlL5NqTw8=", + "dev": true + }, + "private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==" + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" + }, + "process-relative-require": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/process-relative-require/-/process-relative-require-1.0.0.tgz", + "integrity": "sha1-FZDfz1uPKYO6U+OYRGtoJAtMxoo=", + "dev": true, + "requires": { + "node-modules-path": "^1.0.0" + } + }, + "promise-map-series": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/promise-map-series/-/promise-map-series-0.2.3.tgz", + "integrity": "sha1-wtN3r8kyU/a9A9u3d1XriKsgqEc=", + "requires": { + "rsvp": "^3.0.14" + } + }, + "proxy-addr": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.3.tgz", + "integrity": "sha512-jQTChiCJteusULxjBp8+jftSQE5Obdl3k4cnmLA6WXtK6XFuWRnvVL7aCiBqaLPM8c4ph0S4tKna8XvmIwEnXQ==", + "dev": true, + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.6.0" + } + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=" + }, + "qs": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", + "dev": true + }, + "query-string": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", + "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", + "requires": { + "decode-uri-component": "^0.2.0", + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + } + }, + "quick-temp": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/quick-temp/-/quick-temp-0.1.8.tgz", + "integrity": "sha1-urAqJCq4+w3XWKPJd2sy+aXZRAg=", + "requires": { + "mktemp": "~0.4.0", + "rimraf": "^2.5.4", + "underscore.string": "~3.3.4" + } + }, + "qunit-notifications": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/qunit-notifications/-/qunit-notifications-0.1.1.tgz", + "integrity": "sha1-MAGvxqanffvZYsy83d4S3sUobAk=", + "dev": true + }, + "qunitjs": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/qunitjs/-/qunitjs-2.4.1.tgz", + "integrity": "sha512-by/2zYvsNdS6Q6Ev6UJ3qJK+OYVlTzWlQ4afaeYMhVh1dd2K3N1ZZKCrCm3WSWPnz5ELMT8WyJRcVy5PXT2y+Q==", + "dev": true, + "requires": { + "chokidar": "1.6.1", + "commander": "2.9.0", + "exists-stat": "1.0.0", + "findup-sync": "0.4.3", + "js-reporters": "1.2.0", + "resolve": "1.3.2", + "walk-sync": "0.3.1" + }, + "dependencies": { + "commander": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", + "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", + "dev": true, + "requires": { + "graceful-readlink": ">= 1.0.0" + } + }, + "resolve": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.3.2.tgz", + "integrity": "sha1-HwRCyeDLuBNuh7kwX5MvRsfygjU=", + "dev": true, + "requires": { + "path-parse": "^1.0.5" + } + }, + "walk-sync": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/walk-sync/-/walk-sync-0.3.1.tgz", + "integrity": "sha1-VYoWrqyMDbWcAotzxm85doTs5GU=", + "dev": true, + "requires": { + "ensure-posix-path": "^1.0.0", + "matcher-collection": "^1.0.0" + } + } + } + }, + "randomatic": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.0.0.tgz", + "integrity": "sha512-VdxFOIEY3mNO5PtSRkkle/hPJDHvQhK21oa73K4yAc9qmp6N429gAyF1gZMOTMeS0/AYzaV/2Trcef+NaIonSA==", + "dev": true, + "requires": { + "is-number": "^4.0.0", + "kind-of": "^6.0.0", + "math-random": "^1.0.1" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=", + "dev": true + }, + "raw-body": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", + "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", + "dev": true, + "requires": { + "bytes": "3.0.0", + "http-errors": "1.6.2", + "iconv-lite": "0.4.19", + "unpipe": "1.0.0" + }, + "dependencies": { + "depd": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", + "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=", + "dev": true + }, + "http-errors": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", + "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", + "dev": true, + "requires": { + "depd": "1.1.1", + "inherits": "2.0.3", + "setprototypeof": "1.0.3", + "statuses": ">= 1.3.1 < 2" + } + }, + "iconv-lite": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", + "dev": true + }, + "setprototypeof": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", + "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=", + "dev": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "readdirp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", + "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "minimatch": "^3.0.2", + "readable-stream": "^2.0.2", + "set-immediate-shim": "^1.0.1" + } + }, + "recast": { + "version": "0.10.33", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.10.33.tgz", + "integrity": "sha1-lCgI96oBbx+nFCxGHX5XBKqo1pc=", + "requires": { + "ast-types": "0.8.12", + "esprima-fb": "~15001.1001.0-dev-harmony-fb", + "private": "~0.1.5", + "source-map": "~0.5.0" + }, + "dependencies": { + "ast-types": { + "version": "0.8.12", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.8.12.tgz", + "integrity": "sha1-oNkOQ1G7iHcWyD/WN+v4GK9K38w=" + } + } + }, + "redeyed": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-1.0.1.tgz", + "integrity": "sha1-6WwZO0DAgWsArshCaY5hGF5VSYo=", + "dev": true, + "requires": { + "esprima": "~3.0.0" + }, + "dependencies": { + "esprima": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.0.0.tgz", + "integrity": "sha1-U88kes2ncxPlUcOqLnM0LT+099k=", + "dev": true + } + } + }, + "regenerate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", + "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==" + }, + "regenerator": { + "version": "0.8.40", + "resolved": "https://registry.npmjs.org/regenerator/-/regenerator-0.8.40.tgz", + "integrity": "sha1-oORXxY69uuV1yfjNdRJ+k3VkNdg=", + "requires": { + "commoner": "~0.10.3", + "defs": "~1.1.0", + "esprima-fb": "~15001.1001.0-dev-harmony-fb", + "private": "~0.1.5", + "recast": "0.10.33", + "through": "~2.3.8" + } + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + }, + "regenerator-transform": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", + "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", + "requires": { + "babel-runtime": "^6.18.0", + "babel-types": "^6.19.0", + "private": "^0.1.6" + } + }, + "regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "dev": true, + "requires": { + "is-equal-shallow": "^0.1.3" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "regexpu": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/regexpu/-/regexpu-1.3.0.tgz", + "integrity": "sha1-5TTcmRqeWEYFDJjebX3UpVyeoW0=", + "requires": { + "esprima": "^2.6.0", + "recast": "^0.10.10", + "regenerate": "^1.2.1", + "regjsgen": "^0.2.0", + "regjsparser": "^0.1.4" + }, + "dependencies": { + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=" + } + } + }, + "regexpu-core": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", + "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", + "requires": { + "regenerate": "^1.2.1", + "regjsgen": "^0.2.0", + "regjsparser": "^0.1.4" + } + }, + "regjsgen": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", + "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=" + }, + "regjsparser": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", + "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "requires": { + "jsesc": "~0.5.0" + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "repeat-element": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", + "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "requires": { + "is-finite": "^1.0.0" + } + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "resolve": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz", + "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==", + "requires": { + "path-parse": "^1.0.5" + } + }, + "resolve-dir": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-0.1.1.tgz", + "integrity": "sha1-shklmlYC+sXFxJatiUpujMQwJh4=", + "dev": true, + "requires": { + "expand-tilde": "^1.2.2", + "global-modules": "^0.2.3" + } + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "requires": { + "lowercase-keys": "^1.0.0" + } + }, + "restore-cursor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", + "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", + "dev": true, + "requires": { + "exit-hook": "^1.0.0", + "onetime": "^1.0.0" + } + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "requires": { + "align-text": "^0.1.1" + } + }, + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "requires": { + "glob": "^7.0.5" + } + }, + "rollup": { + "version": "0.41.6", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-0.41.6.tgz", + "integrity": "sha1-4NBUl4d6OYwQTYFtJzOnGKepTio=", + "dev": true, + "requires": { + "source-map-support": "^0.4.0" + } + }, + "route-recognizer": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/route-recognizer/-/route-recognizer-0.2.10.tgz", + "integrity": "sha1-Aksig8LmjROnx/UXOlkkZF6JAt8=", + "dev": true + }, + "rsvp": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-3.6.2.tgz", + "integrity": "sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw==" + }, + "run-async": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "dev": true, + "requires": { + "is-promise": "^2.1.0" + } + }, + "rx": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz", + "integrity": "sha1-pfE/957zt0D+MKqAP7CfmIBdR4I=", + "dev": true + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safe-json-parse": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/safe-json-parse/-/safe-json-parse-1.0.1.tgz", + "integrity": "sha1-PnZyPjjf3aE8mx0poeB//uSzC1c=", + "dev": true + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "sane": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/sane/-/sane-1.7.0.tgz", + "integrity": "sha1-s1ebzLRclM8gNVzIESSZDf00bjA=", + "dev": true, + "requires": { + "anymatch": "^1.3.0", + "exec-sh": "^0.2.0", + "fb-watchman": "^2.0.0", + "minimatch": "^3.0.2", + "minimist": "^1.1.1", + "walker": "~1.0.5", + "watch": "~0.10.0" + }, + "dependencies": { + "anymatch": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", + "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", + "dev": true, + "requires": { + "micromatch": "^2.1.5", + "normalize-path": "^2.0.0" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "watch": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/watch/-/watch-0.10.0.tgz", + "integrity": "sha1-d3mLLaD5kQ1ZXxrOWwwiWFIfIdw=", + "dev": true + } + } + }, + "semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==" + }, + "send": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", + "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "~2.3.0", + "range-parser": "~1.2.0", + "statuses": "~1.4.0" + } + }, + "serve-static": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", + "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", + "dev": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.2", + "send": "0.16.2" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", + "dev": true + }, + "set-value": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", + "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" + }, + "shellwords": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "silent-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/silent-error/-/silent-error-1.1.0.tgz", + "integrity": "sha1-IglwbxyFCp8dENDYQJGLRvJuG8k=", + "requires": { + "debug": "^2.2.0" + } + }, + "simple-dom": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/simple-dom/-/simple-dom-0.3.2.tgz", + "integrity": "sha1-BmPRDxVW8VAFUdUY9W46ughxNx0=", + "dev": true + }, + "simple-fmt": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/simple-fmt/-/simple-fmt-0.1.0.tgz", + "integrity": "sha1-GRv1ZqWeZTBILLJatTtKjchcOms=" + }, + "simple-html-tokenizer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/simple-html-tokenizer/-/simple-html-tokenizer-0.3.0.tgz", + "integrity": "sha1-m4tVWdgOMxpUTdE91ZOC5dDZRBE=" + }, + "simple-is": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/simple-is/-/simple-is-0.2.0.tgz", + "integrity": "sha1-Krt1qt453rXMgVzhDmGRFkhQuvA=" + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + } + }, + "socket.io": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-1.6.0.tgz", + "integrity": "sha1-PkDZMmN+a9kjmBslyvfFPoO24uE=", + "dev": true, + "requires": { + "debug": "2.3.3", + "engine.io": "1.8.0", + "has-binary": "0.1.7", + "object-assign": "4.1.0", + "socket.io-adapter": "0.5.0", + "socket.io-client": "1.6.0", + "socket.io-parser": "2.3.1" + }, + "dependencies": { + "debug": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "dev": true, + "requires": { + "ms": "0.7.2" + } + }, + "ms": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", + "dev": true + }, + "object-assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz", + "integrity": "sha1-ejs9DpgGPUP0wD8uiubNUahog6A=", + "dev": true + } + } + }, + "socket.io-adapter": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-0.5.0.tgz", + "integrity": "sha1-y21LuL7IHhB4uZZ3+c7QBGBmu4s=", + "dev": true, + "requires": { + "debug": "2.3.3", + "socket.io-parser": "2.3.1" + }, + "dependencies": { + "debug": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "dev": true, + "requires": { + "ms": "0.7.2" + } + }, + "ms": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", + "dev": true + } + } + }, + "socket.io-client": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-1.6.0.tgz", + "integrity": "sha1-W2aPT3cTBN/u0XkGRwg4b6ZxeFM=", + "dev": true, + "requires": { + "backo2": "1.0.2", + "component-bind": "1.0.0", + "component-emitter": "1.2.1", + "debug": "2.3.3", + "engine.io-client": "1.8.0", + "has-binary": "0.1.7", + "indexof": "0.0.1", + "object-component": "0.0.3", + "parseuri": "0.0.5", + "socket.io-parser": "2.3.1", + "to-array": "0.1.4" + }, + "dependencies": { + "debug": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "dev": true, + "requires": { + "ms": "0.7.2" + } + }, + "ms": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", + "dev": true + } + } + }, + "socket.io-parser": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-2.3.1.tgz", + "integrity": "sha1-3VMgJRA85Clpcya+/WQAX8/ltKA=", + "dev": true, + "requires": { + "component-emitter": "1.1.2", + "debug": "2.2.0", + "isarray": "0.0.1", + "json3": "3.3.2" + }, + "dependencies": { + "component-emitter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.1.2.tgz", + "integrity": "sha1-KWWU8nU9qmOZbSrwjRWpURbJrsM=", + "dev": true + }, + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "dev": true, + "requires": { + "ms": "0.7.1" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", + "dev": true + } + } + }, + "sort-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", + "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=", + "requires": { + "is-plain-obj": "^1.0.0" + } + }, + "sort-object-keys": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sort-object-keys/-/sort-object-keys-1.1.2.tgz", + "integrity": "sha1-06bEjcKsl+a8lDZ2luA/bQnTeVI=", + "dev": true + }, + "sort-package-json": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/sort-package-json/-/sort-package-json-1.15.0.tgz", + "integrity": "sha1-PHMsyDEutKoS9uzKsbw96omxHf8=", + "dev": true, + "requires": { + "detect-indent": "^5.0.0", + "sort-object-keys": "^1.1.1" + }, + "dependencies": { + "detect-indent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz", + "integrity": "sha1-OHHMCmoALow+Wzz38zYmRnXwa50=", + "dev": true + } + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, + "source-map-resolve": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "dev": true, + "requires": { + "atob": "^2.1.1", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + }, + "dependencies": { + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + } + } + }, + "source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "requires": { + "source-map": "^0.5.6" + } + }, + "source-map-url": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.3.0.tgz", + "integrity": "sha1-fsrxO1e80J2opAxdJp2zN5nUqvk=", + "dev": true + }, + "sourcemap-validator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/sourcemap-validator/-/sourcemap-validator-1.1.0.tgz", + "integrity": "sha512-Hmdu39KL+EoAAZ69OTk7RXXJdPRRizJvOZOWhCW9jLGfEQflCNPTlSoCXFPdKWFwwf0uzLcGR/fc7EP/PT8vRQ==", + "dev": true, + "requires": { + "jsesc": "~0.3.x", + "lodash.foreach": "~2.3.x", + "lodash.template": "~2.3.x", + "source-map": "~0.1.x" + }, + "dependencies": { + "jsesc": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.3.0.tgz", + "integrity": "sha1-G/XuY7RTn+LibQwemcJAuXpFeXI=", + "dev": true + }, + "lodash.template": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-2.3.0.tgz", + "integrity": "sha1-Tj4pxDO0z+pnXsg15vEjkcYf0is=", + "dev": true, + "requires": { + "lodash._escapestringchar": "~2.3.0", + "lodash._reinterpolate": "~2.3.0", + "lodash.defaults": "~2.3.0", + "lodash.escape": "~2.3.0", + "lodash.keys": "~2.3.0", + "lodash.templatesettings": "~2.3.0", + "lodash.values": "~2.3.0" + } + }, + "source-map": { + "version": "0.1.43", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, + "spawn-args": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/spawn-args/-/spawn-args-0.2.0.tgz", + "integrity": "sha1-+30L0dcP1DFr2ePew4nmX51jYbs=", + "dev": true + }, + "spawn-sync": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/spawn-sync/-/spawn-sync-1.0.15.tgz", + "integrity": "sha1-sAeZVX63+wyDdsKdROih6mfldHY=", + "dev": true, + "requires": { + "concat-stream": "^1.4.7", + "os-shim": "^0.1.2" + } + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "sprintf-js": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.1.tgz", + "integrity": "sha1-Nr54Mgr+WAH2zqPueLblqrlA6gw=" + }, + "sri-toolbox": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/sri-toolbox/-/sri-toolbox-0.2.0.tgz", + "integrity": "sha1-p/6lw/3lXmdc8cjAbz67XCk1g14=", + "dev": true + }, + "stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==" + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", + "dev": true + }, + "strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" + }, + "string-template": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/string-template/-/string-template-0.2.1.tgz", + "integrity": "sha1-QpMuWYo1LQH8IuwzZ9nYTuxsmt0=", + "dev": true + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "stringmap": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stringmap/-/stringmap-0.2.2.tgz", + "integrity": "sha1-VWwTeyWPlCuHdvWy71gqoGnX0bE=" + }, + "stringset": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/stringset/-/stringset-0.2.1.tgz", + "integrity": "sha1-7yWcTjSTRDd/zRyRPdLoSMnAQrU=" + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^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=" + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "styled_string": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/styled_string/-/styled_string-0.0.1.tgz", + "integrity": "sha1-0ieCvYEpVFm8Tx3xjEutjpTdEko=", + "dev": true + }, + "sum-up": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sum-up/-/sum-up-1.0.3.tgz", + "integrity": "sha1-HGYfZnBX9jvLeHWqFDi8FiUlFW4=", + "dev": true, + "requires": { + "chalk": "^1.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + }, + "symlink-or-copy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/symlink-or-copy/-/symlink-or-copy-1.2.0.tgz", + "integrity": "sha512-W31+GLiBmU/ZR02Ii0mVZICuNEN9daZ63xZMPDsYgPgNjMtg+atqLEGI7PPI936jYSQZxoLb/63xos8Adrx4Eg==" + }, + "sync-disk-cache": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/sync-disk-cache/-/sync-disk-cache-1.3.2.tgz", + "integrity": "sha1-zsKIn1EYdjJmXiY570fdks2qiTg=", + "requires": { + "debug": "^2.1.3", + "heimdalljs": "^0.2.3", + "mkdirp": "^0.5.0", + "rimraf": "^2.2.8", + "username-sync": "1.0.1" + } + }, + "tap-parser": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/tap-parser/-/tap-parser-5.4.0.tgz", + "integrity": "sha512-BIsIaGqv7uTQgTW1KLTMNPSEQf4zDDPgYOBRdgOfuB+JFOLRBfEu6cLa/KvMvmqggu1FKXDfitjLwsq4827RvA==", + "dev": true, + "requires": { + "events-to-array": "^1.0.1", + "js-yaml": "^3.2.7", + "readable-stream": "^2" + } + }, + "temp": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/temp/-/temp-0.8.3.tgz", + "integrity": "sha1-4Ma8TSa5AxJEEOT+2BEDAU38H1k=", + "dev": true, + "requires": { + "os-tmpdir": "^1.0.0", + "rimraf": "~2.2.6" + }, + "dependencies": { + "rimraf": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", + "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=", + "dev": true + } + } + }, + "testem": { + "version": "1.18.4", + "resolved": "https://registry.npmjs.org/testem/-/testem-1.18.4.tgz", + "integrity": "sha1-5F/tkivsL1SmFsQ/EZIlmKyX60E=", + "dev": true, + "requires": { + "backbone": "^1.1.2", + "bluebird": "^3.4.6", + "charm": "^1.0.0", + "commander": "^2.6.0", + "consolidate": "^0.14.0", + "cross-spawn": "^5.1.0", + "express": "^4.10.7", + "fireworm": "^0.7.0", + "glob": "^7.0.4", + "http-proxy": "^1.13.1", + "js-yaml": "^3.2.5", + "lodash.assignin": "^4.1.0", + "lodash.clonedeep": "^4.4.1", + "lodash.find": "^4.5.1", + "lodash.uniqby": "^4.7.0", + "mkdirp": "^0.5.1", + "mustache": "^2.2.1", + "node-notifier": "^5.0.1", + "npmlog": "^4.0.0", + "printf": "^0.2.3", + "rimraf": "^2.4.4", + "socket.io": "1.6.0", + "spawn-args": "^0.2.0", + "styled_string": "0.0.1", + "tap-parser": "^5.1.0", + "xmldom": "^0.1.19" + }, + "dependencies": { + "bluebird": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", + "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==", + "dev": true + } + } + }, + "textextensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/textextensions/-/textextensions-2.2.0.tgz", + "integrity": "sha512-j5EMxnryTvKxwH2Cq+Pb43tsf6sdEgw6Pdwxk83mPaq0ToeFJt6WE4J3s5BqY7vmjlLgkgXvhtXUxo80FyBhCA==" + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, + "timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" + }, + "tiny-lr": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tiny-lr/-/tiny-lr-1.1.1.tgz", + "integrity": "sha512-44yhA3tsaRoMOjQQ+5v5mVdqef+kH6Qze9jTpqtVufgYjYt08zyZAwNwwVBj3i1rJMnR52IxOW0LK0vBzgAkuA==", + "dev": true, + "requires": { + "body": "^5.1.0", + "debug": "^3.1.0", + "faye-websocket": "~0.10.0", + "livereload-js": "^2.3.0", + "object-assign": "^4.1.0", + "qs": "^6.4.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "tmp": { + "version": "0.0.28", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.28.tgz", + "integrity": "sha1-Fyc1t/YU6nrzlmT6hM8N5OUV0SA=", + "requires": { + "os-tmpdir": "~1.0.1" + } + }, + "tmpl": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", + "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", + "dev": true + }, + "to-array": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", + "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=", + "dev": true + }, + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=" + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + } + } + }, + "tree-sync": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-sync/-/tree-sync-1.2.2.tgz", + "integrity": "sha1-LPdrhYn1n/7bWNtaOsfLAT0BWLc=", + "requires": { + "debug": "^2.2.0", + "fs-tree-diff": "^0.5.6", + "mkdirp": "^0.5.1", + "quick-temp": "^0.1.5", + "walk-sync": "^0.2.7" + }, + "dependencies": { + "walk-sync": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/walk-sync/-/walk-sync-0.2.7.tgz", + "integrity": "sha1-tJvk7mhnZXrrc2l4tWop0Q+jmWk=", + "requires": { + "ensure-posix-path": "^1.0.0", + "matcher-collection": "^1.0.0" + } + } + } + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=" + }, + "try-resolve": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/try-resolve/-/try-resolve-1.0.1.tgz", + "integrity": "sha1-z95vq9ctY+V5fPqrhzq76OcA6RI=" + }, + "tryor": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/tryor/-/tryor-0.1.2.tgz", + "integrity": "sha1-gUXkynyv9ArN48z5Rui4u3W0Fys=" + }, + "type-is": { + "version": "1.6.16", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", + "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.18" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "uc.micro": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.5.tgz", + "integrity": "sha512-JoLI4g5zv5qNyT09f4YAvEZIIV1oOjqnewYg5D38dkQljIzpPT296dbIGvKro3digYI1bkb7W6EP1y4uDlmzLg==", + "dev": true + }, + "uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "requires": { + "source-map": "~0.5.1", + "uglify-to-browserify": "~1.0.0", + "yargs": "~3.10.0" + }, + "dependencies": { + "window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=" + }, + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "requires": { + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", + "window-size": "0.1.0" + } + } + } + }, + "uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", + "optional": true + }, + "ultron": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz", + "integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po=", + "dev": true + }, + "underscore": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.0.tgz", + "integrity": "sha512-4IV1DSSxC1QK48j9ONFK1MoIAKKkbE8i7u55w2R6IqBqbT7A/iG7aZBCR2Bi8piF0Uz+i/MG1aeqLwl/5vqF+A==", + "dev": true + }, + "underscore.string": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.4.tgz", + "integrity": "sha1-LCo/n4PmR2L9xF5s6sZRQoZCE9s=", + "requires": { + "sprintf-js": "^1.0.3", + "util-deprecate": "^1.0.2" + } + }, + "union-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", + "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^0.4.3" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "set-value": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", + "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.1", + "to-object-path": "^0.3.0" + } + } + } + }, + "unique-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", + "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", + "dev": true, + "requires": { + "crypto-random-string": "^1.0.0" + } + }, + "universalify": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz", + "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "untildify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-2.1.0.tgz", + "integrity": "sha1-F+soB5h/dpUunASF/DEdBqgmouA=", + "dev": true, + "requires": { + "os-homedir": "^1.0.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "requires": { + "prepend-http": "^2.0.0" + } + }, + "url-to-options": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", + "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=" + }, + "use": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz", + "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==", + "dev": true, + "requires": { + "kind-of": "^6.0.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "user-home": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", + "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=" + }, + "username-sync": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/username-sync/-/username-sync-1.0.1.tgz", + "integrity": "sha1-HN6H7vz5S4gimE2Ti6K3l0Jtrh8=" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true + }, + "uuid": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", + "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==", + "dev": true + }, + "validate-npm-package-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", + "integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=", + "dev": true, + "requires": { + "builtins": "^1.0.3" + } + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true + }, + "walk-sync": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/walk-sync/-/walk-sync-0.3.2.tgz", + "integrity": "sha512-FMB5VqpLqOCcqrzA9okZFc0wq0Qbmdm396qJxvQZhDpyu0W95G9JCmp74tx7iyYnyOcBtUuKJsgIKAqjozvmmQ==", + "requires": { + "ensure-posix-path": "^1.0.0", + "matcher-collection": "^1.0.0" + } + }, + "walker": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", + "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", + "dev": true, + "requires": { + "makeerror": "1.0.x" + } + }, + "watch": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/watch/-/watch-0.18.0.tgz", + "integrity": "sha1-KAlUdsbffJDJYxOJkMClQj60uYY=", + "dev": true, + "requires": { + "exec-sh": "^0.2.0", + "minimist": "^1.2.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "websocket-driver": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz", + "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=", + "dev": true, + "requires": { + "http-parser-js": ">=0.4.0", + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", + "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dev": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "window-size": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", + "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=" + }, + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=" + }, + "workerpool": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-2.3.0.tgz", + "integrity": "sha512-JP5DpviEV84zDmz13QnD4FfRjZBjnTOYY2O4pGgxtlqLh47WOzQFHm8o17TE5OSfcDoKC6vHSrN4yPju93DW0Q==", + "requires": { + "object-assign": "4.1.1" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "write-file-atomic": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", + "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, + "ws": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.1.tgz", + "integrity": "sha1-CC3bbGQehdS7RR8D1S8G6r2x8Bg=", + "dev": true, + "requires": { + "options": ">=0.0.5", + "ultron": "1.0.x" + } + }, + "wtf-8": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wtf-8/-/wtf-8-1.0.0.tgz", + "integrity": "sha1-OS2LotDxw00e4tYw8V0O+2jhBIo=", + "dev": true + }, + "xdg-basedir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", + "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", + "dev": true + }, + "xmldom": { + "version": "0.1.27", + "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.27.tgz", + "integrity": "sha1-1QH5ezvbQDr4757MIFcxh6rawOk=", + "dev": true + }, + "xmlhttprequest-ssl": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz", + "integrity": "sha1-GFqIjATspGw+QHDZn3tJ3jUomS0=", + "dev": true + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + }, + "yam": { + "version": "0.0.22", + "resolved": "https://registry.npmjs.org/yam/-/yam-0.0.22.tgz", + "integrity": "sha1-OKdst5oZKE2SBu1JAx41mhNAvQY=", + "dev": true, + "requires": { + "fs-extra": "^0.30.0", + "lodash.merge": "^4.4.0" + }, + "dependencies": { + "fs-extra": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", + "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.0", + "path-is-absolute": "^1.0.0", + "rimraf": "^2.2.8" + } + } + } + }, + "yargs": { + "version": "3.27.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.27.0.tgz", + "integrity": "sha1-ISBUaTFuk5Ex1Z8toMbX+YIh6kA=", + "requires": { + "camelcase": "^1.2.1", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", + "os-locale": "^1.4.0", + "window-size": "^0.1.2", + "y18n": "^3.2.0" + } + }, + "yeast": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", + "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", + "dev": true + } + } +} diff --git a/tests/unit/ember-tabular-test.js b/tests/unit/ember-tabular-test.js index 050daf7..a3117d0 100644 --- a/tests/unit/ember-tabular-test.js +++ b/tests/unit/ember-tabular-test.js @@ -63,7 +63,7 @@ let columns = [ moduleForComponent('ember-tabular', 'Unit | Component | ember table jsonapi', { unit: true, - needs: ['helper:dot-to-dash-filter', 'component:ember-tabular-filter', 'component:ember-tabular-registry', 'helper:and', 'component:pagination-pager', 'component:ember-tabular-column-select', 'component:sortable-objects', 'service:dragCoordinator', 'component:draggable-object', 'helper:compare-with', 'component:ember-tabular-column'], + needs: ['helper:dot-to-dash-filter', 'component:ember-tabular-filter', 'component:ember-tabular-registry', 'helper:and', 'component:ember-tabular-thead', 'component:pagination-pager', 'component:ember-tabular-column-select', 'component:sortable-objects', 'service:dragCoordinator', 'component:draggable-object', 'helper:compare-with', 'component:ember-tabular-column'], beforeEach: function() { component = this.subject({ record: model, From cd1f0e7c4c08f007830069889855e2aa9452b8bb Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Mon, 13 Aug 2018 16:46:34 -0400 Subject: [PATCH 101/105] Setup ember-tabular-tbody subcomponent --- addon/components/ember-tabular-tbody.js | 16 +++++++ .../components/ember-tabular-tbody.hbs | 33 +++++++++++++ addon/templates/components/ember-tabular.hbs | 46 ++++++------------- app/components/ember-tabular-tbody.js | 3 ++ tests/unit/ember-tabular-test.js | 2 +- 5 files changed, 66 insertions(+), 34 deletions(-) create mode 100644 addon/components/ember-tabular-tbody.js create mode 100644 addon/templates/components/ember-tabular-tbody.hbs create mode 100644 app/components/ember-tabular-tbody.js diff --git a/addon/components/ember-tabular-tbody.js b/addon/components/ember-tabular-tbody.js new file mode 100644 index 0000000..4751bd9 --- /dev/null +++ b/addon/components/ember-tabular-tbody.js @@ -0,0 +1,16 @@ +import Ember from 'ember'; +import layout from 'ember-tabular/templates/components/ember-tabular-tbody'; + +/** +* +* @class EmberTabularThead +*/ +export default Ember.Component.extend({ + /** + * @property tagName + * @type String + * @default '' + */ + tagName: '', + layout +}); diff --git a/addon/templates/components/ember-tabular-tbody.hbs b/addon/templates/components/ember-tabular-tbody.hbs new file mode 100644 index 0000000..a99ed25 --- /dev/null +++ b/addon/templates/components/ember-tabular-tbody.hbs @@ -0,0 +1,33 @@ + + {{yield (hash + column=(component "ember-tabular-column-register" registry=registry columnOrder=columnOrder addToRegistry=(action addToRegistry)) + )}} + {{ember-tabular-registry registryComplete=registryComplete}} + {{#if record}} + {{#if (and record columns)}} + {{#each record as |row|}} + + {{#each columns as |column|}} + {{#if column.isActive}} + {{#if (compare-with columns "property" column.property "isCustom")}} + {{yield (hash + column=(component "ember-tabular-column" column=column record=row property=property collection=record class=column.class) + )}} + {{else}} + {{ember-tabular-column column=column record=row property=column.property collection=record class=column.class}} + {{/if}} + {{/if}} + {{/each}} + + {{/each}} + {{else}} + + + + {{/if}} + {{else}} + {{ember-tabular-loading isRecordLoaded=isRecordLoaded columnLength=columnLength tableLoadedMessage=tableLoadedMessage registryComplete=registryComplete}} + {{/if}} + \ No newline at end of file diff --git a/addon/templates/components/ember-tabular.hbs b/addon/templates/components/ember-tabular.hbs index 251a58a..6233f59 100644 --- a/addon/templates/components/ember-tabular.hbs +++ b/addon/templates/components/ember-tabular.hbs @@ -32,39 +32,19 @@ sortBy=(action "sortBy") focusFilter=(action "triggerOnFilterFocus") }} - - {{yield (hash - column=(component "ember-tabular-column-register" registry=registry columnOrder=columnOrder addToRegistry=(action "addToRegistry")) - )}} - {{ember-tabular-registry registryComplete=(action "registryComplete")}} - {{#if record}} - {{#if (and record columns)}} - {{#each record as |row|}} - - {{#each columns as |column|}} - {{#if column.isActive}} - {{#if (compare-with columns "property" column.property "isCustom")}} - {{yield (hash - column=(component "ember-tabular-column" column=column record=row property=property collection=record class=column.class) - )}} - {{else}} - {{ember-tabular-column column=column record=row property=column.property collection=record class=column.class}} - {{/if}} - {{/if}} - {{/each}} - - {{/each}} - {{else}} - - - - {{/if}} - {{else}} - {{ember-tabular-loading isRecordLoaded=isRecordLoaded columnLength=columnLength tableLoadedMessage=tableLoadedMessage registryComplete=(action "registryComplete")}} - {{/if}} - + {{#ember-tabular-tbody + record=record + columns=columns + registry=registry + columnOrder=columnOrder + columnLength=columnLength + isRecordLoaded=isRecordLoaded + tableLoadedMessage=tableLoadedMessage + addToRegistry=(action "addToRegistry") + registryComplete=(action "registryComplete") + as |tbody|}} + {{yield (hash column=tbody.column)}} + {{/ember-tabular-tbody}}
    - {{#if header.filter}} - - {{/if}} - {{#if header.sort}} -
    - {{header.label}} -
    - {{else if header.selectable}} -
    - -
    - {{else}} -
    - {{header.label}} -
    - {{/if}} -
    {{header.label}}
    {{!-- Blank to reserve table column --}}
    + Loading... +
    - Loading... -
    {{yield wrapperFooter}}
    diff --git a/app/components/ember-tabular-tbody.js b/app/components/ember-tabular-tbody.js new file mode 100644 index 0000000..7e305de --- /dev/null +++ b/app/components/ember-tabular-tbody.js @@ -0,0 +1,3 @@ +import EmberTabularTbody from 'ember-tabular/components/ember-tabular-tbody'; + +export default EmberTabularTbody; diff --git a/tests/unit/ember-tabular-test.js b/tests/unit/ember-tabular-test.js index a3117d0..fdd2dae 100644 --- a/tests/unit/ember-tabular-test.js +++ b/tests/unit/ember-tabular-test.js @@ -63,7 +63,7 @@ let columns = [ moduleForComponent('ember-tabular', 'Unit | Component | ember table jsonapi', { unit: true, - needs: ['helper:dot-to-dash-filter', 'component:ember-tabular-filter', 'component:ember-tabular-registry', 'helper:and', 'component:ember-tabular-thead', 'component:pagination-pager', 'component:ember-tabular-column-select', 'component:sortable-objects', 'service:dragCoordinator', 'component:draggable-object', 'helper:compare-with', 'component:ember-tabular-column'], + needs: ['helper:dot-to-dash-filter', 'component:ember-tabular-filter', 'component:ember-tabular-registry', 'helper:and', 'component:ember-tabular-thead', 'component:ember-tabular-tbody', 'component:pagination-pager', 'component:ember-tabular-column-select', 'component:sortable-objects', 'service:dragCoordinator', 'component:draggable-object', 'helper:compare-with', 'component:ember-tabular-column'], beforeEach: function() { component = this.subject({ record: model, From 9b2fbdce0f36ff43e1e3c7faf94b526b9dad210b Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Mon, 13 Aug 2018 17:16:27 -0400 Subject: [PATCH 102/105] Add/updating ember-tabular-footer and ember-tabular-alert --- addon/components/ember-tabular-footer.js | 16 ++++++++ .../components/ember-tabular-alert.hbs | 21 ++++++++-- .../components/ember-tabular-footer.hbs | 17 ++++++++ addon/templates/components/ember-tabular.hbs | 41 +++++-------------- app/components/ember-tabular-footer.js | 3 ++ tests/unit/ember-tabular-test.js | 2 +- 6 files changed, 65 insertions(+), 35 deletions(-) create mode 100644 addon/components/ember-tabular-footer.js create mode 100644 addon/templates/components/ember-tabular-footer.hbs create mode 100644 app/components/ember-tabular-footer.js diff --git a/addon/components/ember-tabular-footer.js b/addon/components/ember-tabular-footer.js new file mode 100644 index 0000000..52573e9 --- /dev/null +++ b/addon/components/ember-tabular-footer.js @@ -0,0 +1,16 @@ +import Ember from 'ember'; +import layout from 'ember-tabular/templates/components/ember-tabular-footer'; + +/** +* +* @class EmberTabularThead +*/ +export default Ember.Component.extend({ + /** + * @property tagName + * @type String + * @default '' + */ + tagName: '', + layout +}); diff --git a/addon/templates/components/ember-tabular-alert.hbs b/addon/templates/components/ember-tabular-alert.hbs index 40fbce9..f6d720b 100644 --- a/addon/templates/components/ember-tabular-alert.hbs +++ b/addon/templates/components/ember-tabular-alert.hbs @@ -1,3 +1,18 @@ - +{{#if isFailure}} + +{{/if}} diff --git a/addon/templates/components/ember-tabular-footer.hbs b/addon/templates/components/ember-tabular-footer.hbs new file mode 100644 index 0000000..91d3018 --- /dev/null +++ b/addon/templates/components/ember-tabular-footer.hbs @@ -0,0 +1,17 @@ +{{#if columns}} +
    +
    + {{#if isColumnSelect}} + {{ember-tabular-column-select columns=columns}} + {{/if}} + +
    + {{#if isDropdownLimit}} +
    + {{ember-tabular-dropdown-limit limit=limit record=record count=pageLimit}} +
    + {{/if}} +
    +{{/if}} \ No newline at end of file diff --git a/addon/templates/components/ember-tabular.hbs b/addon/templates/components/ember-tabular.hbs index 6233f59..a45d933 100644 --- a/addon/templates/components/ember-tabular.hbs +++ b/addon/templates/components/ember-tabular.hbs @@ -1,17 +1,4 @@ -{{#if isFailure}} - {{#ember-tabular-alert type="danger"}} - {{failureMessage}} - {{#if errors}} -
      - {{#each errors as |error|}} -
    • - {{error.detail}} -
    • - {{/each}} -
    - {{/if}} - {{/ember-tabular-alert}} -{{/if}} +{{ember-tabular-alert type="danger" isFailure=isFailure failureMessage=failureMessage errors=errors}} {{yield header}} @@ -51,20 +38,12 @@ {{yield footer}} -{{#if columns}} -
    -
    - {{#if isColumnSelect}} - {{ember-tabular-column-select columns=columns}} - {{/if}} - -
    - {{#if isDropdownLimit}} -
    - {{ember-tabular-dropdown-limit limit=limit record=record count=pageLimit}} -
    - {{/if}} -
    -{{/if}} +{{ember-tabular-footer + columns=columns + isDropdownLimit=isDropdownLimit + isColumnSelect=isColumnSelect + paginationWrapperClass=paginationWrapperClass + page=page + pageLimit=pageLimit + limit=limit + record=record}} diff --git a/app/components/ember-tabular-footer.js b/app/components/ember-tabular-footer.js new file mode 100644 index 0000000..a37d3fc --- /dev/null +++ b/app/components/ember-tabular-footer.js @@ -0,0 +1,3 @@ +import EmberTabularFooter from 'ember-tabular/components/ember-tabular-footer'; + +export default EmberTabularFooter; diff --git a/tests/unit/ember-tabular-test.js b/tests/unit/ember-tabular-test.js index fdd2dae..f889e56 100644 --- a/tests/unit/ember-tabular-test.js +++ b/tests/unit/ember-tabular-test.js @@ -63,7 +63,7 @@ let columns = [ moduleForComponent('ember-tabular', 'Unit | Component | ember table jsonapi', { unit: true, - needs: ['helper:dot-to-dash-filter', 'component:ember-tabular-filter', 'component:ember-tabular-registry', 'helper:and', 'component:ember-tabular-thead', 'component:ember-tabular-tbody', 'component:pagination-pager', 'component:ember-tabular-column-select', 'component:sortable-objects', 'service:dragCoordinator', 'component:draggable-object', 'helper:compare-with', 'component:ember-tabular-column'], + needs: ['helper:dot-to-dash-filter', 'component:ember-tabular-filter', 'component:ember-tabular-registry', 'helper:and', 'component:ember-tabular-thead', 'component:ember-tabular-tbody', 'component:ember-tabular-footer', 'component:ember-tabular-alert', 'component:ember-tabular-dropdown-limit', 'component:pagination-pager', 'component:ember-tabular-column-select', 'component:sortable-objects', 'service:dragCoordinator', 'component:draggable-object', 'helper:compare-with', 'component:ember-tabular-column'], beforeEach: function() { component = this.subject({ record: model, From 6a1d4dd57cc7d3bbedef68932f9fbd66e4829a7f Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Mon, 13 Aug 2018 17:19:14 -0400 Subject: [PATCH 103/105] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 668cc30..61f4f40 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ This project adheres to [Semantic Versioning](http://semver.org/). ### Changed - Upgrades ember-power-select to 1.4.3, may require refactoring of `class` to `triggerClass` if applicable. - Upgrade ember and ember-cli to 2.10.0 +- Updated ember-tabular.hbs to use subcomponents for rendering. ### Fixed From b4162bacae09ee59e3739ec57df436658524e030 Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Mon, 13 Aug 2018 21:11:09 -0400 Subject: [PATCH 104/105] Pass additional properties to subcomponents --- addon/templates/components/ember-tabular.hbs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/addon/templates/components/ember-tabular.hbs b/addon/templates/components/ember-tabular.hbs index a45d933..b31f594 100644 --- a/addon/templates/components/ember-tabular.hbs +++ b/addon/templates/components/ember-tabular.hbs @@ -27,6 +27,9 @@ columnLength=columnLength isRecordLoaded=isRecordLoaded tableLoadedMessage=tableLoadedMessage + filter=filter + page=page + pageLimit=pageLimit addToRegistry=(action "addToRegistry") registryComplete=(action "registryComplete") as |tbody|}} @@ -43,6 +46,8 @@ isDropdownLimit=isDropdownLimit isColumnSelect=isColumnSelect paginationWrapperClass=paginationWrapperClass + filter=filter + allChecked=allChecked page=page pageLimit=pageLimit limit=limit From 6f93298f53b510ab5c1861b9979c4a9ea99617ff Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Mon, 13 Aug 2018 22:26:54 -0400 Subject: [PATCH 105/105] Setup a way to refreshTabular by toggling a property --- addon/components/ember-tabular.js | 9 ++++++++- addon/templates/components/ember-tabular.hbs | 2 ++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/addon/components/ember-tabular.js b/addon/components/ember-tabular.js index a14b08e..39b385d 100644 --- a/addon/components/ember-tabular.js +++ b/addon/components/ember-tabular.js @@ -30,6 +30,13 @@ export default Ember.Component.extend(Ember.Evented, EmberTabularHelpers, { */ makeRequest: true, /** + * + * @property refreshTabular + * @type Boolean + * @default false + */ + refreshTabular: false, + /** * Used to toggle the filter row bar. * * @property showFilterRow @@ -847,7 +854,7 @@ export default Ember.Component.extend(Ember.Evented, EmberTabularHelpers, { * @return {Object} */ query: Ember.computed('page', 'limit', 'offset', 'sort', 'filter.@each.value', - 'staticParams', function () { + 'staticParams', 'refreshTabular', function () { let query = {}; const filter = this.get('filter') || []; query = { diff --git a/addon/templates/components/ember-tabular.hbs b/addon/templates/components/ember-tabular.hbs index b31f594..77fb3b9 100644 --- a/addon/templates/components/ember-tabular.hbs +++ b/addon/templates/components/ember-tabular.hbs @@ -27,6 +27,8 @@ columnLength=columnLength isRecordLoaded=isRecordLoaded tableLoadedMessage=tableLoadedMessage + refreshTabular=refreshTabular + query=query filter=filter page=page pageLimit=pageLimit