From c893387845b057ccc3314388a8bf4c562133c6fc Mon Sep 17 00:00:00 2001 From: ridz1208 Date: Wed, 12 Sep 2018 18:57:17 -0400 Subject: [PATCH 01/95] [JSX/Form.js] Adding sortByValue Option for Selects and SearchableSelects --- jsx/Form.js | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/jsx/Form.js b/jsx/Form.js index 47166e1e8e0..4cdc38804c8 100644 --- a/jsx/Form.js +++ b/jsx/Form.js @@ -367,12 +367,13 @@ SearchableDropdown.propTypes = { PropTypes.string, PropTypes.array, ]), - class: PropTypes.string, - disabled: PropTypes.bool, - required: PropTypes.bool, - errorMessage: PropTypes.string, - placeHolder: PropTypes.string, - onUserInput: PropTypes.func, + class: React.PropTypes.string, + disabled: React.PropTypes.bool, + required: React.PropTypes.bool, + sortByValue: React.PropTypes.bool, + errorMessage: React.PropTypes.string, + placeHolder: React.PropTypes.string, + onUserInput: React.PropTypes.func }; SearchableDropdown.defaultProps = { @@ -488,6 +489,7 @@ class SelectElement extends Component { onChange={this.handleChange} required={required} disabled={disabled} + sortByValue={sortByValue} > {emptyOptionHTML} {optionList} @@ -507,15 +509,16 @@ SelectElement.propTypes = { PropTypes.string, PropTypes.array, ]), - id: PropTypes.string, - class: PropTypes.string, - multiple: PropTypes.bool, - disabled: PropTypes.bool, - required: PropTypes.bool, - emptyOption: PropTypes.bool, - hasError: PropTypes.bool, - errorMessage: PropTypes.string, - onUserInput: PropTypes.func, + id: React.PropTypes.string, + class: React.PropTypes.string, + multiple: React.PropTypes.bool, + disabled: React.PropTypes.bool, + required: React.PropTypes.bool, + sortByValue: React.PropTypes.bool, + emptyOption: React.PropTypes.bool, + hasError: React.PropTypes.bool, + errorMessage: React.PropTypes.string, + onUserInput: React.PropTypes.func }; SelectElement.defaultProps = { From 27ae8a8d4f5abc8ad574234df61684695ccb3827 Mon Sep 17 00:00:00 2001 From: Rida Date: Mon, 1 Oct 2018 10:33:07 -0400 Subject: [PATCH 02/95] removed unnecessary lines --- jsx/Form.js | 1 - 1 file changed, 1 deletion(-) diff --git a/jsx/Form.js b/jsx/Form.js index 4cdc38804c8..9a274363ca0 100644 --- a/jsx/Form.js +++ b/jsx/Form.js @@ -489,7 +489,6 @@ class SelectElement extends Component { onChange={this.handleChange} required={required} disabled={disabled} - sortByValue={sortByValue} > {emptyOptionHTML} {optionList} From 2e9335b17b25c05dd38228a79aa8ec77cdef8cfd Mon Sep 17 00:00:00 2001 From: ridz1208 Date: Mon, 18 Jun 2018 09:59:09 -0400 Subject: [PATCH 03/95] [media] Remove unused code (#3705) This removes the validFilters and formToFilter variables which are unused when using React. [Help Editor] Remove unused 'indent' variable (#3757) Added spec/README for conflict resolver module (#3375) This adds a README for the conflict resolver outlining the purpose of the module, following the template set out by the imaging_browser module. Added ModalWindow Component to Tabs Added Webpack Config added scroll on Modal Window added functionality to Panel updated composer to be able to use namespaces added containerIndex to webpack added Modal Window and Loader updated ModalWindow Added Modal Window functionality updated Modal Window Updated Modal Window added functionality to form.js Altered Database class to allow on duplicate update update documentation for on duplicate key update edited Form.js Made changes to Modal Window Updated Modal Window Edited Loader and Media Rebased Altered Modal Window and Loader Removed debugging message Made changes to filter form and datatable change loader css Made changes to Form.js and CSS Added error props to Form.js Added JSON Router Dependencies ; Altered Filter Form to Prevent Infinite Loop Recompiled JSX --- composer.json | 2 +- htdocs/bootstrap/css/custom-css.css | 14 +--- jsx/FilterForm.js | 14 +--- jsx/Form.js | 115 ++++++++++++++++++---------- jsx/Panel.js | 48 ++++++++++-- package.json | 3 +- php/libraries/Database.class.inc | 9 ++- webpack.config.js | 1 + 8 files changed, 134 insertions(+), 72 deletions(-) diff --git a/composer.json b/composer.json index cbb2e8fda86..bcc7eb97d94 100644 --- a/composer.json +++ b/composer.json @@ -28,6 +28,6 @@ "psr-4": { "LORIS\\": "src/" }, - "classmap": ["project/libraries", "php"] + "classmap": ["project/libraries", "php/libraries", "php/exceptions", "php/interfaces", "modules/biobank/php"] } } diff --git a/htdocs/bootstrap/css/custom-css.css b/htdocs/bootstrap/css/custom-css.css index 1ac03968a5d..367b1142f48 100644 --- a/htdocs/bootstrap/css/custom-css.css +++ b/htdocs/bootstrap/css/custom-css.css @@ -133,17 +133,8 @@ Note: other colors are currenly inherited from Bootstrap default color palette /* * Making the table header font colour white */ -table th { - color: #064785; - background-color: #E4EBF2; -} - -.table > thead > tr > th > a { - color: #064785; -} - -.table > thead:first-child > tr:first-child > th { - border-top: 1px solid #C3D5DB; +.table>thead>tr>th>a { + color: #ffffff; } /* @@ -686,7 +677,6 @@ a.btn.btn-primary:hover { } /* Loader customizations */ - .loader { position: relative; top: 50%; diff --git a/jsx/FilterForm.js b/jsx/FilterForm.js index 73274bb8ea8..41f785c6c1e 100644 --- a/jsx/FilterForm.js +++ b/jsx/FilterForm.js @@ -38,7 +38,7 @@ class FilterForm extends Component { this.queryString = QueryString.get(); } - componentDidMount() { + componentWillReceiveProps() { let filter = {}; let queryString = this.queryString; @@ -178,15 +178,9 @@ class FilterForm extends Component { } return ( - - - {formChildren} - - + + {formChildren} + ); } } diff --git a/jsx/Form.js b/jsx/Form.js index 9a274363ca0..ee31d532c46 100644 --- a/jsx/Form.js +++ b/jsx/Form.js @@ -341,6 +341,7 @@ class SearchableDropdown extends Component { className="form-control" disabled={disabled} placeholder={this.props.placeHolder} + autoFocus={this.props.autoFocus} onChange={this.handleChange} onBlur={this.handleBlur} required={required} @@ -373,6 +374,7 @@ SearchableDropdown.propTypes = { sortByValue: React.PropTypes.bool, errorMessage: React.PropTypes.string, placeHolder: React.PropTypes.string, + autoFocus: React.PropTypes.bool, onUserInput: React.PropTypes.func }; @@ -389,6 +391,7 @@ SearchableDropdown.defaultProps = { sortByValue: true, errorMessage: '', placeHolder: '', + autoFocus: false, onUserInput: function() { console.warn('onUserInput() callback is not set'); }, @@ -432,6 +435,7 @@ class SelectElement extends Component { let emptyOptionHTML = null; let requiredHTML = null; let elementClass = 'row form-group'; + let label = null; // Add required asterisk if (required) { @@ -444,7 +448,7 @@ class SelectElement extends Component { } // Add error message - if (this.props.hasError || (this.props.required && this.props.value === '')) { + if (this.props.errorMessage || (this.props.required && this.props.value === "")) { errorMessage = {this.props.errorMessage}; elementClass = 'row form-group has-error'; } @@ -473,13 +477,19 @@ class SelectElement extends Component { // Default to empty string for regular select and to empty array for 'multiple' select const value = this.props.value || (multiple ? [] : ''); - return ( -
+ if (this.props.label) { + label = ( -
+ ); + } + + return ( +
+ {label} +
*; } - // Check if props minYear and maxYear are valid values if supplied - let minYear = this.props.minYear; - let maxYear = this.props.maxYear; - if (this.props.minYear === '' || this.props.minYear === null) { - minYear = '1000'; - } - if (this.props.maxYear === '' || this.props.maxYear === null) { - maxYear = '9999'; - } - - // Handle date format - let format = this.props.dateFormat; - let inputType = 'date'; - let minFullDate = minYear + '-01-01'; - let maxFullDate = maxYear + '-12-31'; - if (!format.match(/d/i)) { - inputType = 'month'; - minFullDate = minYear + '-01'; - maxFullDate = maxYear + '-12'; + // Add error message + if (this.props.errorMessage) { + errorMessage = {this.props.errorMessage}; + elementClass = 'row form-group has-error'; } return ( -
+
); @@ -1072,6 +1078,7 @@ class DateElement extends Component { } DateElement.propTypes = { +<<<<<<< 27ae8a8d4f5abc8ad574234df61684695ccb3827 name: PropTypes.string.isRequired, label: PropTypes.string, value: PropTypes.string, @@ -1082,6 +1089,18 @@ DateElement.propTypes = { disabled: PropTypes.bool, required: PropTypes.bool, onUserInput: PropTypes.func, +======= + name: React.PropTypes.string.isRequired, + label: React.PropTypes.string, + value: React.PropTypes.string, + id: React.PropTypes.string, + maxYear: React.PropTypes.string, + minYear: React.PropTypes.string, + disabled: React.PropTypes.bool, + required: React.PropTypes.bool, + errorMessage: React.PropTypes.func, + onUserInput: React.PropTypes.func +>>>>>>> [media] Remove unused code (#3705) }; DateElement.defaultProps = { @@ -1094,6 +1113,7 @@ DateElement.defaultProps = { dateFormat: 'YMd', disabled: false, required: false, + errorMessage: '', onUserInput: function() { console.warn('onUserInput() callback is not set'); }, @@ -1117,15 +1137,23 @@ class TimeElement extends Component { render() { let disabled = this.props.disabled ? 'disabled' : null; let required = this.props.required ? 'required' : null; + let errorMessage = null; let requiredHTML = null; + let elementClass = 'row form-group'; // Add required asterix if (required) { requiredHTML = *; } + // Add error message + if (this.props.errorMessage) { + errorMessage = {this.props.errorMessage}; + elementClass = 'row form-group has-error'; + } + return ( -
+
); @@ -1150,13 +1179,14 @@ class TimeElement extends Component { } TimeElement.propTypes = { - name: PropTypes.string.isRequired, - label: PropTypes.string, - value: PropTypes.string, - id: PropTypes.string, - disabled: PropTypes.bool, - required: PropTypes.bool, - onUserInput: PropTypes.func, + name: React.PropTypes.string.isRequired, + label: React.PropTypes.string, + value: React.PropTypes.string, + id: React.PropTypes.string, + disabled: React.PropTypes.bool, + required: React.PropTypes.bool, + errorMessage: React.PropTypes.string, + onUserInput: React.PropTypes.func }; TimeElement.defaultProps = { @@ -1166,6 +1196,7 @@ TimeElement.defaultProps = { id: '', disabled: false, required: false, + errorMessage: '', onUserInput: function() { console.warn('onUserInput() callback is not set'); }, @@ -1399,10 +1430,10 @@ class StaticElement extends Component { render() { return (
-
); + + return modal; } } diff --git a/jsx/StaticDataTable.js b/jsx/StaticDataTable.js index 0ba57b18260..00dd04ad96e 100644 --- a/jsx/StaticDataTable.js +++ b/jsx/StaticDataTable.js @@ -91,7 +91,7 @@ class StaticDataTable extends Component { this.state.SortOrder !== prevState.SortOrder) ) { let index = this.getSortedRows(); - this.props.onSort(index, this.props.Data, this.props.Headers); + this.props.onSort(index, this.props.data, this.props.Headers); } } @@ -165,7 +165,7 @@ class StaticDataTable extends Component { Object.keys(this.props.Filter).length : 0 ); - let tableData = this.props.Data; + let tableData = this.props.data; let headersData = this.props.Headers; if (this.props.Filter.keyword) { @@ -216,8 +216,8 @@ class StaticDataTable extends Component { getSortedRows() { const index = []; - for (let i = 0; i < this.props.Data.length; i += 1) { - let val = this.props.Data[i][this.state.SortColumn] || undefined; + for (let i = 0; i < this.props.data.length; i += 1) { + let val = this.props.data[i][this.state.SortColumn] || undefined; // If SortColumn is equal to default No. column, set value to be // index + 1 if (this.state.SortColumn === -1) { @@ -317,12 +317,12 @@ class StaticDataTable extends Component { // Handle string inputs if (typeof filterData === 'string') { searchKey = filterData.toLowerCase(); - searchString = data.toLowerCase(); + searchString = typeof data === 'string' ? data.toLowerCase() : String(data); if (exactMatch) { result = (searchString === searchKey); } else { - result = (searchString.indexOf(searchKey) > -1); + result = (searchString.indexOf(searchKey) > -1) && searchKey != ''; } } @@ -341,7 +341,7 @@ class StaticDataTable extends Component { return result; } render() { - if (this.props.Data === null || this.props.Data.length === 0) { + if (this.props.data === null || this.props.data.length === 0) { return (
No result found. @@ -390,7 +390,7 @@ class StaticDataTable extends Component { // Push rows to data table for (let i = 0; - (i < this.props.Data.length) && (rows.length < rowsPerPage); + (i < this.props.data.length) && (rows.length < rowsPerPage); i++ ) { curRow = []; @@ -406,13 +406,13 @@ class StaticDataTable extends Component { let data = 'Unknown'; // Set column data - if (this.props.Data[index[i].RowIdx]) { - data = this.props.Data[index[i].RowIdx][j]; + if (this.props.data[index[i].RowIdx]) { + data = this.props.data[index[i].RowIdx][j]; } if (this.hasFilterKeyword(this.props.Headers[j], data)) { filterMatchCount++; - filteredData.push(this.props.Data[index[i].RowIdx]); + filteredData.push(this.props.data[index[i].RowIdx]); } if (useKeyword === true) { @@ -431,7 +431,7 @@ class StaticDataTable extends Component { data = this.props.getFormattedCell( this.props.Headers[j], data, - this.props.Data[index[i].RowIdx], + this.props.data[index[i].RowIdx], this.props.Headers ); if (data !== null) { @@ -477,47 +477,28 @@ class StaticDataTable extends Component { ); // Include only filtered data if filters were applied - let csvData = this.props.Data; + let csvData = this.props.data; if (this.props.Filter && filteredData.length > 0) { csvData = filteredData; } - let header = this.state.Hide.rowsPerPage === true ? '' : ( -
-
-
- {rows.length} rows displayed of {filteredRows}. - (Maximum rows per page: {RowsPerPageDropdown}) -
- -
-
-
-
- ); - let footer = this.state.Hide.downloadCSV === true ? '' : (
-
+
{rows.length} rows displayed of {filteredRows}. (Maximum rows per page: {RowsPerPageDropdown})
-
+
-
+
- {header} - +
- {headers} + {headers} {rows} @@ -547,9 +527,9 @@ class StaticDataTable extends Component { } } StaticDataTable.propTypes = { - Headers: PropTypes.array.isRequired, - Data: PropTypes.array.isRequired, - RowNumLabel: PropTypes.string, + Headers: React.PropTypes.array.isRequired, + data: React.PropTypes.array.isRequired, + RowNumLabel: React.PropTypes.string, // Function of which returns a JSX element for a table cell, takes // parameters of the form: func(ColumnName, CellData, EntireRowData) getFormattedCell: PropTypes.func, @@ -559,7 +539,7 @@ StaticDataTable.propTypes = { }; StaticDataTable.defaultProps = { Headers: [], - Data: {}, + data: {}, RowNumLabel: 'No.', Filter: {}, Hide: { From 02f4ed16bf5db0265f525152fef2b27f93f1077f Mon Sep 17 00:00:00 2001 From: Loris Admin Date: Thu, 4 Oct 2018 11:22:08 -0400 Subject: [PATCH 05/95] updated modal window --- htdocs/bootstrap/css/custom-css.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/bootstrap/css/custom-css.css b/htdocs/bootstrap/css/custom-css.css index 1360b1bf59e..d9f685ac331 100644 --- a/htdocs/bootstrap/css/custom-css.css +++ b/htdocs/bootstrap/css/custom-css.css @@ -259,7 +259,7 @@ html, body { width: 100%; height: 100%; overflow: auto; - background-color: rgba(0,0,0,0.9); + background-color: rgba(0,0,0,0.7); } .modal-content { From 713b4c133526131c0c4479d86817746fed2c8f9a Mon Sep 17 00:00:00 2001 From: Loris Admin Date: Thu, 4 Oct 2018 11:59:36 -0400 Subject: [PATCH 06/95] Update Modal Window --- jsx/Modal.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/jsx/Modal.js b/jsx/Modal.js index c7e0bdff154..5724bbf50e0 100644 --- a/jsx/Modal.js +++ b/jsx/Modal.js @@ -9,8 +9,6 @@ import React, {Component} from 'react'; import PropTypes from 'prop-types'; import swal from 'sweetalert2'; -import swal from 'sweetalert2'; - /** * Modal Component. * React wrapper for a Modal Window. Allows to dynamically toggle a Modal From 6d9e9d62ef3cc8afc5381e61ce5c7d372ace2665 Mon Sep 17 00:00:00 2001 From: Loris Admin Date: Mon, 15 Oct 2018 11:37:31 -0400 Subject: [PATCH 07/95] Added minor changes --- composer.json | 2 +- package-lock.json | 7867 --------------------------------------------- 2 files changed, 1 insertion(+), 7868 deletions(-) delete mode 100644 package-lock.json diff --git a/composer.json b/composer.json index bcc7eb97d94..a5e3312775b 100644 --- a/composer.json +++ b/composer.json @@ -14,7 +14,7 @@ "ext-json": "*" }, "require-dev" : { - "squizlabs/php_codesniffer" : "2.9.2", + "squizlabs/php_codesniffer" : "3.1.0", "phpunit/phpunit" : "6.5.*", "phpunit/dbunit": "3.0.*", "facebook/webdriver" : "dev-master", diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 0974cac9b0f..00000000000 --- a/package-lock.json +++ /dev/null @@ -1,7867 +0,0 @@ -{ - "name": "loris", - "version": "1.0.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@babel/code-frame": { - "version": "7.0.0-beta.44", - "resolved": "http://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.44.tgz", - "integrity": "sha512-cuAuTTIQ9RqcFRJ/Y8PvTh+paepNcaGxwQwjIDRWPXmzzyAeCO4KqS9ikMvq0MCbRk6GlYKwfzStrcP3/jSL8g==", - "dev": true, - "requires": { - "@babel/highlight": "7.0.0-beta.44" - } - }, - "@babel/generator": { - "version": "7.0.0-beta.44", - "resolved": "http://registry.npmjs.org/@babel/generator/-/generator-7.0.0-beta.44.tgz", - "integrity": "sha512-5xVb7hlhjGcdkKpMXgicAVgx8syK5VJz193k0i/0sLP6DzE6lRrU1K3B/rFefgdo9LPGMAOOOAWW4jycj07ShQ==", - "dev": true, - "requires": { - "@babel/types": "7.0.0-beta.44", - "jsesc": "^2.5.1", - "lodash": "^4.2.0", - "source-map": "^0.5.0", - "trim-right": "^1.0.1" - }, - "dependencies": { - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - } - } - }, - "@babel/helper-function-name": { - "version": "7.0.0-beta.44", - "resolved": "http://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.44.tgz", - "integrity": "sha512-MHRG2qZMKMFaBavX0LWpfZ2e+hLloT++N7rfM3DYOMUOGCD8cVjqZpwiL8a0bOX3IYcQev1ruciT0gdFFRTxzg==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "7.0.0-beta.44", - "@babel/template": "7.0.0-beta.44", - "@babel/types": "7.0.0-beta.44" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.0.0-beta.44", - "resolved": "http://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.44.tgz", - "integrity": "sha512-w0YjWVwrM2HwP6/H3sEgrSQdkCaxppqFeJtAnB23pRiJB5E/O9Yp7JAAeWBl+gGEgmBFinnTyOv2RN7rcSmMiw==", - "dev": true, - "requires": { - "@babel/types": "7.0.0-beta.44" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.0.0-beta.44", - "resolved": "http://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0-beta.44.tgz", - "integrity": "sha512-aQ7QowtkgKKzPGf0j6u77kBMdUFVBKNHw2p/3HX/POt5/oz8ec5cs0GwlgM8Hz7ui5EwJnzyfRmkNF1Nx1N7aA==", - "dev": true, - "requires": { - "@babel/types": "7.0.0-beta.44" - } - }, - "@babel/highlight": { - "version": "7.0.0-beta.44", - "resolved": "http://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0-beta.44.tgz", - "integrity": "sha512-Il19yJvy7vMFm8AVAh6OZzaFoAd0hbkeMZiX3P5HGD+z7dyI7RzndHB0dg6Urh/VAFfHtpOIzDUSxmY6coyZWQ==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^3.0.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==", - "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" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/template": { - "version": "7.0.0-beta.44", - "resolved": "http://registry.npmjs.org/@babel/template/-/template-7.0.0-beta.44.tgz", - "integrity": "sha512-w750Sloq0UNifLx1rUqwfbnC6uSUk0mfwwgGRfdLiaUzfAOiH0tHJE6ILQIUi3KYkjiCDTskoIsnfqZvWLBDng==", - "dev": true, - "requires": { - "@babel/code-frame": "7.0.0-beta.44", - "@babel/types": "7.0.0-beta.44", - "babylon": "7.0.0-beta.44", - "lodash": "^4.2.0" - }, - "dependencies": { - "babylon": { - "version": "7.0.0-beta.44", - "resolved": "http://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.44.tgz", - "integrity": "sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g==", - "dev": true - } - } - }, - "@babel/traverse": { - "version": "7.0.0-beta.44", - "resolved": "http://registry.npmjs.org/@babel/traverse/-/traverse-7.0.0-beta.44.tgz", - "integrity": "sha512-UHuDz8ukQkJCDASKHf+oDt3FVUzFd+QYfuBIsiNu/4+/ix6pP/C+uQZJ6K1oEfbCMv/IKWbgDEh7fcsnIE5AtA==", - "dev": true, - "requires": { - "@babel/code-frame": "7.0.0-beta.44", - "@babel/generator": "7.0.0-beta.44", - "@babel/helper-function-name": "7.0.0-beta.44", - "@babel/helper-split-export-declaration": "7.0.0-beta.44", - "@babel/types": "7.0.0-beta.44", - "babylon": "7.0.0-beta.44", - "debug": "^3.1.0", - "globals": "^11.1.0", - "invariant": "^2.2.0", - "lodash": "^4.2.0" - }, - "dependencies": { - "babylon": { - "version": "7.0.0-beta.44", - "resolved": "http://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.44.tgz", - "integrity": "sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g==", - "dev": true - }, - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "globals": { - "version": "11.9.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.9.0.tgz", - "integrity": "sha512-5cJVtyXWH8PiJPVLZzzoIizXx944O4OmRro5MWKx5fT4MgcN7OfaMutPeaTdJCCURwbWdhhcCWcKIffPnmTzBg==", - "dev": true - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - } - } - }, - "@babel/types": { - "version": "7.0.0-beta.44", - "resolved": "http://registry.npmjs.org/@babel/types/-/types-7.0.0-beta.44.tgz", - "integrity": "sha512-5eTV4WRmqbaFM3v9gHAIljEQJU4Ssc6fxL61JN+Oe2ga/BwyjzjamwkCVVAQjHGuAX8i0BWo42dshL8eO5KfLQ==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.2.0", - "to-fast-properties": "^2.0.0" - }, - "dependencies": { - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - } - } - }, - "@fortawesome/fontawesome-free": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-5.5.0.tgz", - "integrity": "sha512-p4lu0jfj5QN013ddArh99r3OXZ/fp9rbovs62LfaO70OMBsAXxtNd0lAq/97fitrscR0fqfd+/a5KNcp6Sh/0A==", - "dev": true - }, - "@webassemblyjs/ast": { - "version": "1.5.13", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.5.13.tgz", - "integrity": "sha512-49nwvW/Hx9i+OYHg+mRhKZfAlqThr11Dqz8TsrvqGKMhdI2ijy3KBJOun2Z4770TPjrIJhR6KxChQIDaz8clDA==", - "dev": true, - "requires": { - "@webassemblyjs/helper-module-context": "1.5.13", - "@webassemblyjs/helper-wasm-bytecode": "1.5.13", - "@webassemblyjs/wast-parser": "1.5.13", - "debug": "^3.1.0", - "mamacro": "^0.0.3" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - } - } - }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.5.13", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.5.13.tgz", - "integrity": "sha512-vrvvB18Kh4uyghSKb0NTv+2WZx871WL2NzwMj61jcq2bXkyhRC+8Q0oD7JGVf0+5i/fKQYQSBCNMMsDMRVAMqA==", - "dev": true - }, - "@webassemblyjs/helper-api-error": { - "version": "1.5.13", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.5.13.tgz", - "integrity": "sha512-dBh2CWYqjaDlvMmRP/kudxpdh30uXjIbpkLj9HQe+qtYlwvYjPRjdQXrq1cTAAOUSMTtzqbXIxEdEZmyKfcwsg==", - "dev": true - }, - "@webassemblyjs/helper-buffer": { - "version": "1.5.13", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.5.13.tgz", - "integrity": "sha512-v7igWf1mHcpJNbn4m7e77XOAWXCDT76Xe7Is1VQFXc4K5jRcFrl9D0NrqM4XifQ0bXiuTSkTKMYqDxu5MhNljA==", - "dev": true, - "requires": { - "debug": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - } - } - }, - "@webassemblyjs/helper-code-frame": { - "version": "1.5.13", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.5.13.tgz", - "integrity": "sha512-yN6ScQQDFCiAXnVctdVO/J5NQRbwyTbQzsGzEgXsAnrxhjp0xihh+nNHQTMrq5UhOqTb5LykpJAvEv9AT0jnAQ==", - "dev": true, - "requires": { - "@webassemblyjs/wast-printer": "1.5.13" - } - }, - "@webassemblyjs/helper-fsm": { - "version": "1.5.13", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.5.13.tgz", - "integrity": "sha512-hSIKzbXjVMRvy3Jzhgu+vDd/aswJ+UMEnLRCkZDdknZO3Z9e6rp1DAs0tdLItjCFqkz9+0BeOPK/mk3eYvVzZg==", - "dev": true - }, - "@webassemblyjs/helper-module-context": { - "version": "1.5.13", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.5.13.tgz", - "integrity": "sha512-zxJXULGPLB7r+k+wIlvGlXpT4CYppRz8fLUM/xobGHc9Z3T6qlmJD9ySJ2jknuktuuiR9AjnNpKYDECyaiX+QQ==", - "dev": true, - "requires": { - "debug": "^3.1.0", - "mamacro": "^0.0.3" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - } - } - }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.5.13", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.5.13.tgz", - "integrity": "sha512-0n3SoNGLvbJIZPhtMFq0XmmnA/YmQBXaZKQZcW8maGKwLpVcgjNrxpFZHEOLKjXJYVN5Il8vSfG7nRX50Zn+aw==", - "dev": true - }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.5.13", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.5.13.tgz", - "integrity": "sha512-IJ/goicOZ5TT1axZFSnlAtz4m8KEjYr12BNOANAwGFPKXM4byEDaMNXYowHMG0yKV9a397eU/NlibFaLwr1fbw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.5.13", - "@webassemblyjs/helper-buffer": "1.5.13", - "@webassemblyjs/helper-wasm-bytecode": "1.5.13", - "@webassemblyjs/wasm-gen": "1.5.13", - "debug": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - } - } - }, - "@webassemblyjs/ieee754": { - "version": "1.5.13", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.5.13.tgz", - "integrity": "sha512-TseswvXEPpG5TCBKoLx9tT7+/GMACjC1ruo09j46ULRZWYm8XHpDWaosOjTnI7kr4SRJFzA6MWoUkAB+YCGKKg==", - "dev": true, - "requires": { - "ieee754": "^1.1.11" - } - }, - "@webassemblyjs/leb128": { - "version": "1.5.13", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.5.13.tgz", - "integrity": "sha512-0NRMxrL+GG3eISGZBmLBLAVjphbN8Si15s7jzThaw1UE9e5BY1oH49/+MA1xBzxpf1OW5sf9OrPDOclk9wj2yg==", - "dev": true, - "requires": { - "long": "4.0.0" - }, - "dependencies": { - "long": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==", - "dev": true - } - } - }, - "@webassemblyjs/utf8": { - "version": "1.5.13", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.5.13.tgz", - "integrity": "sha512-Ve1ilU2N48Ew0lVGB8FqY7V7hXjaC4+PeZM+vDYxEd+R2iQ0q+Wb3Rw8v0Ri0+rxhoz6gVGsnQNb4FjRiEH/Ng==", - "dev": true - }, - "@webassemblyjs/wasm-edit": { - "version": "1.5.13", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.5.13.tgz", - "integrity": "sha512-X7ZNW4+Hga4f2NmqENnHke2V/mGYK/xnybJSIXImt1ulxbCOEs/A+ZK/Km2jgihjyVxp/0z0hwIcxC6PrkWtgw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.5.13", - "@webassemblyjs/helper-buffer": "1.5.13", - "@webassemblyjs/helper-wasm-bytecode": "1.5.13", - "@webassemblyjs/helper-wasm-section": "1.5.13", - "@webassemblyjs/wasm-gen": "1.5.13", - "@webassemblyjs/wasm-opt": "1.5.13", - "@webassemblyjs/wasm-parser": "1.5.13", - "@webassemblyjs/wast-printer": "1.5.13", - "debug": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - } - } - }, - "@webassemblyjs/wasm-gen": { - "version": "1.5.13", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.5.13.tgz", - "integrity": "sha512-yfv94Se8R73zmr8GAYzezFHc3lDwE/lBXQddSiIZEKZFuqy7yWtm3KMwA1uGbv5G1WphimJxboXHR80IgX1hQA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.5.13", - "@webassemblyjs/helper-wasm-bytecode": "1.5.13", - "@webassemblyjs/ieee754": "1.5.13", - "@webassemblyjs/leb128": "1.5.13", - "@webassemblyjs/utf8": "1.5.13" - } - }, - "@webassemblyjs/wasm-opt": { - "version": "1.5.13", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.5.13.tgz", - "integrity": "sha512-IkXSkgzVhQ0QYAdIayuCWMmXSYx0dHGU8Ah/AxJf1gBvstMWVnzJnBwLsXLyD87VSBIcsqkmZ28dVb0mOC3oBg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.5.13", - "@webassemblyjs/helper-buffer": "1.5.13", - "@webassemblyjs/wasm-gen": "1.5.13", - "@webassemblyjs/wasm-parser": "1.5.13", - "debug": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - } - } - }, - "@webassemblyjs/wasm-parser": { - "version": "1.5.13", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.5.13.tgz", - "integrity": "sha512-XnYoIcu2iqq8/LrtmdnN3T+bRjqYFjRHqWbqK3osD/0r/Fcv4d9ecRzjVtC29ENEuNTK4mQ9yyxCBCbK8S/cpg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.5.13", - "@webassemblyjs/helper-api-error": "1.5.13", - "@webassemblyjs/helper-wasm-bytecode": "1.5.13", - "@webassemblyjs/ieee754": "1.5.13", - "@webassemblyjs/leb128": "1.5.13", - "@webassemblyjs/utf8": "1.5.13" - } - }, - "@webassemblyjs/wast-parser": { - "version": "1.5.13", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.5.13.tgz", - "integrity": "sha512-Lbz65T0LQ1LgzKiUytl34CwuhMNhaCLgrh0JW4rJBN6INnBB8NMwUfQM+FxTnLY9qJ+lHJL/gCM5xYhB9oWi4A==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.5.13", - "@webassemblyjs/floating-point-hex-parser": "1.5.13", - "@webassemblyjs/helper-api-error": "1.5.13", - "@webassemblyjs/helper-code-frame": "1.5.13", - "@webassemblyjs/helper-fsm": "1.5.13", - "long": "^3.2.0", - "mamacro": "^0.0.3" - } - }, - "@webassemblyjs/wast-printer": { - "version": "1.5.13", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.5.13.tgz", - "integrity": "sha512-QcwogrdqcBh8Z+eUF8SG+ag5iwQSXxQJELBEHmLkk790wgQgnIMmntT2sMAMw53GiFNckArf5X0bsCA44j3lWQ==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.5.13", - "@webassemblyjs/wast-parser": "1.5.13", - "long": "^3.2.0" - } - }, - "acorn": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.0.4.tgz", - "integrity": "sha512-VY4i5EKSKkofY2I+6QLTbTTN/UvEQPCo6eiwzzSaSWfpaDhOmStMCMod6wmuPciNq+XS0faCglFu2lHZpdHUtg==", - "dev": true - }, - "acorn-dynamic-import": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz", - "integrity": "sha512-zVWV8Z8lislJoOKKqdNMOB+s6+XV5WERty8MnKBeFgwA+19XJjJHs2RP5dzM57FftIs+jQnRToLiWazKr6sSWg==", - "dev": true, - "requires": { - "acorn": "^5.0.0" - }, - "dependencies": { - "acorn": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", - "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", - "dev": true - } - } - }, - "acorn-jsx": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.0.tgz", - "integrity": "sha512-XkB50fn0MURDyww9+UYL3c1yLbOBz0ZFvrdYlGB8l+Ije1oSC75qAqrzSPjYQbdnQUzhlUGNKuesryAv0gxZOg==", - "dev": true - }, - "ajv": { - "version": "6.5.5", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.5.tgz", - "integrity": "sha512-7q7gtRQDJSyuEHjuVgHoUa2VuemFiCMrfQc9Tc08XTAc4Zj/5U1buQJ0HU6i7fKjXU09SVgSmxa4sLvuvS8Iyg==", - "dev": true, - "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz", - "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=", - "dev": true - }, - "ansi-escapes": { - "version": "3.1.0", - "resolved": "http://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", - "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==", - "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=" - }, - "anymatch": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.0.tgz", - "integrity": "sha1-o+Uvo5FoyCX/V7AkgSbOWo/5VQc=", - "dev": true, - "optional": true, - "requires": { - "arrify": "^1.0.0", - "micromatch": "^2.1.5" - } - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true - }, - "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" - } - }, - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, - "optional": true, - "requires": { - "arr-flatten": "^1.0.1" - } - }, - "arr-flatten": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.0.3.tgz", - "integrity": "sha1-onTthawIhJtr14R8RYB0XcUa37E=", - "dev": true, - "optional": 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-includes": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", - "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.7.0" - } - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true, - "optional": true - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true, - "optional": true - }, - "asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", - "dev": true - }, - "asn1.js": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", - "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "assert": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", - "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", - "dev": true, - "requires": { - "util": "0.10.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "dev": true, - "requires": { - "inherits": "2.0.1" - } - } - } - }, - "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 - }, - "async-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", - "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", - "dev": true - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true - }, - "babel-cli": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-cli/-/babel-cli-6.26.0.tgz", - "integrity": "sha1-UCq1SHTX24itALiHoGODzgPQAvE=", - "dev": true, - "requires": { - "babel-core": "^6.26.0", - "babel-polyfill": "^6.26.0", - "babel-register": "^6.26.0", - "babel-runtime": "^6.26.0", - "chokidar": "^1.6.1", - "commander": "^2.11.0", - "convert-source-map": "^1.5.0", - "fs-readdir-recursive": "^1.0.0", - "glob": "^7.1.2", - "lodash": "^4.17.4", - "output-file-sync": "^1.1.2", - "path-is-absolute": "^1.0.1", - "slash": "^1.0.0", - "source-map": "^0.5.6", - "v8flags": "^2.1.1" - }, - "dependencies": { - "babel-core": { - "version": "6.26.3", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", - "integrity": "sha1-suLwnjQtDwyI4vAuBneUEl51wgc=", - "dev": true, - "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" - }, - "dependencies": { - "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=", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" - }, - "dependencies": { - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", - "dev": true - } - } - }, - "babel-generator": { - "version": "6.26.1", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", - "integrity": "sha1-GERAjTuPDTWkBOp6wYDwh6YBvZA=", - "dev": true, - "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" - } - }, - "babel-template": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", - "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "babel-traverse": "^6.26.0", - "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=", - "dev": true, - "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=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" - } - }, - "babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha1-ry87iPpvXB5MY00aD46sT1WzleM=", - "dev": true - }, - "convert-source-map": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", - "integrity": "sha1-UbU3qMQ+DwTewZk7/83VBOdYrCA=", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0=", - "dev": true - } - } - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "private": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha1-I4Hts2ifelPWUxkAYPz4ItLzaP8=", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "babel-polyfill": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz", - "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "core-js": "^2.5.0", - "regenerator-runtime": "^0.10.5" - }, - "dependencies": { - "core-js": { - "version": "2.5.7", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", - "integrity": "sha1-+XJgj/DOrWi4QaFqky0LGDeRgU4=", - "dev": true - } - } - }, - "babel-register": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", - "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", - "dev": true, - "requires": { - "babel-core": "^6.26.0", - "babel-runtime": "^6.26.0", - "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" - }, - "dependencies": { - "core-js": { - "version": "2.5.7", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", - "integrity": "sha1-+XJgj/DOrWi4QaFqky0LGDeRgU4=", - "dev": true - } - } - }, - "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=", - "dev": true, - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - }, - "dependencies": { - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha1-vgWtf5v30i4Fb5cmzuUBf78Z4uk=", - "dev": true - } - } - }, - "commander": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", - "integrity": "sha1-9hmKqE5bg8RgVLlN3tv+1e6f8So=", - "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" - }, - "dependencies": { - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" - } - } - }, - "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" - }, - "dependencies": { - "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-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" - } - }, - "convert-source-map": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", - "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "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" - } - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" - }, - "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==" - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "babel-eslint": { - "version": "8.2.6", - "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-8.2.6.tgz", - "integrity": "sha512-aCdHjhzcILdP8c9lej7hvXKvQieyRt20SF102SIGyY4cUIiw6UaAtK4j2o3dXX74jEmy0TJ0CEhv4fTIM3SzcA==", - "dev": true, - "requires": { - "@babel/code-frame": "7.0.0-beta.44", - "@babel/traverse": "7.0.0-beta.44", - "@babel/types": "7.0.0-beta.44", - "babylon": "7.0.0-beta.44", - "eslint-scope": "3.7.1", - "eslint-visitor-keys": "^1.0.0" - }, - "dependencies": { - "babylon": { - "version": "7.0.0-beta.44", - "resolved": "http://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.44.tgz", - "integrity": "sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g==", - "dev": true - } - } - }, - "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": { - "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-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" - } - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "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=", - "dev": true, - "requires": { - "babel-helper-explode-assignable-expression": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-helper-builder-react-jsx": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.24.1.tgz", - "integrity": "sha1-CteRfjPI11HmRtrKTnfMGTd9LLw=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1", - "esutils": "^2.0.0" - } - }, - "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=", - "dev": true, - "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=", - "dev": true, - "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" - }, - "dependencies": { - "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=", - "dev": true, - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - } - }, - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" - } - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true - } - } - }, - "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=", - "dev": true, - "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=", - "dev": true, - "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=", - "dev": true, - "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=", - "dev": true, - "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=", - "dev": true, - "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=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" - }, - "dependencies": { - "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=", - "dev": true, - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - } - }, - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" - } - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true - } - } - }, - "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=", - "dev": true, - "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=", - "dev": true, - "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-loader": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-7.1.5.tgz", - "integrity": "sha512-iCHfbieL5d1LfOQeeVJEUyD9rTwBcP/fcEbRCfempxTDuqrKpu0AZjLAQHEQa3Yqyj9ORKe2iHfoj4rHLf7xpw==", - "dev": true, - "requires": { - "find-cache-dir": "^1.0.0", - "loader-utils": "^1.0.2", - "mkdirp": "^0.5.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=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-syntax-async-functions": { - "version": "6.13.0", - "resolved": "http://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", - "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=", - "dev": true - }, - "babel-plugin-syntax-exponentiation-operator": { - "version": "6.13.0", - "resolved": "http://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", - "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=", - "dev": true - }, - "babel-plugin-syntax-flow": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz", - "integrity": "sha1-TDqyCiryaqIM0lmVw5jE63AxDI0=", - "dev": true - }, - "babel-plugin-syntax-jsx": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", - "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=", - "dev": true - }, - "babel-plugin-syntax-object-rest-spread": { - "version": "6.13.0", - "resolved": "http://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", - "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=", - "dev": true - }, - "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=", - "dev": true - }, - "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=", - "dev": true, - "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-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=", - "dev": true, - "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=", - "dev": true, - "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=", - "dev": true, - "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" - }, - "dependencies": { - "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=", - "dev": true, - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - } - }, - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" - } - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true - } - } - }, - "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=", - "dev": true, - "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=", - "dev": true, - "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=", - "dev": true, - "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=", - "dev": true, - "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=", - "dev": true, - "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=", - "dev": true, - "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=", - "dev": true, - "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=", - "dev": true, - "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==", - "dev": true, - "requires": { - "babel-plugin-transform-strict-mode": "^6.24.1", - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-types": "^6.26.0" - }, - "dependencies": { - "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=", - "dev": true, - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - } - }, - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" - } - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true - } - } - }, - "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=", - "dev": true, - "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=", - "dev": true, - "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=", - "dev": true, - "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=", - "dev": true, - "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=", - "dev": true, - "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=", - "dev": true, - "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=", - "dev": true, - "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=", - "dev": true, - "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=", - "dev": true, - "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=", - "dev": true, - "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=", - "dev": true, - "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-flow-strip-types": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz", - "integrity": "sha1-hMtnKTXUNxT9wyvOhFaNh0Qc988=", - "dev": true, - "requires": { - "babel-plugin-syntax-flow": "^6.18.0", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-object-rest-spread": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", - "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", - "dev": true, - "requires": { - "babel-plugin-syntax-object-rest-spread": "^6.8.0", - "babel-runtime": "^6.26.0" - }, - "dependencies": { - "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=", - "dev": true, - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - } - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true - } - } - }, - "babel-plugin-transform-react-display-name": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.25.0.tgz", - "integrity": "sha1-Z+K/Hx6ck6sI25Z5LgU5K/LMKNE=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-react-jsx": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz", - "integrity": "sha1-hAoCjn30YN/DotKfDA2R9jduZqM=", - "dev": true, - "requires": { - "babel-helper-builder-react-jsx": "^6.24.1", - "babel-plugin-syntax-jsx": "^6.8.0", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-react-jsx-self": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.22.0.tgz", - "integrity": "sha1-322AqdomEqEh5t3XVYvL7PBuY24=", - "dev": true, - "requires": { - "babel-plugin-syntax-jsx": "^6.8.0", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-react-jsx-source": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz", - "integrity": "sha1-ZqwSFT9c0tF7PBkmj0vwGX9E7NY=", - "dev": true, - "requires": { - "babel-plugin-syntax-jsx": "^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=", - "dev": true, - "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=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "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==", - "dev": true, - "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-preset-flow": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz", - "integrity": "sha1-5xIYiHCFrpoktb5Baa/7WZgWxJ0=", - "dev": true, - "requires": { - "babel-plugin-transform-flow-strip-types": "^6.22.0" - } - }, - "babel-preset-react": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-react/-/babel-preset-react-6.24.1.tgz", - "integrity": "sha1-umnfrqRfw+xjm2pOzqbhdwLJE4A=", - "dev": true, - "requires": { - "babel-plugin-syntax-jsx": "^6.3.13", - "babel-plugin-transform-react-display-name": "^6.23.0", - "babel-plugin-transform-react-jsx": "^6.24.1", - "babel-plugin-transform-react-jsx-self": "^6.22.0", - "babel-plugin-transform-react-jsx-source": "^6.22.0", - "babel-preset-flow": "^6.23.0" - } - }, - "babel-register": { - "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" - }, - "dependencies": { - "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" - } - }, - "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==" - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" - } - } - }, - "babel-runtime": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "integrity": "sha1-CpSJ8UTecO+zzkMArM2zKeL8VDs=", - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.10.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" - }, - "dependencies": { - "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-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" - } - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" - } - } - }, - "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" - }, - "dependencies": { - "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-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" - } - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" - } - } - }, - "babel-types": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz", - "integrity": "sha1-cK+ySNVmDl0Y+BHZHIMDtUE0oY4=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "esutils": "^2.0.2", - "lodash": "^4.2.0", - "to-fast-properties": "^1.0.1" - } - }, - "babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==" - }, - "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-js": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", - "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==", - "dev": true - }, - "big.js": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", - "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", - "dev": true - }, - "binary-extensions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.8.0.tgz", - "integrity": "sha1-SOyNFt9Dd+rl+liEaCSAr02Vx3Q=", - "dev": true - }, - "bluebird": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.3.tgz", - "integrity": "sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw==", - "dev": true - }, - "bn.js": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", - "dev": true - }, - "brace-expansion": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", - "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", - "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, - "optional": true, - "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" - } - }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true - }, - "browserify-aes": { - "version": "1.2.0", - "resolved": "http://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dev": true, - "requires": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "dev": true, - "requires": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } - } - }, - "browserify-rsa": { - "version": "4.0.1", - "resolved": "http://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "randombytes": "^2.0.1" - } - }, - "browserify-sign": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", - "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", - "dev": true, - "requires": { - "bn.js": "^4.1.1", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.2", - "elliptic": "^6.0.0", - "inherits": "^2.0.1", - "parse-asn1": "^5.0.0" - } - }, - "browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "dev": true, - "requires": { - "pako": "~1.0.5" - } - }, - "browserslist": { - "version": "3.2.8", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-3.2.8.tgz", - "integrity": "sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30000844", - "electron-to-chromium": "^1.3.47" - } - }, - "buffer": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", - "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", - "dev": true, - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } - }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true - }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", - "dev": true - }, - "builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", - "dev": true - }, - "cacache": { - "version": "10.0.4", - "resolved": "http://registry.npmjs.org/cacache/-/cacache-10.0.4.tgz", - "integrity": "sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==", - "dev": true, - "requires": { - "bluebird": "^3.5.1", - "chownr": "^1.0.1", - "glob": "^7.1.2", - "graceful-fs": "^4.1.11", - "lru-cache": "^4.1.1", - "mississippi": "^2.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.2", - "ssri": "^5.2.4", - "unique-filename": "^1.1.0", - "y18n": "^4.0.0" - } - }, - "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 - } - } - }, - "caller-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", - "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", - "dev": true, - "requires": { - "callsites": "^0.2.0" - } - }, - "callsites": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", - "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", - "dev": true - }, - "camelcase": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz", - "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==", - "dev": true - }, - "caniuse-lite": { - "version": "1.0.30000909", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000909.tgz", - "integrity": "sha512-4Ix9ArKpo3s/dLGVn/el9SAk6Vn2kGhg8XeE4eRTsGEsmm9RnTkwnBsVZs7p4wA8gB+nsgP36vZWYbG8a4nYrg==", - "dev": true - }, - "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" - } - }, - "chardet": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", - "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", - "dev": true - }, - "chokidar": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", - "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", - "dev": true, - "optional": 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" - } - }, - "chownr": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", - "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==", - "dev": true - }, - "chrome-trace-event": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.0.tgz", - "integrity": "sha512-xDbVgyfDTT2piup/h8dK/y4QZfJRSa73bw1WZ8b4XM1o7fsFubUVGYcE+1ANtOzJJELGpYoG2961z0Z6OAld9A==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "circular-json": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", - "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", - "dev": true - }, - "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 - } - } - }, - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "dev": true, - "requires": { - "restore-cursor": "^2.0.0" - } - }, - "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": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", - "dev": true, - "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, - "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.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "commander": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz", - "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==", - "dev": true - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "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 - }, - "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" - } - }, - "console-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", - "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", - "dev": true, - "requires": { - "date-now": "^0.1.4" - } - }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", - "dev": true - }, - "convert-source-map": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.0.tgz", - "integrity": "sha1-ms1whRxtXf3ZPZKC5e35SgP/RrU=", - "dev": true - }, - "copy-concurrently": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", - "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", - "dev": true, - "requires": { - "aproba": "^1.1.1", - "fs-write-stream-atomic": "^1.0.8", - "iferr": "^0.1.5", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.0" - } - }, - "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.4.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.4.1.tgz", - "integrity": "sha1-TekR5mew6ukSTjQlS1OupvxhjT4=" - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "create-ecdh": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", - "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "elliptic": "^6.0.0" - } - }, - "create-hash": { - "version": "1.2.0", - "resolved": "http://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "create-hmac": { - "version": "1.1.7", - "resolved": "http://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dev": true, - "requires": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "dev": true, - "requires": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - } - }, - "cyclist": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", - "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=", - "dev": true - }, - "date-now": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", - "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", - "dev": true - }, - "debug": { - "version": "2.6.8", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", - "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", - "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=", - "dev": true - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true - }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true - }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, - "requires": { - "object-keys": "^1.0.12" - } - }, - "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 - } - } - }, - "des.js": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", - "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.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" - } - }, - "diffie-hellman": { - "version": "5.0.3", - "resolved": "http://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - } - }, - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", - "dev": true - }, - "duplexify": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.1.tgz", - "integrity": "sha512-vM58DwdnKmty+FSPzT14K9JXb90H+j5emaR4KYbr2KTIz00WHGbWOe5ghQTx233ZCLZtrGDALzKwcjEtSt35mA==", - "dev": true, - "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - } - }, - "electron-to-chromium": { - "version": "1.3.84", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.84.tgz", - "integrity": "sha512-IYhbzJYOopiTaNWMBp7RjbecUBsbnbDneOP86f3qvS0G0xfzwNSvMJpTrvi5/Y1gU7tg2NAgeg8a8rCYvW9Whw==", - "dev": true - }, - "elliptic": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.1.tgz", - "integrity": "sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ==", - "dev": true, - "requires": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.0" - } - }, - "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", - "dev": true - }, - "encoding": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", - "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", - "dev": true, - "requires": { - "iconv-lite": "~0.4.13" - } - }, - "end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "enhanced-resolve": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", - "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.4.0", - "tapable": "^1.0.0" - } - }, - "errno": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", - "dev": true, - "requires": { - "prr": "~1.0.1" - } - }, - "es-abstract": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz", - "integrity": "sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA==", - "dev": true, - "requires": { - "es-to-primitive": "^1.1.1", - "function-bind": "^1.1.1", - "has": "^1.0.1", - "is-callable": "^1.1.3", - "is-regex": "^1.0.4" - } - }, - "es-to-primitive": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", - "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "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=" - }, - "eslint": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.3.0.tgz", - "integrity": "sha512-N/tCqlMKkyNvAvLu+zI9AqDasnSLt00K+Hu8kdsERliC9jYEc8ck12XtjvOXrBKu8fK6RrBcN9bat6Xk++9jAg==", - "dev": true, - "requires": { - "ajv": "^6.5.0", - "babel-code-frame": "^6.26.0", - "chalk": "^2.1.0", - "cross-spawn": "^6.0.5", - "debug": "^3.1.0", - "doctrine": "^2.1.0", - "eslint-scope": "^4.0.0", - "eslint-utils": "^1.3.1", - "eslint-visitor-keys": "^1.0.0", - "espree": "^4.0.0", - "esquery": "^1.0.1", - "esutils": "^2.0.2", - "file-entry-cache": "^2.0.0", - "functional-red-black-tree": "^1.0.1", - "glob": "^7.1.2", - "globals": "^11.7.0", - "ignore": "^4.0.2", - "imurmurhash": "^0.1.4", - "inquirer": "^5.2.0", - "is-resolvable": "^1.1.0", - "js-yaml": "^3.11.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.5", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "optionator": "^0.8.2", - "path-is-inside": "^1.0.2", - "pluralize": "^7.0.0", - "progress": "^2.0.0", - "regexpp": "^2.0.0", - "require-uncached": "^1.0.3", - "semver": "^5.5.0", - "string.prototype.matchall": "^2.0.0", - "strip-ansi": "^4.0.0", - "strip-json-comments": "^2.0.1", - "table": "^4.0.3", - "text-table": "^0.2.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "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" - } - }, - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "eslint-scope": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.0.tgz", - "integrity": "sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA==", - "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "globals": { - "version": "11.9.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.9.0.tgz", - "integrity": "sha512-5cJVtyXWH8PiJPVLZzzoIizXx944O4OmRro5MWKx5fT4MgcN7OfaMutPeaTdJCCURwbWdhhcCWcKIffPnmTzBg==", - "dev": true - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "eslint-config-google": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/eslint-config-google/-/eslint-config-google-0.9.1.tgz", - "integrity": "sha512-5A83D+lH0PA81QMESKbLJd/a3ic8tPZtwUmqNrxMRo54nfFaUvtt89q/+icQ+fd66c2xQHn0KyFkzJDoAUfpZA==", - "dev": true - }, - "eslint-loader": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-2.1.0.tgz", - "integrity": "sha512-f4A/Yk7qF+HcFSz5Tck2QoKIwJVHlX0soJk5MkROYahb5uvspad5Ba60rrz4u/V2/MEj1dtp/uBi6LlLWVaY7Q==", - "dev": true, - "requires": { - "loader-fs-cache": "^1.0.0", - "loader-utils": "^1.0.2", - "object-assign": "^4.0.1", - "object-hash": "^1.1.4", - "rimraf": "^2.6.1" - } - }, - "eslint-plugin-react": { - "version": "7.11.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.11.1.tgz", - "integrity": "sha512-cVVyMadRyW7qsIUh3FHp3u6QHNhOgVrLQYdQEB1bPWBsgbNCHdFAeNMquBMCcZJu59eNthX053L70l7gRt4SCw==", - "dev": true, - "requires": { - "array-includes": "^3.0.3", - "doctrine": "^2.1.0", - "has": "^1.0.3", - "jsx-ast-utils": "^2.0.1", - "prop-types": "^15.6.2" - } - }, - "eslint-scope": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", - "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", - "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "eslint-utils": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.3.1.tgz", - "integrity": "sha512-Z7YjnIldX+2XMcjr7ZkgEsOj/bREONV60qYeB/bjMAqqqZ4zxKyWX+BOUkdmRmA9riiIPVvo5x86m5elviOk0Q==", - "dev": true - }, - "eslint-visitor-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", - "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==", - "dev": true - }, - "espree": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-4.1.0.tgz", - "integrity": "sha512-I5BycZW6FCVIub93TeVY1s7vjhP9CY6cXCznIRfiig7nRviKZYdRnj/sHEWC6A7WE9RDWOFq9+7OsWSYz8qv2w==", - "dev": true, - "requires": { - "acorn": "^6.0.2", - "acorn-jsx": "^5.0.0", - "eslint-visitor-keys": "^1.0.0" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "esquery": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", - "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", - "dev": true, - "requires": { - "estraverse": "^4.0.0" - } - }, - "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", - "dev": true, - "requires": { - "estraverse": "^4.1.0" - } - }, - "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", - "dev": true - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" - }, - "events": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", - "dev": true - }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dev": true, - "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } - } - }, - "execa": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.10.0.tgz", - "integrity": "sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==", - "dev": true, - "requires": { - "cross-spawn": "^6.0.0", - "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" - } - }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, - "optional": 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, - "optional": true, - "requires": { - "fill-range": "^2.1.0" - } - }, - "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": "2.2.0", - "resolved": "http://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", - "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", - "dev": true, - "requires": { - "chardet": "^0.4.0", - "iconv-lite": "^0.4.17", - "tmp": "^0.0.33" - } - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, - "optional": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", - "dev": true - }, - "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "fbjs": { - "version": "0.8.17", - "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.17.tgz", - "integrity": "sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90=", - "dev": true, - "requires": { - "core-js": "^1.0.0", - "isomorphic-fetch": "^2.1.1", - "loose-envify": "^1.0.0", - "object-assign": "^4.1.0", - "promise": "^7.1.1", - "setimmediate": "^1.0.5", - "ua-parser-js": "^0.7.18" - }, - "dependencies": { - "core-js": { - "version": "1.2.7", - "resolved": "http://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", - "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=", - "dev": true - } - } - }, - "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "file-entry-cache": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", - "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", - "dev": true, - "requires": { - "flat-cache": "^1.2.1", - "object-assign": "^4.0.1" - } - }, - "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, - "optional": 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, - "optional": 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" - }, - "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, - "optional": true - }, - "randomatic": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", - "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", - "dev": true, - "optional": 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, - "optional": true - } - } - } - } - }, - "find-cache-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", - "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^1.0.0", - "pkg-dir": "^2.0.0" - } - }, - "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" - } - }, - "flat-cache": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.4.tgz", - "integrity": "sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==", - "dev": true, - "requires": { - "circular-json": "^0.3.1", - "graceful-fs": "^4.1.2", - "rimraf": "~2.6.2", - "write": "^0.2.1" - } - }, - "flush-write-stream": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.3.tgz", - "integrity": "sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.4" - } - }, - "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, - "optional": true, - "requires": { - "for-in": "^1.0.1" - } - }, - "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" - } - }, - "from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, - "fs-readdir-recursive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.0.0.tgz", - "integrity": "sha1-jNF0XItPiinIyuw5JHaSG6GV9WA=", - "dev": true - }, - "fs-write-stream-atomic": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", - "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "iferr": "^0.1.5", - "imurmurhash": "^0.1.4", - "readable-stream": "1 || 2" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "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 - }, - "nan": { - "version": "2.11.1", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.11.1.tgz", - "integrity": "sha512-iji6k87OSXa0CcrLl9z+ZiYSuR2o+c0bGuNmXdrhTQTakxytAFsC56SArGYoiHlJlFoHSnvmhpceZJaXkVuOtA==", - "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 - } - } - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", - "dev": true - }, - "get-stream": { - "version": "3.0.0", - "resolved": "http://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true - }, - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": 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" - } - }, - "glob-base": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", - "dev": true, - "optional": 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-path": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/global-modules-path/-/global-modules-path-2.3.0.tgz", - "integrity": "sha512-HchvMJNYh9dGSCy8pOQ2O8u/hoXaL+0XhnrwH0RyLiSXMMTl9W3N6KUU73+JFOg5PGjtzl6VZzUQsnrpm7Szag==", - "dev": true - }, - "globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==" - }, - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "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-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "has-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", - "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", - "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-base": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", - "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "hash.js": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.5.tgz", - "integrity": "sha512-eWI5HG9Np+eHV1KQhisXWwM+4EPPYe5dFX1UZZH7k/E3JzDEazVH+VGlZi6R94ZqImq+A3D1mCEtrFIfg/E7sA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dev": true, - "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "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" - } - }, - "https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", - "dev": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ieee754": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz", - "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==", - "dev": true - }, - "iferr": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", - "dev": true - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - }, - "import-local": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz", - "integrity": "sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==", - "dev": true, - "requires": { - "pkg-dir": "^2.0.0", - "resolve-cwd": "^2.0.0" - } - }, - "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 - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "inquirer": { - "version": "5.2.0", - "resolved": "http://registry.npmjs.org/inquirer/-/inquirer-5.2.0.tgz", - "integrity": "sha512-E9BmnJbAKLPGonz0HeWHtbKf+EeSP93paWO3ZYoUpq/aowXvYGjjCSuashhXPpzbArIjBbji39THkxTz9ZeEUQ==", - "dev": true, - "requires": { - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.0", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^2.1.0", - "figures": "^2.0.0", - "lodash": "^4.3.0", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rxjs": "^5.5.2", - "string-width": "^2.1.0", - "strip-ansi": "^4.0.0", - "through": "^2.3.6" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "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" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "interpret": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", - "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", - "dev": true - }, - "invariant": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", - "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", - "requires": { - "loose-envify": "^1.0.0" - } - }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", - "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.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz", - "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=", - "dev": true - }, - "is-callable": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", - "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", - "dev": true - }, - "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-date-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", - "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", - "dev": true - }, - "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, - "optional": 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, - "optional": 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": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "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-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", - "dev": true, - "optional": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "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, - "optional": 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-regex": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", - "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", - "dev": true, - "requires": { - "has": "^1.0.1" - } - }, - "is-resolvable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", - "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", - "dev": true - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, - "is-symbol": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", - "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", - "dev": true, - "requires": { - "has-symbols": "^1.0.0" - } - }, - "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 - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "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, - "optional": true, - "requires": { - "isarray": "1.0.0" - } - }, - "isomorphic-fetch": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", - "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", - "dev": true, - "requires": { - "node-fetch": "^1.0.1", - "whatwg-fetch": ">=0.10.0" - } - }, - "js-tokens": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.1.tgz", - "integrity": "sha1-COnxMkhKLEWjCQfp3E1VZ7fxFNc=" - }, - "js-yaml": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", - "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsesc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", - "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=" - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" - }, - "jsx-ast-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.0.1.tgz", - "integrity": "sha1-6AGxs5mF4g//yHtA43SAgOLcrH8=", - "dev": true, - "requires": { - "array-includes": "^3.0.3" - } - }, - "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" - } - }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", - "dev": true, - "requires": { - "invert-kv": "^2.0.0" - } - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "loader-fs-cache": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/loader-fs-cache/-/loader-fs-cache-1.0.1.tgz", - "integrity": "sha1-VuC/CL2XCLJqdltoUJhAyN7J/bw=", - "dev": true, - "requires": { - "find-cache-dir": "^0.1.1", - "mkdirp": "0.5.1" - }, - "dependencies": { - "find-cache-dir": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz", - "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "mkdirp": "^0.5.1", - "pkg-dir": "^1.0.0" - } - }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "^2.0.0" - } - }, - "pkg-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", - "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", - "dev": true, - "requires": { - "find-up": "^1.0.0" - } - } - } - }, - "loader-runner": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.1.tgz", - "integrity": "sha512-By6ZFY7ETWOc9RFaAIb23IjJVcM4dvJC/N57nmdz9RSkMXvAXGI7SyVlAw3v8vjtDRlqThgVDVmTnr9fqMlxkw==", - "dev": true - }, - "loader-utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", - "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", - "dev": true, - "requires": { - "big.js": "^3.1.3", - "emojis-list": "^2.0.0", - "json5": "^0.5.0" - } - }, - "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" - } - }, - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" - }, - "lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", - "dev": true - }, - "long": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz", - "integrity": "sha1-2CG3E4yhy1gcFymQ7xTbIAtcR0s=", - "dev": true - }, - "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" - } - }, - "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" - } - }, - "mamacro": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz", - "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==", - "dev": true - }, - "map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", - "dev": true, - "requires": { - "p-defer": "^1.0.0" - } - }, - "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" - } - }, - "math-random": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz", - "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=", - "dev": true, - "optional": true - }, - "md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } - } - }, - "mem": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.0.0.tgz", - "integrity": "sha512-WQxG/5xYc3tMbYLXoXPm81ET2WDULiU5FxbuIoNbJqLOOI8zehXFdZuiUEgfdrU2mVB1pxBZUGlYORSrpuJreA==", - "dev": true, - "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^1.0.0", - "p-is-promise": "^1.1.0" - } - }, - "memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", - "dev": true, - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, - "optional": 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" - } - }, - "miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - } - }, - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true - }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", - "dev": true - }, - "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=" - }, - "mississippi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-2.0.0.tgz", - "integrity": "sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==", - "dev": true, - "requires": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^2.0.1", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" - } - }, - "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" - } - }, - "move-concurrently": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", - "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", - "dev": true, - "requires": { - "aproba": "^1.1.1", - "copy-concurrently": "^1.0.0", - "fs-write-stream-atomic": "^1.0.8", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.3" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", - "dev": true - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "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 - }, - "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 - } - } - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "neo-async": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.0.tgz", - "integrity": "sha512-MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA==", - "dev": true - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "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==", - "dev": true, - "requires": { - "encoding": "^0.1.11", - "is-stream": "^1.0.1" - } - }, - "node-libs-browser": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz", - "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==", - "dev": true, - "requires": { - "assert": "^1.1.1", - "browserify-zlib": "^0.2.0", - "buffer": "^4.3.0", - "console-browserify": "^1.1.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.11.0", - "domain-browser": "^1.1.1", - "events": "^1.0.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", - "path-browserify": "0.0.0", - "process": "^0.11.10", - "punycode": "^1.2.4", - "querystring-es3": "^0.2.0", - "readable-stream": "^2.3.3", - "stream-browserify": "^2.0.1", - "stream-http": "^2.7.2", - "string_decoder": "^1.0.0", - "timers-browserify": "^2.0.4", - "tty-browserify": "0.0.0", - "url": "^0.11.0", - "util": "^0.10.3", - "vm-browserify": "0.0.4" - }, - "dependencies": { - "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "dev": true - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "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" - }, - "dependencies": { - "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==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } - } - }, - "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" - } - }, - "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" - } - }, - "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-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-hash": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-1.3.1.tgz", - "integrity": "sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA==", - "dev": true - }, - "object-keys": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", - "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==", - "dev": true - }, - "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, - "optional": 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 - } - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "dev": true, - "requires": { - "mimic-fn": "^1.0.0" - } - }, - "optionator": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", - "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", - "dev": true, - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.4", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "wordwrap": "~1.0.0" - } - }, - "os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", - "dev": true - }, - "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": "3.0.1", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.0.1.tgz", - "integrity": "sha512-7g5e7dmXPtzcP4bgsZ8ixDVqA7oWYuEz4lOSujeWyliPai4gfVDiFIcwBg3aGCPnmSGfzOKTK3ccPn0CKv3DBw==", - "dev": true, - "requires": { - "execa": "^0.10.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" - } - }, - "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=" - }, - "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=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.4", - "mkdirp": "^0.5.1", - "object-assign": "^4.1.0" - } - }, - "p-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", - "dev": true - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, - "p-is-promise": { - "version": "1.1.0", - "resolved": "http://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz", - "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=", - "dev": true - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "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-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 - }, - "pako": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", - "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==", - "dev": true - }, - "parallel-transform": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz", - "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", - "dev": true, - "requires": { - "cyclist": "~0.2.2", - "inherits": "^2.0.3", - "readable-stream": "^2.1.5" - } - }, - "parse-asn1": { - "version": "5.1.1", - "resolved": "http://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", - "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==", - "dev": true, - "requires": { - "asn1.js": "^4.0.0", - "browserify-aes": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3" - } - }, - "parse-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", - "dev": true, - "optional": true, - "requires": { - "glob-base": "^0.3.0", - "is-dotfile": "^1.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.0" - } - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true - }, - "path-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", - "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", - "dev": true - }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true - }, - "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 - }, - "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-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", - "dev": true - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "pbkdf2": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", - "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", - "dev": true, - "requires": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "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" - } - }, - "pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", - "dev": true, - "requires": { - "find-up": "^2.1.0" - } - }, - "pluralize": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", - "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", - "dev": true - }, - "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 - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true - }, - "preserve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", - "dev": true, - "optional": 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": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "dev": true - }, - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", - "dev": true - }, - "progress": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.1.tgz", - "integrity": "sha512-OE+a6vzqazc+K6LxJrX5UPyKFvGnL5CYmq2jFGNIBWHpc4QyE49/YOumcrpQFJpfejmvRtbJzgO1zPmMCqlbBg==", - "dev": true - }, - "promise": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", - "dev": true, - "requires": { - "asap": "~2.0.3" - } - }, - "promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", - "dev": true - }, - "prop-types": { - "version": "15.6.2", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.2.tgz", - "integrity": "sha512-3pboPvLiWD7dkI3qf3KbUe6hKFKa52w+AE0VCqECtf+QHAKgOL37tTaNCnuX1nAAQ4ZhyP+kYVKf8rLmJ/feDQ==", - "requires": { - "loose-envify": "^1.3.1", - "object-assign": "^4.1.1" - } - }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", - "dev": true - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, - "public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } - } - }, - "pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "dev": true, - "requires": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "dev": true - }, - "querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", - "dev": true - }, - "randombytes": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", - "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } - } - }, - "randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dev": true, - "requires": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } - } - }, - "react": { - "version": "16.6.3", - "resolved": "https://registry.npmjs.org/react/-/react-16.6.3.tgz", - "integrity": "sha512-zCvmH2vbEolgKxtqXL2wmGCUxUyNheYn/C+PD1YAjfxHC54+MhdruyhO7QieQrYsYeTxrn93PM2y0jRH1zEExw==", - "dev": true, - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2", - "scheduler": "^0.11.2" - } - }, - "react-addons-create-fragment": { - "version": "15.6.2", - "resolved": "https://registry.npmjs.org/react-addons-create-fragment/-/react-addons-create-fragment-15.6.2.tgz", - "integrity": "sha1-o5TefCx77Na1R1uhuXrEcs58dPg=", - "dev": true, - "requires": { - "fbjs": "^0.8.4", - "loose-envify": "^1.3.1", - "object-assign": "^4.1.0" - } - }, - "readable-stream": { - "version": "2.2.11", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.11.tgz", - "integrity": "sha512-h+8+r3MKEhkiVrwdKL8aWs1oc1VvBu33ueshOvS26RsZQ3Amhx/oO3TKe4lApSV9ueY6as8EAh7mtuFjdlhg9Q==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "safe-buffer": "~5.0.1", - "string_decoder": "~1.0.0", - "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" - } - }, - "regenerate": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", - "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", - "dev": true - }, - "regenerator-runtime": { - "version": "0.10.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", - "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=" - }, - "regenerator-transform": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", - "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", - "dev": true, - "requires": { - "babel-runtime": "^6.18.0", - "babel-types": "^6.19.0", - "private": "^0.1.6" - } - }, - "regex-cache": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.3.tgz", - "integrity": "sha1-mxpsNdTQ3871cRrmUejp09cRQUU=", - "dev": true, - "optional": true, - "requires": { - "is-equal-shallow": "^0.1.3", - "is-primitive": "^2.0.0" - } - }, - "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" - } - }, - "regexp.prototype.flags": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.2.0.tgz", - "integrity": "sha512-ztaw4M1VqgMwl9HlPpOuiYgItcHlunW0He2fE6eNfT6E/CF2FtYi9ofOYe4mKntstYk0Fyh/rDRBdS3AnxjlrA==", - "dev": true, - "requires": { - "define-properties": "^1.1.2" - } - }, - "regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", - "dev": true - }, - "regexpu-core": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", - "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", - "dev": true, - "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=", - "dev": true - }, - "regjsparser": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", - "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", - "dev": true, - "requires": { - "jsesc": "~0.5.0" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true - } - } - }, - "remove-trailing-separator": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.0.2.tgz", - "integrity": "sha1-abBi2XhyetFNxrVrpKt3L9jXBRE=", - "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=", - "dev": true - }, - "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" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - }, - "require-uncached": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", - "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", - "dev": true, - "requires": { - "caller-path": "^0.1.0", - "resolve-from": "^1.0.0" - } - }, - "resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", - "dev": true, - "requires": { - "resolve-from": "^3.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true - } - } - }, - "resolve-from": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", - "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", - "dev": true - }, - "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 - }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "dev": true, - "requires": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - } - }, - "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 - }, - "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", - "dev": true, - "requires": { - "glob": "^7.0.5" - } - }, - "ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "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" - } - }, - "run-queue": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", - "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", - "dev": true, - "requires": { - "aproba": "^1.1.1" - } - }, - "rxjs": { - "version": "5.5.12", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz", - "integrity": "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==", - "dev": true, - "requires": { - "symbol-observable": "1.0.1" - } - }, - "safe-buffer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.0.1.tgz", - "integrity": "sha1-0mPKVGls2KMGtcplUekt5XkY++c=", - "dev": true - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "http://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==", - "dev": true - }, - "scheduler": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.11.2.tgz", - "integrity": "sha512-+WCP3s3wOaW4S7C1tl3TEXp4l9lJn0ZK8G3W3WKRWmw77Z2cIFUW2MiNTMHn5sCjxN+t7N43HAOOgMjyAg5hlg==", - "dev": true, - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, - "schema-utils": { - "version": "0.4.7", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", - "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-keywords": "^3.1.0" - } - }, - "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", - "dev": true - }, - "serialize-javascript": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.5.0.tgz", - "integrity": "sha512-Ga8c8NjAAp46Br4+0oZ2WxJCwIzwP60Gq1YPgU+39PiTVxyed/iKE/zyZI6+UlVYH5Q4PaQdHhcegIFPZTUfoQ==", - "dev": true - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "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" - } - } - } - }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", - "dev": true - }, - "sha.js": { - "version": "2.4.11", - "resolved": "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "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=", - "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 - }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" - }, - "slice-ansi": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", - "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0" - } - }, - "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" - } - }, - "source-list-map": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", - "dev": true - }, - "source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=" - }, - "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" - } - }, - "source-map-support": { - "version": "0.4.15", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.15.tgz", - "integrity": "sha1-AyAt9lwG0r2MfsI2KhkwVv7407E=", - "requires": { - "source-map": "^0.5.6" - } - }, - "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 - }, - "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.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "ssri": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-5.3.0.tgz", - "integrity": "sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } - } - }, - "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" - } - } - } - }, - "stream-browserify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", - "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", - "dev": true, - "requires": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" - } - }, - "stream-each": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", - "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "stream-shift": "^1.0.0" - } - }, - "stream-http": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", - "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", - "dev": true, - "requires": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.3.6", - "to-arraybuffer": "^1.0.0", - "xtend": "^4.0.0" - }, - "dependencies": { - "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "dev": true - }, - "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==", - "dev": 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" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "stream-shift": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", - "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "string.prototype.matchall": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-2.0.0.tgz", - "integrity": "sha512-WoZ+B2ypng1dp4iFLF2kmZlwwlE19gmjgKuhL1FJfDgCREWb3ye3SDVHSzLH6bxfnvYmkCxbzkmWcQZHA4P//Q==", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.10.0", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "regexp.prototype.flags": "^1.2.0" - } - }, - "string_decoder": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.2.tgz", - "integrity": "sha1-sp4fThEl+pehA4K4pTNze3SR4Xk=", - "dev": true, - "requires": { - "safe-buffer": "~5.0.1" - } - }, - "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-eof": { - "version": "1.0.0", - "resolved": "http://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - }, - "sweetalert2": { - "version": "7.29.2", - "resolved": "https://registry.npmjs.org/sweetalert2/-/sweetalert2-7.29.2.tgz", - "integrity": "sha512-p+Zp2ly8vf9jGlzlUOmpVDZZoRHHatTHa3H3OnXVInQKJ5HHQr5Vg8XnledhS4Iih6TdSadbdGZ8Y4gE+OUgOQ==" - }, - "symbol-observable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", - "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=", - "dev": true - }, - "table": { - "version": "4.0.3", - "resolved": "http://registry.npmjs.org/table/-/table-4.0.3.tgz", - "integrity": "sha512-S7rnFITmBH1EnyKcvxBh1LjYeQMmnZtCXSEbHcH6S0NoKit24ZuFO/T1vDcLdYsLQkM188PVVhQmzKIuThNkKg==", - "dev": true, - "requires": { - "ajv": "^6.0.1", - "ajv-keywords": "^3.0.0", - "chalk": "^2.1.0", - "lodash": "^4.17.4", - "slice-ansi": "1.0.0", - "string-width": "^2.1.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" - } - }, - "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" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "tapable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.0.tgz", - "integrity": "sha512-IlqtmLVaZA2qab8epUXbVWRn3aB1imbDMJtjB3nu4X0NqPkcY/JH9ZtCBWKHWPxs8Svi9tyo8w2dBoi07qZbBA==", - "dev": true - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - }, - "dependencies": { - "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "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" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "timers-browserify": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz", - "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==", - "dev": true, - "requires": { - "setimmediate": "^1.0.4" - } - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.2" - } - }, - "to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", - "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" - } - } - } - }, - "trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=" - }, - "tslib": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", - "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", - "dev": true - }, - "tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", - "dev": true - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2" - } - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, - "ua-parser-js": { - "version": "0.7.19", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.19.tgz", - "integrity": "sha512-T3PVJ6uz8i0HzPxOF9SWzWAlfN/DavlpQqepn22xgve/5QecC+XMCAtmUNnY7C9StehaV6exjUCI801lOI7QlQ==", - "dev": true - }, - "uglify-es": { - "version": "3.3.9", - "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz", - "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==", - "dev": true, - "requires": { - "commander": "~2.13.0", - "source-map": "~0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "uglifyjs-webpack-plugin": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.3.0.tgz", - "integrity": "sha512-ovHIch0AMlxjD/97j9AYovZxG5wnHOPkL7T1GKochBADp/Zwc44pEWNqpKl1Loupp1WhFg7SlYmHZRUfdAacgw==", - "dev": true, - "requires": { - "cacache": "^10.0.4", - "find-cache-dir": "^1.0.0", - "schema-utils": "^0.4.5", - "serialize-javascript": "^1.4.0", - "source-map": "^0.6.1", - "uglify-es": "^3.3.4", - "webpack-sources": "^1.1.0", - "worker-farm": "^1.5.2" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "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-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "dev": true, - "requires": { - "unique-slug": "^2.0.0" - } - }, - "unique-slug": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.1.tgz", - "integrity": "sha512-n9cU6+gITaVu7VGj1Z8feKMmfAjEAQGhwD9fE3zvpRRa0wEIx8ODYkVGfSc94M2OX00tUFV8wH3zYbm1I8mxFg==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4" - } - }, - "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 - } - } - }, - "upath": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz", - "integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==", - "dev": true - }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true - }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "dev": true, - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "dev": true - } - } - }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true - }, - "user-home": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", - "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=", - "dev": true - }, - "util": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", - "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", - "dev": true, - "requires": { - "inherits": "2.0.3" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "v8-compile-cache": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.2.tgz", - "integrity": "sha512-1wFuMUIM16MDJRCrpbpuEPTUGmM5QMUg0cr3KFwra2XgOgFcPGDQHDh3CszSCD2Zewc/dh/pamNEW8CbfDebUw==", - "dev": true - }, - "v8flags": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz", - "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=", - "dev": true, - "requires": { - "user-home": "^1.1.1" - } - }, - "vm-browserify": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", - "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", - "dev": true, - "requires": { - "indexof": "0.0.1" - } - }, - "watchpack": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", - "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", - "dev": true, - "requires": { - "chokidar": "^2.0.2", - "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0" - }, - "dependencies": { - "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" - } - }, - "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 - }, - "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 - }, - "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" - } - } - } - }, - "chokidar": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz", - "integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==", - "dev": true, - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.0", - "braces": "^2.3.0", - "fsevents": "^1.2.2", - "glob-parent": "^3.1.0", - "inherits": "^2.0.1", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "lodash.debounce": "^4.0.8", - "normalize-path": "^2.1.1", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.0.0", - "upath": "^1.0.5" - } - }, - "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" - } - } - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.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-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-glob": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", - "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "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" - } - } - } - }, - "webpack": { - "version": "4.16.5", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.16.5.tgz", - "integrity": "sha512-i5cHYHonzSc1zBuwB5MSzW4v9cScZFbprkHK8ZgzPDCRkQXGGpYzPmJhbus5bOrZ0tXTcQp+xyImRSvKb0b+Kw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.5.13", - "@webassemblyjs/helper-module-context": "1.5.13", - "@webassemblyjs/wasm-edit": "1.5.13", - "@webassemblyjs/wasm-opt": "1.5.13", - "@webassemblyjs/wasm-parser": "1.5.13", - "acorn": "^5.6.2", - "acorn-dynamic-import": "^3.0.0", - "ajv": "^6.1.0", - "ajv-keywords": "^3.1.0", - "chrome-trace-event": "^1.0.0", - "enhanced-resolve": "^4.1.0", - "eslint-scope": "^4.0.0", - "json-parse-better-errors": "^1.0.2", - "loader-runner": "^2.3.0", - "loader-utils": "^1.1.0", - "memory-fs": "~0.4.1", - "micromatch": "^3.1.8", - "mkdirp": "~0.5.0", - "neo-async": "^2.5.0", - "node-libs-browser": "^2.0.0", - "schema-utils": "^0.4.4", - "tapable": "^1.0.0", - "uglifyjs-webpack-plugin": "^1.2.4", - "watchpack": "^1.5.0", - "webpack-sources": "^1.0.1" - }, - "dependencies": { - "acorn": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", - "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", - "dev": true - }, - "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 - }, - "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 - }, - "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" - } - } - } - }, - "eslint-scope": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.0.tgz", - "integrity": "sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA==", - "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "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" - } - } - } - }, - "webpack-cli": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.1.0.tgz", - "integrity": "sha512-p5NeKDtYwjZozUWq6kGNs9w+Gtw/CPvyuXjXn2HMdz8Tie+krjEg8oAtonvIyITZdvpF7XG9xDHwscLr2c+ugQ==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "cross-spawn": "^6.0.5", - "enhanced-resolve": "^4.0.0", - "global-modules-path": "^2.1.0", - "import-local": "^1.0.0", - "inquirer": "^6.0.0", - "interpret": "^1.1.0", - "loader-utils": "^1.1.0", - "supports-color": "^5.4.0", - "v8-compile-cache": "^2.0.0", - "yargs": "^12.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "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" - } - }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "external-editor": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.0.3.tgz", - "integrity": "sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA==", - "dev": true, - "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - } - }, - "inquirer": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.2.0.tgz", - "integrity": "sha512-QIEQG4YyQ2UYZGDC4srMZ7BjHOmNk1lR2JQj5UknBapklm6WHA+VVH7N+sUdX3A7NeCfGF8o4X1S3Ao7nAcIeg==", - "dev": true, - "requires": { - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.0", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.0", - "figures": "^2.0.0", - "lodash": "^4.17.10", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rxjs": "^6.1.0", - "string-width": "^2.1.0", - "strip-ansi": "^4.0.0", - "through": "^2.3.6" - } - }, - "rxjs": { - "version": "6.3.3", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz", - "integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "webpack-sources": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.3.0.tgz", - "integrity": "sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==", - "dev": true, - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "whatwg-fetch": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz", - "integrity": "sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q==", - "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" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true - }, - "worker-farm": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.6.0.tgz", - "integrity": "sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ==", - "dev": true, - "requires": { - "errno": "~0.1.7" - } - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "write": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", - "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", - "dev": true, - "requires": { - "mkdirp": "^0.5.1" - } - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", - "dev": true - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - }, - "yargs": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", - "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", - "dev": true, - "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.2.0", - "find-up": "^3.0.0", - "get-caller-file": "^1.0.1", - "os-locale": "^3.0.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1 || ^4.0.0", - "yargs-parser": "^11.1.1" - }, - "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz", - "integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", - "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", - "dev": true - } - } - }, - "yargs-parser": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", - "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } -} From 8f1b59db45fc1c2069cb3400c5e1468c0e88fdf9 Mon Sep 17 00:00:00 2001 From: Loris Admin Date: Fri, 19 Oct 2018 13:41:24 -0400 Subject: [PATCH 08/95] Hack to allow data provisioner filtering --- src/Data/ProvisionerInstance.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/Data/ProvisionerInstance.php b/src/Data/ProvisionerInstance.php index 2002c12890f..5e00776614a 100644 --- a/src/Data/ProvisionerInstance.php +++ b/src/Data/ProvisionerInstance.php @@ -125,7 +125,12 @@ public function execute(\User $user) : \Traversable }; if ($rows instanceof \Iterator) { - $rows = new \CallbackFilterIterator($rows, $callback); + //$rows = new \CallbackFilterIterator($rows, $callback); + foreach ($rows as $instance) { + if ($this->modifier->filter($user, $instance) === false) { + $rows->offsetUnset($rows->key()); + } + } } else { // Convert non-iterator traversables to iterators. $rows = new \CallbackFilterIterator( From 0d0b2773610562449097132e808c59e134053be8 Mon Sep 17 00:00:00 2001 From: Loris Admin Date: Fri, 19 Oct 2018 17:25:07 -0400 Subject: [PATCH 09/95] made slight change to user class --- php/libraries/User.class.inc | 2 +- src/Data/ProvisionerInstance.php | 7 +------ 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/php/libraries/User.class.inc b/php/libraries/User.class.inc index 25ee4597236..8f3b6ee6d0f 100644 --- a/php/libraries/User.class.inc +++ b/php/libraries/User.class.inc @@ -608,7 +608,7 @@ class User extends UserPermissions return in_array( $center_id, $this->getCenterIDs(), - true + false ); } diff --git a/src/Data/ProvisionerInstance.php b/src/Data/ProvisionerInstance.php index 5e00776614a..2002c12890f 100644 --- a/src/Data/ProvisionerInstance.php +++ b/src/Data/ProvisionerInstance.php @@ -125,12 +125,7 @@ public function execute(\User $user) : \Traversable }; if ($rows instanceof \Iterator) { - //$rows = new \CallbackFilterIterator($rows, $callback); - foreach ($rows as $instance) { - if ($this->modifier->filter($user, $instance) === false) { - $rows->offsetUnset($rows->key()); - } - } + $rows = new \CallbackFilterIterator($rows, $callback); } else { // Convert non-iterator traversables to iterators. $rows = new \CallbackFilterIterator( From e179bf53f1f26ba6d67b8df8d5e5bca584405d9b Mon Sep 17 00:00:00 2001 From: Loris Admin Date: Mon, 29 Oct 2018 14:00:14 -0400 Subject: [PATCH 10/95] Added New Exceptions --- php/exceptions/Forbidden.class.inc | 27 +++++++++++++++++++++++++++ php/exceptions/Invalid.class.inc | 27 +++++++++++++++++++++++++++ 2 files changed, 54 insertions(+) create mode 100644 php/exceptions/Forbidden.class.inc create mode 100644 php/exceptions/Invalid.class.inc diff --git a/php/exceptions/Forbidden.class.inc b/php/exceptions/Forbidden.class.inc new file mode 100644 index 00000000000..2e200843c1a --- /dev/null +++ b/php/exceptions/Forbidden.class.inc @@ -0,0 +1,27 @@ + + * @license http://www.gnu.org/licenses/gpl-3.0.txt GPLv3 + * @link https://github.com/aces/Loris + */ + +/** + * The ForbiddenException class. + * + * @category Errors + * @package Loris + * @author Henri Rabalais + * @license http://www.gnu.org/licenses/gpl-3.0.txt GPLv3 + * @link https://github.com/aces/Loris + */ + +class ForbiddenException extends LorisException +{ +} +?> diff --git a/php/exceptions/Invalid.class.inc b/php/exceptions/Invalid.class.inc new file mode 100644 index 00000000000..688830bb07e --- /dev/null +++ b/php/exceptions/Invalid.class.inc @@ -0,0 +1,27 @@ + + * @license http://www.gnu.org/licenses/gpl-3.0.txt GPLv3 + * @link https://github.com/aces/Loris + */ + +/** + * The Invalid class. + * + * @category Errors + * @package Loris + * @author Henri Rabalais + * @license http://www.gnu.org/licenses/gpl-3.0.txt GPLv3 + * @link https://github.com/aces/Loris + */ + +class Invalid extends \LorisException +{ +} +?> From 28e939eddf52deb55e8de6a98c0f6fd16595ee60 Mon Sep 17 00:00:00 2001 From: Loris Admin Date: Wed, 30 Jan 2019 15:38:34 -0500 Subject: [PATCH 11/95] rebased to major --- composer.lock | 3527 ----------------- jsx/FilterForm.js | 14 +- jsx/Form.js | 22 +- jsx/Panel.js | 12 +- jsx/StaticDataTable.js | 66 +- package-lock.json | 8386 ++++++++++++++++++++++++++++++++++++++++ 6 files changed, 8450 insertions(+), 3577 deletions(-) delete mode 100644 composer.lock create mode 100644 package-lock.json diff --git a/composer.lock b/composer.lock deleted file mode 100644 index 4fa599dbd63..00000000000 --- a/composer.lock +++ /dev/null @@ -1,3527 +0,0 @@ -{ - "_readme": [ - "This file locks the dependencies of your project to a known state", - "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", - "This file is @generated automatically" - ], - "content-hash": "a1658794e8d9acf2fe54f99100b55929", - "packages": [ - { - "name": "firebase/php-jwt", - "version": "v3.0.0", - "source": { - "type": "git", - "url": "https://github.com/firebase/php-jwt.git", - "reference": "fa8a06e96526eb7c0eeaa47e4f39be59d21f16e1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/firebase/php-jwt/zipball/fa8a06e96526eb7c0eeaa47e4f39be59d21f16e1", - "reference": "fa8a06e96526eb7c0eeaa47e4f39be59d21f16e1", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Firebase\\JWT\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Neuman Vong", - "email": "neuman+pear@twilio.com", - "role": "Developer" - }, - { - "name": "Anant Narayanan", - "email": "anant@php.net", - "role": "Developer" - } - ], - "description": "A simple library to encode and decode JSON Web Tokens (JWT) in PHP. Should conform to the current spec.", - "homepage": "https://github.com/firebase/php-jwt", - "time": "2015-07-22T18:31:08+00:00" - }, - { - "name": "google/recaptcha", - "version": "1.2.1", - "source": { - "type": "git", - "url": "https://github.com/google/recaptcha.git", - "reference": "e7add3be59211482ecdb942288f52da64a35f61a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/google/recaptcha/zipball/e7add3be59211482ecdb942288f52da64a35f61a", - "reference": "e7add3be59211482ecdb942288f52da64a35f61a", - "shasum": "" - }, - "require": { - "php": ">=5.5" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "^2.2.20|^2.12", - "php-coveralls/php-coveralls": "^2.1", - "phpunit/phpunit": "^4.8.36|^5.7.27|^6.59|^7" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.2.x-dev" - } - }, - "autoload": { - "psr-4": { - "ReCaptcha\\": "src/ReCaptcha" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "description": "Client library for reCAPTCHA, a free service that protects websites from spam and abuse.", - "homepage": "https://www.google.com/recaptcha/", - "keywords": [ - "Abuse", - "captcha", - "recaptcha", - "spam" - ], - "time": "2018-08-05T09:31:53+00:00" - }, - { - "name": "guzzlehttp/guzzle", - "version": "6.3.3", - "source": { - "type": "git", - "url": "https://github.com/guzzle/guzzle.git", - "reference": "407b0cb880ace85c9b63c5f9551db498cb2d50ba" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/407b0cb880ace85c9b63c5f9551db498cb2d50ba", - "reference": "407b0cb880ace85c9b63c5f9551db498cb2d50ba", - "shasum": "" - }, - "require": { - "guzzlehttp/promises": "^1.0", - "guzzlehttp/psr7": "^1.4", - "php": ">=5.5" - }, - "require-dev": { - "ext-curl": "*", - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0", - "psr/log": "^1.0" - }, - "suggest": { - "psr/log": "Required for using the Log middleware" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "6.3-dev" - } - }, - "autoload": { - "files": [ - "src/functions_include.php" - ], - "psr-4": { - "GuzzleHttp\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - } - ], - "description": "Guzzle is a PHP HTTP client library", - "homepage": "http://guzzlephp.org/", - "keywords": [ - "client", - "curl", - "framework", - "http", - "http client", - "rest", - "web service" - ], - "time": "2018-04-22T15:46:56+00:00" - }, - { - "name": "guzzlehttp/promises", - "version": "v1.3.1", - "source": { - "type": "git", - "url": "https://github.com/guzzle/promises.git", - "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/a59da6cf61d80060647ff4d3eb2c03a2bc694646", - "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646", - "shasum": "" - }, - "require": { - "php": ">=5.5.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.4-dev" - } - }, - "autoload": { - "psr-4": { - "GuzzleHttp\\Promise\\": "src/" - }, - "files": [ - "src/functions_include.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - } - ], - "description": "Guzzle promises library", - "keywords": [ - "promise" - ], - "time": "2016-12-20T10:07:11+00:00" - }, - { - "name": "guzzlehttp/psr7", - "version": "1.5.2", - "source": { - "type": "git", - "url": "https://github.com/guzzle/psr7.git", - "reference": "9f83dded91781a01c63574e387eaa769be769115" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/9f83dded91781a01c63574e387eaa769be769115", - "reference": "9f83dded91781a01c63574e387eaa769be769115", - "shasum": "" - }, - "require": { - "php": ">=5.4.0", - "psr/http-message": "~1.0", - "ralouphie/getallheaders": "^2.0.5" - }, - "provide": { - "psr/http-message-implementation": "1.0" - }, - "require-dev": { - "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.8" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.5-dev" - } - }, - "autoload": { - "psr-4": { - "GuzzleHttp\\Psr7\\": "src/" - }, - "files": [ - "src/functions_include.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - }, - { - "name": "Tobias Schultze", - "homepage": "https://github.com/Tobion" - } - ], - "description": "PSR-7 message implementation that also provides common utility methods", - "keywords": [ - "http", - "message", - "psr-7", - "request", - "response", - "stream", - "uri", - "url" - ], - "time": "2018-12-04T20:46:45+00:00" - }, - { - "name": "php-http/guzzle6-adapter", - "version": "v2.0.1", - "source": { - "type": "git", - "url": "https://github.com/php-http/guzzle6-adapter.git", - "reference": "6074a4b1f4d5c21061b70bab3b8ad484282fe31f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-http/guzzle6-adapter/zipball/6074a4b1f4d5c21061b70bab3b8ad484282fe31f", - "reference": "6074a4b1f4d5c21061b70bab3b8ad484282fe31f", - "shasum": "" - }, - "require": { - "guzzlehttp/guzzle": "^6.0", - "php": "^7.1", - "php-http/httplug": "^2.0", - "psr/http-client": "^1.0" - }, - "provide": { - "php-http/async-client-implementation": "1.0", - "php-http/client-implementation": "1.0", - "psr/http-client-implementation": "1.0" - }, - "require-dev": { - "ext-curl": "*", - "php-http/client-integration-tests": "^2.0", - "phpunit/phpunit": "^7.4" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.x-dev" - } - }, - "autoload": { - "psr-4": { - "Http\\Adapter\\Guzzle6\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com" - }, - { - "name": "David de Boer", - "email": "david@ddeboer.nl" - } - ], - "description": "Guzzle 6 HTTP Adapter", - "homepage": "http://httplug.io", - "keywords": [ - "Guzzle", - "http" - ], - "time": "2018-12-16T14:44:03+00:00" - }, - { - "name": "php-http/httplug", - "version": "v2.0.0", - "source": { - "type": "git", - "url": "https://github.com/php-http/httplug.git", - "reference": "b3842537338c949f2469557ef4ad4bdc47b58603" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-http/httplug/zipball/b3842537338c949f2469557ef4ad4bdc47b58603", - "reference": "b3842537338c949f2469557ef4ad4bdc47b58603", - "shasum": "" - }, - "require": { - "php": "^7.0", - "php-http/promise": "^1.0", - "psr/http-client": "^1.0", - "psr/http-message": "^1.0" - }, - "require-dev": { - "henrikbjorn/phpspec-code-coverage": "^1.0", - "phpspec/phpspec": "^2.4" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Http\\Client\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Eric GELOEN", - "email": "geloen.eric@gmail.com" - }, - { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com" - } - ], - "description": "HTTPlug, the HTTP client abstraction for PHP", - "homepage": "http://httplug.io", - "keywords": [ - "client", - "http" - ], - "time": "2018-10-31T09:14:44+00:00" - }, - { - "name": "php-http/promise", - "version": "v1.0.0", - "source": { - "type": "git", - "url": "https://github.com/php-http/promise.git", - "reference": "dc494cdc9d7160b9a09bd5573272195242ce7980" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-http/promise/zipball/dc494cdc9d7160b9a09bd5573272195242ce7980", - "reference": "dc494cdc9d7160b9a09bd5573272195242ce7980", - "shasum": "" - }, - "require-dev": { - "henrikbjorn/phpspec-code-coverage": "^1.0", - "phpspec/phpspec": "^2.4" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1-dev" - } - }, - "autoload": { - "psr-4": { - "Http\\Promise\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com" - }, - { - "name": "Joel Wurtz", - "email": "joel.wurtz@gmail.com" - } - ], - "description": "Promise used for asynchronous HTTP requests", - "homepage": "http://httplug.io", - "keywords": [ - "promise" - ], - "time": "2016-01-26T13:27:02+00:00" - }, - { - "name": "psr/http-client", - "version": "1.0.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-client.git", - "reference": "496a823ef742b632934724bf769560c2a5c7c44e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-client/zipball/496a823ef742b632934724bf769560c2a5c7c44e", - "reference": "496a823ef742b632934724bf769560c2a5c7c44e", - "shasum": "" - }, - "require": { - "php": "^7.0", - "psr/http-message": "^1.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Http\\Client\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interface for HTTP clients", - "homepage": "https://github.com/php-fig/http-client", - "keywords": [ - "http", - "http-client", - "psr", - "psr-18" - ], - "time": "2018-10-30T23:29:13+00:00" - }, - { - "name": "psr/http-message", - "version": "1.0.1", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-message.git", - "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", - "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Http\\Message\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interface for HTTP messages", - "homepage": "https://github.com/php-fig/http-message", - "keywords": [ - "http", - "http-message", - "psr", - "psr-7", - "request", - "response" - ], - "time": "2016-08-06T14:39:51+00:00" - }, - { - "name": "psr/http-server-handler", - "version": "1.0.1", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-server-handler.git", - "reference": "aff2f80e33b7f026ec96bb42f63242dc50ffcae7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-server-handler/zipball/aff2f80e33b7f026ec96bb42f63242dc50ffcae7", - "reference": "aff2f80e33b7f026ec96bb42f63242dc50ffcae7", - "shasum": "" - }, - "require": { - "php": ">=7.0", - "psr/http-message": "^1.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Http\\Server\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interface for HTTP server-side request handler", - "keywords": [ - "handler", - "http", - "http-interop", - "psr", - "psr-15", - "psr-7", - "request", - "response", - "server" - ], - "time": "2018-10-30T16:46:14+00:00" - }, - { - "name": "psr/http-server-middleware", - "version": "1.0.1", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-server-middleware.git", - "reference": "2296f45510945530b9dceb8bcedb5cb84d40c5f5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-server-middleware/zipball/2296f45510945530b9dceb8bcedb5cb84d40c5f5", - "reference": "2296f45510945530b9dceb8bcedb5cb84d40c5f5", - "shasum": "" - }, - "require": { - "php": ">=7.0", - "psr/http-message": "^1.0", - "psr/http-server-handler": "^1.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Http\\Server\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interface for HTTP server-side middleware", - "keywords": [ - "http", - "http-interop", - "middleware", - "psr", - "psr-15", - "psr-7", - "request", - "response" - ], - "time": "2018-10-30T17:12:04+00:00" - }, - { - "name": "ralouphie/getallheaders", - "version": "2.0.5", - "source": { - "type": "git", - "url": "https://github.com/ralouphie/getallheaders.git", - "reference": "5601c8a83fbba7ef674a7369456d12f1e0d0eafa" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/5601c8a83fbba7ef674a7369456d12f1e0d0eafa", - "reference": "5601c8a83fbba7ef674a7369456d12f1e0d0eafa", - "shasum": "" - }, - "require": { - "php": ">=5.3" - }, - "require-dev": { - "phpunit/phpunit": "~3.7.0", - "satooshi/php-coveralls": ">=1.0" - }, - "type": "library", - "autoload": { - "files": [ - "src/getallheaders.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Ralph Khattar", - "email": "ralph.khattar@gmail.com" - } - ], - "description": "A polyfill for getallheaders.", - "time": "2016-02-11T07:05:27+00:00" - }, - { - "name": "smarty/smarty", - "version": "v3.1.33", - "source": { - "type": "git", - "url": "https://github.com/smarty-php/smarty.git", - "reference": "dd55b23121e55a3b4f1af90a707a6c4e5969530f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/smarty-php/smarty/zipball/dd55b23121e55a3b4f1af90a707a6c4e5969530f", - "reference": "dd55b23121e55a3b4f1af90a707a6c4e5969530f", - "shasum": "" - }, - "require": { - "php": ">=5.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.1.x-dev" - } - }, - "autoload": { - "files": [ - "libs/bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "LGPL-3.0" - ], - "authors": [ - { - "name": "Monte Ohrt", - "email": "monte@ohrt.com" - }, - { - "name": "Uwe Tews", - "email": "uwe.tews@googlemail.com" - }, - { - "name": "Rodney Rehm", - "email": "rodney.rehm@medialize.de" - } - ], - "description": "Smarty - the compiling PHP template engine", - "homepage": "http://www.smarty.net", - "keywords": [ - "templating" - ], - "time": "2018-09-12T20:54:16+00:00" - }, - { - "name": "zendframework/zend-diactoros", - "version": "1.8.6", - "source": { - "type": "git", - "url": "https://github.com/zendframework/zend-diactoros.git", - "reference": "20da13beba0dde8fb648be3cc19765732790f46e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/zendframework/zend-diactoros/zipball/20da13beba0dde8fb648be3cc19765732790f46e", - "reference": "20da13beba0dde8fb648be3cc19765732790f46e", - "shasum": "" - }, - "require": { - "php": "^5.6 || ^7.0", - "psr/http-message": "^1.0" - }, - "provide": { - "psr/http-message-implementation": "1.0" - }, - "require-dev": { - "ext-dom": "*", - "ext-libxml": "*", - "php-http/psr7-integration-tests": "dev-master", - "phpunit/phpunit": "^5.7.16 || ^6.0.8 || ^7.2.7", - "zendframework/zend-coding-standard": "~1.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.8.x-dev", - "dev-develop": "1.9.x-dev", - "dev-release-2.0": "2.0.x-dev" - } - }, - "autoload": { - "files": [ - "src/functions/create_uploaded_file.php", - "src/functions/marshal_headers_from_sapi.php", - "src/functions/marshal_method_from_sapi.php", - "src/functions/marshal_protocol_version_from_sapi.php", - "src/functions/marshal_uri_from_sapi.php", - "src/functions/normalize_server.php", - "src/functions/normalize_uploaded_files.php", - "src/functions/parse_cookie_header.php" - ], - "psr-4": { - "Zend\\Diactoros\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-2-Clause" - ], - "description": "PSR HTTP Message implementations", - "homepage": "https://github.com/zendframework/zend-diactoros", - "keywords": [ - "http", - "psr", - "psr-7" - ], - "time": "2018-09-05T19:29:37+00:00" - } - ], - "packages-dev": [ - { - "name": "composer/semver", - "version": "1.5.0", - "source": { - "type": "git", - "url": "https://github.com/composer/semver.git", - "reference": "46d9139568ccb8d9e7cdd4539cab7347568a5e2e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/semver/zipball/46d9139568ccb8d9e7cdd4539cab7347568a5e2e", - "reference": "46d9139568ccb8d9e7cdd4539cab7347568a5e2e", - "shasum": "" - }, - "require": { - "php": "^5.3.2 || ^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.5 || ^5.0.5", - "phpunit/phpunit-mock-objects": "2.3.0 || ^3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Composer\\Semver\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nils Adermann", - "email": "naderman@naderman.de", - "homepage": "http://www.naderman.de" - }, - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - }, - { - "name": "Rob Bast", - "email": "rob.bast@gmail.com", - "homepage": "http://robbast.nl" - } - ], - "description": "Semver library that offers utilities, version constraint parsing and validation.", - "keywords": [ - "semantic", - "semver", - "validation", - "versioning" - ], - "time": "2019-03-19T17:25:45+00:00" - }, - { - "name": "composer/xdebug-handler", - "version": "1.3.2", - "source": { - "type": "git", - "url": "https://github.com/composer/xdebug-handler.git", - "reference": "d17708133b6c276d6e42ef887a877866b909d892" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/d17708133b6c276d6e42ef887a877866b909d892", - "reference": "d17708133b6c276d6e42ef887a877866b909d892", - "shasum": "" - }, - "require": { - "php": "^5.3.2 || ^7.0", - "psr/log": "^1.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5" - }, - "type": "library", - "autoload": { - "psr-4": { - "Composer\\XdebugHandler\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "John Stevenson", - "email": "john-stevenson@blueyonder.co.uk" - } - ], - "description": "Restarts a process without xdebug.", - "keywords": [ - "Xdebug", - "performance" - ], - "time": "2019-01-28T20:25:53+00:00" - }, - { - "name": "doctrine/instantiator", - "version": "1.2.0", - "source": { - "type": "git", - "url": "https://github.com/doctrine/instantiator.git", - "reference": "a2c590166b2133a4633738648b6b064edae0814a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/a2c590166b2133a4633738648b6b064edae0814a", - "reference": "a2c590166b2133a4633738648b6b064edae0814a", - "shasum": "" - }, - "require": { - "php": "^7.1" - }, - "require-dev": { - "doctrine/coding-standard": "^6.0", - "ext-pdo": "*", - "ext-phar": "*", - "phpbench/phpbench": "^0.13", - "phpstan/phpstan-phpunit": "^0.11", - "phpstan/phpstan-shim": "^0.11", - "phpunit/phpunit": "^7.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.2.x-dev" - } - }, - "autoload": { - "psr-4": { - "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com", - "homepage": "http://ocramius.github.com/" - } - ], - "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", - "homepage": "https://www.doctrine-project.org/projects/instantiator.html", - "keywords": [ - "constructor", - "instantiate" - ], - "time": "2019-03-17T17:37:11+00:00" - }, - { - "name": "facebook/webdriver", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/facebook/php-webdriver.git", - "reference": "575600dfcfebad49fd0fc59d781b0696462a1f4e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/facebook/php-webdriver/zipball/575600dfcfebad49fd0fc59d781b0696462a1f4e", - "reference": "575600dfcfebad49fd0fc59d781b0696462a1f4e", - "shasum": "" - }, - "require": { - "php": ">=5.3.19" - }, - "require-dev": { - "phpdocumentor/phpdocumentor": "2.*", - "phpunit/phpunit": "3.7.*" - }, - "type": "library", - "autoload": { - "classmap": [ - "lib/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "description": "A php client for WebDriver", - "homepage": "https://github.com/facebook/php-webdriver", - "keywords": [ - "facebook", - "php", - "selenium", - "webdriver" - ], - "time": "2015-06-09T17:09:16+00:00" - }, - { - "name": "felixfbecker/advanced-json-rpc", - "version": "v3.0.3", - "source": { - "type": "git", - "url": "https://github.com/felixfbecker/php-advanced-json-rpc.git", - "reference": "241c470695366e7b83672be04ea0e64d8085a551" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/felixfbecker/php-advanced-json-rpc/zipball/241c470695366e7b83672be04ea0e64d8085a551", - "reference": "241c470695366e7b83672be04ea0e64d8085a551", - "shasum": "" - }, - "require": { - "netresearch/jsonmapper": "^1.0", - "php": ">=7.0", - "phpdocumentor/reflection-docblock": "^4.0.0" - }, - "require-dev": { - "phpunit/phpunit": "^6.0.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "AdvancedJsonRpc\\": "lib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "ISC" - ], - "authors": [ - { - "name": "Felix Becker", - "email": "felix.b@outlook.com" - } - ], - "description": "A more advanced JSONRPC implementation", - "time": "2018-09-10T08:58:41+00:00" - }, - { - "name": "microsoft/tolerant-php-parser", - "version": "v0.0.17", - "source": { - "type": "git", - "url": "https://github.com/Microsoft/tolerant-php-parser.git", - "reference": "89386de8dec9c004c8ea832692e236c92f34b542" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Microsoft/tolerant-php-parser/zipball/89386de8dec9c004c8ea832692e236c92f34b542", - "reference": "89386de8dec9c004c8ea832692e236c92f34b542", - "shasum": "" - }, - "require": { - "php": ">=7.0" - }, - "require-dev": { - "phpunit/phpunit": "^6.4" - }, - "type": "library", - "autoload": { - "psr-4": { - "Microsoft\\PhpParser\\": [ - "src/" - ] - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Rob Lourens", - "email": "roblou@microsoft.com" - } - ], - "description": "Tolerant PHP-to-AST parser designed for IDE usage scenarios", - "time": "2019-03-09T19:24:59+00:00" - }, - { - "name": "myclabs/deep-copy", - "version": "1.9.1", - "source": { - "type": "git", - "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "e6828efaba2c9b79f4499dae1d66ef8bfa7b2b72" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/e6828efaba2c9b79f4499dae1d66ef8bfa7b2b72", - "reference": "e6828efaba2c9b79f4499dae1d66ef8bfa7b2b72", - "shasum": "" - }, - "require": { - "php": "^7.1" - }, - "replace": { - "myclabs/deep-copy": "self.version" - }, - "require-dev": { - "doctrine/collections": "^1.0", - "doctrine/common": "^2.6", - "phpunit/phpunit": "^7.1" - }, - "type": "library", - "autoload": { - "psr-4": { - "DeepCopy\\": "src/DeepCopy/" - }, - "files": [ - "src/DeepCopy/deep_copy.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Create deep copies (clones) of your objects", - "keywords": [ - "clone", - "copy", - "duplicate", - "object", - "object graph" - ], - "time": "2019-04-07T13:18:21+00:00" - }, - { - "name": "netresearch/jsonmapper", - "version": "v1.4.0", - "source": { - "type": "git", - "url": "https://github.com/cweiske/jsonmapper.git", - "reference": "3868fe1128ce1169228acdb623359dca74db5ef3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/cweiske/jsonmapper/zipball/3868fe1128ce1169228acdb623359dca74db5ef3", - "reference": "3868fe1128ce1169228acdb623359dca74db5ef3", - "shasum": "" - }, - "require": { - "php": ">=5.6" - }, - "require-dev": { - "phpunit/phpunit": "~4.8.35 || ~5.7 || ~6.4", - "squizlabs/php_codesniffer": "~1.5" - }, - "type": "library", - "autoload": { - "psr-0": { - "JsonMapper": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "OSL-3.0" - ], - "authors": [ - { - "name": "Christian Weiske", - "email": "cweiske@cweiske.de", - "homepage": "http://github.com/cweiske/jsonmapper/", - "role": "Developer" - } - ], - "description": "Map nested JSON structures onto PHP classes", - "time": "2017-11-28T21:30:01+00:00" - }, - { - "name": "pdepend/pdepend", - "version": "2.5.2", - "source": { - "type": "git", - "url": "https://github.com/pdepend/pdepend.git", - "reference": "9daf26d0368d4a12bed1cacae1a9f3a6f0adf239" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/pdepend/pdepend/zipball/9daf26d0368d4a12bed1cacae1a9f3a6f0adf239", - "reference": "9daf26d0368d4a12bed1cacae1a9f3a6f0adf239", - "shasum": "" - }, - "require": { - "php": ">=5.3.7", - "symfony/config": "^2.3.0|^3|^4", - "symfony/dependency-injection": "^2.3.0|^3|^4", - "symfony/filesystem": "^2.3.0|^3|^4" - }, - "require-dev": { - "phpunit/phpunit": "^4.8|^5.7", - "squizlabs/php_codesniffer": "^2.0.0" - }, - "bin": [ - "src/bin/pdepend" - ], - "type": "library", - "autoload": { - "psr-4": { - "PDepend\\": "src/main/php/PDepend" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "description": "Official version of pdepend to be handled with Composer", - "time": "2017-12-13T13:21:38+00:00" - }, - { - "name": "phan/phan", - "version": "1.3.1", - "source": { - "type": "git", - "url": "https://github.com/phan/phan.git", - "reference": "afbcf1ab162df39dbfd96672ba29a0208a49efff" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phan/phan/zipball/afbcf1ab162df39dbfd96672ba29a0208a49efff", - "reference": "afbcf1ab162df39dbfd96672ba29a0208a49efff", - "shasum": "" - }, - "require": { - "composer/semver": "^1.4", - "composer/xdebug-handler": "^1.3.2", - "ext-filter": "*", - "ext-json": "*", - "felixfbecker/advanced-json-rpc": "^3.0.3", - "microsoft/tolerant-php-parser": "0.0.17", - "php": "^7.0.0", - "sabre/event": "^5.0", - "symfony/console": "^2.3|^3.0|~4.0", - "symfony/polyfill-mbstring": "^1.11.0" - }, - "require-dev": { - "brianium/paratest": "^1.1", - "phpunit/phpunit": "^6.3.0" - }, - "suggest": { - "ext-ast": "Needed for parsing ASTs (unless --use-fallback-parser is used). 1.0.1+ is recommended, php-ast ^0.1.5|^1.0.0 is needed.", - "ext-igbinary": "Improves performance of polyfill when ext-ast is unavailable", - "ext-tokenizer": "Needed for non-AST support and file/line-based suppressions." - }, - "bin": [ - "phan", - "phan_client", - "tocheckstyle" - ], - "type": "project", - "autoload": { - "psr-4": { - "Phan\\": "src/Phan" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Rasmus Lerdorf" - }, - { - "name": "Andrew S. Morrison" - }, - { - "name": "Tyson Andre" - } - ], - "description": "A static analyzer for PHP", - "keywords": [ - "analyzer", - "php", - "static" - ], - "time": "2019-04-20T18:35:23+00:00" - }, - { - "name": "phar-io/manifest", - "version": "1.0.1", - "source": { - "type": "git", - "url": "https://github.com/phar-io/manifest.git", - "reference": "2df402786ab5368a0169091f61a7c1e0eb6852d0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phar-io/manifest/zipball/2df402786ab5368a0169091f61a7c1e0eb6852d0", - "reference": "2df402786ab5368a0169091f61a7c1e0eb6852d0", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-phar": "*", - "phar-io/version": "^1.0.1", - "php": "^5.6 || ^7.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - }, - { - "name": "Sebastian Heuer", - "email": "sebastian@phpeople.de", - "role": "Developer" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" - } - ], - "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", - "time": "2017-03-05T18:14:27+00:00" - }, - { - "name": "phar-io/version", - "version": "1.0.1", - "source": { - "type": "git", - "url": "https://github.com/phar-io/version.git", - "reference": "a70c0ced4be299a63d32fa96d9281d03e94041df" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phar-io/version/zipball/a70c0ced4be299a63d32fa96d9281d03e94041df", - "reference": "a70c0ced4be299a63d32fa96d9281d03e94041df", - "shasum": "" - }, - "require": { - "php": "^5.6 || ^7.0" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - }, - { - "name": "Sebastian Heuer", - "email": "sebastian@phpeople.de", - "role": "Developer" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" - } - ], - "description": "Library for handling version information and constraints", - "time": "2017-03-05T17:38:23+00:00" - }, - { - "name": "phpdocumentor/reflection-common", - "version": "1.0.1", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionCommon.git", - "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6", - "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6", - "shasum": "" - }, - "require": { - "php": ">=5.5" - }, - "require-dev": { - "phpunit/phpunit": "^4.6" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": [ - "src" - ] - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jaap van Otterdijk", - "email": "opensource@ijaap.nl" - } - ], - "description": "Common reflection classes used by phpdocumentor to reflect the code structure", - "homepage": "http://www.phpdoc.org", - "keywords": [ - "FQSEN", - "phpDocumentor", - "phpdoc", - "reflection", - "static analysis" - ], - "time": "2017-09-11T18:02:19+00:00" - }, - { - "name": "phpdocumentor/reflection-docblock", - "version": "4.3.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "94fd0001232e47129dd3504189fa1c7225010d08" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/94fd0001232e47129dd3504189fa1c7225010d08", - "reference": "94fd0001232e47129dd3504189fa1c7225010d08", - "shasum": "" - }, - "require": { - "php": "^7.0", - "phpdocumentor/reflection-common": "^1.0.0", - "phpdocumentor/type-resolver": "^0.4.0", - "webmozart/assert": "^1.0" - }, - "require-dev": { - "doctrine/instantiator": "~1.0.5", - "mockery/mockery": "^1.0", - "phpunit/phpunit": "^6.4" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": [ - "src/" - ] - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" - } - ], - "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", - "time": "2017-11-30T07:14:17+00:00" - }, - { - "name": "phpdocumentor/type-resolver", - "version": "0.4.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/9c977708995954784726e25d0cd1dddf4e65b0f7", - "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7", - "shasum": "" - }, - "require": { - "php": "^5.5 || ^7.0", - "phpdocumentor/reflection-common": "^1.0" - }, - "require-dev": { - "mockery/mockery": "^0.9.4", - "phpunit/phpunit": "^5.2||^4.8.24" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": [ - "src/" - ] - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" - } - ], - "time": "2017-07-14T14:27:02+00:00" - }, - { - "name": "phpmd/phpmd", - "version": "2.6.0", - "source": { - "type": "git", - "url": "https://github.com/phpmd/phpmd.git", - "reference": "4e9924b2c157a3eb64395460fcf56b31badc8374" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpmd/phpmd/zipball/4e9924b2c157a3eb64395460fcf56b31badc8374", - "reference": "4e9924b2c157a3eb64395460fcf56b31badc8374", - "shasum": "" - }, - "require": { - "ext-xml": "*", - "pdepend/pdepend": "^2.5", - "php": ">=5.3.9" - }, - "require-dev": { - "phpunit/phpunit": "^4.0", - "squizlabs/php_codesniffer": "^2.0" - }, - "bin": [ - "src/bin/phpmd" - ], - "type": "project", - "autoload": { - "psr-0": { - "PHPMD\\": "src/main/php" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Manuel Pichler", - "email": "github@manuel-pichler.de", - "homepage": "https://github.com/manuelpichler", - "role": "Project Founder" - }, - { - "name": "Other contributors", - "homepage": "https://github.com/phpmd/phpmd/graphs/contributors", - "role": "Contributors" - }, - { - "name": "Marc Würth", - "email": "ravage@bluewin.ch", - "homepage": "https://github.com/ravage84", - "role": "Project Maintainer" - } - ], - "description": "PHPMD is a spin-off project of PHP Depend and aims to be a PHP equivalent of the well known Java tool PMD.", - "homepage": "http://phpmd.org/", - "keywords": [ - "mess detection", - "mess detector", - "pdepend", - "phpmd", - "pmd" - ], - "time": "2017-01-20T14:41:10+00:00" - }, - { - "name": "phpspec/prophecy", - "version": "1.8.0", - "source": { - "type": "git", - "url": "https://github.com/phpspec/prophecy.git", - "reference": "4ba436b55987b4bf311cb7c6ba82aa528aac0a06" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/4ba436b55987b4bf311cb7c6ba82aa528aac0a06", - "reference": "4ba436b55987b4bf311cb7c6ba82aa528aac0a06", - "shasum": "" - }, - "require": { - "doctrine/instantiator": "^1.0.2", - "php": "^5.3|^7.0", - "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0", - "sebastian/comparator": "^1.1|^2.0|^3.0", - "sebastian/recursion-context": "^1.0|^2.0|^3.0" - }, - "require-dev": { - "phpspec/phpspec": "^2.5|^3.2", - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5 || ^7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.8.x-dev" - } - }, - "autoload": { - "psr-0": { - "Prophecy\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Konstantin Kudryashov", - "email": "ever.zet@gmail.com", - "homepage": "http://everzet.com" - }, - { - "name": "Marcello Duarte", - "email": "marcello.duarte@gmail.com" - } - ], - "description": "Highly opinionated mocking framework for PHP 5.3+", - "homepage": "https://github.com/phpspec/prophecy", - "keywords": [ - "Double", - "Dummy", - "fake", - "mock", - "spy", - "stub" - ], - "time": "2018-08-05T17:53:17+00:00" - }, - { - "name": "phpunit/dbunit", - "version": "3.0.3", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/dbunit.git", - "reference": "0fa4329e490480ab957fe7b1185ea0996ca11f44" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/dbunit/zipball/0fa4329e490480ab957fe7b1185ea0996ca11f44", - "reference": "0fa4329e490480ab957fe7b1185ea0996ca11f44", - "shasum": "" - }, - "require": { - "ext-pdo": "*", - "ext-simplexml": "*", - "php": "^7.0", - "phpunit/phpunit": "^6.0", - "symfony/yaml": "^3.0 || ^4.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "PHPUnit extension for database interaction testing", - "homepage": "https://github.com/sebastianbergmann/dbunit/", - "keywords": [ - "database", - "testing", - "xunit" - ], - "abandoned": true, - "time": "2018-01-23T13:32:26+00:00" - }, - { - "name": "phpunit/php-code-coverage", - "version": "5.3.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "c89677919c5dd6d3b3852f230a663118762218ac" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/c89677919c5dd6d3b3852f230a663118762218ac", - "reference": "c89677919c5dd6d3b3852f230a663118762218ac", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-xmlwriter": "*", - "php": "^7.0", - "phpunit/php-file-iterator": "^1.4.2", - "phpunit/php-text-template": "^1.2.1", - "phpunit/php-token-stream": "^2.0.1", - "sebastian/code-unit-reverse-lookup": "^1.0.1", - "sebastian/environment": "^3.0", - "sebastian/version": "^2.0.1", - "theseer/tokenizer": "^1.1" - }, - "require-dev": { - "phpunit/phpunit": "^6.0" - }, - "suggest": { - "ext-xdebug": "^2.5.5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.3.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", - "homepage": "https://github.com/sebastianbergmann/php-code-coverage", - "keywords": [ - "coverage", - "testing", - "xunit" - ], - "time": "2018-04-06T15:36:58+00:00" - }, - { - "name": "phpunit/php-file-iterator", - "version": "1.4.5", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "730b01bc3e867237eaac355e06a36b85dd93a8b4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/730b01bc3e867237eaac355e06a36b85dd93a8b4", - "reference": "730b01bc3e867237eaac355e06a36b85dd93a8b4", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.4.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sb@sebastian-bergmann.de", - "role": "lead" - } - ], - "description": "FilterIterator implementation that filters files based on a list of suffixes.", - "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", - "keywords": [ - "filesystem", - "iterator" - ], - "time": "2017-11-27T13:52:08+00:00" - }, - { - "name": "phpunit/php-text-template", - "version": "1.2.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", - "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Simple template engine.", - "homepage": "https://github.com/sebastianbergmann/php-text-template/", - "keywords": [ - "template" - ], - "time": "2015-06-21T13:50:34+00:00" - }, - { - "name": "phpunit/php-timer", - "version": "1.0.9", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3dcf38ca72b158baf0bc245e9184d3fdffa9c46f", - "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f", - "shasum": "" - }, - "require": { - "php": "^5.3.3 || ^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sb@sebastian-bergmann.de", - "role": "lead" - } - ], - "description": "Utility class for timing", - "homepage": "https://github.com/sebastianbergmann/php-timer/", - "keywords": [ - "timer" - ], - "time": "2017-02-26T11:10:40+00:00" - }, - { - "name": "phpunit/php-token-stream", - "version": "2.0.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-token-stream.git", - "reference": "791198a2c6254db10131eecfe8c06670700904db" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/791198a2c6254db10131eecfe8c06670700904db", - "reference": "791198a2c6254db10131eecfe8c06670700904db", - "shasum": "" - }, - "require": { - "ext-tokenizer": "*", - "php": "^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^6.2.4" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Wrapper around PHP's tokenizer extension.", - "homepage": "https://github.com/sebastianbergmann/php-token-stream/", - "keywords": [ - "tokenizer" - ], - "time": "2017-11-27T05:48:46+00:00" - }, - { - "name": "phpunit/phpunit", - "version": "6.5.14", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "bac23fe7ff13dbdb461481f706f0e9fe746334b7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/bac23fe7ff13dbdb461481f706f0e9fe746334b7", - "reference": "bac23fe7ff13dbdb461481f706f0e9fe746334b7", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-json": "*", - "ext-libxml": "*", - "ext-mbstring": "*", - "ext-xml": "*", - "myclabs/deep-copy": "^1.6.1", - "phar-io/manifest": "^1.0.1", - "phar-io/version": "^1.0", - "php": "^7.0", - "phpspec/prophecy": "^1.7", - "phpunit/php-code-coverage": "^5.3", - "phpunit/php-file-iterator": "^1.4.3", - "phpunit/php-text-template": "^1.2.1", - "phpunit/php-timer": "^1.0.9", - "phpunit/phpunit-mock-objects": "^5.0.9", - "sebastian/comparator": "^2.1", - "sebastian/diff": "^2.0", - "sebastian/environment": "^3.1", - "sebastian/exporter": "^3.1", - "sebastian/global-state": "^2.0", - "sebastian/object-enumerator": "^3.0.3", - "sebastian/resource-operations": "^1.0", - "sebastian/version": "^2.0.1" - }, - "conflict": { - "phpdocumentor/reflection-docblock": "3.0.2", - "phpunit/dbunit": "<3.0" - }, - "require-dev": { - "ext-pdo": "*" - }, - "suggest": { - "ext-xdebug": "*", - "phpunit/php-invoker": "^1.1" - }, - "bin": [ - "phpunit" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "6.5.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "The PHP Unit Testing framework.", - "homepage": "https://phpunit.de/", - "keywords": [ - "phpunit", - "testing", - "xunit" - ], - "time": "2019-02-01T05:22:47+00:00" - }, - { - "name": "phpunit/phpunit-mock-objects", - "version": "5.0.10", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", - "reference": "cd1cf05c553ecfec36b170070573e540b67d3f1f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/cd1cf05c553ecfec36b170070573e540b67d3f1f", - "reference": "cd1cf05c553ecfec36b170070573e540b67d3f1f", - "shasum": "" - }, - "require": { - "doctrine/instantiator": "^1.0.5", - "php": "^7.0", - "phpunit/php-text-template": "^1.2.1", - "sebastian/exporter": "^3.1" - }, - "conflict": { - "phpunit/phpunit": "<6.0" - }, - "require-dev": { - "phpunit/phpunit": "^6.5.11" - }, - "suggest": { - "ext-soap": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Mock Object library for PHPUnit", - "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/", - "keywords": [ - "mock", - "xunit" - ], - "abandoned": true, - "time": "2018-08-09T05:50:03+00:00" - }, - { - "name": "psr/container", - "version": "1.0.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/container.git", - "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f", - "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Container\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common Container Interface (PHP FIG PSR-11)", - "homepage": "https://github.com/php-fig/container", - "keywords": [ - "PSR-11", - "container", - "container-interface", - "container-interop", - "psr" - ], - "time": "2017-02-14T16:28:37+00:00" - }, - { - "name": "psr/log", - "version": "1.1.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/log.git", - "reference": "6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd", - "reference": "6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Log\\": "Psr/Log/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interface for logging libraries", - "homepage": "https://github.com/php-fig/log", - "keywords": [ - "log", - "psr", - "psr-3" - ], - "time": "2018-11-20T15:27:04+00:00" - }, - { - "name": "sabre/event", - "version": "5.0.3", - "source": { - "type": "git", - "url": "https://github.com/sabre-io/event.git", - "reference": "f5cf802d240df1257866d8813282b98aee3bc548" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sabre-io/event/zipball/f5cf802d240df1257866d8813282b98aee3bc548", - "reference": "f5cf802d240df1257866d8813282b98aee3bc548", - "shasum": "" - }, - "require": { - "php": ">=7.0" - }, - "require-dev": { - "phpunit/phpunit": ">=6", - "sabre/cs": "~1.0.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Sabre\\Event\\": "lib/" - }, - "files": [ - "lib/coroutine.php", - "lib/Loop/functions.php", - "lib/Promise/functions.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Evert Pot", - "email": "me@evertpot.com", - "homepage": "http://evertpot.com/", - "role": "Developer" - } - ], - "description": "sabre/event is a library for lightweight event-based programming", - "homepage": "http://sabre.io/event/", - "keywords": [ - "EventEmitter", - "async", - "coroutine", - "eventloop", - "events", - "hooks", - "plugin", - "promise", - "reactor", - "signal" - ], - "time": "2018-03-05T13:55:47+00:00" - }, - { - "name": "sebastian/code-unit-reverse-lookup", - "version": "1.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", - "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", - "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", - "shasum": "" - }, - "require": { - "php": "^5.6 || ^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^5.7 || ^6.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Looks up which function or method a line of code belongs to", - "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", - "time": "2017-03-04T06:30:41+00:00" - }, - { - "name": "sebastian/comparator", - "version": "2.1.3", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "34369daee48eafb2651bea869b4b15d75ccc35f9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/34369daee48eafb2651bea869b4b15d75ccc35f9", - "reference": "34369daee48eafb2651bea869b4b15d75ccc35f9", - "shasum": "" - }, - "require": { - "php": "^7.0", - "sebastian/diff": "^2.0 || ^3.0", - "sebastian/exporter": "^3.1" - }, - "require-dev": { - "phpunit/phpunit": "^6.4" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.1.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@2bepublished.at" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Provides the functionality to compare PHP values for equality", - "homepage": "https://github.com/sebastianbergmann/comparator", - "keywords": [ - "comparator", - "compare", - "equality" - ], - "time": "2018-02-01T13:46:46+00:00" - }, - { - "name": "sebastian/diff", - "version": "2.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "347c1d8b49c5c3ee30c7040ea6fc446790e6bddd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/347c1d8b49c5c3ee30c7040ea6fc446790e6bddd", - "reference": "347c1d8b49c5c3ee30c7040ea6fc446790e6bddd", - "shasum": "" - }, - "require": { - "php": "^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^6.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Kore Nordmann", - "email": "mail@kore-nordmann.de" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Diff implementation", - "homepage": "https://github.com/sebastianbergmann/diff", - "keywords": [ - "diff" - ], - "time": "2017-08-03T08:09:46+00:00" - }, - { - "name": "sebastian/environment", - "version": "3.1.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "cd0871b3975fb7fc44d11314fd1ee20925fce4f5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/cd0871b3975fb7fc44d11314fd1ee20925fce4f5", - "reference": "cd0871b3975fb7fc44d11314fd1ee20925fce4f5", - "shasum": "" - }, - "require": { - "php": "^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^6.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.1.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Provides functionality to handle HHVM/PHP environments", - "homepage": "http://www.github.com/sebastianbergmann/environment", - "keywords": [ - "Xdebug", - "environment", - "hhvm" - ], - "time": "2017-07-01T08:51:00+00:00" - }, - { - "name": "sebastian/exporter", - "version": "3.1.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "234199f4528de6d12aaa58b612e98f7d36adb937" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/234199f4528de6d12aaa58b612e98f7d36adb937", - "reference": "234199f4528de6d12aaa58b612e98f7d36adb937", - "shasum": "" - }, - "require": { - "php": "^7.0", - "sebastian/recursion-context": "^3.0" - }, - "require-dev": { - "ext-mbstring": "*", - "phpunit/phpunit": "^6.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.1.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@2bepublished.at" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" - } - ], - "description": "Provides the functionality to export PHP variables for visualization", - "homepage": "http://www.github.com/sebastianbergmann/exporter", - "keywords": [ - "export", - "exporter" - ], - "time": "2017-04-03T13:19:02+00:00" - }, - { - "name": "sebastian/global-state", - "version": "2.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4", - "reference": "e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4", - "shasum": "" - }, - "require": { - "php": "^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^6.0" - }, - "suggest": { - "ext-uopz": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Snapshotting of global state", - "homepage": "http://www.github.com/sebastianbergmann/global-state", - "keywords": [ - "global state" - ], - "time": "2017-04-27T15:39:26+00:00" - }, - { - "name": "sebastian/object-enumerator", - "version": "3.0.3", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/object-enumerator.git", - "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/7cfd9e65d11ffb5af41198476395774d4c8a84c5", - "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5", - "shasum": "" - }, - "require": { - "php": "^7.0", - "sebastian/object-reflector": "^1.1.1", - "sebastian/recursion-context": "^3.0" - }, - "require-dev": { - "phpunit/phpunit": "^6.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Traverses array structures and object graphs to enumerate all referenced objects", - "homepage": "https://github.com/sebastianbergmann/object-enumerator/", - "time": "2017-08-03T12:35:26+00:00" - }, - { - "name": "sebastian/object-reflector", - "version": "1.1.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/object-reflector.git", - "reference": "773f97c67f28de00d397be301821b06708fca0be" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/773f97c67f28de00d397be301821b06708fca0be", - "reference": "773f97c67f28de00d397be301821b06708fca0be", - "shasum": "" - }, - "require": { - "php": "^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^6.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Allows reflection of object attributes, including inherited and non-public ones", - "homepage": "https://github.com/sebastianbergmann/object-reflector/", - "time": "2017-03-29T09:07:27+00:00" - }, - { - "name": "sebastian/recursion-context", - "version": "3.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", - "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", - "shasum": "" - }, - "require": { - "php": "^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^6.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" - } - ], - "description": "Provides functionality to recursively process PHP variables", - "homepage": "http://www.github.com/sebastianbergmann/recursion-context", - "time": "2017-03-03T06:23:57+00:00" - }, - { - "name": "sebastian/resource-operations", - "version": "1.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/resource-operations.git", - "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/ce990bb21759f94aeafd30209e8cfcdfa8bc3f52", - "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52", - "shasum": "" - }, - "require": { - "php": ">=5.6.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Provides a list of PHP built-in functions that operate on resources", - "homepage": "https://www.github.com/sebastianbergmann/resource-operations", - "time": "2015-07-28T20:34:47+00:00" - }, - { - "name": "sebastian/version", - "version": "2.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/version.git", - "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019", - "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019", - "shasum": "" - }, - "require": { - "php": ">=5.6" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library that helps with managing the version number of Git-hosted PHP projects", - "homepage": "https://github.com/sebastianbergmann/version", - "time": "2016-10-03T07:35:21+00:00" - }, - { - "name": "squizlabs/php_codesniffer", - "version": "2.9.2", - "source": { - "type": "git", - "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", - "reference": "2acf168de78487db620ab4bc524135a13cfe6745" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/2acf168de78487db620ab4bc524135a13cfe6745", - "reference": "2acf168de78487db620ab4bc524135a13cfe6745", - "shasum": "" - }, - "require": { - "ext-simplexml": "*", - "ext-tokenizer": "*", - "ext-xmlwriter": "*", - "php": ">=5.1.2" - }, - "require-dev": { - "phpunit/phpunit": "~4.0" - }, - "bin": [ - "scripts/phpcs", - "scripts/phpcbf" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.x-dev" - } - }, - "autoload": { - "classmap": [ - "CodeSniffer.php", - "CodeSniffer/CLI.php", - "CodeSniffer/Exception.php", - "CodeSniffer/File.php", - "CodeSniffer/Fixer.php", - "CodeSniffer/Report.php", - "CodeSniffer/Reporting.php", - "CodeSniffer/Sniff.php", - "CodeSniffer/Tokens.php", - "CodeSniffer/Reports/", - "CodeSniffer/Tokenizers/", - "CodeSniffer/DocGenerators/", - "CodeSniffer/Standards/AbstractPatternSniff.php", - "CodeSniffer/Standards/AbstractScopeSniff.php", - "CodeSniffer/Standards/AbstractVariableSniff.php", - "CodeSniffer/Standards/IncorrectPatternException.php", - "CodeSniffer/Standards/Generic/Sniffs/", - "CodeSniffer/Standards/MySource/Sniffs/", - "CodeSniffer/Standards/PEAR/Sniffs/", - "CodeSniffer/Standards/PSR1/Sniffs/", - "CodeSniffer/Standards/PSR2/Sniffs/", - "CodeSniffer/Standards/Squiz/Sniffs/", - "CodeSniffer/Standards/Zend/Sniffs/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Greg Sherwood", - "role": "lead" - } - ], - "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", - "homepage": "http://www.squizlabs.com/php-codesniffer", - "keywords": [ - "phpcs", - "standards" - ], - "time": "2018-11-07T22:31:41+00:00" - }, - { - "name": "symfony/config", - "version": "v4.2.7", - "source": { - "type": "git", - "url": "https://github.com/symfony/config.git", - "reference": "0e745ead307d5dcd4e163e94a47ec04b1428943f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/0e745ead307d5dcd4e163e94a47ec04b1428943f", - "reference": "0e745ead307d5dcd4e163e94a47ec04b1428943f", - "shasum": "" - }, - "require": { - "php": "^7.1.3", - "symfony/filesystem": "~3.4|~4.0", - "symfony/polyfill-ctype": "~1.8" - }, - "conflict": { - "symfony/finder": "<3.4" - }, - "require-dev": { - "symfony/dependency-injection": "~3.4|~4.0", - "symfony/event-dispatcher": "~3.4|~4.0", - "symfony/finder": "~3.4|~4.0", - "symfony/yaml": "~3.4|~4.0" - }, - "suggest": { - "symfony/yaml": "To use the yaml reference dumper" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.2-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Config\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Config Component", - "homepage": "https://symfony.com", - "time": "2019-04-01T14:03:25+00:00" - }, - { - "name": "symfony/console", - "version": "v4.2.7", - "source": { - "type": "git", - "url": "https://github.com/symfony/console.git", - "reference": "e2840bb38bddad7a0feaf85931e38fdcffdb2f81" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/e2840bb38bddad7a0feaf85931e38fdcffdb2f81", - "reference": "e2840bb38bddad7a0feaf85931e38fdcffdb2f81", - "shasum": "" - }, - "require": { - "php": "^7.1.3", - "symfony/contracts": "^1.0", - "symfony/polyfill-mbstring": "~1.0" - }, - "conflict": { - "symfony/dependency-injection": "<3.4", - "symfony/process": "<3.3" - }, - "provide": { - "psr/log-implementation": "1.0" - }, - "require-dev": { - "psr/log": "~1.0", - "symfony/config": "~3.4|~4.0", - "symfony/dependency-injection": "~3.4|~4.0", - "symfony/event-dispatcher": "~3.4|~4.0", - "symfony/lock": "~3.4|~4.0", - "symfony/process": "~3.4|~4.0" - }, - "suggest": { - "psr/log": "For using the console logger", - "symfony/event-dispatcher": "", - "symfony/lock": "", - "symfony/process": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.2-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Console\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Console Component", - "homepage": "https://symfony.com", - "time": "2019-04-08T14:23:48+00:00" - }, - { - "name": "symfony/contracts", - "version": "v1.0.2", - "source": { - "type": "git", - "url": "https://github.com/symfony/contracts.git", - "reference": "1aa7ab2429c3d594dd70689604b5cf7421254cdf" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/contracts/zipball/1aa7ab2429c3d594dd70689604b5cf7421254cdf", - "reference": "1aa7ab2429c3d594dd70689604b5cf7421254cdf", - "shasum": "" - }, - "require": { - "php": "^7.1.3" - }, - "require-dev": { - "psr/cache": "^1.0", - "psr/container": "^1.0" - }, - "suggest": { - "psr/cache": "When using the Cache contracts", - "psr/container": "When using the Service contracts", - "symfony/cache-contracts-implementation": "", - "symfony/service-contracts-implementation": "", - "symfony/translation-contracts-implementation": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Contracts\\": "" - }, - "exclude-from-classmap": [ - "**/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "A set of abstractions extracted out of the Symfony components", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], - "time": "2018-12-05T08:06:11+00:00" - }, - { - "name": "symfony/dependency-injection", - "version": "v4.2.7", - "source": { - "type": "git", - "url": "https://github.com/symfony/dependency-injection.git", - "reference": "2748643dd378626c4d348a31ad12394e2d6f7ea8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/2748643dd378626c4d348a31ad12394e2d6f7ea8", - "reference": "2748643dd378626c4d348a31ad12394e2d6f7ea8", - "shasum": "" - }, - "require": { - "php": "^7.1.3", - "psr/container": "^1.0", - "symfony/contracts": "^1.0" - }, - "conflict": { - "symfony/config": "<4.2", - "symfony/finder": "<3.4", - "symfony/proxy-manager-bridge": "<3.4", - "symfony/yaml": "<3.4" - }, - "provide": { - "psr/container-implementation": "1.0", - "symfony/service-contracts-implementation": "1.0" - }, - "require-dev": { - "symfony/config": "~4.2", - "symfony/expression-language": "~3.4|~4.0", - "symfony/yaml": "~3.4|~4.0" - }, - "suggest": { - "symfony/config": "", - "symfony/expression-language": "For using expressions in service container configuration", - "symfony/finder": "For using double-star glob patterns or when GLOB_BRACE portability is required", - "symfony/proxy-manager-bridge": "Generate service proxies to lazy load them", - "symfony/yaml": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.2-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\DependencyInjection\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony DependencyInjection Component", - "homepage": "https://symfony.com", - "time": "2019-04-16T11:19:53+00:00" - }, - { - "name": "symfony/filesystem", - "version": "v4.2.7", - "source": { - "type": "git", - "url": "https://github.com/symfony/filesystem.git", - "reference": "e16b9e471703b2c60b95f14d31c1239f68f11601" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/e16b9e471703b2c60b95f14d31c1239f68f11601", - "reference": "e16b9e471703b2c60b95f14d31c1239f68f11601", - "shasum": "" - }, - "require": { - "php": "^7.1.3", - "symfony/polyfill-ctype": "~1.8" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.2-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Filesystem\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Filesystem Component", - "homepage": "https://symfony.com", - "time": "2019-02-07T11:40:08+00:00" - }, - { - "name": "symfony/polyfill-ctype", - "version": "v1.11.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "82ebae02209c21113908c229e9883c419720738a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/82ebae02209c21113908c229e9883c419720738a", - "reference": "82ebae02209c21113908c229e9883c419720738a", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "suggest": { - "ext-ctype": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.11-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Ctype\\": "" - }, - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - }, - { - "name": "Gert de Pagter", - "email": "BackEndTea@gmail.com" - } - ], - "description": "Symfony polyfill for ctype functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "ctype", - "polyfill", - "portable" - ], - "time": "2019-02-06T07:57:58+00:00" - }, - { - "name": "symfony/polyfill-mbstring", - "version": "v1.11.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "fe5e94c604826c35a32fa832f35bd036b6799609" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/fe5e94c604826c35a32fa832f35bd036b6799609", - "reference": "fe5e94c604826c35a32fa832f35bd036b6799609", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "suggest": { - "ext-mbstring": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.11-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Mbstring\\": "" - }, - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for the Mbstring extension", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "mbstring", - "polyfill", - "portable", - "shim" - ], - "time": "2019-02-06T07:57:58+00:00" - }, - { - "name": "symfony/yaml", - "version": "v4.2.7", - "source": { - "type": "git", - "url": "https://github.com/symfony/yaml.git", - "reference": "6712daf03ee25b53abb14e7e8e0ede1a770efdb1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/6712daf03ee25b53abb14e7e8e0ede1a770efdb1", - "reference": "6712daf03ee25b53abb14e7e8e0ede1a770efdb1", - "shasum": "" - }, - "require": { - "php": "^7.1.3", - "symfony/polyfill-ctype": "~1.8" - }, - "conflict": { - "symfony/console": "<3.4" - }, - "require-dev": { - "symfony/console": "~3.4|~4.0" - }, - "suggest": { - "symfony/console": "For validating YAML files using the lint command" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.2-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Yaml\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Yaml Component", - "homepage": "https://symfony.com", - "time": "2019-03-30T15:58:42+00:00" - }, - { - "name": "theseer/tokenizer", - "version": "1.1.2", - "source": { - "type": "git", - "url": "https://github.com/theseer/tokenizer.git", - "reference": "1c42705be2b6c1de5904f8afacef5895cab44bf8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/1c42705be2b6c1de5904f8afacef5895cab44bf8", - "reference": "1c42705be2b6c1de5904f8afacef5895cab44bf8", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-tokenizer": "*", - "ext-xmlwriter": "*", - "php": "^7.0" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - } - ], - "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", - "time": "2019-04-04T09:56:43+00:00" - }, - { - "name": "webmozart/assert", - "version": "1.4.0", - "source": { - "type": "git", - "url": "https://github.com/webmozart/assert.git", - "reference": "83e253c8e0be5b0257b881e1827274667c5c17a9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/webmozart/assert/zipball/83e253c8e0be5b0257b881e1827274667c5c17a9", - "reference": "83e253c8e0be5b0257b881e1827274667c5c17a9", - "shasum": "" - }, - "require": { - "php": "^5.3.3 || ^7.0", - "symfony/polyfill-ctype": "^1.8" - }, - "require-dev": { - "phpunit/phpunit": "^4.6", - "sebastian/version": "^1.0.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.3-dev" - } - }, - "autoload": { - "psr-4": { - "Webmozart\\Assert\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - } - ], - "description": "Assertions to validate method input/output with nice error messages.", - "keywords": [ - "assert", - "check", - "validate" - ], - "time": "2018-12-25T11:19:39+00:00" - } - ], - "aliases": [], - "minimum-stability": "stable", - "stability-flags": { - "facebook/webdriver": 20 - }, - "prefer-stable": false, - "prefer-lowest": false, - "platform": { - "ext-json": "*" - }, - "platform-dev": [] -} diff --git a/jsx/FilterForm.js b/jsx/FilterForm.js index e8e0db3a158..73274bb8ea8 100644 --- a/jsx/FilterForm.js +++ b/jsx/FilterForm.js @@ -52,7 +52,7 @@ class FilterForm extends Component { }); // Update parent component - //this.props.onUpdate(filter); + this.props.onUpdate(filter); } /** @@ -178,9 +178,15 @@ class FilterForm extends Component { } return ( - - {formChildren} - + + + {formChildren} + + ); } } diff --git a/jsx/Form.js b/jsx/Form.js index 3009badb1f3..ec2c5c8157f 100644 --- a/jsx/Form.js +++ b/jsx/Form.js @@ -375,7 +375,7 @@ SearchableDropdown.propTypes = { errorMessage: React.PropTypes.string, placeHolder: React.PropTypes.string, autoFocus: React.PropTypes.bool, - onUserInput: React.PropTypes.func + onUserInput: React.PropTypes.func, }; SearchableDropdown.defaultProps = { @@ -424,7 +424,7 @@ class SelectElement extends Component { } } - //TODO: use this concept elsewhere in the code. + // TODO: use this concept elsewhere in the code. this.props.onUserInput(this.props.name, value, id, type); } @@ -451,7 +451,7 @@ class SelectElement extends Component { } // Add error message - if (this.props.errorMessage || (this.props.required && this.props.value === "")) { + if (this.props.errorMessage || (this.props.required && this.props.value === '')) { errorMessage = {this.props.errorMessage}; elementClass = 'row form-group has-error'; } @@ -530,7 +530,7 @@ SelectElement.propTypes = { sortByValue: React.PropTypes.bool, emptyOption: React.PropTypes.bool, errorMessage: React.PropTypes.string, - onUserInput: React.PropTypes.func + onUserInput: React.PropTypes.func, }; SelectElement.defaultProps = { @@ -1092,18 +1092,6 @@ DateElement.propTypes = { disabled: PropTypes.bool, required: PropTypes.bool, onUserInput: PropTypes.func, -======= - name: React.PropTypes.string.isRequired, - label: React.PropTypes.string, - value: React.PropTypes.string, - id: React.PropTypes.string, - maxYear: React.PropTypes.string, - minYear: React.PropTypes.string, - disabled: React.PropTypes.bool, - required: React.PropTypes.bool, - errorMessage: React.PropTypes.func, - onUserInput: React.PropTypes.func ->>>>>>> [media] Remove unused code (#3705) }; DateElement.defaultProps = { @@ -1189,7 +1177,7 @@ TimeElement.propTypes = { disabled: React.PropTypes.bool, required: React.PropTypes.bool, errorMessage: React.PropTypes.string, - onUserInput: React.PropTypes.func + onUserInput: React.PropTypes.func, }; TimeElement.defaultProps = { diff --git a/jsx/Panel.js b/jsx/Panel.js index bd0651f91dc..d066d15f768 100644 --- a/jsx/Panel.js +++ b/jsx/Panel.js @@ -48,18 +48,18 @@ class Panel extends Component { pencilGlyph = ( + /> ); - } + } let plusGlyph; if (this.props.add) { plusGlyph = ( ); @@ -70,7 +70,7 @@ class Panel extends Component { removeGlyph = ( ); @@ -81,7 +81,7 @@ class Panel extends Component {
- -1) && searchKey != ''; + result = (searchString.indexOf(searchKey) > -1); } } @@ -341,7 +341,7 @@ class StaticDataTable extends Component { return result; } render() { - if (this.props.data === null || this.props.data.length === 0) { + if (this.props.Data === null || this.props.Data.length === 0) { return (
No result found. @@ -390,7 +390,7 @@ class StaticDataTable extends Component { // Push rows to data table for (let i = 0; - (i < this.props.data.length) && (rows.length < rowsPerPage); + (i < this.props.Data.length) && (rows.length < rowsPerPage); i++ ) { curRow = []; @@ -406,13 +406,13 @@ class StaticDataTable extends Component { let data = 'Unknown'; // Set column data - if (this.props.data[index[i].RowIdx]) { - data = this.props.data[index[i].RowIdx][j]; + if (this.props.Data[index[i].RowIdx]) { + data = this.props.Data[index[i].RowIdx][j]; } if (this.hasFilterKeyword(this.props.Headers[j], data)) { filterMatchCount++; - filteredData.push(this.props.data[index[i].RowIdx]); + filteredData.push(this.props.Data[index[i].RowIdx]); } if (useKeyword === true) { @@ -431,7 +431,7 @@ class StaticDataTable extends Component { data = this.props.getFormattedCell( this.props.Headers[j], data, - this.props.data[index[i].RowIdx], + this.props.Data[index[i].RowIdx], this.props.Headers ); if (data !== null) { @@ -477,28 +477,47 @@ class StaticDataTable extends Component { ); // Include only filtered data if filters were applied - let csvData = this.props.data; + let csvData = this.props.Data; if (this.props.Filter && filteredData.length > 0) { csvData = filteredData; } + let header = this.state.Hide.rowsPerPage === true ? '' : ( +
+
+
+ {rows.length} rows displayed of {filteredRows}. + (Maximum rows per page: {RowsPerPageDropdown}) +
+ +
+
+
+
+ ); + let footer = this.state.Hide.downloadCSV === true ? '' : (
-
+
{rows.length} rows displayed of {filteredRows}. (Maximum rows per page: {RowsPerPageDropdown})
-
+
-
+
-
+ {header} +
- {headers} + {headers} {rows} @@ -527,9 +547,9 @@ class StaticDataTable extends Component { } } StaticDataTable.propTypes = { - Headers: React.PropTypes.array.isRequired, - data: React.PropTypes.array.isRequired, - RowNumLabel: React.PropTypes.string, + Headers: PropTypes.array.isRequired, + Data: PropTypes.array.isRequired, + RowNumLabel: PropTypes.string, // Function of which returns a JSX element for a table cell, takes // parameters of the form: func(ColumnName, CellData, EntireRowData) getFormattedCell: PropTypes.func, @@ -539,7 +559,7 @@ StaticDataTable.propTypes = { }; StaticDataTable.defaultProps = { Headers: [], - data: {}, + Data: {}, RowNumLabel: 'No.', Filter: {}, Hide: { diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000000..d55430e9be5 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,8386 @@ +{ + "name": "loris", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@babel/code-frame": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.44.tgz", + "integrity": "sha512-cuAuTTIQ9RqcFRJ/Y8PvTh+paepNcaGxwQwjIDRWPXmzzyAeCO4KqS9ikMvq0MCbRk6GlYKwfzStrcP3/jSL8g==", + "dev": true, + "requires": { + "@babel/highlight": "7.0.0-beta.44" + } + }, + "@babel/generator": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.0.0-beta.44.tgz", + "integrity": "sha512-5xVb7hlhjGcdkKpMXgicAVgx8syK5VJz193k0i/0sLP6DzE6lRrU1K3B/rFefgdo9LPGMAOOOAWW4jycj07ShQ==", + "dev": true, + "requires": { + "@babel/types": "7.0.0-beta.44", + "jsesc": "^2.5.1", + "lodash": "^4.2.0", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + }, + "dependencies": { + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + } + } + }, + "@babel/helper-function-name": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.44.tgz", + "integrity": "sha512-MHRG2qZMKMFaBavX0LWpfZ2e+hLloT++N7rfM3DYOMUOGCD8cVjqZpwiL8a0bOX3IYcQev1ruciT0gdFFRTxzg==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "7.0.0-beta.44", + "@babel/template": "7.0.0-beta.44", + "@babel/types": "7.0.0-beta.44" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.44.tgz", + "integrity": "sha512-w0YjWVwrM2HwP6/H3sEgrSQdkCaxppqFeJtAnB23pRiJB5E/O9Yp7JAAeWBl+gGEgmBFinnTyOv2RN7rcSmMiw==", + "dev": true, + "requires": { + "@babel/types": "7.0.0-beta.44" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0-beta.44.tgz", + "integrity": "sha512-aQ7QowtkgKKzPGf0j6u77kBMdUFVBKNHw2p/3HX/POt5/oz8ec5cs0GwlgM8Hz7ui5EwJnzyfRmkNF1Nx1N7aA==", + "dev": true, + "requires": { + "@babel/types": "7.0.0-beta.44" + } + }, + "@babel/highlight": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0-beta.44.tgz", + "integrity": "sha512-Il19yJvy7vMFm8AVAh6OZzaFoAd0hbkeMZiX3P5HGD+z7dyI7RzndHB0dg6Urh/VAFfHtpOIzDUSxmY6coyZWQ==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^3.0.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==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@babel/template": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.0.0-beta.44.tgz", + "integrity": "sha512-w750Sloq0UNifLx1rUqwfbnC6uSUk0mfwwgGRfdLiaUzfAOiH0tHJE6ILQIUi3KYkjiCDTskoIsnfqZvWLBDng==", + "dev": true, + "requires": { + "@babel/code-frame": "7.0.0-beta.44", + "@babel/types": "7.0.0-beta.44", + "babylon": "7.0.0-beta.44", + "lodash": "^4.2.0" + }, + "dependencies": { + "babylon": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.44.tgz", + "integrity": "sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g==", + "dev": true + } + } + }, + "@babel/traverse": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.0.0-beta.44.tgz", + "integrity": "sha512-UHuDz8ukQkJCDASKHf+oDt3FVUzFd+QYfuBIsiNu/4+/ix6pP/C+uQZJ6K1oEfbCMv/IKWbgDEh7fcsnIE5AtA==", + "dev": true, + "requires": { + "@babel/code-frame": "7.0.0-beta.44", + "@babel/generator": "7.0.0-beta.44", + "@babel/helper-function-name": "7.0.0-beta.44", + "@babel/helper-split-export-declaration": "7.0.0-beta.44", + "@babel/types": "7.0.0-beta.44", + "babylon": "7.0.0-beta.44", + "debug": "^3.1.0", + "globals": "^11.1.0", + "invariant": "^2.2.0", + "lodash": "^4.2.0" + }, + "dependencies": { + "babylon": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.44.tgz", + "integrity": "sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g==", + "dev": true + }, + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "globals": { + "version": "11.10.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.10.0.tgz", + "integrity": "sha512-0GZF1RiPKU97IHUO5TORo9w1PwrH/NBPl+fS7oMLdaTRiYmYbwK4NWoZWrAdd0/abG9R2BU+OiwyQpTpE6pdfQ==", + "dev": true + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } + } + }, + "@babel/types": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0-beta.44.tgz", + "integrity": "sha512-5eTV4WRmqbaFM3v9gHAIljEQJU4Ssc6fxL61JN+Oe2ga/BwyjzjamwkCVVAQjHGuAX8i0BWo42dshL8eO5KfLQ==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.2.0", + "to-fast-properties": "^2.0.0" + }, + "dependencies": { + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@fortawesome/fontawesome-free": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-5.7.0.tgz", + "integrity": "sha512-jLikKhTPgYTY/IFIBwkPSh2JME5xK0b9DqXmTdlG/SUbMW0siHIJ+GLPTebL8qHO5R6xOth0uPHBL5/oZ7BeEQ==", + "dev": true + }, + "@webassemblyjs/ast": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.5.13.tgz", + "integrity": "sha512-49nwvW/Hx9i+OYHg+mRhKZfAlqThr11Dqz8TsrvqGKMhdI2ijy3KBJOun2Z4770TPjrIJhR6KxChQIDaz8clDA==", + "dev": true, + "requires": { + "@webassemblyjs/helper-module-context": "1.5.13", + "@webassemblyjs/helper-wasm-bytecode": "1.5.13", + "@webassemblyjs/wast-parser": "1.5.13", + "debug": "^3.1.0", + "mamacro": "^0.0.3" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.5.13.tgz", + "integrity": "sha512-vrvvB18Kh4uyghSKb0NTv+2WZx871WL2NzwMj61jcq2bXkyhRC+8Q0oD7JGVf0+5i/fKQYQSBCNMMsDMRVAMqA==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.5.13.tgz", + "integrity": "sha512-dBh2CWYqjaDlvMmRP/kudxpdh30uXjIbpkLj9HQe+qtYlwvYjPRjdQXrq1cTAAOUSMTtzqbXIxEdEZmyKfcwsg==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.5.13.tgz", + "integrity": "sha512-v7igWf1mHcpJNbn4m7e77XOAWXCDT76Xe7Is1VQFXc4K5jRcFrl9D0NrqM4XifQ0bXiuTSkTKMYqDxu5MhNljA==", + "dev": true, + "requires": { + "debug": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } + } + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.5.13.tgz", + "integrity": "sha512-yN6ScQQDFCiAXnVctdVO/J5NQRbwyTbQzsGzEgXsAnrxhjp0xihh+nNHQTMrq5UhOqTb5LykpJAvEv9AT0jnAQ==", + "dev": true, + "requires": { + "@webassemblyjs/wast-printer": "1.5.13" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.5.13.tgz", + "integrity": "sha512-hSIKzbXjVMRvy3Jzhgu+vDd/aswJ+UMEnLRCkZDdknZO3Z9e6rp1DAs0tdLItjCFqkz9+0BeOPK/mk3eYvVzZg==", + "dev": true + }, + "@webassemblyjs/helper-module-context": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.5.13.tgz", + "integrity": "sha512-zxJXULGPLB7r+k+wIlvGlXpT4CYppRz8fLUM/xobGHc9Z3T6qlmJD9ySJ2jknuktuuiR9AjnNpKYDECyaiX+QQ==", + "dev": true, + "requires": { + "debug": "^3.1.0", + "mamacro": "^0.0.3" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.5.13.tgz", + "integrity": "sha512-0n3SoNGLvbJIZPhtMFq0XmmnA/YmQBXaZKQZcW8maGKwLpVcgjNrxpFZHEOLKjXJYVN5Il8vSfG7nRX50Zn+aw==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.5.13.tgz", + "integrity": "sha512-IJ/goicOZ5TT1axZFSnlAtz4m8KEjYr12BNOANAwGFPKXM4byEDaMNXYowHMG0yKV9a397eU/NlibFaLwr1fbw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.5.13", + "@webassemblyjs/helper-buffer": "1.5.13", + "@webassemblyjs/helper-wasm-bytecode": "1.5.13", + "@webassemblyjs/wasm-gen": "1.5.13", + "debug": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } + } + }, + "@webassemblyjs/ieee754": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.5.13.tgz", + "integrity": "sha512-TseswvXEPpG5TCBKoLx9tT7+/GMACjC1ruo09j46ULRZWYm8XHpDWaosOjTnI7kr4SRJFzA6MWoUkAB+YCGKKg==", + "dev": true, + "requires": { + "ieee754": "^1.1.11" + } + }, + "@webassemblyjs/leb128": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.5.13.tgz", + "integrity": "sha512-0NRMxrL+GG3eISGZBmLBLAVjphbN8Si15s7jzThaw1UE9e5BY1oH49/+MA1xBzxpf1OW5sf9OrPDOclk9wj2yg==", + "dev": true, + "requires": { + "long": "4.0.0" + }, + "dependencies": { + "long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==", + "dev": true + } + } + }, + "@webassemblyjs/utf8": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.5.13.tgz", + "integrity": "sha512-Ve1ilU2N48Ew0lVGB8FqY7V7hXjaC4+PeZM+vDYxEd+R2iQ0q+Wb3Rw8v0Ri0+rxhoz6gVGsnQNb4FjRiEH/Ng==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.5.13.tgz", + "integrity": "sha512-X7ZNW4+Hga4f2NmqENnHke2V/mGYK/xnybJSIXImt1ulxbCOEs/A+ZK/Km2jgihjyVxp/0z0hwIcxC6PrkWtgw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.5.13", + "@webassemblyjs/helper-buffer": "1.5.13", + "@webassemblyjs/helper-wasm-bytecode": "1.5.13", + "@webassemblyjs/helper-wasm-section": "1.5.13", + "@webassemblyjs/wasm-gen": "1.5.13", + "@webassemblyjs/wasm-opt": "1.5.13", + "@webassemblyjs/wasm-parser": "1.5.13", + "@webassemblyjs/wast-printer": "1.5.13", + "debug": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.5.13.tgz", + "integrity": "sha512-yfv94Se8R73zmr8GAYzezFHc3lDwE/lBXQddSiIZEKZFuqy7yWtm3KMwA1uGbv5G1WphimJxboXHR80IgX1hQA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.5.13", + "@webassemblyjs/helper-wasm-bytecode": "1.5.13", + "@webassemblyjs/ieee754": "1.5.13", + "@webassemblyjs/leb128": "1.5.13", + "@webassemblyjs/utf8": "1.5.13" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.5.13.tgz", + "integrity": "sha512-IkXSkgzVhQ0QYAdIayuCWMmXSYx0dHGU8Ah/AxJf1gBvstMWVnzJnBwLsXLyD87VSBIcsqkmZ28dVb0mOC3oBg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.5.13", + "@webassemblyjs/helper-buffer": "1.5.13", + "@webassemblyjs/wasm-gen": "1.5.13", + "@webassemblyjs/wasm-parser": "1.5.13", + "debug": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.5.13.tgz", + "integrity": "sha512-XnYoIcu2iqq8/LrtmdnN3T+bRjqYFjRHqWbqK3osD/0r/Fcv4d9ecRzjVtC29ENEuNTK4mQ9yyxCBCbK8S/cpg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.5.13", + "@webassemblyjs/helper-api-error": "1.5.13", + "@webassemblyjs/helper-wasm-bytecode": "1.5.13", + "@webassemblyjs/ieee754": "1.5.13", + "@webassemblyjs/leb128": "1.5.13", + "@webassemblyjs/utf8": "1.5.13" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.5.13.tgz", + "integrity": "sha512-Lbz65T0LQ1LgzKiUytl34CwuhMNhaCLgrh0JW4rJBN6INnBB8NMwUfQM+FxTnLY9qJ+lHJL/gCM5xYhB9oWi4A==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.5.13", + "@webassemblyjs/floating-point-hex-parser": "1.5.13", + "@webassemblyjs/helper-api-error": "1.5.13", + "@webassemblyjs/helper-code-frame": "1.5.13", + "@webassemblyjs/helper-fsm": "1.5.13", + "long": "^3.2.0", + "mamacro": "^0.0.3" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.5.13.tgz", + "integrity": "sha512-QcwogrdqcBh8Z+eUF8SG+ag5iwQSXxQJELBEHmLkk790wgQgnIMmntT2sMAMw53GiFNckArf5X0bsCA44j3lWQ==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.5.13", + "@webassemblyjs/wast-parser": "1.5.13", + "long": "^3.2.0" + } + }, + "acorn": { + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.0.6.tgz", + "integrity": "sha512-5M3G/A4uBSMIlfJ+h9W125vJvPFH/zirISsW5qfxF5YzEvXJCtolLoQvM5yZft0DvMcUrPGKPOlgEu55I6iUtA==", + "dev": true + }, + "acorn-dynamic-import": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz", + "integrity": "sha512-zVWV8Z8lislJoOKKqdNMOB+s6+XV5WERty8MnKBeFgwA+19XJjJHs2RP5dzM57FftIs+jQnRToLiWazKr6sSWg==", + "dev": true, + "requires": { + "acorn": "^5.0.0" + }, + "dependencies": { + "acorn": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", + "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", + "dev": true + } + } + }, + "acorn-jsx": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.1.tgz", + "integrity": "sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg==", + "dev": true + }, + "ajv": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.7.0.tgz", + "integrity": "sha512-RZXPviBTtfmtka9n9sy1N5M5b82CbxWIR6HIis4s3WQTXDJamc/0gpCWNGz6EWdWp4DOfjzJfhz/AS9zVPjjWg==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.3.0.tgz", + "integrity": "sha512-CMzN9S62ZOO4sA/mJZIO4S++ZM7KFWzH3PPWkveLhy4OZ9i1/VatgwWMD46w/XbGCBy7Ye0gCk+Za6mmyfKK7g==", + "dev": true + }, + "ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "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=" + }, + "anymatch": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", + "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", + "dev": true, + "optional": true, + "requires": { + "micromatch": "^2.1.5", + "normalize-path": "^2.0.0" + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "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" + } + }, + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "optional": 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-includes": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", + "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.7.0" + } + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true, + "optional": true + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", + "dev": true + }, + "asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "assert": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", + "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", + "dev": true, + "requires": { + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "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 + }, + "async-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", + "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", + "dev": true + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "babel-cli": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-cli/-/babel-cli-6.26.0.tgz", + "integrity": "sha1-UCq1SHTX24itALiHoGODzgPQAvE=", + "dev": true, + "requires": { + "babel-core": "^6.26.0", + "babel-polyfill": "^6.26.0", + "babel-register": "^6.26.0", + "babel-runtime": "^6.26.0", + "chokidar": "^1.6.1", + "commander": "^2.11.0", + "convert-source-map": "^1.5.0", + "fs-readdir-recursive": "^1.0.0", + "glob": "^7.1.2", + "lodash": "^4.17.4", + "output-file-sync": "^1.1.2", + "path-is-absolute": "^1.0.1", + "slash": "^1.0.0", + "source-map": "^0.5.6", + "v8flags": "^2.1.1" + } + }, + "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" + }, + "dependencies": { + "convert-source-map": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", + "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", + "requires": { + "safe-buffer": "~5.1.1" + } + } + } + }, + "babel-eslint": { + "version": "8.2.6", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-8.2.6.tgz", + "integrity": "sha512-aCdHjhzcILdP8c9lej7hvXKvQieyRt20SF102SIGyY4cUIiw6UaAtK4j2o3dXX74jEmy0TJ0CEhv4fTIM3SzcA==", + "dev": true, + "requires": { + "@babel/code-frame": "7.0.0-beta.44", + "@babel/traverse": "7.0.0-beta.44", + "@babel/types": "7.0.0-beta.44", + "babylon": "7.0.0-beta.44", + "eslint-scope": "3.7.1", + "eslint-visitor-keys": "^1.0.0" + }, + "dependencies": { + "babylon": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.44.tgz", + "integrity": "sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g==", + "dev": true + } + } + }, + "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" + } + }, + "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=", + "dev": true, + "requires": { + "babel-helper-explode-assignable-expression": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-helper-builder-react-jsx": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz", + "integrity": "sha1-Of+DE7dci2Xc7/HzHTg+D/KkCKA=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "esutils": "^2.0.2" + } + }, + "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=", + "dev": true, + "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=", + "dev": true, + "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=", + "dev": true, + "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=", + "dev": true, + "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=", + "dev": true, + "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=", + "dev": true, + "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=", + "dev": true, + "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=", + "dev": true, + "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=", + "dev": true, + "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=", + "dev": true, + "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-loader": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-7.1.5.tgz", + "integrity": "sha512-iCHfbieL5d1LfOQeeVJEUyD9rTwBcP/fcEbRCfempxTDuqrKpu0AZjLAQHEQa3Yqyj9ORKe2iHfoj4rHLf7xpw==", + "dev": true, + "requires": { + "find-cache-dir": "^1.0.0", + "loader-utils": "^1.0.2", + "mkdirp": "^0.5.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=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "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=", + "dev": true + }, + "babel-plugin-syntax-exponentiation-operator": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", + "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=", + "dev": true + }, + "babel-plugin-syntax-flow": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz", + "integrity": "sha1-TDqyCiryaqIM0lmVw5jE63AxDI0=", + "dev": true + }, + "babel-plugin-syntax-jsx": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", + "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=", + "dev": true + }, + "babel-plugin-syntax-object-rest-spread": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", + "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=", + "dev": true + }, + "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=", + "dev": true + }, + "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=", + "dev": true, + "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-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=", + "dev": true, + "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=", + "dev": true, + "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=", + "dev": true, + "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=", + "dev": true, + "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=", + "dev": true, + "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=", + "dev": true, + "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=", + "dev": true, + "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=", + "dev": true, + "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=", + "dev": true, + "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=", + "dev": true, + "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=", + "dev": true, + "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.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz", + "integrity": "sha1-DYOUApt9xqvhqX7xgeAHWN0uXYo=", + "dev": true, + "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=", + "dev": true, + "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=", + "dev": true, + "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=", + "dev": true, + "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=", + "dev": true, + "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=", + "dev": true, + "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=", + "dev": true, + "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=", + "dev": true, + "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=", + "dev": true, + "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=", + "dev": true, + "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=", + "dev": true, + "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=", + "dev": true, + "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-flow-strip-types": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz", + "integrity": "sha1-hMtnKTXUNxT9wyvOhFaNh0Qc988=", + "dev": true, + "requires": { + "babel-plugin-syntax-flow": "^6.18.0", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-object-rest-spread": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", + "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", + "dev": true, + "requires": { + "babel-plugin-syntax-object-rest-spread": "^6.8.0", + "babel-runtime": "^6.26.0" + } + }, + "babel-plugin-transform-react-display-name": { + "version": "6.25.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.25.0.tgz", + "integrity": "sha1-Z+K/Hx6ck6sI25Z5LgU5K/LMKNE=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-react-jsx": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz", + "integrity": "sha1-hAoCjn30YN/DotKfDA2R9jduZqM=", + "dev": true, + "requires": { + "babel-helper-builder-react-jsx": "^6.24.1", + "babel-plugin-syntax-jsx": "^6.8.0", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-react-jsx-self": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.22.0.tgz", + "integrity": "sha1-322AqdomEqEh5t3XVYvL7PBuY24=", + "dev": true, + "requires": { + "babel-plugin-syntax-jsx": "^6.8.0", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-react-jsx-source": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz", + "integrity": "sha1-ZqwSFT9c0tF7PBkmj0vwGX9E7NY=", + "dev": true, + "requires": { + "babel-plugin-syntax-jsx": "^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=", + "dev": true, + "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=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-polyfill": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz", + "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=", + "dev": true, + "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=", + "dev": true + } + } + }, + "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==", + "dev": true, + "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-preset-flow": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz", + "integrity": "sha1-5xIYiHCFrpoktb5Baa/7WZgWxJ0=", + "dev": true, + "requires": { + "babel-plugin-transform-flow-strip-types": "^6.22.0" + } + }, + "babel-preset-react": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-react/-/babel-preset-react-6.24.1.tgz", + "integrity": "sha1-umnfrqRfw+xjm2pOzqbhdwLJE4A=", + "dev": true, + "requires": { + "babel-plugin-syntax-jsx": "^6.3.13", + "babel-plugin-transform-react-display-name": "^6.23.0", + "babel-plugin-transform-react-jsx": "^6.24.1", + "babel-plugin-transform-react-jsx-self": "^6.22.0", + "babel-plugin-transform-react-jsx-source": "^6.22.0", + "babel-preset-flow": "^6.23.0" + } + }, + "babel-register": { + "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" + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==" + }, + "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-js": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", + "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==", + "dev": true + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "binary-extensions": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.10.0.tgz", + "integrity": "sha1-muuabF6IY4qtFx4Wf1kAq+JINdA=", + "dev": true + }, + "bluebird": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.3.tgz", + "integrity": "sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw==", + "dev": true + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "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, + "optional": true, + "requires": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "dev": true, + "requires": { + "bn.js": "^4.1.1", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.2", + "elliptic": "^6.0.0", + "inherits": "^2.0.1", + "parse-asn1": "^5.0.0" + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "requires": { + "pako": "~1.0.5" + } + }, + "browserslist": { + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-3.2.8.tgz", + "integrity": "sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30000844", + "electron-to-chromium": "^1.3.47" + } + }, + "buffer": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "cacache": { + "version": "10.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-10.0.4.tgz", + "integrity": "sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==", + "dev": true, + "requires": { + "bluebird": "^3.5.1", + "chownr": "^1.0.1", + "glob": "^7.1.2", + "graceful-fs": "^4.1.11", + "lru-cache": "^4.1.1", + "mississippi": "^2.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.2", + "ssri": "^5.2.4", + "unique-filename": "^1.1.0", + "y18n": "^4.0.0" + } + }, + "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 + } + } + }, + "caller-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", + "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", + "dev": true, + "requires": { + "callsites": "^0.2.0" + } + }, + "callsites": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", + "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", + "dev": true + }, + "camelcase": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz", + "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==", + "dev": true + }, + "caniuse-lite": { + "version": "1.0.30000932", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000932.tgz", + "integrity": "sha512-4bghJFItvzz8m0T3lLZbacmEY9X1Z2AtIzTr7s7byqZIOumASfr4ynDx7rtm0J85nDmx8vsgR6vnaSoeU8Oh0A==", + "dev": true + }, + "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" + } + }, + "chardet": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", + "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", + "dev": true + }, + "chokidar": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", + "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", + "dev": true, + "optional": 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" + } + }, + "chownr": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", + "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==", + "dev": true + }, + "chrome-trace-event": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.0.tgz", + "integrity": "sha512-xDbVgyfDTT2piup/h8dK/y4QZfJRSa73bw1WZ8b4XM1o7fsFubUVGYcE+1ANtOzJJELGpYoG2961z0Z6OAld9A==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "circular-json": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", + "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", + "dev": true + }, + "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 + } + } + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "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": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "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.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "commander": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", + "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "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 + }, + "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" + } + }, + "console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "dev": true, + "requires": { + "date-now": "^0.1.4" + } + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "convert-source-map": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.0.tgz", + "integrity": "sha1-ms1whRxtXf3ZPZKC5e35SgP/RrU=", + "dev": true + }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "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.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.1.tgz", + "integrity": "sha1-rmh03GaTd4m4B1T/VCjfZoGcpQs=" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "create-ecdh": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "cyclist": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", + "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=", + "dev": true + }, + "date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", + "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=", + "dev": true + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "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 + } + } + }, + "des.js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", + "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.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" + } + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true + }, + "duplexify": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.1.tgz", + "integrity": "sha512-vM58DwdnKmty+FSPzT14K9JXb90H+j5emaR4KYbr2KTIz00WHGbWOe5ghQTx233ZCLZtrGDALzKwcjEtSt35mA==", + "dev": true, + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "electron-to-chromium": { + "version": "1.3.109", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.109.tgz", + "integrity": "sha512-1qhgVZD9KIULMyeBkbjU/dWmm30zpPUfdWZfVO3nPhbtqMHJqHr4Ua5wBcWtAymVFrUCuAJxjMF1OhG+bR21Ow==", + "dev": true + }, + "elliptic": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.1.tgz", + "integrity": "sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ==", + "dev": true, + "requires": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + } + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true + }, + "encoding": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", + "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", + "dev": true, + "requires": { + "iconv-lite": "~0.4.13" + } + }, + "end-of-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "enhanced-resolve": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", + "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.4.0", + "tapable": "^1.0.0" + } + }, + "errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "dev": true, + "requires": { + "prr": "~1.0.1" + } + }, + "es-abstract": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz", + "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.0", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "is-callable": "^1.1.4", + "is-regex": "^1.0.4", + "object-keys": "^1.0.12" + } + }, + "es-to-primitive": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", + "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "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=" + }, + "eslint": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.3.0.tgz", + "integrity": "sha512-N/tCqlMKkyNvAvLu+zI9AqDasnSLt00K+Hu8kdsERliC9jYEc8ck12XtjvOXrBKu8fK6RrBcN9bat6Xk++9jAg==", + "dev": true, + "requires": { + "ajv": "^6.5.0", + "babel-code-frame": "^6.26.0", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^3.1.0", + "doctrine": "^2.1.0", + "eslint-scope": "^4.0.0", + "eslint-utils": "^1.3.1", + "eslint-visitor-keys": "^1.0.0", + "espree": "^4.0.0", + "esquery": "^1.0.1", + "esutils": "^2.0.2", + "file-entry-cache": "^2.0.0", + "functional-red-black-tree": "^1.0.1", + "glob": "^7.1.2", + "globals": "^11.7.0", + "ignore": "^4.0.2", + "imurmurhash": "^0.1.4", + "inquirer": "^5.2.0", + "is-resolvable": "^1.1.0", + "js-yaml": "^3.11.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.5", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.2", + "path-is-inside": "^1.0.2", + "pluralize": "^7.0.0", + "progress": "^2.0.0", + "regexpp": "^2.0.0", + "require-uncached": "^1.0.3", + "semver": "^5.5.0", + "string.prototype.matchall": "^2.0.0", + "strip-ansi": "^4.0.0", + "strip-json-comments": "^2.0.1", + "table": "^4.0.3", + "text-table": "^0.2.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "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.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "eslint-scope": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.0.tgz", + "integrity": "sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "globals": { + "version": "11.10.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.10.0.tgz", + "integrity": "sha512-0GZF1RiPKU97IHUO5TORo9w1PwrH/NBPl+fS7oMLdaTRiYmYbwK4NWoZWrAdd0/abG9R2BU+OiwyQpTpE6pdfQ==", + "dev": true + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "eslint-config-google": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/eslint-config-google/-/eslint-config-google-0.9.1.tgz", + "integrity": "sha512-5A83D+lH0PA81QMESKbLJd/a3ic8tPZtwUmqNrxMRo54nfFaUvtt89q/+icQ+fd66c2xQHn0KyFkzJDoAUfpZA==", + "dev": true + }, + "eslint-loader": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-2.1.0.tgz", + "integrity": "sha512-f4A/Yk7qF+HcFSz5Tck2QoKIwJVHlX0soJk5MkROYahb5uvspad5Ba60rrz4u/V2/MEj1dtp/uBi6LlLWVaY7Q==", + "dev": true, + "requires": { + "loader-fs-cache": "^1.0.0", + "loader-utils": "^1.0.2", + "object-assign": "^4.0.1", + "object-hash": "^1.1.4", + "rimraf": "^2.6.1" + } + }, + "eslint-plugin-react": { + "version": "7.11.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.11.1.tgz", + "integrity": "sha512-cVVyMadRyW7qsIUh3FHp3u6QHNhOgVrLQYdQEB1bPWBsgbNCHdFAeNMquBMCcZJu59eNthX053L70l7gRt4SCw==", + "dev": true, + "requires": { + "array-includes": "^3.0.3", + "doctrine": "^2.1.0", + "has": "^1.0.3", + "jsx-ast-utils": "^2.0.1", + "prop-types": "^15.6.2" + } + }, + "eslint-scope": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", + "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.3.1.tgz", + "integrity": "sha512-Z7YjnIldX+2XMcjr7ZkgEsOj/bREONV60qYeB/bjMAqqqZ4zxKyWX+BOUkdmRmA9riiIPVvo5x86m5elviOk0Q==", + "dev": true + }, + "eslint-visitor-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", + "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==", + "dev": true + }, + "espree": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-4.1.0.tgz", + "integrity": "sha512-I5BycZW6FCVIub93TeVY1s7vjhP9CY6cXCznIRfiig7nRviKZYdRnj/sHEWC6A7WE9RDWOFq9+7OsWSYz8qv2w==", + "dev": true, + "requires": { + "acorn": "^6.0.2", + "acorn-jsx": "^5.0.0", + "eslint-visitor-keys": "^1.0.0" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esquery": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", + "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", + "dev": true, + "requires": { + "estraverse": "^4.0.0" + } + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "requires": { + "estraverse": "^4.1.0" + } + }, + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" + }, + "events": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.0.0.tgz", + "integrity": "sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==", + "dev": true + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "optional": 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, + "optional": true, + "requires": { + "fill-range": "^2.1.0" + } + }, + "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": "2.2.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", + "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", + "dev": true, + "requires": { + "chardet": "^0.4.0", + "iconv-lite": "^0.4.17", + "tmp": "^0.0.33" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "optional": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "fbjs": { + "version": "0.8.17", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.17.tgz", + "integrity": "sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90=", + "dev": true, + "requires": { + "core-js": "^1.0.0", + "isomorphic-fetch": "^2.1.1", + "loose-envify": "^1.0.0", + "object-assign": "^4.1.0", + "promise": "^7.1.1", + "setimmediate": "^1.0.5", + "ua-parser-js": "^0.7.18" + }, + "dependencies": { + "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 + } + } + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-entry-cache": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", + "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", + "dev": true, + "requires": { + "flat-cache": "^1.2.1", + "object-assign": "^4.0.1" + } + }, + "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, + "optional": true + }, + "fill-range": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", + "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", + "dev": true, + "optional": true, + "requires": { + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^1.1.3", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" + } + }, + "find-cache-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", + "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^1.0.0", + "pkg-dir": "^2.0.0" + } + }, + "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" + } + }, + "flat-cache": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.4.tgz", + "integrity": "sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==", + "dev": true, + "requires": { + "circular-json": "^0.3.1", + "graceful-fs": "^4.1.2", + "rimraf": "~2.6.2", + "write": "^0.2.1" + } + }, + "flush-write-stream": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.3.tgz", + "integrity": "sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.4" + } + }, + "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, + "optional": true, + "requires": { + "for-in": "^1.0.1" + } + }, + "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" + } + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "fs-readdir-recursive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.0.0.tgz", + "integrity": "sha1-jNF0XItPiinIyuw5JHaSG6GV9WA=", + "dev": true + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.3.tgz", + "integrity": "sha512-WIr7iDkdmdbxu/Gh6eKEZJL6KPE74/5MEsf2whTOFNxbIoIixogroLdKYqB6FDav4Wavh/lZdzzd3b2KxIXC5Q==", + "dev": true, + "optional": true, + "requires": { + "nan": "^2.3.0", + "node-pre-gyp": "^0.6.39" + }, + "dependencies": { + "abbrev": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "ajv": { + "version": "4.11.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "co": "^4.6.0", + "json-stable-stringify": "^1.0.1" + } + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "aproba": { + "version": "1.1.1", + "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" + } + }, + "asn1": { + "version": "0.2.3", + "bundled": true, + "dev": true, + "optional": true + }, + "assert-plus": { + "version": "0.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "asynckit": { + "version": "0.4.0", + "bundled": true, + "dev": true, + "optional": true + }, + "aws-sign2": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "aws4": { + "version": "1.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "balanced-match": { + "version": "0.4.2", + "bundled": true, + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "block-stream": { + "version": "0.0.9", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "inherits": "~2.0.0" + } + }, + "boom": { + "version": "2.10.1", + "bundled": true, + "dev": true, + "requires": { + "hoek": "2.x.x" + } + }, + "brace-expansion": { + "version": "1.1.7", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "^0.4.1", + "concat-map": "0.0.1" + } + }, + "buffer-shims": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "caseless": { + "version": "0.12.0", + "bundled": true, + "dev": true, + "optional": true + }, + "co": { + "version": "4.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "combined-stream": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "cryptiles": { + "version": "2.0.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "boom": "2.x.x" + } + }, + "dashdash": { + "version": "1.14.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "assert-plus": "^1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "debug": { + "version": "2.6.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.4.2", + "bundled": true, + "dev": true, + "optional": true + }, + "delayed-stream": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "ecc-jsbn": { + "version": "0.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "jsbn": "~0.1.0" + } + }, + "extend": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "extsprintf": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "forever-agent": { + "version": "0.6.1", + "bundled": true, + "dev": true, + "optional": true + }, + "form-data": { + "version": "2.1.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.5", + "mime-types": "2.1.15" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "fstream": { + "version": "1.0.11", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + } + }, + "fstream-ignore": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fstream": "^1.0.0", + "inherits": "2", + "minimatch": "^3.0.0" + } + }, + "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" + } + }, + "getpass": { + "version": "0.1.7", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "assert-plus": "^1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "glob": { + "version": "7.1.2", + "bundled": true, + "dev": 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" + } + }, + "graceful-fs": { + "version": "4.1.11", + "bundled": true, + "dev": true + }, + "har-schema": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "optional": true + }, + "har-validator": { + "version": "4.2.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ajv": "4.11.8", + "har-schema": "1.0.5" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "hawk": { + "version": "3.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "boom": "2.x.x", + "cryptiles": "2.x.x", + "hoek": "2.x.x", + "sntp": "1.x.x" + } + }, + "hoek": { + "version": "2.16.3", + "bundled": true, + "dev": true + }, + "http-signature": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "assert-plus": "^0.2.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true + }, + "ini": { + "version": "1.3.4", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-typedarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "isstream": { + "version": "0.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "jodid25519": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "jsbn": "~0.1.0" + } + }, + "jsbn": { + "version": "0.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "json-schema": { + "version": "0.2.3", + "bundled": true, + "dev": true, + "optional": true + }, + "json-stable-stringify": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "jsonify": "~0.0.0" + } + }, + "json-stringify-safe": { + "version": "5.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "jsonify": { + "version": "0.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "jsprim": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.0.2", + "json-schema": "0.2.3", + "verror": "1.3.6" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "mime-db": { + "version": "1.27.0", + "bundled": true, + "dev": true, + "optional": true + }, + "mime-types": { + "version": "2.1.15", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "mime-db": "1.27.0" + } + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true + }, + "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 + }, + "node-pre-gyp": { + "version": "0.6.39", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "hawk": "3.1.3", + "mkdirp": "^0.5.1", + "nopt": "^4.0.1", + "npmlog": "^4.0.2", + "rc": "^1.1.7", + "request": "2.81.0", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^2.2.1", + "tar-pack": "^3.4.0" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npmlog": { + "version": "4.1.0", + "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, + "optional": true + }, + "oauth-sign": { + "version": "0.8.2", + "bundled": true, + "dev": true, + "optional": 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.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "performance-now": { + "version": "0.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "1.0.7", + "bundled": true, + "dev": true, + "optional": true + }, + "punycode": { + "version": "1.4.1", + "bundled": true, + "dev": true, + "optional": true + }, + "qs": { + "version": "6.4.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "~0.4.0", + "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.2.9", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "buffer-shims": "~1.0.0", + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "string_decoder": "~1.0.0", + "util-deprecate": "~1.0.1" + } + }, + "request": { + "version": "2.81.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aws-sign2": "~0.6.0", + "aws4": "^1.2.1", + "caseless": "~0.12.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.0", + "forever-agent": "~0.6.1", + "form-data": "~2.1.1", + "har-validator": "~4.2.1", + "hawk": "~3.1.3", + "http-signature": "~1.1.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.7", + "oauth-sign": "~0.8.1", + "performance-now": "^0.2.0", + "qs": "~6.4.0", + "safe-buffer": "^5.0.1", + "stringstream": "~0.0.4", + "tough-cookie": "~2.3.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.0.0" + } + }, + "rimraf": { + "version": "2.6.1", + "bundled": true, + "dev": true, + "requires": { + "glob": "^7.0.5" + } + }, + "safe-buffer": { + "version": "5.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "5.3.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 + }, + "sntp": { + "version": "1.0.9", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "hoek": "2.x.x" + } + }, + "sshpk": { + "version": "1.13.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jodid25519": "^1.0.0", + "jsbn": "~0.1.0", + "tweetnacl": "~0.14.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "stringstream": { + "version": "0.0.5", + "bundled": true, + "dev": true, + "optional": true + }, + "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": "2.2.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "block-stream": "*", + "fstream": "^1.0.2", + "inherits": "2" + } + }, + "tar-pack": { + "version": "3.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "^2.2.0", + "fstream": "^1.0.10", + "fstream-ignore": "^1.0.5", + "once": "^1.3.3", + "readable-stream": "^2.1.4", + "rimraf": "^2.5.1", + "tar": "^2.2.1", + "uid-number": "^0.0.6" + } + }, + "tough-cookie": { + "version": "2.3.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "punycode": "^1.4.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "bundled": true, + "dev": true, + "optional": true + }, + "uid-number": { + "version": "0.0.6", + "bundled": true, + "dev": true, + "optional": true + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "uuid": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "verror": { + "version": "1.3.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "extsprintf": "1.0.2" + } + }, + "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 + } + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + }, + "dependencies": { + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": 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" + } + }, + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true, + "optional": 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-path": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/global-modules-path/-/global-modules-path-2.3.1.tgz", + "integrity": "sha512-y+shkf4InI7mPRHSo2b/k6ix6+NLDtyccYv86whhxrSGX9wjPX1VMITmrDbE1eh7zkzhiWtW2sHklJYoQ62Cxg==", + "dev": true + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==" + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "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-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", + "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", + "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-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "history": { + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/history/-/history-4.7.2.tgz", + "integrity": "sha512-1zkBRWW6XweO0NBcjiphtVJVsIQ+SXF29z9DVkceeaSLVMFXHool+fdCZD4spDCfZJCILPILc3bm7Bc+HRi0nA==", + "requires": { + "invariant": "^2.2.1", + "loose-envify": "^1.2.0", + "resolve-pathname": "^2.2.0", + "value-equal": "^0.4.0", + "warning": "^3.0.0" + }, + "dependencies": { + "warning": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", + "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=", + "requires": { + "loose-envify": "^1.0.0" + } + } + } + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "hoist-non-react-statics": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz", + "integrity": "sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw==" + }, + "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" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ieee754": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz", + "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==", + "dev": true + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "dev": true + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "import-local": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz", + "integrity": "sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==", + "dev": true, + "requires": { + "pkg-dir": "^2.0.0", + "resolve-cwd": "^2.0.0" + } + }, + "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 + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "inquirer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-5.2.0.tgz", + "integrity": "sha512-E9BmnJbAKLPGonz0HeWHtbKf+EeSP93paWO3ZYoUpq/aowXvYGjjCSuashhXPpzbArIjBbji39THkxTz9ZeEUQ==", + "dev": true, + "requires": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.0", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^2.1.0", + "figures": "^2.0.0", + "lodash": "^4.3.0", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^5.5.2", + "string-width": "^2.1.0", + "strip-ansi": "^4.0.0", + "through": "^2.3.6" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "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.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "interpret": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", + "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", + "dev": true + }, + "invariant": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", + "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", + "requires": { + "loose-envify": "^1.0.0" + } + }, + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", + "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.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz", + "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=", + "dev": true + }, + "is-callable": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", + "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", + "dev": true + }, + "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-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "dev": true + }, + "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, + "optional": 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, + "optional": 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": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "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-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dev": true, + "optional": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "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, + "optional": 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, + "optional": 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-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "dev": true, + "requires": { + "has": "^1.0.1" + } + }, + "is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-symbol": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", + "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", + "dev": true, + "requires": { + "has-symbols": "^1.0.0" + } + }, + "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 + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "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, + "optional": true, + "requires": { + "isarray": "1.0.0" + } + }, + "isomorphic-fetch": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", + "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", + "dev": true, + "requires": { + "node-fetch": "^1.0.1", + "whatwg-fetch": ">=0.10.0" + } + }, + "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.12.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.1.tgz", + "integrity": "sha512-um46hB9wNOKlwkHgiuyEVAybXBjwFUV0Z/RaHJblRd9DXltue9FTYvzCr9ErQrK9Adz5MU4gHWVaNUfdmrC8qA==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=" + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" + }, + "jsx-ast-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.0.1.tgz", + "integrity": "sha1-6AGxs5mF4g//yHtA43SAgOLcrH8=", + "dev": true, + "requires": { + "array-includes": "^3.0.3" + } + }, + "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" + } + }, + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "dev": true, + "requires": { + "invert-kv": "^2.0.0" + } + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "loader-fs-cache": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/loader-fs-cache/-/loader-fs-cache-1.0.1.tgz", + "integrity": "sha1-VuC/CL2XCLJqdltoUJhAyN7J/bw=", + "dev": true, + "requires": { + "find-cache-dir": "^0.1.1", + "mkdirp": "0.5.1" + }, + "dependencies": { + "find-cache-dir": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz", + "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "mkdirp": "^0.5.1", + "pkg-dir": "^1.0.0" + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "pkg-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", + "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", + "dev": true, + "requires": { + "find-up": "^1.0.0" + } + } + } + }, + "loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "dev": true + }, + "loader-utils": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "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" + } + }, + "lodash": { + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=" + }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", + "dev": true + }, + "long": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz", + "integrity": "sha1-2CG3E4yhy1gcFymQ7xTbIAtcR0s=", + "dev": true + }, + "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" + } + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "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" + } + }, + "mamacro": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz", + "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==", + "dev": true + }, + "map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "dev": true, + "requires": { + "p-defer": "^1.0.0" + } + }, + "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" + } + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, + "mem": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.1.0.tgz", + "integrity": "sha512-I5u6Q1x7wxO0kdOpYBB28xueHADYps5uty/zg936CiG8NTe5sJL8EjrCuLneuDW3PlMdZBGDIn8BirEVdovZvg==", + "dev": true, + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^1.0.0", + "p-is-promise": "^2.0.0" + } + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "optional": 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" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, + "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=" + }, + "mississippi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-2.0.0.tgz", + "integrity": "sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==", + "dev": true, + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^2.0.1", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "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" + } + }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "dev": true + }, + "nan": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.8.0.tgz", + "integrity": "sha1-7XFfP+neArV6XmJS2QqWZ14fCFo=", + "dev": true, + "optional": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "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 + }, + "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 + } + } + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "neo-async": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.0.tgz", + "integrity": "sha512-MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA==", + "dev": true + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "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==", + "dev": true, + "requires": { + "encoding": "^0.1.11", + "is-stream": "^1.0.1" + } + }, + "node-libs-browser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.0.tgz", + "integrity": "sha512-5MQunG/oyOaBdttrL40dA7bUfPORLRWMUJLQtMg7nluxUvk5XwnLdL9twQHFAjRx/y7mIMkLKT9++qPbbk6BZA==", + "dev": true, + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.0", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "0.0.4" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } + } + }, + "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" + } + }, + "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" + } + }, + "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-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-hash": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-1.3.1.tgz", + "integrity": "sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA==", + "dev": true + }, + "object-keys": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", + "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==", + "dev": true + }, + "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, + "optional": 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 + } + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "optionator": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.4", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "wordwrap": "~1.0.0" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "dev": true + }, + "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": "3.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + } + }, + "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=" + }, + "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=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.4", + "mkdirp": "^0.5.1", + "object-assign": "^4.1.0" + } + }, + "p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", + "dev": true + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-is-promise": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.0.0.tgz", + "integrity": "sha512-pzQPhYMCAgLAKPWD2jC3Se9fEfrD9npNos0y150EeqZll7akhEgGhTW/slB6lHku8AvYGiJ+YJ5hfHKePPgFWg==", + "dev": true + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "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-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 + }, + "pako": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.8.tgz", + "integrity": "sha512-6i0HVbUfcKaTv+EG8ZTr75az7GFXcLYk9UyLEg7Notv/Ma+z/UG3TCoz6GiNeOrn1E/e63I0X/Hpw18jHOTUnA==", + "dev": true + }, + "parallel-transform": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz", + "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", + "dev": true, + "requires": { + "cyclist": "~0.2.2", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "parse-asn1": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.3.tgz", + "integrity": "sha512-VrPoetlz7B/FqjBLD2f5wBVZvsZVLnRUrxVLfRYhGXCODa/NWE4p3Wp+6+aV3ZPL3KM7/OZmxDIwwijD7yuucg==", + "dev": true, + "requires": { + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "dev": true, + "optional": true, + "requires": { + "glob-base": "^0.3.0", + "is-dotfile": "^1.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.0" + } + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", + "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "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 + }, + "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-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "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-to-regexp": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", + "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=", + "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=" + } + } + }, + "pbkdf2": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", + "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", + "dev": true, + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "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" + } + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + } + }, + "pluralize": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", + "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", + "dev": true + }, + "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 + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "dev": true, + "optional": 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": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "dev": true + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "dev": true, + "requires": { + "asap": "~2.0.3" + } + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true + }, + "prop-types": { + "version": "15.6.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.2.tgz", + "integrity": "sha512-3pboPvLiWD7dkI3qf3KbUe6hKFKa52w+AE0VCqECtf+QHAKgOL37tTaNCnuX1nAAQ4ZhyP+kYVKf8rLmJ/feDQ==", + "requires": { + "loose-envify": "^1.3.1", + "object-assign": "^4.1.1" + } + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true + }, + "randomatic": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", + "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", + "dev": true, + "optional": 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, + "optional": 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, + "optional": 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, + "optional": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "randombytes": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", + "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "react": { + "version": "16.7.0", + "resolved": "https://registry.npmjs.org/react/-/react-16.7.0.tgz", + "integrity": "sha512-StCz3QY8lxTb5cl2HJxjwLFOXPIFQp+p+hxQfc8WE0QiLfCtIlKj8/+5tjjKm8uSTlAW+fCPaavGFS06V9Ar3A==", + "dev": true, + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2", + "scheduler": "^0.12.0" + } + }, + "react-addons-create-fragment": { + "version": "15.6.2", + "resolved": "https://registry.npmjs.org/react-addons-create-fragment/-/react-addons-create-fragment-15.6.2.tgz", + "integrity": "sha1-o5TefCx77Na1R1uhuXrEcs58dPg=", + "dev": true, + "requires": { + "fbjs": "^0.8.4", + "loose-envify": "^1.3.1", + "object-assign": "^4.1.0" + } + }, + "react-router": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-4.3.1.tgz", + "integrity": "sha512-yrvL8AogDh2X42Dt9iknk4wF4V8bWREPirFfS9gLU1huk6qK41sg7Z/1S81jjTrGHxa3B8R3J6xIkDAA6CVarg==", + "requires": { + "history": "^4.7.2", + "hoist-non-react-statics": "^2.5.0", + "invariant": "^2.2.4", + "loose-envify": "^1.3.1", + "path-to-regexp": "^1.7.0", + "prop-types": "^15.6.1", + "warning": "^4.0.1" + }, + "dependencies": { + "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" + } + } + } + }, + "react-router-dom": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-4.3.1.tgz", + "integrity": "sha512-c/MlywfxDdCp7EnB7YfPMOfMD3tOtIjrQlj/CKfNMBxdmpJP8xcz5P/UAFn3JbnQCNUxsHyVVqllF9LhgVyFCA==", + "requires": { + "history": "^4.7.2", + "invariant": "^2.2.4", + "loose-envify": "^1.3.1", + "prop-types": "^15.6.1", + "react-router": "^4.3.1", + "warning": "^4.0.1" + }, + "dependencies": { + "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" + } + } + } + }, + "readable-stream": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.0.3", + "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" + } + }, + "regenerate": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.2.tgz", + "integrity": "sha1-0ZQcZ7rUN+G+dkM63Vs4X5WxkmA=", + "dev": true + }, + "regenerator-runtime": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz", + "integrity": "sha512-/aA0kLeRb5N9K0d4fw7ooEbI+xDe+DKD499EQqygGqeS8N3xto15p09uY2xj7ixP81sNPXvRLnAQIqdVStgb1A==" + }, + "regenerator-transform": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", + "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", + "dev": true, + "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, + "optional": 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" + } + }, + "regexp.prototype.flags": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.2.0.tgz", + "integrity": "sha512-ztaw4M1VqgMwl9HlPpOuiYgItcHlunW0He2fE6eNfT6E/CF2FtYi9ofOYe4mKntstYk0Fyh/rDRBdS3AnxjlrA==", + "dev": true, + "requires": { + "define-properties": "^1.1.2" + } + }, + "regexpp": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "dev": true + }, + "regexpu-core": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", + "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", + "dev": true, + "requires": { + "regenerate": "^1.2.1", + "regjsgen": "^0.2.0", + "regjsparser": "^0.1.4" + } + }, + "regjsgen": { + "version": "0.2.0", + "resolved": "http://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", + "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", + "dev": true + }, + "regjsparser": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", + "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "http://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } + } + }, + "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=", + "dev": true + }, + "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" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "require-uncached": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", + "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", + "dev": true, + "requires": { + "caller-path": "^0.1.0", + "resolve-from": "^1.0.0" + } + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + } + } + }, + "resolve-from": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", + "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", + "dev": true + }, + "resolve-pathname": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-2.2.0.tgz", + "integrity": "sha512-bAFz9ld18RzJfddgrO2e/0S2O81710++chRMUxHjXOYKF6jTAMrUNZrEZ1PvV0zlhfjidm08iRPdTLPno1FuRg==" + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "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 + }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + }, + "dependencies": { + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "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" + } + }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "dev": true, + "requires": { + "aproba": "^1.1.1" + } + }, + "rxjs": { + "version": "5.5.12", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz", + "integrity": "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==", + "dev": true, + "requires": { + "symbol-observable": "1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + }, + "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==", + "dev": true + }, + "scheduler": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.12.0.tgz", + "integrity": "sha512-t7MBR28Akcp4Jm+QoR63XgAi9YgCUmgvDHqf5otgAj4QvdoBE4ImCX0ffehefePPG+aitiYHp0g/mW6s4Tp+dw==", + "dev": true, + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "schema-utils": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", + "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0" + } + }, + "semver": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", + "dev": true + }, + "serialize-javascript": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.6.1.tgz", + "integrity": "sha512-A5MOagrPFga4YaKQSWHryl7AXvbQkEqpw4NNYMTNYUNV51bA8ABHgYFpqKx+YFFrw59xMV1qGH1R4AgoNIVgCw==", + "dev": true + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "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" + } + } + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "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=", + "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 + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" + }, + "slice-ansi": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", + "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0" + } + }, + "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" + } + }, + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "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" + } + }, + "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.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "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.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "ssri": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-5.3.0.tgz", + "integrity": "sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.1" + } + }, + "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" + } + } + } + }, + "stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "dev": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "dev": true, + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + }, + "dependencies": { + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true + }, + "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==", + "dev": 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" + } + }, + "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==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "stream-shift": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", + "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "string.prototype.matchall": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-2.0.0.tgz", + "integrity": "sha512-WoZ+B2ypng1dp4iFLF2kmZlwwlE19gmjgKuhL1FJfDgCREWb3ye3SDVHSzLH6bxfnvYmkCxbzkmWcQZHA4P//Q==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.10.0", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "regexp.prototype.flags": "^1.2.0" + } + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "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-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + }, + "sweetalert2": { + "version": "7.33.1", + "resolved": "https://registry.npmjs.org/sweetalert2/-/sweetalert2-7.33.1.tgz", + "integrity": "sha512-69KYtyhtxejFG0HDb8aVhAwbpAWPSTZwaL5vxDHgojErD2KeFxTmRgmkbiLtMC8UdTFXRmvTPtZTF4459MUb7w==" + }, + "symbol-observable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", + "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=", + "dev": true + }, + "table": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/table/-/table-4.0.3.tgz", + "integrity": "sha512-S7rnFITmBH1EnyKcvxBh1LjYeQMmnZtCXSEbHcH6S0NoKit24ZuFO/T1vDcLdYsLQkM188PVVhQmzKIuThNkKg==", + "dev": true, + "requires": { + "ajv": "^6.0.1", + "ajv-keywords": "^3.0.0", + "chalk": "^2.1.0", + "lodash": "^4.17.4", + "slice-ansi": "1.0.0", + "string-width": "^2.1.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" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "tapable": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.1.tgz", + "integrity": "sha512-9I2ydhj8Z9veORCw5PRm4u9uebCn0mcCa6scWoNcbZ6dAtoo2618u9UUzxgmsCOreJpqDDuv61LvwofW7hLcBA==", + "dev": true + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + }, + "dependencies": { + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true + }, + "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==", + "dev": 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" + } + }, + "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==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "timers-browserify": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz", + "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==", + "dev": true, + "requires": { + "setimmediate": "^1.0.4" + } + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "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" + } + } + } + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=" + }, + "tslib": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", + "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", + "dev": true + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "ua-parser-js": { + "version": "0.7.19", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.19.tgz", + "integrity": "sha512-T3PVJ6uz8i0HzPxOF9SWzWAlfN/DavlpQqepn22xgve/5QecC+XMCAtmUNnY7C9StehaV6exjUCI801lOI7QlQ==", + "dev": true + }, + "uglify-es": { + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz", + "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==", + "dev": true, + "requires": { + "commander": "~2.13.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "commander": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz", + "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "uglifyjs-webpack-plugin": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.3.0.tgz", + "integrity": "sha512-ovHIch0AMlxjD/97j9AYovZxG5wnHOPkL7T1GKochBADp/Zwc44pEWNqpKl1Loupp1WhFg7SlYmHZRUfdAacgw==", + "dev": true, + "requires": { + "cacache": "^10.0.4", + "find-cache-dir": "^1.0.0", + "schema-utils": "^0.4.5", + "serialize-javascript": "^1.4.0", + "source-map": "^0.6.1", + "uglify-es": "^3.3.4", + "webpack-sources": "^1.1.0", + "worker-farm": "^1.5.2" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "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-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dev": true, + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.1.tgz", + "integrity": "sha512-n9cU6+gITaVu7VGj1Z8feKMmfAjEAQGhwD9fE3zvpRRa0wEIx8ODYkVGfSc94M2OX00tUFV8wH3zYbm1I8mxFg==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "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 + } + } + }, + "upath": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz", + "integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==", + "dev": true + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "user-home": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", + "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=", + "dev": true + }, + "util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "dev": true, + "requires": { + "inherits": "2.0.3" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "v8-compile-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.2.tgz", + "integrity": "sha512-1wFuMUIM16MDJRCrpbpuEPTUGmM5QMUg0cr3KFwra2XgOgFcPGDQHDh3CszSCD2Zewc/dh/pamNEW8CbfDebUw==", + "dev": true + }, + "v8flags": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz", + "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=", + "dev": true, + "requires": { + "user-home": "^1.1.1" + } + }, + "value-equal": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-0.4.0.tgz", + "integrity": "sha512-x+cYdNnaA3CxvMaTX0INdTCN8m8aF2uY9BvEqmxuYp8bL09cs/kWVQPVGcA35fMktdOsP69IgU7wFj/61dJHEw==" + }, + "vm-browserify": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", + "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", + "dev": true, + "requires": { + "indexof": "0.0.1" + } + }, + "warning": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.2.tgz", + "integrity": "sha512-wbTp09q/9C+jJn4KKJfJfoS6VleK/Dti0yqWSm6KMvJ4MRCXFQNapHuJXutJIrWV0Cf4AhTdeIe4qdKHR1+Hug==", + "requires": { + "loose-envify": "^1.0.0" + } + }, + "watchpack": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", + "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", + "dev": true, + "requires": { + "chokidar": "^2.0.2", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + }, + "dependencies": { + "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" + } + }, + "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" + } + } + } + }, + "chokidar": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz", + "integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.0", + "braces": "^2.3.0", + "fsevents": "^1.2.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "lodash.debounce": "^4.0.8", + "normalize-path": "^2.1.1", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0", + "upath": "^1.0.5" + } + }, + "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" + } + } + } + }, + "fsevents": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.7.tgz", + "integrity": "sha512-Pxm6sI2MeBD7RdD12RYsqaP0nMiwx8eZBXCa6z2L+mRHm2DYrOYwihmhjpkdjUHwQhslWQjRpEgNq4XvBmaAuw==", + "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.5", + "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.1.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.6.0", + "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.3", + "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.24", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "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.3.5", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.2.1", + "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.4", + "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.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.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.5", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.2.0", + "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.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "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.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "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.6.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.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "yallist": { + "version": "3.0.3", + "bundled": true, + "dev": true + } + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.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-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-glob": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "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" + } + }, + "nan": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.12.1.tgz", + "integrity": "sha512-JY7V6lRkStKcKTvHO5NVSQRv+RV+FIL5pvDoLiAtSL9pKlC5x9PKQcZDsq7m4FO4d57mkhC6Z+QhAh3Jdk5JFw==", + "dev": true, + "optional": true + } + } + }, + "webpack": { + "version": "4.16.5", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.16.5.tgz", + "integrity": "sha512-i5cHYHonzSc1zBuwB5MSzW4v9cScZFbprkHK8ZgzPDCRkQXGGpYzPmJhbus5bOrZ0tXTcQp+xyImRSvKb0b+Kw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.5.13", + "@webassemblyjs/helper-module-context": "1.5.13", + "@webassemblyjs/wasm-edit": "1.5.13", + "@webassemblyjs/wasm-opt": "1.5.13", + "@webassemblyjs/wasm-parser": "1.5.13", + "acorn": "^5.6.2", + "acorn-dynamic-import": "^3.0.0", + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0", + "chrome-trace-event": "^1.0.0", + "enhanced-resolve": "^4.1.0", + "eslint-scope": "^4.0.0", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.3.0", + "loader-utils": "^1.1.0", + "memory-fs": "~0.4.1", + "micromatch": "^3.1.8", + "mkdirp": "~0.5.0", + "neo-async": "^2.5.0", + "node-libs-browser": "^2.0.0", + "schema-utils": "^0.4.4", + "tapable": "^1.0.0", + "uglifyjs-webpack-plugin": "^1.2.4", + "watchpack": "^1.5.0", + "webpack-sources": "^1.0.1" + }, + "dependencies": { + "acorn": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", + "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", + "dev": true + }, + "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" + } + } + } + }, + "eslint-scope": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.0.tgz", + "integrity": "sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "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" + } + } + } + }, + "webpack-cli": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.1.0.tgz", + "integrity": "sha512-p5NeKDtYwjZozUWq6kGNs9w+Gtw/CPvyuXjXn2HMdz8Tie+krjEg8oAtonvIyITZdvpF7XG9xDHwscLr2c+ugQ==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "cross-spawn": "^6.0.5", + "enhanced-resolve": "^4.0.0", + "global-modules-path": "^2.1.0", + "import-local": "^1.0.0", + "inquirer": "^6.0.0", + "interpret": "^1.1.0", + "loader-utils": "^1.1.0", + "supports-color": "^5.4.0", + "v8-compile-cache": "^2.0.0", + "yargs": "^12.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.0.0.tgz", + "integrity": "sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w==", + "dev": true + }, + "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.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "external-editor": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.0.3.tgz", + "integrity": "sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA==", + "dev": true, + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + } + }, + "inquirer": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.2.1.tgz", + "integrity": "sha512-088kl3DRT2dLU5riVMKKr1DlImd6X7smDhpXUCkJDCKvTEJeRiXh0G132HG9u5a+6Ylw9plFRY7RuTnwohYSpg==", + "dev": true, + "requires": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.0", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.0", + "figures": "^2.0.0", + "lodash": "^4.17.10", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^6.1.0", + "string-width": "^2.1.0", + "strip-ansi": "^5.0.0", + "through": "^2.3.6" + } + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + }, + "rxjs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", + "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "strip-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.0.0.tgz", + "integrity": "sha512-Uu7gQyZI7J7gn5qLn1Np3G9vcYGTVqB+lFTytnDJv83dd8T22aGH451P3jueT2/QemInJDfxHB5Tde5OzgG1Ow==", + "dev": true, + "requires": { + "ansi-regex": "^4.0.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "webpack-sources": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.3.0.tgz", + "integrity": "sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==", + "dev": true, + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "whatwg-fetch": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz", + "integrity": "sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q==", + "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" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + }, + "worker-farm": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.6.0.tgz", + "integrity": "sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ==", + "dev": true, + "requires": { + "errno": "~0.1.7" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", + "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", + "dev": true, + "requires": { + "mkdirp": "^0.5.1" + } + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + }, + "yargs": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", + "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^11.1.1" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.1.0.tgz", + "integrity": "sha512-NhURkNcrVB+8hNfLuysU8enY5xn2KXphsHBaC2YmRNTZRc7RWusw6apSpdEj3jo4CMb6W9nrF6tTnsJsJeyu6g==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", + "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", + "dev": true + } + } + }, + "yargs-parser": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", + "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } +} From b41c1d768b4fec8f0feade1980a93c3354a8084f Mon Sep 17 00:00:00 2001 From: Loris Admin Date: Wed, 30 Jan 2019 15:45:12 -0500 Subject: [PATCH 12/95] removed unnecessary changes --- htdocs/bootstrap/css/custom-css.css | 39 ----------------------- jsx/Modal.js | 2 -- jsx/Panel.js | 48 +++-------------------------- php/exceptions/Forbidden.class.inc | 27 ---------------- php/exceptions/Invalid.class.inc | 27 ---------------- php/libraries/User.class.inc | 2 +- 6 files changed, 6 insertions(+), 139 deletions(-) delete mode 100644 php/exceptions/Forbidden.class.inc delete mode 100644 php/exceptions/Invalid.class.inc diff --git a/htdocs/bootstrap/css/custom-css.css b/htdocs/bootstrap/css/custom-css.css index d9f685ac331..42cc8ef4df2 100644 --- a/htdocs/bootstrap/css/custom-css.css +++ b/htdocs/bootstrap/css/custom-css.css @@ -240,45 +240,6 @@ html, body { color: #c09853; } -/* Necessary for swal2 while still with bootstrap v3 */ -.swal2-popup { - font-size: 1.6rem -} - -.swal2-container { - z-index: 9999 -} - -.modal { - display: none; - position: fixed; - z-index: 9999; - padding-top: 100px; - left: 0; - top: 0; - width: 100%; - height: 100%; - overflow: auto; - background-color: rgba(0,0,0,0.7); -} - -.modal-content { - position: relative; - background-color: #fefefe; - margin: auto; - padding: 0; - border: 1px solid #888; - width: 700px; - box-shadow: 0 4px 8px 0 rbga(0,0,0,0.2), 0 6px 20px 0 rgba(0,0,0,0.19); - animation-name: animatetop; - animation-duration: 0.4s -} - -@keyframes animatetop { - from {top:-300px; opacity:0} - to {top:0; opacity:1} -} - /* * CSS for Loris footer */ diff --git a/jsx/Modal.js b/jsx/Modal.js index 5724bbf50e0..4e635010285 100644 --- a/jsx/Modal.js +++ b/jsx/Modal.js @@ -150,8 +150,6 @@ class Modal extends Component { ); - - return modal; } } diff --git a/jsx/Panel.js b/jsx/Panel.js index d066d15f768..e253ff56192 100644 --- a/jsx/Panel.js +++ b/jsx/Panel.js @@ -43,55 +43,17 @@ class Panel extends Component { 'glyphicon pull-right glyphicon-chevron-up' ); - let pencilGlyph; - if (this.props.edit) { - pencilGlyph = ( - - ); - } - - let plusGlyph; - if (this.props.add) { - plusGlyph = ( - - ); - } - - let removeGlyph; - if (this.props.cancel) { - removeGlyph = ( - - ); - } - // Add panel header, if title is set const panelHeading = this.props.title ? (
- - {pencilGlyph} - {plusGlyph} - {removeGlyph} {this.props.title} +
) : ''; diff --git a/php/exceptions/Forbidden.class.inc b/php/exceptions/Forbidden.class.inc deleted file mode 100644 index 2e200843c1a..00000000000 --- a/php/exceptions/Forbidden.class.inc +++ /dev/null @@ -1,27 +0,0 @@ - - * @license http://www.gnu.org/licenses/gpl-3.0.txt GPLv3 - * @link https://github.com/aces/Loris - */ - -/** - * The ForbiddenException class. - * - * @category Errors - * @package Loris - * @author Henri Rabalais - * @license http://www.gnu.org/licenses/gpl-3.0.txt GPLv3 - * @link https://github.com/aces/Loris - */ - -class ForbiddenException extends LorisException -{ -} -?> diff --git a/php/exceptions/Invalid.class.inc b/php/exceptions/Invalid.class.inc deleted file mode 100644 index 688830bb07e..00000000000 --- a/php/exceptions/Invalid.class.inc +++ /dev/null @@ -1,27 +0,0 @@ - - * @license http://www.gnu.org/licenses/gpl-3.0.txt GPLv3 - * @link https://github.com/aces/Loris - */ - -/** - * The Invalid class. - * - * @category Errors - * @package Loris - * @author Henri Rabalais - * @license http://www.gnu.org/licenses/gpl-3.0.txt GPLv3 - * @link https://github.com/aces/Loris - */ - -class Invalid extends \LorisException -{ -} -?> diff --git a/php/libraries/User.class.inc b/php/libraries/User.class.inc index 8f3b6ee6d0f..25ee4597236 100644 --- a/php/libraries/User.class.inc +++ b/php/libraries/User.class.inc @@ -608,7 +608,7 @@ class User extends UserPermissions return in_array( $center_id, $this->getCenterIDs(), - false + true ); } From a80f9288ef31fdd22ec5f25a7a19efefc2978483 Mon Sep 17 00:00:00 2001 From: Loris Admin Date: Mon, 4 Feb 2019 17:00:41 -0500 Subject: [PATCH 13/95] updating Biobank --- composer.json | 2 +- composer.lock | 3490 ++++++++++++++++++++++++++++++ jsx/Form.js | 56 +- modules/api/php/module.class.inc | 2 +- package-lock.json | 87 +- php/libraries/Database.class.inc | 1 - src/Api/Endpoints/Login.php | 4 +- 7 files changed, 3568 insertions(+), 74 deletions(-) create mode 100644 composer.lock diff --git a/composer.json b/composer.json index a5e3312775b..b78bac610ad 100644 --- a/composer.json +++ b/composer.json @@ -28,6 +28,6 @@ "psr-4": { "LORIS\\": "src/" }, - "classmap": ["project/libraries", "php/libraries", "php/exceptions", "php/interfaces", "modules/biobank/php"] + "classmap": ["project/libraries", "php/libraries", "php/exceptions", "modules/biobank/php"] } } diff --git a/composer.lock b/composer.lock new file mode 100644 index 00000000000..593bbcb8f5d --- /dev/null +++ b/composer.lock @@ -0,0 +1,3490 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", + "This file is @generated automatically" + ], + "hash": "6c71674f164a6727dfc5983488553cff", + "content-hash": "3a0116e44763b3842b182d8bcfd1af70", + "packages": [ + { + "name": "firebase/php-jwt", + "version": "v3.0.0", + "source": { + "type": "git", + "url": "https://github.com/firebase/php-jwt.git", + "reference": "fa8a06e96526eb7c0eeaa47e4f39be59d21f16e1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/firebase/php-jwt/zipball/fa8a06e96526eb7c0eeaa47e4f39be59d21f16e1", + "reference": "fa8a06e96526eb7c0eeaa47e4f39be59d21f16e1", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Firebase\\JWT\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Neuman Vong", + "email": "neuman+pear@twilio.com", + "role": "Developer" + }, + { + "name": "Anant Narayanan", + "email": "anant@php.net", + "role": "Developer" + } + ], + "description": "A simple library to encode and decode JSON Web Tokens (JWT) in PHP. Should conform to the current spec.", + "homepage": "https://github.com/firebase/php-jwt", + "time": "2015-07-22 18:31:08" + }, + { + "name": "google/recaptcha", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/google/recaptcha.git", + "reference": "e7add3be59211482ecdb942288f52da64a35f61a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/google/recaptcha/zipball/e7add3be59211482ecdb942288f52da64a35f61a", + "reference": "e7add3be59211482ecdb942288f52da64a35f61a", + "shasum": "" + }, + "require": { + "php": ">=5.5" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2.2.20|^2.12", + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^4.8.36|^5.7.27|^6.59|^7" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2.x-dev" + } + }, + "autoload": { + "psr-4": { + "ReCaptcha\\": "src/ReCaptcha" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Client library for reCAPTCHA, a free service that protects websites from spam and abuse.", + "homepage": "https://www.google.com/recaptcha/", + "keywords": [ + "Abuse", + "captcha", + "recaptcha", + "spam" + ], + "time": "2018-08-05 09:31:53" + }, + { + "name": "guzzlehttp/guzzle", + "version": "6.3.3", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "407b0cb880ace85c9b63c5f9551db498cb2d50ba" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/407b0cb880ace85c9b63c5f9551db498cb2d50ba", + "reference": "407b0cb880ace85c9b63c5f9551db498cb2d50ba", + "shasum": "" + }, + "require": { + "guzzlehttp/promises": "^1.0", + "guzzlehttp/psr7": "^1.4", + "php": ">=5.5" + }, + "require-dev": { + "ext-curl": "*", + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0", + "psr/log": "^1.0" + }, + "suggest": { + "psr/log": "Required for using the Log middleware" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "6.3-dev" + } + }, + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "GuzzleHttp\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "Guzzle is a PHP HTTP client library", + "homepage": "http://guzzlephp.org/", + "keywords": [ + "client", + "curl", + "framework", + "http", + "http client", + "rest", + "web service" + ], + "time": "2018-04-22 15:46:56" + }, + { + "name": "guzzlehttp/promises", + "version": "v1.3.1", + "source": { + "type": "git", + "url": "https://github.com/guzzle/promises.git", + "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/promises/zipball/a59da6cf61d80060647ff4d3eb2c03a2bc694646", + "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646", + "shasum": "" + }, + "require": { + "php": ">=5.5.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Promise\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "Guzzle promises library", + "keywords": [ + "promise" + ], + "time": "2016-12-20 10:07:11" + }, + { + "name": "guzzlehttp/psr7", + "version": "1.5.2", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "9f83dded91781a01c63574e387eaa769be769115" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/9f83dded91781a01c63574e387eaa769be769115", + "reference": "9f83dded91781a01c63574e387eaa769be769115", + "shasum": "" + }, + "require": { + "php": ">=5.4.0", + "psr/http-message": "~1.0", + "ralouphie/getallheaders": "^2.0.5" + }, + "provide": { + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.5-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Tobias Schultze", + "homepage": "https://github.com/Tobion" + } + ], + "description": "PSR-7 message implementation that also provides common utility methods", + "keywords": [ + "http", + "message", + "psr-7", + "request", + "response", + "stream", + "uri", + "url" + ], + "time": "2018-12-04 20:46:45" + }, + { + "name": "php-http/guzzle6-adapter", + "version": "v2.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-http/guzzle6-adapter.git", + "reference": "6074a4b1f4d5c21061b70bab3b8ad484282fe31f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/guzzle6-adapter/zipball/6074a4b1f4d5c21061b70bab3b8ad484282fe31f", + "reference": "6074a4b1f4d5c21061b70bab3b8ad484282fe31f", + "shasum": "" + }, + "require": { + "guzzlehttp/guzzle": "^6.0", + "php": "^7.1", + "php-http/httplug": "^2.0", + "psr/http-client": "^1.0" + }, + "provide": { + "php-http/async-client-implementation": "1.0", + "php-http/client-implementation": "1.0", + "psr/http-client-implementation": "1.0" + }, + "require-dev": { + "ext-curl": "*", + "php-http/client-integration-tests": "^2.0", + "phpunit/phpunit": "^7.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Http\\Adapter\\Guzzle6\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + }, + { + "name": "David de Boer", + "email": "david@ddeboer.nl" + } + ], + "description": "Guzzle 6 HTTP Adapter", + "homepage": "http://httplug.io", + "keywords": [ + "Guzzle", + "http" + ], + "time": "2018-12-16 14:44:03" + }, + { + "name": "php-http/httplug", + "version": "v2.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-http/httplug.git", + "reference": "b3842537338c949f2469557ef4ad4bdc47b58603" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/httplug/zipball/b3842537338c949f2469557ef4ad4bdc47b58603", + "reference": "b3842537338c949f2469557ef4ad4bdc47b58603", + "shasum": "" + }, + "require": { + "php": "^7.0", + "php-http/promise": "^1.0", + "psr/http-client": "^1.0", + "psr/http-message": "^1.0" + }, + "require-dev": { + "henrikbjorn/phpspec-code-coverage": "^1.0", + "phpspec/phpspec": "^2.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Http\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Eric GELOEN", + "email": "geloen.eric@gmail.com" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + } + ], + "description": "HTTPlug, the HTTP client abstraction for PHP", + "homepage": "http://httplug.io", + "keywords": [ + "client", + "http" + ], + "time": "2018-10-31 09:14:44" + }, + { + "name": "php-http/promise", + "version": "v1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-http/promise.git", + "reference": "dc494cdc9d7160b9a09bd5573272195242ce7980" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/promise/zipball/dc494cdc9d7160b9a09bd5573272195242ce7980", + "reference": "dc494cdc9d7160b9a09bd5573272195242ce7980", + "shasum": "" + }, + "require-dev": { + "henrikbjorn/phpspec-code-coverage": "^1.0", + "phpspec/phpspec": "^2.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "autoload": { + "psr-4": { + "Http\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + }, + { + "name": "Joel Wurtz", + "email": "joel.wurtz@gmail.com" + } + ], + "description": "Promise used for asynchronous HTTP requests", + "homepage": "http://httplug.io", + "keywords": [ + "promise" + ], + "time": "2016-01-26 13:27:02" + }, + { + "name": "psr/http-client", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-client.git", + "reference": "496a823ef742b632934724bf769560c2a5c7c44e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/496a823ef742b632934724bf769560c2a5c7c44e", + "reference": "496a823ef742b632934724bf769560c2a5c7c44e", + "shasum": "" + }, + "require": { + "php": "^7.0", + "psr/http-message": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP clients", + "homepage": "https://github.com/php-fig/http-client", + "keywords": [ + "http", + "http-client", + "psr", + "psr-18" + ], + "time": "2018-10-30 23:29:13" + }, + { + "name": "psr/http-message", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "time": "2016-08-06 14:39:51" + }, + { + "name": "psr/http-server-handler", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-server-handler.git", + "reference": "aff2f80e33b7f026ec96bb42f63242dc50ffcae7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-server-handler/zipball/aff2f80e33b7f026ec96bb42f63242dc50ffcae7", + "reference": "aff2f80e33b7f026ec96bb42f63242dc50ffcae7", + "shasum": "" + }, + "require": { + "php": ">=7.0", + "psr/http-message": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Server\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP server-side request handler", + "keywords": [ + "handler", + "http", + "http-interop", + "psr", + "psr-15", + "psr-7", + "request", + "response", + "server" + ], + "time": "2018-10-30 16:46:14" + }, + { + "name": "psr/http-server-middleware", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-server-middleware.git", + "reference": "2296f45510945530b9dceb8bcedb5cb84d40c5f5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-server-middleware/zipball/2296f45510945530b9dceb8bcedb5cb84d40c5f5", + "reference": "2296f45510945530b9dceb8bcedb5cb84d40c5f5", + "shasum": "" + }, + "require": { + "php": ">=7.0", + "psr/http-message": "^1.0", + "psr/http-server-handler": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Server\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP server-side middleware", + "keywords": [ + "http", + "http-interop", + "middleware", + "psr", + "psr-15", + "psr-7", + "request", + "response" + ], + "time": "2018-10-30 17:12:04" + }, + { + "name": "ralouphie/getallheaders", + "version": "2.0.5", + "source": { + "type": "git", + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "5601c8a83fbba7ef674a7369456d12f1e0d0eafa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/5601c8a83fbba7ef674a7369456d12f1e0d0eafa", + "reference": "5601c8a83fbba7ef674a7369456d12f1e0d0eafa", + "shasum": "" + }, + "require": { + "php": ">=5.3" + }, + "require-dev": { + "phpunit/phpunit": "~3.7.0", + "satooshi/php-coveralls": ">=1.0" + }, + "type": "library", + "autoload": { + "files": [ + "src/getallheaders.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" + } + ], + "description": "A polyfill for getallheaders.", + "time": "2016-02-11 07:05:27" + }, + { + "name": "smarty/smarty", + "version": "v3.1.33", + "source": { + "type": "git", + "url": "https://github.com/smarty-php/smarty.git", + "reference": "dd55b23121e55a3b4f1af90a707a6c4e5969530f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/smarty-php/smarty/zipball/dd55b23121e55a3b4f1af90a707a6c4e5969530f", + "reference": "dd55b23121e55a3b4f1af90a707a6c4e5969530f", + "shasum": "" + }, + "require": { + "php": ">=5.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1.x-dev" + } + }, + "autoload": { + "files": [ + "libs/bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-3.0" + ], + "authors": [ + { + "name": "Monte Ohrt", + "email": "monte@ohrt.com" + }, + { + "name": "Uwe Tews", + "email": "uwe.tews@googlemail.com" + }, + { + "name": "Rodney Rehm", + "email": "rodney.rehm@medialize.de" + } + ], + "description": "Smarty - the compiling PHP template engine", + "homepage": "http://www.smarty.net", + "keywords": [ + "templating" + ], + "time": "2018-09-12 20:54:16" + }, + { + "name": "zendframework/zend-diactoros", + "version": "1.8.6", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-diactoros.git", + "reference": "20da13beba0dde8fb648be3cc19765732790f46e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-diactoros/zipball/20da13beba0dde8fb648be3cc19765732790f46e", + "reference": "20da13beba0dde8fb648be3cc19765732790f46e", + "shasum": "" + }, + "require": { + "php": "^5.6 || ^7.0", + "psr/http-message": "^1.0" + }, + "provide": { + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "ext-dom": "*", + "ext-libxml": "*", + "php-http/psr7-integration-tests": "dev-master", + "phpunit/phpunit": "^5.7.16 || ^6.0.8 || ^7.2.7", + "zendframework/zend-coding-standard": "~1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.8.x-dev", + "dev-develop": "1.9.x-dev", + "dev-release-2.0": "2.0.x-dev" + } + }, + "autoload": { + "files": [ + "src/functions/create_uploaded_file.php", + "src/functions/marshal_headers_from_sapi.php", + "src/functions/marshal_method_from_sapi.php", + "src/functions/marshal_protocol_version_from_sapi.php", + "src/functions/marshal_uri_from_sapi.php", + "src/functions/normalize_server.php", + "src/functions/normalize_uploaded_files.php", + "src/functions/parse_cookie_header.php" + ], + "psr-4": { + "Zend\\Diactoros\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-2-Clause" + ], + "description": "PSR HTTP Message implementations", + "homepage": "https://github.com/zendframework/zend-diactoros", + "keywords": [ + "http", + "psr", + "psr-7" + ], + "time": "2018-09-05 19:29:37" + } + ], + "packages-dev": [ + { + "name": "composer/semver", + "version": "1.4.2", + "source": { + "type": "git", + "url": "https://github.com/composer/semver.git", + "reference": "c7cb9a2095a074d131b65a8a0cd294479d785573" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/semver/zipball/c7cb9a2095a074d131b65a8a0cd294479d785573", + "reference": "c7cb9a2095a074d131b65a8a0cd294479d785573", + "shasum": "" + }, + "require": { + "php": "^5.3.2 || ^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.5 || ^5.0.5", + "phpunit/phpunit-mock-objects": "2.3.0 || ^3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Semver\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nils Adermann", + "email": "naderman@naderman.de", + "homepage": "http://www.naderman.de" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + }, + { + "name": "Rob Bast", + "email": "rob.bast@gmail.com", + "homepage": "http://robbast.nl" + } + ], + "description": "Semver library that offers utilities, version constraint parsing and validation.", + "keywords": [ + "semantic", + "semver", + "validation", + "versioning" + ], + "time": "2016-08-30 16:08:34" + }, + { + "name": "composer/xdebug-handler", + "version": "1.3.2", + "source": { + "type": "git", + "url": "https://github.com/composer/xdebug-handler.git", + "reference": "d17708133b6c276d6e42ef887a877866b909d892" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/d17708133b6c276d6e42ef887a877866b909d892", + "reference": "d17708133b6c276d6e42ef887a877866b909d892", + "shasum": "" + }, + "require": { + "php": "^5.3.2 || ^7.0", + "psr/log": "^1.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Composer\\XdebugHandler\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "John Stevenson", + "email": "john-stevenson@blueyonder.co.uk" + } + ], + "description": "Restarts a process without xdebug.", + "keywords": [ + "Xdebug", + "performance" + ], + "time": "2019-01-28 20:25:53" + }, + { + "name": "doctrine/instantiator", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/instantiator.git", + "reference": "185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda", + "reference": "185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda", + "shasum": "" + }, + "require": { + "php": "^7.1" + }, + "require-dev": { + "athletic/athletic": "~0.1.8", + "ext-pdo": "*", + "ext-phar": "*", + "phpunit/phpunit": "^6.2.3", + "squizlabs/php_codesniffer": "^3.0.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "http://ocramius.github.com/" + } + ], + "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", + "homepage": "https://github.com/doctrine/instantiator", + "keywords": [ + "constructor", + "instantiate" + ], + "time": "2017-07-22 11:58:36" + }, + { + "name": "facebook/webdriver", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/facebook/php-webdriver.git", + "reference": "575600dfcfebad49fd0fc59d781b0696462a1f4e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/facebook/php-webdriver/zipball/575600dfcfebad49fd0fc59d781b0696462a1f4e", + "reference": "575600dfcfebad49fd0fc59d781b0696462a1f4e", + "shasum": "" + }, + "require": { + "php": ">=5.3.19" + }, + "require-dev": { + "phpdocumentor/phpdocumentor": "2.*", + "phpunit/phpunit": "3.7.*" + }, + "type": "library", + "autoload": { + "classmap": [ + "lib/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "description": "A php client for WebDriver", + "homepage": "https://github.com/facebook/php-webdriver", + "keywords": [ + "facebook", + "php", + "selenium", + "webdriver" + ], + "time": "2015-06-09 17:09:16" + }, + { + "name": "felixfbecker/advanced-json-rpc", + "version": "v3.0.3", + "source": { + "type": "git", + "url": "https://github.com/felixfbecker/php-advanced-json-rpc.git", + "reference": "241c470695366e7b83672be04ea0e64d8085a551" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/felixfbecker/php-advanced-json-rpc/zipball/241c470695366e7b83672be04ea0e64d8085a551", + "reference": "241c470695366e7b83672be04ea0e64d8085a551", + "shasum": "" + }, + "require": { + "netresearch/jsonmapper": "^1.0", + "php": ">=7.0", + "phpdocumentor/reflection-docblock": "^4.0.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.0.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "AdvancedJsonRpc\\": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "ISC" + ], + "authors": [ + { + "name": "Felix Becker", + "email": "felix.b@outlook.com" + } + ], + "description": "A more advanced JSONRPC implementation", + "time": "2018-09-10 08:58:41" + }, + { + "name": "microsoft/tolerant-php-parser", + "version": "v0.0.16", + "source": { + "type": "git", + "url": "https://github.com/Microsoft/tolerant-php-parser.git", + "reference": "b662587eb797685a98239d1d52d25168a03fdfb2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Microsoft/tolerant-php-parser/zipball/b662587eb797685a98239d1d52d25168a03fdfb2", + "reference": "b662587eb797685a98239d1d52d25168a03fdfb2", + "shasum": "" + }, + "require": { + "php": ">=7.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Microsoft\\PhpParser\\": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Rob Lourens", + "email": "roblou@microsoft.com" + } + ], + "description": "Tolerant PHP-to-AST parser designed for IDE usage scenarios", + "time": "2018-12-29 00:31:32" + }, + { + "name": "myclabs/deep-copy", + "version": "1.8.1", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "3e01bdad3e18354c3dce54466b7fbe33a9f9f7f8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3e01bdad3e18354c3dce54466b7fbe33a9f9f7f8", + "reference": "3e01bdad3e18354c3dce54466b7fbe33a9f9f7f8", + "shasum": "" + }, + "require": { + "php": "^7.1" + }, + "replace": { + "myclabs/deep-copy": "self.version" + }, + "require-dev": { + "doctrine/collections": "^1.0", + "doctrine/common": "^2.6", + "phpunit/phpunit": "^7.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" + }, + "files": [ + "src/DeepCopy/deep_copy.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Create deep copies (clones) of your objects", + "keywords": [ + "clone", + "copy", + "duplicate", + "object", + "object graph" + ], + "time": "2018-06-11 23:09:50" + }, + { + "name": "netresearch/jsonmapper", + "version": "v1.4.0", + "source": { + "type": "git", + "url": "https://github.com/cweiske/jsonmapper.git", + "reference": "3868fe1128ce1169228acdb623359dca74db5ef3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/cweiske/jsonmapper/zipball/3868fe1128ce1169228acdb623359dca74db5ef3", + "reference": "3868fe1128ce1169228acdb623359dca74db5ef3", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "phpunit/phpunit": "~4.8.35 || ~5.7 || ~6.4", + "squizlabs/php_codesniffer": "~1.5" + }, + "type": "library", + "autoload": { + "psr-0": { + "JsonMapper": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "OSL-3.0" + ], + "authors": [ + { + "name": "Christian Weiske", + "email": "cweiske@cweiske.de", + "homepage": "http://github.com/cweiske/jsonmapper/", + "role": "Developer" + } + ], + "description": "Map nested JSON structures onto PHP classes", + "time": "2017-11-28 21:30:01" + }, + { + "name": "pdepend/pdepend", + "version": "2.5.2", + "source": { + "type": "git", + "url": "https://github.com/pdepend/pdepend.git", + "reference": "9daf26d0368d4a12bed1cacae1a9f3a6f0adf239" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pdepend/pdepend/zipball/9daf26d0368d4a12bed1cacae1a9f3a6f0adf239", + "reference": "9daf26d0368d4a12bed1cacae1a9f3a6f0adf239", + "shasum": "" + }, + "require": { + "php": ">=5.3.7", + "symfony/config": "^2.3.0|^3|^4", + "symfony/dependency-injection": "^2.3.0|^3|^4", + "symfony/filesystem": "^2.3.0|^3|^4" + }, + "require-dev": { + "phpunit/phpunit": "^4.8|^5.7", + "squizlabs/php_codesniffer": "^2.0.0" + }, + "bin": [ + "src/bin/pdepend" + ], + "type": "library", + "autoload": { + "psr-4": { + "PDepend\\": "src/main/php/PDepend" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Official version of pdepend to be handled with Composer", + "time": "2017-12-13 13:21:38" + }, + { + "name": "phan/phan", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/phan/phan.git", + "reference": "8f8a01d2bb547675a758e19f11916909d1b85279" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phan/phan/zipball/8f8a01d2bb547675a758e19f11916909d1b85279", + "reference": "8f8a01d2bb547675a758e19f11916909d1b85279", + "shasum": "" + }, + "require": { + "composer/semver": "^1.4", + "composer/xdebug-handler": "^1.3", + "ext-filter": "*", + "ext-json": "*", + "felixfbecker/advanced-json-rpc": "^3.0.3", + "microsoft/tolerant-php-parser": "0.0.16", + "php": "^7.0.0", + "sabre/event": "^5.0", + "symfony/console": "^2.3|^3.0|~4.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.3.0" + }, + "suggest": { + "ext-ast": "Needed for parsing ASTs (unless --use-fallback-parser is used). php-ast ^0.1.5|^1.0.0 is needed.", + "ext-tokenizer": "Needed for non-AST support and file/line-based suppressions." + }, + "bin": [ + "phan", + "phan_client", + "tocheckstyle" + ], + "type": "project", + "autoload": { + "psr-4": { + "Phan\\": "src/Phan" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Rasmus Lerdorf" + }, + { + "name": "Andrew S. Morrison" + }, + { + "name": "Tyson Andre" + } + ], + "description": "A static analyzer for PHP", + "keywords": [ + "analyzer", + "php", + "static" + ], + "time": "2019-01-18 14:40:09" + }, + { + "name": "phar-io/manifest", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/phar-io/manifest.git", + "reference": "2df402786ab5368a0169091f61a7c1e0eb6852d0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/2df402786ab5368a0169091f61a7c1e0eb6852d0", + "reference": "2df402786ab5368a0169091f61a7c1e0eb6852d0", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-phar": "*", + "phar-io/version": "^1.0.1", + "php": "^5.6 || ^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", + "time": "2017-03-05 18:14:27" + }, + { + "name": "phar-io/version", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/phar-io/version.git", + "reference": "a70c0ced4be299a63d32fa96d9281d03e94041df" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/version/zipball/a70c0ced4be299a63d32fa96d9281d03e94041df", + "reference": "a70c0ced4be299a63d32fa96d9281d03e94041df", + "shasum": "" + }, + "require": { + "php": "^5.6 || ^7.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Library for handling version information and constraints", + "time": "2017-03-05 17:38:23" + }, + { + "name": "phpdocumentor/reflection-common", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionCommon.git", + "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6", + "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6", + "shasum": "" + }, + "require": { + "php": ">=5.5" + }, + "require-dev": { + "phpunit/phpunit": "^4.6" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": [ + "src" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jaap van Otterdijk", + "email": "opensource@ijaap.nl" + } + ], + "description": "Common reflection classes used by phpdocumentor to reflect the code structure", + "homepage": "http://www.phpdoc.org", + "keywords": [ + "FQSEN", + "phpDocumentor", + "phpdoc", + "reflection", + "static analysis" + ], + "time": "2017-09-11 18:02:19" + }, + { + "name": "phpdocumentor/reflection-docblock", + "version": "4.3.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", + "reference": "94fd0001232e47129dd3504189fa1c7225010d08" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/94fd0001232e47129dd3504189fa1c7225010d08", + "reference": "94fd0001232e47129dd3504189fa1c7225010d08", + "shasum": "" + }, + "require": { + "php": "^7.0", + "phpdocumentor/reflection-common": "^1.0.0", + "phpdocumentor/type-resolver": "^0.4.0", + "webmozart/assert": "^1.0" + }, + "require-dev": { + "doctrine/instantiator": "~1.0.5", + "mockery/mockery": "^1.0", + "phpunit/phpunit": "^6.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + } + ], + "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", + "time": "2017-11-30 07:14:17" + }, + { + "name": "phpdocumentor/type-resolver", + "version": "0.4.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/TypeResolver.git", + "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/9c977708995954784726e25d0cd1dddf4e65b0f7", + "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7", + "shasum": "" + }, + "require": { + "php": "^5.5 || ^7.0", + "phpdocumentor/reflection-common": "^1.0" + }, + "require-dev": { + "mockery/mockery": "^0.9.4", + "phpunit/phpunit": "^5.2||^4.8.24" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + } + ], + "time": "2017-07-14 14:27:02" + }, + { + "name": "phpmd/phpmd", + "version": "2.6.0", + "source": { + "type": "git", + "url": "https://github.com/phpmd/phpmd.git", + "reference": "4e9924b2c157a3eb64395460fcf56b31badc8374" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpmd/phpmd/zipball/4e9924b2c157a3eb64395460fcf56b31badc8374", + "reference": "4e9924b2c157a3eb64395460fcf56b31badc8374", + "shasum": "" + }, + "require": { + "ext-xml": "*", + "pdepend/pdepend": "^2.5", + "php": ">=5.3.9" + }, + "require-dev": { + "phpunit/phpunit": "^4.0", + "squizlabs/php_codesniffer": "^2.0" + }, + "bin": [ + "src/bin/phpmd" + ], + "type": "project", + "autoload": { + "psr-0": { + "PHPMD\\": "src/main/php" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Manuel Pichler", + "email": "github@manuel-pichler.de", + "homepage": "https://github.com/manuelpichler", + "role": "Project Founder" + }, + { + "name": "Other contributors", + "homepage": "https://github.com/phpmd/phpmd/graphs/contributors", + "role": "Contributors" + }, + { + "name": "Marc Würth", + "email": "ravage@bluewin.ch", + "homepage": "https://github.com/ravage84", + "role": "Project Maintainer" + } + ], + "description": "PHPMD is a spin-off project of PHP Depend and aims to be a PHP equivalent of the well known Java tool PMD.", + "homepage": "http://phpmd.org/", + "keywords": [ + "mess detection", + "mess detector", + "pdepend", + "phpmd", + "pmd" + ], + "time": "2017-01-20 14:41:10" + }, + { + "name": "phpspec/prophecy", + "version": "1.8.0", + "source": { + "type": "git", + "url": "https://github.com/phpspec/prophecy.git", + "reference": "4ba436b55987b4bf311cb7c6ba82aa528aac0a06" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/4ba436b55987b4bf311cb7c6ba82aa528aac0a06", + "reference": "4ba436b55987b4bf311cb7c6ba82aa528aac0a06", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.0.2", + "php": "^5.3|^7.0", + "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0", + "sebastian/comparator": "^1.1|^2.0|^3.0", + "sebastian/recursion-context": "^1.0|^2.0|^3.0" + }, + "require-dev": { + "phpspec/phpspec": "^2.5|^3.2", + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5 || ^7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.8.x-dev" + } + }, + "autoload": { + "psr-0": { + "Prophecy\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Konstantin Kudryashov", + "email": "ever.zet@gmail.com", + "homepage": "http://everzet.com" + }, + { + "name": "Marcello Duarte", + "email": "marcello.duarte@gmail.com" + } + ], + "description": "Highly opinionated mocking framework for PHP 5.3+", + "homepage": "https://github.com/phpspec/prophecy", + "keywords": [ + "Double", + "Dummy", + "fake", + "mock", + "spy", + "stub" + ], + "time": "2018-08-05 17:53:17" + }, + { + "name": "phpunit/dbunit", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/dbunit.git", + "reference": "0fa4329e490480ab957fe7b1185ea0996ca11f44" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/dbunit/zipball/0fa4329e490480ab957fe7b1185ea0996ca11f44", + "reference": "0fa4329e490480ab957fe7b1185ea0996ca11f44", + "shasum": "" + }, + "require": { + "ext-pdo": "*", + "ext-simplexml": "*", + "php": "^7.0", + "phpunit/phpunit": "^6.0", + "symfony/yaml": "^3.0 || ^4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "PHPUnit extension for database interaction testing", + "homepage": "https://github.com/sebastianbergmann/dbunit/", + "keywords": [ + "database", + "testing", + "xunit" + ], + "abandoned": true, + "time": "2018-01-23 13:32:26" + }, + { + "name": "phpunit/php-code-coverage", + "version": "5.3.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "c89677919c5dd6d3b3852f230a663118762218ac" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/c89677919c5dd6d3b3852f230a663118762218ac", + "reference": "c89677919c5dd6d3b3852f230a663118762218ac", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-xmlwriter": "*", + "php": "^7.0", + "phpunit/php-file-iterator": "^1.4.2", + "phpunit/php-text-template": "^1.2.1", + "phpunit/php-token-stream": "^2.0.1", + "sebastian/code-unit-reverse-lookup": "^1.0.1", + "sebastian/environment": "^3.0", + "sebastian/version": "^2.0.1", + "theseer/tokenizer": "^1.1" + }, + "require-dev": { + "phpunit/phpunit": "^6.0" + }, + "suggest": { + "ext-xdebug": "^2.5.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.3.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "keywords": [ + "coverage", + "testing", + "xunit" + ], + "time": "2018-04-06 15:36:58" + }, + { + "name": "phpunit/php-file-iterator", + "version": "1.4.5", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "730b01bc3e867237eaac355e06a36b85dd93a8b4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/730b01bc3e867237eaac355e06a36b85dd93a8b4", + "reference": "730b01bc3e867237eaac355e06a36b85dd93a8b4", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "keywords": [ + "filesystem", + "iterator" + ], + "time": "2017-11-27 13:52:08" + }, + { + "name": "phpunit/php-text-template", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", + "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], + "time": "2015-06-21 13:50:34" + }, + { + "name": "phpunit/php-timer", + "version": "1.0.9", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3dcf38ca72b158baf0bc245e9184d3fdffa9c46f", + "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f", + "shasum": "" + }, + "require": { + "php": "^5.3.3 || ^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", + "keywords": [ + "timer" + ], + "time": "2017-02-26 11:10:40" + }, + { + "name": "phpunit/php-token-stream", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-token-stream.git", + "reference": "791198a2c6254db10131eecfe8c06670700904db" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/791198a2c6254db10131eecfe8c06670700904db", + "reference": "791198a2c6254db10131eecfe8c06670700904db", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": "^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.2.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Wrapper around PHP's tokenizer extension.", + "homepage": "https://github.com/sebastianbergmann/php-token-stream/", + "keywords": [ + "tokenizer" + ], + "time": "2017-11-27 05:48:46" + }, + { + "name": "phpunit/phpunit", + "version": "6.5.13", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "0973426fb012359b2f18d3bd1e90ef1172839693" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/0973426fb012359b2f18d3bd1e90ef1172839693", + "reference": "0973426fb012359b2f18d3bd1e90ef1172839693", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", + "myclabs/deep-copy": "^1.6.1", + "phar-io/manifest": "^1.0.1", + "phar-io/version": "^1.0", + "php": "^7.0", + "phpspec/prophecy": "^1.7", + "phpunit/php-code-coverage": "^5.3", + "phpunit/php-file-iterator": "^1.4.3", + "phpunit/php-text-template": "^1.2.1", + "phpunit/php-timer": "^1.0.9", + "phpunit/phpunit-mock-objects": "^5.0.9", + "sebastian/comparator": "^2.1", + "sebastian/diff": "^2.0", + "sebastian/environment": "^3.1", + "sebastian/exporter": "^3.1", + "sebastian/global-state": "^2.0", + "sebastian/object-enumerator": "^3.0.3", + "sebastian/resource-operations": "^1.0", + "sebastian/version": "^2.0.1" + }, + "conflict": { + "phpdocumentor/reflection-docblock": "3.0.2", + "phpunit/dbunit": "<3.0" + }, + "require-dev": { + "ext-pdo": "*" + }, + "suggest": { + "ext-xdebug": "*", + "phpunit/php-invoker": "^1.1" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "6.5.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", + "keywords": [ + "phpunit", + "testing", + "xunit" + ], + "time": "2018-09-08 15:10:43" + }, + { + "name": "phpunit/phpunit-mock-objects", + "version": "5.0.10", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", + "reference": "cd1cf05c553ecfec36b170070573e540b67d3f1f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/cd1cf05c553ecfec36b170070573e540b67d3f1f", + "reference": "cd1cf05c553ecfec36b170070573e540b67d3f1f", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.0.5", + "php": "^7.0", + "phpunit/php-text-template": "^1.2.1", + "sebastian/exporter": "^3.1" + }, + "conflict": { + "phpunit/phpunit": "<6.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.5.11" + }, + "suggest": { + "ext-soap": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Mock Object library for PHPUnit", + "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/", + "keywords": [ + "mock", + "xunit" + ], + "time": "2018-08-09 05:50:03" + }, + { + "name": "psr/container", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f", + "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "time": "2017-02-14 16:28:37" + }, + { + "name": "psr/log", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd", + "reference": "6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "Psr/Log/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "time": "2018-11-20 15:27:04" + }, + { + "name": "sabre/event", + "version": "5.0.3", + "source": { + "type": "git", + "url": "https://github.com/sabre-io/event.git", + "reference": "f5cf802d240df1257866d8813282b98aee3bc548" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sabre-io/event/zipball/f5cf802d240df1257866d8813282b98aee3bc548", + "reference": "f5cf802d240df1257866d8813282b98aee3bc548", + "shasum": "" + }, + "require": { + "php": ">=7.0" + }, + "require-dev": { + "phpunit/phpunit": ">=6", + "sabre/cs": "~1.0.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Sabre\\Event\\": "lib/" + }, + "files": [ + "lib/coroutine.php", + "lib/Loop/functions.php", + "lib/Promise/functions.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Evert Pot", + "email": "me@evertpot.com", + "homepage": "http://evertpot.com/", + "role": "Developer" + } + ], + "description": "sabre/event is a library for lightweight event-based programming", + "homepage": "http://sabre.io/event/", + "keywords": [ + "EventEmitter", + "async", + "coroutine", + "eventloop", + "events", + "hooks", + "plugin", + "promise", + "reactor", + "signal" + ], + "time": "2018-03-05 13:55:47" + }, + { + "name": "sebastian/code-unit-reverse-lookup", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", + "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", + "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", + "shasum": "" + }, + "require": { + "php": "^5.6 || ^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^5.7 || ^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Looks up which function or method a line of code belongs to", + "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", + "time": "2017-03-04 06:30:41" + }, + { + "name": "sebastian/comparator", + "version": "2.1.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "34369daee48eafb2651bea869b4b15d75ccc35f9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/34369daee48eafb2651bea869b4b15d75ccc35f9", + "reference": "34369daee48eafb2651bea869b4b15d75ccc35f9", + "shasum": "" + }, + "require": { + "php": "^7.0", + "sebastian/diff": "^2.0 || ^3.0", + "sebastian/exporter": "^3.1" + }, + "require-dev": { + "phpunit/phpunit": "^6.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides the functionality to compare PHP values for equality", + "homepage": "https://github.com/sebastianbergmann/comparator", + "keywords": [ + "comparator", + "compare", + "equality" + ], + "time": "2018-02-01 13:46:46" + }, + { + "name": "sebastian/diff", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "347c1d8b49c5c3ee30c7040ea6fc446790e6bddd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/347c1d8b49c5c3ee30c7040ea6fc446790e6bddd", + "reference": "347c1d8b49c5c3ee30c7040ea6fc446790e6bddd", + "shasum": "" + }, + "require": { + "php": "^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", + "keywords": [ + "diff" + ], + "time": "2017-08-03 08:09:46" + }, + { + "name": "sebastian/environment", + "version": "3.1.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "cd0871b3975fb7fc44d11314fd1ee20925fce4f5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/cd0871b3975fb7fc44d11314fd1ee20925fce4f5", + "reference": "cd0871b3975fb7fc44d11314fd1ee20925fce4f5", + "shasum": "" + }, + "require": { + "php": "^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "http://www.github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], + "time": "2017-07-01 08:51:00" + }, + { + "name": "sebastian/exporter", + "version": "3.1.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "234199f4528de6d12aaa58b612e98f7d36adb937" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/234199f4528de6d12aaa58b612e98f7d36adb937", + "reference": "234199f4528de6d12aaa58b612e98f7d36adb937", + "shasum": "" + }, + "require": { + "php": "^7.0", + "sebastian/recursion-context": "^3.0" + }, + "require-dev": { + "ext-mbstring": "*", + "phpunit/phpunit": "^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "http://www.github.com/sebastianbergmann/exporter", + "keywords": [ + "export", + "exporter" + ], + "time": "2017-04-03 13:19:02" + }, + { + "name": "sebastian/global-state", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4", + "reference": "e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4", + "shasum": "" + }, + "require": { + "php": "^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.0" + }, + "suggest": { + "ext-uopz": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Snapshotting of global state", + "homepage": "http://www.github.com/sebastianbergmann/global-state", + "keywords": [ + "global state" + ], + "time": "2017-04-27 15:39:26" + }, + { + "name": "sebastian/object-enumerator", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/7cfd9e65d11ffb5af41198476395774d4c8a84c5", + "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5", + "shasum": "" + }, + "require": { + "php": "^7.0", + "sebastian/object-reflector": "^1.1.1", + "sebastian/recursion-context": "^3.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Traverses array structures and object graphs to enumerate all referenced objects", + "homepage": "https://github.com/sebastianbergmann/object-enumerator/", + "time": "2017-08-03 12:35:26" + }, + { + "name": "sebastian/object-reflector", + "version": "1.1.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-reflector.git", + "reference": "773f97c67f28de00d397be301821b06708fca0be" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/773f97c67f28de00d397be301821b06708fca0be", + "reference": "773f97c67f28de00d397be301821b06708fca0be", + "shasum": "" + }, + "require": { + "php": "^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Allows reflection of object attributes, including inherited and non-public ones", + "homepage": "https://github.com/sebastianbergmann/object-reflector/", + "time": "2017-03-29 09:07:27" + }, + { + "name": "sebastian/recursion-context", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", + "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", + "shasum": "" + }, + "require": { + "php": "^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides functionality to recursively process PHP variables", + "homepage": "http://www.github.com/sebastianbergmann/recursion-context", + "time": "2017-03-03 06:23:57" + }, + { + "name": "sebastian/resource-operations", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/resource-operations.git", + "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/ce990bb21759f94aeafd30209e8cfcdfa8bc3f52", + "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52", + "shasum": "" + }, + "require": { + "php": ">=5.6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides a list of PHP built-in functions that operate on resources", + "homepage": "https://www.github.com/sebastianbergmann/resource-operations", + "time": "2015-07-28 20:34:47" + }, + { + "name": "sebastian/version", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019", + "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", + "time": "2016-10-03 07:35:21" + }, + { + "name": "squizlabs/php_codesniffer", + "version": "3.1.0", + "source": { + "type": "git", + "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", + "reference": "3c2d0a0fe39684ba0c1eb842a6a775d0b938d699" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/3c2d0a0fe39684ba0c1eb842a6a775d0b938d699", + "reference": "3c2d0a0fe39684ba0c1eb842a6a775d0b938d699", + "shasum": "" + }, + "require": { + "ext-simplexml": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": ">=5.4.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0" + }, + "bin": [ + "bin/phpcs", + "bin/phpcbf" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Greg Sherwood", + "role": "lead" + } + ], + "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", + "homepage": "http://www.squizlabs.com/php-codesniffer", + "keywords": [ + "phpcs", + "standards" + ], + "time": "2017-09-19 22:47:14" + }, + { + "name": "symfony/config", + "version": "v4.2.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/config.git", + "reference": "a7a7d0a0244cfc82f040729ccf769e6cf55a78fb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/config/zipball/a7a7d0a0244cfc82f040729ccf769e6cf55a78fb", + "reference": "a7a7d0a0244cfc82f040729ccf769e6cf55a78fb", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "symfony/filesystem": "~3.4|~4.0", + "symfony/polyfill-ctype": "~1.8" + }, + "conflict": { + "symfony/finder": "<3.4" + }, + "require-dev": { + "symfony/dependency-injection": "~3.4|~4.0", + "symfony/event-dispatcher": "~3.4|~4.0", + "symfony/finder": "~3.4|~4.0", + "symfony/yaml": "~3.4|~4.0" + }, + "suggest": { + "symfony/yaml": "To use the yaml reference dumper" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.2-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Config\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Config Component", + "homepage": "https://symfony.com", + "time": "2019-01-03 09:07:35" + }, + { + "name": "symfony/console", + "version": "v4.2.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "b0a03c1bb0fcbe288629956cf2f1dd3f1dc97522" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/b0a03c1bb0fcbe288629956cf2f1dd3f1dc97522", + "reference": "b0a03c1bb0fcbe288629956cf2f1dd3f1dc97522", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "symfony/contracts": "^1.0", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/dependency-injection": "<3.4", + "symfony/process": "<3.3" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/config": "~3.4|~4.0", + "symfony/dependency-injection": "~3.4|~4.0", + "symfony/event-dispatcher": "~3.4|~4.0", + "symfony/lock": "~3.4|~4.0", + "symfony/process": "~3.4|~4.0" + }, + "suggest": { + "psr/log-implementation": "For using the console logger", + "symfony/event-dispatcher": "", + "symfony/lock": "", + "symfony/process": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.2-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Console Component", + "homepage": "https://symfony.com", + "time": "2019-01-04 15:13:53" + }, + { + "name": "symfony/contracts", + "version": "v1.0.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/contracts.git", + "reference": "1aa7ab2429c3d594dd70689604b5cf7421254cdf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/contracts/zipball/1aa7ab2429c3d594dd70689604b5cf7421254cdf", + "reference": "1aa7ab2429c3d594dd70689604b5cf7421254cdf", + "shasum": "" + }, + "require": { + "php": "^7.1.3" + }, + "require-dev": { + "psr/cache": "^1.0", + "psr/container": "^1.0" + }, + "suggest": { + "psr/cache": "When using the Cache contracts", + "psr/container": "When using the Service contracts", + "symfony/cache-contracts-implementation": "", + "symfony/service-contracts-implementation": "", + "symfony/translation-contracts-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\": "" + }, + "exclude-from-classmap": [ + "**/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A set of abstractions extracted out of the Symfony components", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "time": "2018-12-05 08:06:11" + }, + { + "name": "symfony/dependency-injection", + "version": "v4.2.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/dependency-injection.git", + "reference": "a28dda9df1d5494367454cad91e44751ac53921c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/a28dda9df1d5494367454cad91e44751ac53921c", + "reference": "a28dda9df1d5494367454cad91e44751ac53921c", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "psr/container": "^1.0", + "symfony/contracts": "^1.0" + }, + "conflict": { + "symfony/config": "<4.2", + "symfony/finder": "<3.4", + "symfony/proxy-manager-bridge": "<3.4", + "symfony/yaml": "<3.4" + }, + "provide": { + "psr/container-implementation": "1.0", + "symfony/service-contracts-implementation": "1.0" + }, + "require-dev": { + "symfony/config": "~4.2", + "symfony/expression-language": "~3.4|~4.0", + "symfony/yaml": "~3.4|~4.0" + }, + "suggest": { + "symfony/config": "", + "symfony/expression-language": "For using expressions in service container configuration", + "symfony/finder": "For using double-star glob patterns or when GLOB_BRACE portability is required", + "symfony/proxy-manager-bridge": "Generate service proxies to lazy load them", + "symfony/yaml": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.2-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\DependencyInjection\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony DependencyInjection Component", + "homepage": "https://symfony.com", + "time": "2019-01-05 16:37:49" + }, + { + "name": "symfony/filesystem", + "version": "v4.2.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/filesystem.git", + "reference": "c2ffd9a93f2d6c5be2f68a0aa7953cc229f871f8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/c2ffd9a93f2d6c5be2f68a0aa7953cc229f871f8", + "reference": "c2ffd9a93f2d6c5be2f68a0aa7953cc229f871f8", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "symfony/polyfill-ctype": "~1.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.2-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Filesystem\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Filesystem Component", + "homepage": "https://symfony.com", + "time": "2019-01-03 09:07:35" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.10.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "e3d826245268269cd66f8326bd8bc066687b4a19" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/e3d826245268269cd66f8326bd8bc066687b4a19", + "reference": "e3d826245268269cd66f8326bd8bc066687b4a19", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.9-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + }, + { + "name": "Gert de Pagter", + "email": "backendtea@gmail.com" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "time": "2018-08-06 14:22:27" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.10.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "c79c051f5b3a46be09205c73b80b346e4153e494" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/c79c051f5b3a46be09205c73b80b346e4153e494", + "reference": "c79c051f5b3a46be09205c73b80b346e4153e494", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.9-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "time": "2018-09-21 13:07:52" + }, + { + "name": "symfony/yaml", + "version": "v4.2.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "d0aa6c0ea484087927b49fd513383a7d36190ca6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/d0aa6c0ea484087927b49fd513383a7d36190ca6", + "reference": "d0aa6c0ea484087927b49fd513383a7d36190ca6", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "symfony/polyfill-ctype": "~1.8" + }, + "conflict": { + "symfony/console": "<3.4" + }, + "require-dev": { + "symfony/console": "~3.4|~4.0" + }, + "suggest": { + "symfony/console": "For validating YAML files using the lint command" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.2-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Yaml\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Yaml Component", + "homepage": "https://symfony.com", + "time": "2019-01-03 09:07:35" + }, + { + "name": "theseer/tokenizer", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/theseer/tokenizer.git", + "reference": "cb2f008f3f05af2893a87208fe6a6c4985483f8b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/cb2f008f3f05af2893a87208fe6a6c4985483f8b", + "reference": "cb2f008f3f05af2893a87208fe6a6c4985483f8b", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": "^7.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + } + ], + "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", + "time": "2017-04-07 12:08:54" + }, + { + "name": "webmozart/assert", + "version": "1.4.0", + "source": { + "type": "git", + "url": "https://github.com/webmozart/assert.git", + "reference": "83e253c8e0be5b0257b881e1827274667c5c17a9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozart/assert/zipball/83e253c8e0be5b0257b881e1827274667c5c17a9", + "reference": "83e253c8e0be5b0257b881e1827274667c5c17a9", + "shasum": "" + }, + "require": { + "php": "^5.3.3 || ^7.0", + "symfony/polyfill-ctype": "^1.8" + }, + "require-dev": { + "phpunit/phpunit": "^4.6", + "sebastian/version": "^1.0.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3-dev" + } + }, + "autoload": { + "psr-4": { + "Webmozart\\Assert\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Assertions to validate method input/output with nice error messages.", + "keywords": [ + "assert", + "check", + "validate" + ], + "time": "2018-12-25 11:19:39" + } + ], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": { + "facebook/webdriver": 20 + }, + "prefer-stable": false, + "prefer-lowest": false, + "platform": [], + "platform-dev": [] +} diff --git a/jsx/Form.js b/jsx/Form.js index ec2c5c8157f..0e49f0a0b9b 100644 --- a/jsx/Form.js +++ b/jsx/Form.js @@ -368,14 +368,14 @@ SearchableDropdown.propTypes = { PropTypes.string, PropTypes.array, ]), - class: React.PropTypes.string, - disabled: React.PropTypes.bool, - required: React.PropTypes.bool, - sortByValue: React.PropTypes.bool, - errorMessage: React.PropTypes.string, - placeHolder: React.PropTypes.string, - autoFocus: React.PropTypes.bool, - onUserInput: React.PropTypes.func, + class: PropTypes.string, + disabled: PropTypes.bool, + required: PropTypes.bool, + sortByValue: PropTypes.bool, + errorMessage: PropTypes.string, + placeHolder: PropTypes.string, + autoFocus: PropTypes.bool, + onUserInput: PropTypes.func, }; SearchableDropdown.defaultProps = { @@ -521,16 +521,16 @@ SelectElement.propTypes = { PropTypes.string, PropTypes.array, ]), - id: React.PropTypes.string, - class: React.PropTypes.string, - inputClass: React.PropTypes.string, - multiple: React.PropTypes.bool, - disabled: React.PropTypes.bool, - required: React.PropTypes.bool, - sortByValue: React.PropTypes.bool, - emptyOption: React.PropTypes.bool, - errorMessage: React.PropTypes.string, - onUserInput: React.PropTypes.func, + id: PropTypes.string, + class: PropTypes.string, + inputClass: PropTypes.string, + multiple: PropTypes.bool, + disabled: PropTypes.bool, + required: PropTypes.bool, + sortByValue: PropTypes.bool, + emptyOption: PropTypes.bool, + errorMessage: PropTypes.string, + onUserInput: PropTypes.func, }; SelectElement.defaultProps = { @@ -1081,7 +1081,6 @@ class DateElement extends Component { } DateElement.propTypes = { -<<<<<<< 27ae8a8d4f5abc8ad574234df61684695ccb3827 name: PropTypes.string.isRequired, label: PropTypes.string, value: PropTypes.string, @@ -1091,6 +1090,7 @@ DateElement.propTypes = { dateFormat: PropTypes.string, disabled: PropTypes.bool, required: PropTypes.bool, + errorMessage: PropTypes.func, onUserInput: PropTypes.func, }; @@ -1170,14 +1170,14 @@ class TimeElement extends Component { } TimeElement.propTypes = { - name: React.PropTypes.string.isRequired, - label: React.PropTypes.string, - value: React.PropTypes.string, - id: React.PropTypes.string, - disabled: React.PropTypes.bool, - required: React.PropTypes.bool, - errorMessage: React.PropTypes.string, - onUserInput: React.PropTypes.func, + name: PropTypes.string.isRequired, + label: PropTypes.string, + value: PropTypes.string, + id: PropTypes.string, + disabled: PropTypes.bool, + required: PropTypes.bool, + errorMessage: PropTypes.string, + onUserInput: PropTypes.func, }; TimeElement.defaultProps = { @@ -1487,7 +1487,7 @@ LinkElement.defaultProps = { * Checkbox Component * React wrapper for a element. */ -class CheckboxElement extends React.Component { +class CheckboxElement extends Component { constructor() { super(); this.handleChange = this.handleChange.bind(this); diff --git a/modules/api/php/module.class.inc b/modules/api/php/module.class.inc index 4d9f31cff3e..4e29b55baac 100644 --- a/modules/api/php/module.class.inc +++ b/modules/api/php/module.class.inc @@ -3,7 +3,7 @@ * This serves as a hint to LORIS that this module is a real module. * It handles the basic routing for the module. * - * PHP Version 7 + * PHP Version 5 * * @category API * @package Main diff --git a/package-lock.json b/package-lock.json index d55430e9be5..3c47cd1d17a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6,7 +6,7 @@ "dependencies": { "@babel/code-frame": { "version": "7.0.0-beta.44", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.44.tgz", + "resolved": "http://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.44.tgz", "integrity": "sha512-cuAuTTIQ9RqcFRJ/Y8PvTh+paepNcaGxwQwjIDRWPXmzzyAeCO4KqS9ikMvq0MCbRk6GlYKwfzStrcP3/jSL8g==", "dev": true, "requires": { @@ -15,7 +15,7 @@ }, "@babel/generator": { "version": "7.0.0-beta.44", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.0.0-beta.44.tgz", + "resolved": "http://registry.npmjs.org/@babel/generator/-/generator-7.0.0-beta.44.tgz", "integrity": "sha512-5xVb7hlhjGcdkKpMXgicAVgx8syK5VJz193k0i/0sLP6DzE6lRrU1K3B/rFefgdo9LPGMAOOOAWW4jycj07ShQ==", "dev": true, "requires": { @@ -36,7 +36,7 @@ }, "@babel/helper-function-name": { "version": "7.0.0-beta.44", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.44.tgz", + "resolved": "http://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.44.tgz", "integrity": "sha512-MHRG2qZMKMFaBavX0LWpfZ2e+hLloT++N7rfM3DYOMUOGCD8cVjqZpwiL8a0bOX3IYcQev1ruciT0gdFFRTxzg==", "dev": true, "requires": { @@ -47,7 +47,7 @@ }, "@babel/helper-get-function-arity": { "version": "7.0.0-beta.44", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.44.tgz", + "resolved": "http://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.44.tgz", "integrity": "sha512-w0YjWVwrM2HwP6/H3sEgrSQdkCaxppqFeJtAnB23pRiJB5E/O9Yp7JAAeWBl+gGEgmBFinnTyOv2RN7rcSmMiw==", "dev": true, "requires": { @@ -56,7 +56,7 @@ }, "@babel/helper-split-export-declaration": { "version": "7.0.0-beta.44", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0-beta.44.tgz", + "resolved": "http://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0-beta.44.tgz", "integrity": "sha512-aQ7QowtkgKKzPGf0j6u77kBMdUFVBKNHw2p/3HX/POt5/oz8ec5cs0GwlgM8Hz7ui5EwJnzyfRmkNF1Nx1N7aA==", "dev": true, "requires": { @@ -65,7 +65,7 @@ }, "@babel/highlight": { "version": "7.0.0-beta.44", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0-beta.44.tgz", + "resolved": "http://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0-beta.44.tgz", "integrity": "sha512-Il19yJvy7vMFm8AVAh6OZzaFoAd0hbkeMZiX3P5HGD+z7dyI7RzndHB0dg6Urh/VAFfHtpOIzDUSxmY6coyZWQ==", "dev": true, "requires": { @@ -107,7 +107,7 @@ }, "@babel/template": { "version": "7.0.0-beta.44", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.0.0-beta.44.tgz", + "resolved": "http://registry.npmjs.org/@babel/template/-/template-7.0.0-beta.44.tgz", "integrity": "sha512-w750Sloq0UNifLx1rUqwfbnC6uSUk0mfwwgGRfdLiaUzfAOiH0tHJE6ILQIUi3KYkjiCDTskoIsnfqZvWLBDng==", "dev": true, "requires": { @@ -119,7 +119,7 @@ "dependencies": { "babylon": { "version": "7.0.0-beta.44", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.44.tgz", + "resolved": "http://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.44.tgz", "integrity": "sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g==", "dev": true } @@ -127,7 +127,7 @@ }, "@babel/traverse": { "version": "7.0.0-beta.44", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.0.0-beta.44.tgz", + "resolved": "http://registry.npmjs.org/@babel/traverse/-/traverse-7.0.0-beta.44.tgz", "integrity": "sha512-UHuDz8ukQkJCDASKHf+oDt3FVUzFd+QYfuBIsiNu/4+/ix6pP/C+uQZJ6K1oEfbCMv/IKWbgDEh7fcsnIE5AtA==", "dev": true, "requires": { @@ -145,7 +145,7 @@ "dependencies": { "babylon": { "version": "7.0.0-beta.44", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.44.tgz", + "resolved": "http://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.44.tgz", "integrity": "sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g==", "dev": true }, @@ -174,7 +174,7 @@ }, "@babel/types": { "version": "7.0.0-beta.44", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0-beta.44.tgz", + "resolved": "http://registry.npmjs.org/@babel/types/-/types-7.0.0-beta.44.tgz", "integrity": "sha512-5eTV4WRmqbaFM3v9gHAIljEQJU4Ssc6fxL61JN+Oe2ga/BwyjzjamwkCVVAQjHGuAX8i0BWo42dshL8eO5KfLQ==", "dev": true, "requires": { @@ -654,7 +654,7 @@ }, "util": { "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "resolved": "http://registry.npmjs.org/util/-/util-0.10.3.tgz", "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", "dev": true, "requires": { @@ -766,7 +766,7 @@ "dependencies": { "babylon": { "version": "7.0.0-beta.44", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.44.tgz", + "resolved": "http://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.44.tgz", "integrity": "sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g==", "dev": true } @@ -964,13 +964,13 @@ }, "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", + "resolved": "http://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=", "dev": true }, "babel-plugin-syntax-exponentiation-operator": { "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", + "resolved": "http://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=", "dev": true }, @@ -988,7 +988,7 @@ }, "babel-plugin-syntax-object-rest-spread": { "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", + "resolved": "http://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=", "dev": true }, @@ -1611,7 +1611,7 @@ }, "browserify-aes": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "dev": true, "requires": { @@ -1656,7 +1656,7 @@ }, "browserify-rsa": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "resolved": "http://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", "dev": true, "requires": { @@ -1700,7 +1700,7 @@ }, "buffer": { "version": "4.9.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "resolved": "http://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", "dev": true, "requires": { @@ -1729,7 +1729,7 @@ }, "cacache": { "version": "10.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-10.0.4.tgz", + "resolved": "http://registry.npmjs.org/cacache/-/cacache-10.0.4.tgz", "integrity": "sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==", "dev": true, "requires": { @@ -1784,7 +1784,7 @@ }, "callsites": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", + "resolved": "http://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", "dev": true }, @@ -2069,7 +2069,7 @@ }, "create-hash": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "dev": true, "requires": { @@ -2082,7 +2082,7 @@ }, "create-hmac": { "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "resolved": "http://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "dev": true, "requires": { @@ -2246,7 +2246,7 @@ }, "diffie-hellman": { "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "resolved": "http://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "dev": true, "requires": { @@ -2681,7 +2681,7 @@ }, "external-editor": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", + "resolved": "http://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", "dev": true, "requires": { @@ -2735,7 +2735,7 @@ "dependencies": { "core-js": { "version": "1.2.7", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", + "resolved": "http://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=", "dev": true } @@ -2912,7 +2912,8 @@ "ansi-regex": { "version": "2.1.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "aproba": { "version": "1.1.1", @@ -2987,6 +2988,7 @@ "version": "2.10.1", "bundled": true, "dev": true, + "optional": true, "requires": { "hoek": "2.x.x" } @@ -3156,6 +3158,7 @@ "version": "1.0.11", "bundled": true, "dev": true, + "optional": true, "requires": { "graceful-fs": "^4.1.2", "inherits": "~2.0.0", @@ -3223,7 +3226,8 @@ "graceful-fs": { "version": "4.1.11", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "har-schema": { "version": "1.0.5", @@ -3410,12 +3414,14 @@ "minimist": { "version": "0.0.8", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "mkdirp": { "version": "0.5.1", "bundled": true, "dev": true, + "optional": true, "requires": { "minimist": "0.0.8" } @@ -3705,6 +3711,7 @@ "version": "3.0.1", "bundled": true, "dev": true, + "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -4134,7 +4141,7 @@ }, "inquirer": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-5.2.0.tgz", + "resolved": "http://registry.npmjs.org/inquirer/-/inquirer-5.2.0.tgz", "integrity": "sha512-E9BmnJbAKLPGonz0HeWHtbKf+EeSP93paWO3ZYoUpq/aowXvYGjjCSuashhXPpzbArIjBbji39THkxTz9ZeEUQ==", "dev": true, "requires": { @@ -5786,7 +5793,7 @@ }, "require-uncached": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", + "resolved": "http://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", "dev": true, "requires": { @@ -5913,7 +5920,7 @@ }, "safe-regex": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "resolved": "http://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", "dev": true, "requires": { @@ -6001,7 +6008,7 @@ }, "sha.js": { "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "resolved": "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "dev": true, "requires": { @@ -6276,7 +6283,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { @@ -6291,7 +6298,7 @@ }, "string_decoder": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { @@ -6365,7 +6372,7 @@ }, "strip-eof": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "resolved": "http://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", "dev": true }, @@ -6393,7 +6400,7 @@ }, "table": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/table/-/table-4.0.3.tgz", + "resolved": "http://registry.npmjs.org/table/-/table-4.0.3.tgz", "integrity": "sha512-S7rnFITmBH1EnyKcvxBh1LjYeQMmnZtCXSEbHcH6S0NoKit24ZuFO/T1vDcLdYsLQkM188PVVhQmzKIuThNkKg==", "dev": true, "requires": { @@ -6450,7 +6457,7 @@ }, "through": { "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", "dev": true }, @@ -6472,7 +6479,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { @@ -8244,7 +8251,7 @@ }, "wrap-ansi": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "resolved": "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "dev": true, "requires": { diff --git a/php/libraries/Database.class.inc b/php/libraries/Database.class.inc index 84424f81eac..7f66b49fa57 100644 --- a/php/libraries/Database.class.inc +++ b/php/libraries/Database.class.inc @@ -387,7 +387,6 @@ class Database bool $ignore = false, bool $onDuplicateUpdate = false ) : bool { - { if ($ignore && $onDuplicateUpdate) { throw new DatabaseException( 'The Database::_realinsert() function does not accept both ignore diff --git a/src/Api/Endpoints/Login.php b/src/Api/Endpoints/Login.php index 313d073dc95..ac3e80561f4 100644 --- a/src/Api/Endpoints/Login.php +++ b/src/Api/Endpoints/Login.php @@ -48,11 +48,9 @@ class Login extends Endpoint /** * All users have access to the login endpoint to try and login. * - * @param \User $user The user whose access is being checked - * * @return boolean true if access is permitted */ - function _hasAccess(\User $user) : bool + function _hasAccess() { // Anyone can try and login. Even you. return true; From 9d289ca258a40fbc44b7c9f506c3b2d4b1ca3405 Mon Sep 17 00:00:00 2001 From: Loris Admin Date: Tue, 16 Jul 2019 13:38:34 -0400 Subject: [PATCH 14/95] Added new json response --- src/Http/Response/OK.php | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 src/Http/Response/OK.php diff --git a/src/Http/Response/OK.php b/src/Http/Response/OK.php new file mode 100644 index 00000000000..981db64b3d6 --- /dev/null +++ b/src/Http/Response/OK.php @@ -0,0 +1,39 @@ + + * * @license http://www.gnu.org/licenses/gpl-3.0.txt GPLv3 + * * @link https://www.github.com/aces/Loris/ + * * + * * @see https://www.php-fig.org/psr/psr-7/ + * * @see https://www.php-fig.org/psr/psr-15/ + * */ +namespace LORIS\Http\Response; +use \LORIS\Http\Response\JsonResponse; +/** + * * A LORIS Http Response is an implementation of the PSR15 ResponseInterface + * * to use in LORIS specific for 200 OK. + * * + * * @category PSR15 + * * @package Http + * * @author Henri Rabalais + * * @license http://www.gnu.org/licenses/gpl-3.0.txt GPLv3 + * * @link https://www.github.com/aces/Loris/ + * */ +class OK extends JsonResponse +{ + /** + * * Create a Json response specific to 200 OK. + * * + * * @param ?array $msg The response message. + * */ + public function __construct(?array $msg = null) + { + parent::__construct($msg, 200); + } +} From 7e7cb8b72998ec7f6eda913c18d29fc24f49a24f Mon Sep 17 00:00:00 2001 From: Loris Admin Date: Tue, 16 Jul 2019 16:49:38 -0400 Subject: [PATCH 15/95] added BadRequest exception and OK response --- php/exceptions/BadRequest.class.inc | 28 +++++++++++++ src/Http/Response/OK.php | 62 ++++++++++++++--------------- 2 files changed, 59 insertions(+), 31 deletions(-) create mode 100644 php/exceptions/BadRequest.class.inc diff --git a/php/exceptions/BadRequest.class.inc b/php/exceptions/BadRequest.class.inc new file mode 100644 index 00000000000..f29c685a910 --- /dev/null +++ b/php/exceptions/BadRequest.class.inc @@ -0,0 +1,28 @@ + + * @license http://www.gnu.org/licenses/gpl-3.0.txt GPLv3 + * @link https://github.com/aces/Loris + */ + +/** + * The NotFound exception is thrown when a resource can not + * be found. It maps to a 400 error. + * + * @category Errors + * @package Loris + * @author Loris Team + * @license http://www.gnu.org/licenses/gpl-3.0.txt GPLv3 + * @link https://github.com/aces/Loris + */ + +class BadRequest extends LorisException +{ +} + diff --git a/src/Http/Response/OK.php b/src/Http/Response/OK.php index 981db64b3d6..e0f239a9455 100644 --- a/src/Http/Response/OK.php +++ b/src/Http/Response/OK.php @@ -1,39 +1,39 @@ - * * @license http://www.gnu.org/licenses/gpl-3.0.txt GPLv3 - * * @link https://www.github.com/aces/Loris/ - * * - * * @see https://www.php-fig.org/psr/psr-7/ - * * @see https://www.php-fig.org/psr/psr-15/ - * */ + * File contains the PSR7 ResponseInterface implementation for OK responses. + * + * PHP Version 7 + * + * @category PSR15 + * @package Http + * @author Xavier Lecours Boucher + * @license http://www.gnu.org/licenses/gpl-3.0.txt GPLv3 + * @link https://www.github.com/aces/Loris/ + * + * @see https://www.php-fig.org/psr/psr-7/ + * @see https://www.php-fig.org/psr/psr-15/ + **/ namespace LORIS\Http\Response; use \LORIS\Http\Response\JsonResponse; /** - * * A LORIS Http Response is an implementation of the PSR15 ResponseInterface - * * to use in LORIS specific for 200 OK. - * * - * * @category PSR15 - * * @package Http - * * @author Henri Rabalais - * * @license http://www.gnu.org/licenses/gpl-3.0.txt GPLv3 - * * @link https://www.github.com/aces/Loris/ - * */ + * A LORIS Http Response is an implementation of the PSR15 ResponseInterface + * to use in LORIS specific for 200 OK. + * + * @category PSR15 + * @package Http + * @author Henri Rabalais + * @license http://www.gnu.org/licenses/gpl-3.0.txt GPLv3 + * @link https://www.github.com/aces/Loris/ + **/ class OK extends JsonResponse { - /** - * * Create a Json response specific to 200 OK. - * * - * * @param ?array $msg The response message. - * */ - public function __construct(?array $msg = null) - { - parent::__construct($msg, 200); - } + /** + * Create a Json response specific to 200 OK. + * + * @param ?array $msg The response message. + **/ + public function __construct(?array $msg = null) + { + parent::__construct($msg, 200); + } } From 1162fee37d64564af713c8e0e7bb03d1298ff2cb Mon Sep 17 00:00:00 2001 From: Loris Admin Date: Thu, 18 Jul 2019 15:54:56 -0400 Subject: [PATCH 16/95] making this branch functional again --- SQL/0000-00-01-Permission.sql | 25 +- SQL/0000-00-02-Menus.sql | 41 +- SQL/0000-00-03-ConfigTables.sql | 20 +- ...019-02-27_add_biobank_module_to_schema.sql | 523 ++++++++++++++++++ jsx/Form.js | 2 +- package-lock.json | 24 +- php/exceptions/Forbidden.class.inc | 28 + php/exceptions/UploadException.class.inc | 80 +++ php/libraries/Database.class.inc | 2 +- php/libraries/FilesUploadHandler.class.inc | 230 ++++++++ 10 files changed, 938 insertions(+), 37 deletions(-) create mode 100644 SQL/New_patches/2019-02-27_add_biobank_module_to_schema.sql create mode 100644 php/exceptions/Forbidden.class.inc create mode 100644 php/exceptions/UploadException.class.inc create mode 100644 php/libraries/FilesUploadHandler.class.inc diff --git a/SQL/0000-00-01-Permission.sql b/SQL/0000-00-01-Permission.sql index e360cc7f1d7..a8807d0de0f 100644 --- a/SQL/0000-00-01-Permission.sql +++ b/SQL/0000-00-01-Permission.sql @@ -1,7 +1,20 @@ +SET FOREIGN_KEY_CHECKS=0; + + +DROP TABLE IF EXISTS `permissions`; + + +DROP TABLE IF EXISTS `permissions_category`; + + +DROP TABLE IF EXISTS `user_perm_rel`; + +SET FOREIGN_KEY_CHECKS=1; -- -- Table structure for table `permissions_category` -- + CREATE TABLE `permissions_category` ( `ID` int(10) NOT NULL AUTO_INCREMENT, `Description` varchar(255) NOT NULL, @@ -99,9 +112,14 @@ INSERT INTO `permissions` VALUES (50,'data_release_edit_file_access', 'Data Release: Grant other users view-file permissions', 2), (51,'instrument_manager_read', 'Instrument Manager: View module', 2), (52,'instrument_manager_write', 'Instrument Manager: Install new instruments via file upload', 2), - (53,'publication_view', 'Publication - Access to module', 2), - (54,'publication_propose', 'Publication - Propose a project', 2), - (55,'publication_approve', 'Publication - Approve or reject proposed publication projects', 2); + (53, 'biobank_specimen_view', 'Biobank: View Specimen Data', 2), + (54, 'biobank_specimen_create', 'Biobank: Create Specimen Data', 2), + (55, 'biobank_specimen_update', 'Biobank: Update Specimen Data', 2), + (57, 'biobank_container_view', 'Biobank: View Container Data', 2), + (58, 'biobank_container_create', 'Biobank: Create Container Data', 2), + (59, 'biobank_container_update', 'Biobank: Update Container Data', 2), + (61, 'biobank_pool_view', 'Biobank: View Pool Data', 2), + (62, 'biobank_pool_create', 'Biobank: Create Pool Data', 2), INSERT INTO `user_perm_rel` (userID, permID) @@ -123,4 +141,3 @@ CREATE TABLE `notification_modules_perm_rel` ( -- populate notification perm table INSERT INTO notification_modules_perm_rel SELECT nm.id, p.permID FROM notification_modules nm JOIN permissions p WHERE nm.module_name='media' AND (p.code='media_write' OR p.code='media_read'); INSERT INTO notification_modules_perm_rel SELECT nm.id, p.permID FROM notification_modules nm JOIN permissions p WHERE nm.module_name='document_repository' AND (p.code='document_repository_view' OR p.code='document_repository_delete'); -INSERT INTO notification_modules_perm_rel SELECT nm.id, p.permID FROM notification_modules nm JOIN permissions p WHERE nm.module_name='publication' AND (p.code='publication_view' OR p.code='publication_propose' OR p.code='publication_approve'); diff --git a/SQL/0000-00-02-Menus.sql b/SQL/0000-00-02-Menus.sql index f78a1c68c1c..75d68f103cc 100644 --- a/SQL/0000-00-02-Menus.sql +++ b/SQL/0000-00-02-Menus.sql @@ -2,6 +2,11 @@ -- Table Definition -- +DROP TABLE IF EXISTS `LorisMenuPermissions`; + + +DROP TABLE IF EXISTS `LorisMenu`; + CREATE TABLE `LorisMenu` ( `ID` int(10) unsigned NOT NULL AUTO_INCREMENT, @@ -35,9 +40,10 @@ INSERT INTO LorisMenu (Label, OrderNumber) VALUES ('Candidate', 1), ('Clinical', 2), ('Imaging', 3), - ('Reports', 4), - ('Tools', 5), - ('Admin', 6); + ('Biobank', 4) + ('Reports', 5), + ('Tools', 6), + ('Admin', 7); INSERT INTO LorisMenu (Label, Link, Parent, OrderNumber) VALUES @@ -48,7 +54,8 @@ INSERT INTO LorisMenu (Label, Link, Parent, OrderNumber) VALUES INSERT INTO LorisMenu (Label, Link, Parent, OrderNumber) VALUES ('Conflict Resolver', 'conflict_resolver/', (SELECT ID FROM LorisMenu as L WHERE Label='Clinical'), 2), ('Examiner', 'examiner/', (SELECT ID FROM LorisMenu as L WHERE Label='Clinical'), 3), - ('Media', 'media/', (SELECT ID FROM LorisMenu as L WHERE Label='Clinical'), 4); + ('Training', 'training/', (SELECT ID FROM LorisMenu as L WHERE Label='Clinical'), 4), + ('Media', 'media/', (SELECT ID FROM LorisMenu as L WHERE Label='Clinical'), 5); INSERT INTO LorisMenu (Label, Link, Parent, OrderNumber) VALUES @@ -59,8 +66,7 @@ INSERT INTO LorisMenu (Label, Link, Parent, OrderNumber) VALUES INSERT INTO LorisMenu (Label, Link, Parent, OrderNumber) VALUES ('Statistics', 'statistics/', (SELECT ID FROM LorisMenu as L WHERE Label='Reports'), 1), - ('Data Query Tool', 'dataquery/', (SELECT ID FROM LorisMenu as L WHERE Label='Reports'), 2), - ('Publications', 'publication/', (SELECT ID FROM LorisMenu as L WHERE Label='Reports'), 3); + ('Data Query Tool', 'dataquery/', (SELECT ID FROM LorisMenu as L WHERE Label='Reports'), 2); INSERT INTO LorisMenu (Label, Link, Parent, OrderNumber) VALUES @@ -75,6 +81,10 @@ INSERT INTO LorisMenu (Label, Link, Parent, OrderNumber) VALUES ('Issue Tracker', 'issue_tracker/', (SELECT ID FROM LorisMenu as L WHERE Label='Tools'), 9), ('Quality Control', 'quality_control/', (SELECT ID FROM LorisMenu as L Where Label='Tools'), 10); +INSERT INTO LorisMenu (Label, Link, Parent OrderNumber) VALUES + ('Specimens', '/biobank#specimens', (SELECT ID FROM LorisMenu as L WHERE Label='Biobank'), 1); + ('Containers', '/biobank#containers', (SELECT ID FROM LorisMenu as L WHERE Label='Biobank'), 2); + ('Pools', '/biobank#pools', (SELECT ID FROM LorisMenu as L WHERE Label='Biobank'), 3); INSERT INTO LorisMenu (Label, Link, Parent, OrderNumber) VALUES ('User Accounts', 'user_accounts/', (SELECT ID FROM LorisMenu as L WHERE Label='Admin'), 1), @@ -208,26 +218,19 @@ INSERT INTO LorisMenuPermissions (MenuID, PermID) INSERT INTO LorisMenuPermissions (MenuID, PermID) SELECT m.ID, p.PermID FROM permissions p CROSS JOIN LorisMenu m WHERE p.code='issue_tracker_reporter' AND m.Label='Issue Tracker'; -INSERT INTO LorisMenuPermissions (MenuID, PermID) - SELECT m.ID, p.PermID FROM permissions p CROSS JOIN LorisMenu m WHERE p.code='issue_tracker_developer' AND m.Label='Issue Tracker'; - -INSERT INTO LorisMenuPermissions (MenuID, PermID) - SELECT m.ID, p.PermID FROM permissions p CROSS JOIN LorisMenu m WHERE p.code='data_release_upload' AND m.Label='Data Release'; -INSERT INTO LorisMenuPermissions (MenuID, PermID) - SELECT m.ID, p.PermID FROM permissions p CROSS JOIN LorisMenu m WHERE p.code='data_release_edit_file_access' AND m.Label='Data Release'; -INSERT INTO LorisMenuPermissions (MenuID, PermID) - SELECT m.ID, p.PermID FROM permissions p CROSS JOIN LorisMenu m WHERE p.code='data_team_helper' AND m.Label='Quality Control'; INSERT INTO LorisMenuPermissions (MenuID, PermID) SELECT m.ID, p.PermID FROM permissions p CROSS JOIN LorisMenu m WHERE p.code='media_read' AND m.Label='Media'; INSERT INTO LorisMenuPermissions (MenuID, PermID) SELECT m.ID, p.PermID FROM permissions p CROSS JOIN LorisMenu m WHERE p.code='media_write' AND m.Label='Media'; - INSERT INTO LorisMenuPermissions (MenuID, PermID) - SELECT m.ID, p.PermID FROM permissions p CROSS JOIN LorisMenu m WHERE p.code='publication_view' AND m.Label='Publications'; + SELECT m.ID, p.PermID FROM permissions p CROSS JOIN LorisMenu m WHERE p.code='biobank_specimen_view' AND m.Label='Specimen'; INSERT INTO LorisMenuPermissions (MenuID, PermID) - SELECT m.ID, p.PermID FROM permissions p CROSS JOIN LorisMenu m WHERE p.code='publication_propose' AND m.Label='Publications'; + SELECT m.ID, p.PermID FROM permissions p CROSS JOIN LorisMenu m WHERE p.code='biobank_container_view' AND m.Label='Container'; INSERT INTO LorisMenuPermissions (MenuID, PermID) - SELECT m.ID, p.PermID FROM permissions p CROSS JOIN LorisMenu m WHERE p.code='publication_approve' AND m.Label='Publications'; + SELECT m.ID, p.PermID FROM permissions p CROSS JOIN LorisMenu m WHERE p.code='biobank_pool_view' AND m.Label='Pool'; + + + diff --git a/SQL/0000-00-03-ConfigTables.sql b/SQL/0000-00-03-ConfigTables.sql index 1c24cb534b1..da7d8fdc8c4 100644 --- a/SQL/0000-00-03-ConfigTables.sql +++ b/SQL/0000-00-03-ConfigTables.sql @@ -1,3 +1,12 @@ +-- +-- DROP tables +-- + +DROP TABLE IF EXISTS `Config`; + + +DROP TABLE IF EXISTS `ConfigSettings`; + -- -- Table structure for table `ConfigSettings` -- @@ -38,6 +47,7 @@ INSERT INTO ConfigSettings (Name, Description, Visible, AllowMultiple, Label, Or INSERT INTO ConfigSettings (Name, Description, Visible, AllowMultiple, DataType, Parent, Label, OrderNumber) SELECT 'title', 'Full descriptive title of the study', 1, 0, 'text', ID, 'Study title', 1 FROM ConfigSettings WHERE Name="study"; INSERT INTO ConfigSettings (Name, Description, Visible, AllowMultiple, DataType, Parent, Label, OrderNumber) SELECT 'studylogo', 'Filename containing logo of the study. File should be located under the htdocs/images/ folder', 1, 0, 'text', ID, 'Study logo', 2 FROM ConfigSettings WHERE Name="study"; INSERT INTO ConfigSettings (Name, Description, Visible, AllowMultiple, DataType, Parent, Label, OrderNumber) SELECT 'multipleSites', 'Enable if there is there more than one site in the project', 1, 0, 'boolean', ID, 'Multiple sites', 3 FROM ConfigSettings WHERE Name="study"; +INSERT INTO ConfigSettings (Name, Description, Visible, AllowMultiple, DataType, Parent, Label, OrderNumber) SELECT 'useProjects', "Enable if the study involves more than one project, where each project has multiple cohorts/subprojects", 1, 0, 'boolean', ID, 'Use projects', 4 FROM ConfigSettings WHERE Name="study"; INSERT INTO ConfigSettings (Name, Description, Visible, AllowMultiple, DataType, Parent, Label, OrderNumber) SELECT 'startYear', "Start year for study recruitment or data collection", 1, 0, 'text', ID, 'Start year', 5 FROM ConfigSettings WHERE Name="study"; INSERT INTO ConfigSettings (Name, Description, Visible, AllowMultiple, DataType, Parent, Label, OrderNumber) SELECT 'endYear', "End year for study recruitment or data collection", 1, 0, 'text', ID, 'End year', 6 FROM ConfigSettings WHERE Name="study"; INSERT INTO ConfigSettings (Name, Description, Visible, AllowMultiple, DataType, Parent, Label, OrderNumber) SELECT 'ageMin', 'Minimum candidate age in years (0+)', 1, 0, 'text', ID, 'Minimum candidate age', 7 FROM ConfigSettings WHERE Name="study"; @@ -72,8 +82,8 @@ INSERT INTO ConfigSettings (Name, Description, Visible, AllowMultiple, DataType, INSERT INTO ConfigSettings (Name, Description, Visible, AllowMultiple, DataType, Parent, Label, OrderNumber) SELECT 'MRIUploadIncomingPath', 'Path to the upload directory for incoming MRI studies', 1, 0, 'text', ID, 'MRI Incoming Directory', 7 FROM ConfigSettings WHERE Name="paths"; INSERT INTO ConfigSettings (Name, Description, Visible, AllowMultiple, DataType, Parent, Label, OrderNumber) SELECT 'GenomicDataPath', 'Path to Genomic data files', 1, 0, 'text', ID, 'Genomic Data Path', 8 FROM ConfigSettings WHERE Name="paths"; INSERT INTO ConfigSettings (Name, Description, Visible, AllowMultiple, DataType, Parent, Label, OrderNumber) SELECT 'mediaPath', 'Path to uploaded media files', 1, 0, 'text', ID, 'Media', 9 FROM ConfigSettings WHERE Name="paths"; -INSERT INTO ConfigSettings (Name, Description, Visible, AllowMultiple, DataType, Parent, Label, OrderNumber) SELECT 'publication_uploads', 'Path to uploaded publications', 1, 0, 'web_path', ID, 'Publications', 10 FROM ConfigSettings WHERE Name="paths"; -INSERT INTO ConfigSettings (Name, Description, Visible, AllowMultiple, DataType, Parent, Label, OrderNumber) SELECT 'publication_deletions', 'Path to deleted publications', 1, 0, 'web_path', ID, 'Deleted Publications', 11 FROM ConfigSettings WHERE Name="paths"; +INSERT INTO ConfigSettings (Name, Description, Visible, AllowMultiple, DataType, Parent, Label, OrderNumber) SELECT 'biobankPath', 'Path to Biobank data files', 1, 0, 'text', ID, 'Biobank', 10 FROM ConfigSettings WHERE Name="paths"; + INSERT INTO ConfigSettings (Name, Description, Visible, AllowMultiple, Label, OrderNumber) VALUES ('gui', 'Settings related to the overall display of LORIS', 1, 0, 'GUI', 3); INSERT INTO ConfigSettings (Name, Description, Visible, AllowMultiple, DataType, Parent, Label, OrderNumber) SELECT 'css', 'CSS file used for rendering (default main.css)', 1, 0, 'text', ID, 'CSS file', 1 FROM ConfigSettings WHERE Name="gui"; @@ -146,7 +156,6 @@ INSERT INTO ConfigSettings (Name, Description, Visible, AllowMultiple, DataType, INSERT INTO ConfigSettings (Name, Description, Visible, AllowMultiple, DataType, Parent, Label, OrderNumber) SELECT 'compute_snr_modalities', 'Modalities for which the SNR should be computed when running the insertion MRI scripts', 1, 1, 'scan_type', ID, 'Modalities on which SNR should be calculated', 21 FROM ConfigSettings WHERE Name="imaging_pipeline"; INSERT INTO ConfigSettings (Name, Description, Visible, AllowMultiple, DataType, Parent, Label, OrderNumber) SELECT 'reference_scan_type_for_defacing', 'Scan type to use as a reference for registration when defacing anatomical images (typically a T1W image)', 1, 0, 'scan_type', ID, 'Scan type to use as a reference for defacing (typically a T1W image)', 22 FROM ConfigSettings WHERE Name="imaging_pipeline"; INSERT INTO ConfigSettings (Name, Description, Visible, AllowMultiple, DataType, Parent, Label, OrderNumber) SELECT 'modalities_to_deface', 'Modalities for which defacing should be run and defaced image inserted in the database', 1, 1, 'scan_type', ID, 'Modalities on which to run the defacing pipeline', 23 FROM ConfigSettings WHERE Name="imaging_pipeline"; - -- -- Filling Config table with default values -- @@ -164,6 +173,7 @@ INSERT INTO Config (ConfigID, Value) SELECT ID, YEAR(NOW()) FROM ConfigSettings INSERT INTO Config (ConfigID, Value) SELECT ID, YEAR(NOW())+10 FROM ConfigSettings WHERE Name="endYear"; INSERT INTO Config (ConfigID, Value) SELECT ID, "false" FROM ConfigSettings WHERE Name="useExternalID"; INSERT INTO Config (ConfigID, Value) SELECT ID, "false" FROM ConfigSettings WHERE Name="useProband"; +INSERT INTO Config (ConfigID, Value) SELECT ID, "false" FROM ConfigSettings WHERE Name="useProjects"; INSERT INTO Config (ConfigID, Value) SELECT ID, "false" FROM ConfigSettings WHERE Name="useScreening"; INSERT INTO Config (ConfigID, Value) SELECT ID, "false" FROM ConfigSettings WHERE Name="useConsent"; INSERT INTO Config (ConfigID, Value) SELECT ID, "false" FROM ConfigSettings WHERE Name="SupplementalSessionStatus"; @@ -184,8 +194,6 @@ INSERT INTO Config (ConfigID, Value) SELECT ID, "/data/%PROJECTNAME%/bin/mri/" F INSERT INTO Config (ConfigID, Value) SELECT ID, "/data/incoming/" FROM ConfigSettings WHERE Name="MRIUploadIncomingPath"; INSERT INTO Config (ConfigID, Value) SELECT ID, "/PATH/TO/Genomic-Data/" FROM ConfigSettings WHERE Name="GenomicDataPath"; INSERT INTO Config (ConfigID, Value) SELECT ID, "/data/uploads/" FROM ConfigSettings WHERE Name="mediaPath"; -INSERT INTO Config (ConfigID, Value) SELECT ID, "/data/publication_uploads/" FROM ConfigSettings WHERE Name="publication_uploads"; -INSERT INTO Config (ConfigID, Value) SELECT ID, "/data/publication_uploads/to_be_deleted/" FROM ConfigSettings WHERE Name="publication_deletions"; INSERT INTO Config (ConfigID, Value) SELECT ID, "main.css" FROM ConfigSettings WHERE Name="css"; @@ -251,4 +259,4 @@ INSERT INTO Config (ConfigID, Value) SELECT ID, 'flair' FROM ConfigSettings WHER INSERT INTO Config (ConfigID, Value) SELECT ID, 't1' FROM ConfigSettings WHERE Name="modalities_to_deface"; INSERT INTO Config (ConfigID, Value) SELECT ID, 't2' FROM ConfigSettings WHERE Name="modalities_to_deface"; INSERT INTO Config (ConfigID, Value) SELECT ID, 'pd' FROM ConfigSettings WHERE Name="modalities_to_deface"; -INSERT INTO Config (ConfigID, Value) SELECT ID, 'false' FROM ConfigSettings WHERE Name="usePwnedPasswordsAPI"; +INSERT INTO Config (ConfigID, Value) SELECT ID, 'true' FROM ConfigSettings WHERE Name="usePwnedPasswordsAPI"; diff --git a/SQL/New_patches/2019-02-27_add_biobank_module_to_schema.sql b/SQL/New_patches/2019-02-27_add_biobank_module_to_schema.sql new file mode 100644 index 00000000000..950d8269762 --- /dev/null +++ b/SQL/New_patches/2019-02-27_add_biobank_module_to_schema.sql @@ -0,0 +1,523 @@ +-- DROPS -- + +/*Relational*/ +DROP TABLE IF EXISTS `biobank_container_parent`; +DROP TABLE IF EXISTS `biobank_container_project_rel`; +DROP TABLE IF EXISTS `biobank_container_psc_rel`; +DROP TABLE IF EXISTS `biobank_specimen_pool_rel`; +DROP TABLE IF EXISTS `biobank_specimen_type_parent`; +DROP TABLE IF EXISTS `biobank_specimen_parent`; +DROP TABLE IF EXISTS `biobank_specimen_type_unit_rel`; +DROP TABLE IF EXISTS `biobank_specimen_protocol_container_type_rel`; +DROP TABLE IF EXISTS `biobank_specimen_type_container_type_rel`; +DROP TABLE IF EXISTS `biobank_specimen_protocol_attribute_rel`; +DROP TABLE IF EXISTS `biobank_specimen_type_attribute_rel`; +DROP TABLE IF EXISTS `biobank_specimen_method_attribute_rel`; + +/*Pool*/ +DROP TABLE IF EXISTS `biobank_pool`; + +/*Specimen*/ +DROP TABLE IF EXISTS `biobank_specimen_attribute`; +DROP TABLE IF EXISTS `biobank_specimen_attribute_referencetable`; +DROP TABLE IF EXISTS `biobank_specimen_attribute_datatype`; +DROP TABLE IF EXISTS `biobank_specimen_analysis`; +DROP TABLE IF EXISTS `biobank_specimen_preparation`; +DROP TABLE IF EXISTS `biobank_specimen_collection`; +DROP TABLE IF EXISTS `biobank_specimen_freezethaw`; +DROP TABLE IF EXISTS `biobank_specimen`; +DROP TABLE IF EXISTS `biobank_specimen_protocol`; +DROP TABLE IF EXISTS `biobank_specimen_process`; +DROP TABLE IF EXISTS `biobank_specimen_type`; +DROP TABLE IF EXISTS `biobank_specimen_method`; + +/*Container*/ +DROP TABLE IF EXISTS `biobank_container`; +DROP TABLE IF EXISTS `biobank_container_status`; +DROP TABLE IF EXISTS `biobank_container_type`; +DROP TABLE IF EXISTS `biobank_container_dimension`; +DROP TABLE IF EXISTS `biobank_container_capacity`; + +/*Global*/ +DROP TABLE IF EXISTS `biobank_unit`; + + +-- CREATES -- + +/*Global*/ + +CREATE TABLE `biobank_unit` ( + `UnitID` integer unsigned NOT NULL AUTO_INCREMENT, + `Label` varchar(20) NOT NULL UNIQUE, + CONSTRAINT `PK_biobank_unit` PRIMARY KEY (`UnitID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + + +/*Container*/ + +CREATE TABLE `biobank_container_capacity` ( + `ContainerCapacityID` integer unsigned NOT NULL AUTO_INCREMENT, + `Quantity` decimal(10, 3) NOT NULL, + `UnitID` integer unsigned NOT NULL, + CONSTRAINT `PK_biobank_container_capacity` PRIMARY KEY (`ContainerCapacityID`), + CONSTRAINT `FK_biobank_container_capacity_UnitID` + FOREIGN KEY (`UnitID`) REFERENCES `biobank_unit`(`UnitID`) + ON UPDATE RESTRICT ON DELETE RESTRICT, + CONSTRAINT `UK_biobank_container_capacity_Quantity_UnitID` UNIQUE(`Quantity`, `UnitID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE `biobank_container_dimension` ( + `ContainerDimensionID` integer unsigned NOT NULL AUTO_INCREMENT, + `X` integer unsigned NOT NULL, + `XNumerical` BIT(1) NOT NULL, + `Y` integer unsigned NOT NULL, + `YNumerical` BIT(1) NOT NULL, + `Z` integer unsigned NOT NULL, + `ZNumerical` BIT(1) NOT NULL, + CONSTRAINT `PK_biobank_container_dimension` PRIMARY KEY (`ContainerDimensionID`), + CONSTRAINT `UK_biobank_container_dimension_X_Y_Z` UNIQUE(`X`, `Y`, `Z`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE `biobank_container_type` ( + `ContainerTypeID` integer unsigned NOT NULL AUTO_INCREMENT, + `Brand` varchar(50) NOT NULL, + `ProductNumber` varchar(50) NOT NULL, + `Label` varchar(40) NOT NULL, + `Primary` BIT(1) NOT NULL, + `ContainerCapacityID` integer unsigned, + `ContainerDimensionID` integer unsigned, + CONSTRAINT `PK_biobank_container_type` PRIMARY KEY (`ContainerTypeID`), + CONSTRAINT `FK_biobank_container_type_CapacityID` + FOREIGN KEY (`ContainerCapacityID`) REFERENCES `biobank_container_capacity`(`ContainerCapacityID`) + ON UPDATE RESTRICT ON DELETE RESTRICT, + CONSTRAINT `FK_biobank_container_type_DimensionID` + FOREIGN KEY (`ContainerDimensionID`) REFERENCES `biobank_container_dimension`(`ContainerDimensionID`) + ON UPDATE RESTRICT ON DELETE RESTRICT, + CONSTRAINT `UK_biobank_container_type_Brand_ProductNumber` UNIQUE(`Brand`, `ProductNumber`), + CONSTRAINT `UK_biobank_container_type_Label` UNIQUE (`Label`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +/* Should this be simply biobank_status since it applies to both containers and specimen? */ +CREATE TABLE `biobank_container_status` ( + `ContainerStatusID` integer unsigned NOT NULL AUTO_INCREMENT, + `Label` varchar(40) NOT NULL, + CONSTRAINT `PK_biobank_container_status` PRIMARY KEY (`ContainerStatusID`), + CONSTRAINT `UK_biobank_container_status_Label` UNIQUE (`Label`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE `biobank_container` ( + `ContainerID` integer unsigned NOT NULL AUTO_INCREMENT, + `Barcode` varchar(40) NOT NULL, /*index by barcode*/ + `ContainerTypeID` integer unsigned NOT NULL, + `Temperature` decimal(5, 2) NOT NULL DEFAULT 20, + `ContainerStatusID` integer unsigned NOT NULL, + `OriginCenterID` integer unsigned NOT NULL, + `CurrentCenterID` integer unsigned NOT NULL, + `LotNumber` varchar(40), + `ExpirationDate` DATE, + `DateTimeCreate` DATETIME NOT NULL DEFAULT NOW(), + `DateTimeUpdate` DATETIME NOT NULL DEFAULT NOW() ON UPDATE NOW(), + CONSTRAINT `PK_biobank_container` PRIMARY KEY (`ContainerID`), + CONSTRAINT `FK_biobank_container_ContainerTypeID` + FOREIGN KEY (`ContainerTypeID`) REFERENCES `biobank_container_type`(`ContainerTypeID`) + ON UPDATE RESTRICT ON DELETE RESTRICT, + CONSTRAINT `FK_biobank_container_ContainerStatusID` + FOREIGN KEY (`ContainerStatusID`) REFERENCES `biobank_container_status`(`ContainerStatusID`) + ON UPDATE RESTRICT ON DELETE RESTRICT, + CONSTRAINT `FK_biobank_container_OriginCenterID` + FOREIGN KEY (`OriginCenterID`) REFERENCES `psc`(`CenterID`) + ON UPDATE RESTRICT ON DELETE RESTRICT, + CONSTRAINT `FK_biobank_container_CurrentCenterID` + FOREIGN KEY (`CurrentCenterID`) REFERENCES `psc`(`CenterID`) + ON UPDATE RESTRICT ON DELETE RESTRICT, + CONSTRAINT `UK_biobank_container_Barcode` UNIQUE (`Barcode`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + + +/*Specimen*/ +CREATE TABLE `biobank_specimen_type` ( + `SpecimenTypeID` integer unsigned NOT NULL AUTO_INCREMENT, + `Label` varchar(50) NOT NULL, + `FreezeThaw` BIT(1) NOT NULL, + CONSTRAINT `PK_biobank_specimen_type` PRIMARY KEY (`SpecimenTypeID`), + CONSTRAINT `UK_biobank_specimen_type_Label` UNIQUE (`Label`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE `biobank_specimen_process` ( + `SpecimenProcessID` integer unsigned NOT NULL AUTO_INCREMENT, + `Label` varchar(50) NOT NULL, + CONSTRAINT `PK_biobank_specimen_process` PRIMARY KEY (`SpecimenProcessID`), + CONSTRAINT `UK_biobank_specimen_process_Label` UNIQUE (`Label`) +); + +CREATE TABLE `biobank_specimen_protocol` ( + `SpecimenProtocolID` integer unsigned NOT NULL AUTO_INCREMENT, + `Label` varchar(50) NOT NULL, + `SpecimenProcessID` integer unsigned NOT NULL, + `SpecimenTypeID` integer unsigned NOT NULL, + CONSTRAINT `PK_biobank_specimen_protocol` PRIMARY KEY (`SpecimenProtocolID`), + CONSTRAINT `FK_biobank_specimen_protocol_SpecimenProcessID` + FOREIGN KEY (`SpecimenProcessID`) REFERENCES `biobank_specimen_process`(`SpecimenProcessID`) + ON UPDATE RESTRICT ON DELETE RESTRICT, + CONSTRAINT `FK_biobank_specimen_protocol_SpecimenTypeID` + FOREIGN KEY (`SpecimenTypeID`) REFERENCES `biobank_specimen_type`(`SpecimenTypeID`) + ON UPDATE RESTRICT ON DELETE RESTRICT, + CONSTRAINT `UK_biobank_specimen_protocol_Label` UNIQUE (`Label`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE `biobank_specimen` ( + `SpecimenID` integer unsigned NOT NULL AUTO_INCREMENT, + `ContainerID` integer unsigned NOT NULL, /*Index by ContainerID*/ + `SpecimenTypeID` integer unsigned NOT NULL, + `Quantity` DECIMAL(10, 3) NOT NULL, + `UnitID` integer unsigned NOT NULL, + `SessionID` integer unsigned NOT NULL, + CONSTRAINT `PK_biobank_specimen` PRIMARY KEY (`SpecimenID`), + CONSTRAINT `FK_biobank_specimen_ContainerID` + FOREIGN KEY (`ContainerID`) REFERENCES `biobank_container`(`ContainerID`) + ON UPDATE RESTRICT ON DELETE RESTRICT, + CONSTRAINT `FK_biobank_specimen_SpecimenTypeID` + FOREIGN KEY (`SpecimenTypeID`) REFERENCES `biobank_specimen_type`(`SpecimenTypeID`) + ON UPDATE RESTRICT ON DELETE RESTRICT, + CONSTRAINT `FK_biobank_specimen_UnitID` + FOREIGN KEY (`UnitID`) REFERENCES `biobank_unit` (`UnitID`) + ON UPDATE RESTRICT ON DELETE RESTRICT, + CONSTRAINT `FK_biobank_specimen_SessionID` + FOREIGN KEY (`SessionID`) REFERENCES `session`(`ID`) + ON UPDATE RESTRICT ON DELETE RESTRICT, + CONSTRAINT `UK_biobank_specimen_ContainerID` UNIQUE (`ContainerID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE `biobank_specimen_freezethaw` ( + `SpecimenID` integer unsigned NOT NULL, + `FreezeThawCycle` integer unsigned NOT NULL, + CONSTRAINT `PK_biobank_specimen_freezethaw` PRIMARY KEY (`SpecimenID`), + CONSTRAINT `FK_biobank_specimen_freezethaw_SpecimenID` + FOREIGN KEY (`SpecimenID`) REFERENCES `biobank_specimen`(`SpecimenID`) + ON UPDATE RESTRICT ON DELETE RESTRICT +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE `biobank_specimen_collection` ( + `SpecimenID` integer unsigned NOT NULL, + `SpecimenProtocolID` integer unsigned NOT NULL, + `Quantity` DECIMAL(10, 3) NOT NULL, + `UnitID` integer unsigned NOT NULL, + `CenterID` integer unsigned NOT NULL, + `ExaminerID` integer unsigned NOT NULL, + `Date` DATE NOT NULL, + `Time` TIME NOT NULL, + `Comments` varchar(255), + `Data` json DEFAULT NULL, + CONSTRAINT `PK_biobank_specimen_collection` PRIMARY KEY (`SpecimenID`), + CONSTRAINT `FK_biobank_specimen_collection_SpecimenID` + FOREIGN KEY (`SpecimenID`) REFERENCES `biobank_specimen`(`SpecimenID`) + ON UPDATE RESTRICT ON DELETE RESTRICT, + CONSTRAINT `FK_biobank_specimen_collection_SpecimenProtocolID` + FOREIGN KEY (`SpecimenProtocolID`) REFERENCES `biobank_specimen_protocol`(`SpecimenProtocolID`) + ON UPDATE RESTRICT ON DELETE RESTRICT, + CONSTRAINT `FK_biobank_specimen_collection_UnitID` + FOREIGN KEY (`UnitID`) REFERENCES `biobank_unit`(`UnitID`) + ON UPDATE RESTRICT ON DELETE RESTRICT, + CONSTRAINT `FK_biobank_specimen_collection_CenterID` + FOREIGN KEY (`CenterID`) REFERENCES `psc`(`CenterID`) + ON UPDATE RESTRICT ON DELETE RESTRICT, + CONSTRAINT `FK_biobank_specimen_collection_ExaminerID` + FOREIGN KEY (`ExaminerID`) REFERENCES `examiners`(`examinerID`) + ON UPDATE RESTRICT ON DELETE RESTRICT +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE `biobank_specimen_preparation` ( + `SpecimenID` integer unsigned NOT NULL, + `SpecimenProtocolID` integer unsigned NOT NULL, + `CenterID` integer unsigned NOT NULL, + `ExaminerID` integer unsigned NOT NULL, + `Date` DATE NOT NULL, + `Time` TIME NOT NULL, + `Comments` varchar(255), + `Data` json DEFAULT NULL, + CONSTRAINT `PK_biobank_specimen_preparation` PRIMARY KEY (`SpecimenID`), + CONSTRAINT `FK_biobank_specimen_preparation_SpecimenID` + FOREIGN KEY (`SpecimenID`) REFERENCES `biobank_specimen`(`SpecimenID`) + ON UPDATE RESTRICT ON DELETE RESTRICT, + CONSTRAINT `FK_biobank_specimen_preparation_SpecimenProtocolID` + FOREIGN KEY (`SpecimenProtocolID`) REFERENCES `biobank_specimen_protocol`(`SpecimenProtocolID`) + ON UPDATE RESTRICT ON DELETE RESTRICT, + CONSTRAINT `FK_biobank_specimen_preparation_CenterID` + FOREIGN KEY (`CenterID`) REFERENCES `psc`(`CenterID`) + ON UPDATE RESTRICT ON DELETE RESTRICT, + CONSTRAINT `FK_biobank_specimen_preparation_ExaminerID` + FOREIGN KEY (`ExaminerID`) REFERENCES `examiners`(`examinerID`) + ON UPDATE RESTRICT ON DELETE RESTRICT +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE `biobank_specimen_analysis` ( + `SpecimenID` integer unsigned NOT NULL, + `SpecimenProtocolID` integer unsigned NOT NULL, + `CenterID` integer unsigned NOT NULL, + `ExaminerID` integer unsigned NOT NULL, + `Date` DATE NOT NULL, + `Time` TIME NOT NULL, + `Comments` varchar(255), + `Data` json DEFAULT NULL, + CONSTRAINT `PK_biobank_specimen` PRIMARY KEY (`SpecimenID`), + CONSTRAINT `FK_biobank_specimen_analysis_SpecimenID` + FOREIGN KEY (`SpecimenID`) REFERENCES `biobank_specimen`(`SpecimenID`) + ON UPDATE RESTRICT ON DELETE RESTRICT, + CONSTRAINT `FK_biobank_specimen_analysis_SpecimenProtocolID` + FOREIGN KEY (`SpecimenProtocolID`) REFERENCES `biobank_specimen_protocol`(`SpecimenProtocolID`) + ON UPDATE RESTRICT ON DELETE RESTRICT, + CONSTRAINT `FK_biobank_specimen_analysis_CenterID` + FOREIGN KEY (`CenterID`) REFERENCES `psc`(`CenterID`) + ON UPDATE RESTRICT ON DELETE RESTRICT, + CONSTRAINT `FK_biobank_specimen_analysis_ExaminerID` + FOREIGN KEY (`ExaminerID`) REFERENCES `examiners`(`examinerID`) + ON UPDATE RESTRICT ON DELETE RESTRICT +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE `biobank_specimen_attribute_datatype` ( + `DatatypeID` integer unsigned NOT NULL AUTO_INCREMENT, + `Datatype` varchar(20) NOT NULL UNIQUE, + CONSTRAINT `PK_biobank_datatype` PRIMARY KEY (`DatatypeID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE `biobank_specimen_attribute_referencetable` ( + `ReferenceTableID` integer unsigned NOT NULL AUTO_INCREMENT, + `TableName` varchar(50) NOT NULL, + `ColumnName` varchar(50) NOT NULL, + CONSTRAINT `PK_biobank_specimen_attribute_referencetable` PRIMARY KEY (`ReferenceTableID`), + CONSTRAINT `UK_bio_spec_attribute_referencetable_TableName_ColumnName` UNIQUE(`TableName`, `ColumnName`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + + +CREATE TABLE `biobank_specimen_attribute` ( + `SpecimenAttributeID` integer unsigned NOT NULL AUTO_INCREMENT, + `Label` varchar(40) NOT NULL, + `DatatypeID` integer unsigned NOT NULL, + `ReferenceTableID` integer unsigned, + CONSTRAINT `PK_biobank_specimen_attribute` PRIMARY KEY (`SpecimenAttributeID`), + CONSTRAINT `FK_biobank_specimen_attribute_DatatypeID` + FOREIGN KEY (`DatatypeID`) REFERENCES `biobank_specimen_attribute_datatype`(`DatatypeID`) + ON UPDATE RESTRICT ON DELETE RESTRICT, + CONSTRAINT `FK_biobank_specimen_attribute_ReferenceTableID` + FOREIGN KEY (`ReferenceTableID`) REFERENCES `biobank_specimen_attribute_referencetable`(`ReferenceTableID`) + ON UPDATE RESTRICT ON DELETE RESTRICT, + CONSTRAINT `UK_biobank_specimen_attribute_Label` UNIQUE (`Label`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +/*Pool*/ +CREATE TABLE `biobank_pool` ( + `PoolID` integer unsigned NOT NULL AUTO_INCREMENT, + `Label` varchar(40) NOT NULL, + `Quantity` DECIMAL(10, 3) NOT NULL, + `UnitID` integer unsigned NOT NULL, + `CenterID` integer unsigned NOT NULL, + `Date` DATE NOT NULL, + `Time` TIME NOT NULL, + CONSTRAINT `PK_biobank_pool` PRIMARY KEY (`PoolID`), + CONSTRAINT `FK_biobank_pool_UnitID` + FOREIGN KEY (`UnitID`) REFERENCES `biobank_unit` (`UnitID`) + ON UPDATE RESTRICT ON DELETE RESTRICT, + CONSTRAINT `FK_biobank_pool_CenterID` + FOREIGN KEY (`CenterID`) REFERENCES `psc` (`CenterID`), + CONSTRAINT `UK_biobank_pool_Label` UNIQUE (`Label`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + + +/*Relational Tables*/ +CREATE TABLE `biobank_specimen_protocol_attribute_rel` ( + `SpecimenProtocolID` integer unsigned NOT NULL, + `SpecimenAttributeID` integer unsigned NOT NULL, + `Required` BIT(1) NOT NULL, + CONSTRAINT `PK_biobank_specimen_protocol_attribute_rel` PRIMARY KEY (`SpecimenProtocolID`, `SpecimenAttributeID`), + CONSTRAINT `FK_biobank_specimen_protocol_attribute__rel_SpecimenProtocolID` + FOREIGN KEY (`SpecimenProtocolID`) REFERENCES `biobank_specimen_protocol`(`SpecimenProtocolID`) + ON UPDATE RESTRICT ON DELETE RESTRICT, + CONSTRAINT `FK_biobank_specimen_protocol_attribute_rel_SpecimenAttributeID` + FOREIGN KEY (`SpecimenAttributeID`) REFERENCES `biobank_specimen_attribute`(`SpecimenAttributeID`) + ON UPDATE RESTRICT ON DELETE RESTRICT +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE `biobank_specimen_protocol_container_type_rel` ( + `SpecimenProtocolID` integer unsigned NOT NULL, + `ContainerTypeID` integer unsigned NOT NULL, + CONSTRAINT `PK_biobank_specimen_protocol_container_type_rel` PRIMARY KEY (SpecimenProtocolID, ContainerTypeID), + CONSTRAINT `FK_bio_spec_protocol_container_type_rel_SpecimenProtocolID` + FOREIGN KEY (`SpecimenProtocolID`) REFERENCES `biobank_specimen_protocol`(`SpecimenProtocolID`) + ON UPDATE RESTRICT ON DELETE RESTRICT, + CONSTRAINT `FK_biobank_specimen_protocol_container_type_rel_ContainerTypeID` + FOREIGN KEY (`ContainerTypeID`) REFERENCES `biobank_container_type`(`ContainerTypeID`) + ON UPDATE RESTRICT ON DELETE RESTRICT +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE `biobank_specimen_type_container_type_rel` ( + `SpecimenTypeID` integer unsigned NOT NULL, + `ContainerTypeID` integer unsigned NOT NULL, + CONSTRAINT `PK_biobank_specimen_type_container_type_rel` PRIMARY KEY (SpecimenTypeID, ContainerTypeID), + CONSTRAINT `FK_biobank_specimen_type_container_type_rel_SpecimenTypeID` + FOREIGN KEY (`SpecimenTypeID`) REFERENCES `biobank_specimen_type`(`SpecimenTypeID`) + ON UPDATE RESTRICT ON DELETE RESTRICT, + CONSTRAINT `FK_biobank_validate_identifier_ContainerTypeID` + FOREIGN KEY (`ContainerTypeID`) REFERENCES `biobank_container_type`(`ContainerTypeID`) + ON UPDATE RESTRICT ON DELETE RESTRICT +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE `biobank_specimen_type_unit_rel` ( + `SpecimenTypeID` integer unsigned NOT NULL, + `UnitID` integer unsigned NOT NULL, + CONSTRAINT `PK_biobank_container_psc_rel` PRIMARY KEY (`SpecimenTypeID`, `UnitID`), + CONSTRAINT `FK_biobank_specimen_type_unit_rel_TypeID` + FOREIGN KEY (`SpecimenTypeID`) REFERENCES `biobank_specimen_type` (`SpecimenTypeID`) + ON UPDATE RESTRICT ON DELETE RESTRICT, + CONSTRAINT `FK_biobank_specimen_type_unit_rel_SourceID` + FOREIGN KEY (`UnitID`) REFERENCES `biobank_unit` (`UnitID`) + ON UPDATE RESTRICT ON DELETE RESTRICT +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE `biobank_specimen_parent` ( + `SpecimenID` integer unsigned NOT NULL, + `ParentSpecimenID` integer unsigned NOT NULL, + CONSTRAINT `PK_biobank_specimen_parent` PRIMARY KEY (`SpecimenID`, `ParentSpecimenID`), + CONSTRAINT `FK_biobank_specimen_parent_SpecimenID` + FOREIGN KEY (`SpecimenID`) REFERENCES `biobank_specimen`(`SpecimenID`) + ON UPDATE RESTRICT ON DELETE RESTRICT, + CONSTRAINT `FK_biobank_specimen_parent_ParentSpecimenID` + FOREIGN KEY (`ParentSpecimenID`) REFERENCES `biobank_specimen`(`SpecimenID`) + ON UPDATE RESTRICT ON DELETE RESTRICT +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE `biobank_specimen_type_parent` ( + `SpecimenTypeID` integer unsigned NOT NULL, + `ParentSpecimenTypeID` integer unsigned NOT NULL, + CONSTRAINT `PK_biobank_specimen_type_parent` PRIMARY KEY (`SpecimenTypeID`, `ParentSpecimenTypeID`), + CONSTRAINT `FK_biobank_specimen_type_parent_SpecimenTypeID` + FOREIGN KEY (`SpecimenTypeID`) REFERENCES `biobank_specimen_type`(`SpecimenTypeID`) + ON UPDATE RESTRICT ON DELETE RESTRICT, + CONSTRAINT `FK_biobank_specimen_type_parent_ParentSpecimenTypeID` + FOREIGN KEY (`ParentSpecimenTypeID`) REFERENCES `biobank_specimen_type`(`SpecimenTypeID`) + ON UPDATE RESTRICT ON DELETE RESTRICT +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE `biobank_specimen_pool_rel` ( + `SpecimenID` integer unsigned NOT NULL, + `PoolID` integer unsigned NOT NULL, + CONSTRAINT `PK_biobank_specimen_pool_rel` PRIMARY KEY (`SpecimenID`), + CONSTRAINT `FK_biobank_specimen_pool_rel_SpecimenID` + FOREIGN KEY (`SpecimenID`) REFERENCES `biobank_specimen`(`SpecimenID`) + ON UPDATE RESTRICT ON DELETE RESTRICT, + CONSTRAINT `FK_biobank_specimen_pool_rel_PoolID` + FOREIGN KEY (`PoolID`) REFERENCES `biobank_pool`(`PoolID`) + ON UPDATE RESTRICT ON DELETE RESTRICT +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE `biobank_container_project_rel` ( + `ContainerID` integer unsigned NOT NULL, + `ProjectID` int(2) NOT NULL, + CONSTRAINT `PK_biobank_container_project_rel` PRIMARY KEY (`ContainerID`, `ProjectID`), + CONSTRAINT `FK_biobank_container_project_rel_ContainerID` + FOREIGN KEY (`ContainerID`) REFERENCES `biobank_container`(`ContainerID`) + ON UPDATE RESTRICT ON DELETE RESTRICT, + CONSTRAINT `FK_biobank_container_project_rel_ProjectID` + FOREIGN KEY (`ProjectID`) REFERENCES `Project`(`ProjectID`) + ON UPDATE RESTRICT ON DELETE RESTRICT +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE `biobank_container_parent` ( + `ContainerID` integer unsigned NOT NULL, + `ParentContainerID` integer unsigned NOT NULL, + `Coordinate` integer unsigned, + CONSTRAINT `PK_biobank_container_parent_ContainerID` + PRIMARY KEY (`ContainerID`), + CONSTRAINT `FK_biobank_container_parent_ContainerID` + FOREIGN KEY (`ContainerID`) REFERENCES `biobank_container` (`ContainerID`) + ON UPDATE RESTRICT ON DELETE RESTRICT, + CONSTRAINT `FK_biobank_container_parent_ParentContainerID` + FOREIGN KEY (`ParentContainerID`) REFERENCES `biobank_container` (`ContainerID`) + ON UPDATE RESTRICT ON DELETE RESTRICT, + CONSTRAINT `UK_biobank_container_parent_ParentContainerID_Coordinate` + UNIQUE (`ParentContainerID`, `Coordinate`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + + +/*INDEXES*/ + +/* Future indexes need to go here*/ + + +/*INSERTS*/ + +/*XXX: The following 4 lines are for testing. Delete before merging.*/ +DELETE FROM LorisMenu WHERE `Label`='Specimens'; +DELETE FROM LorisMenu WHERE `Label`='Containers'; +DELETE FROM LorisMenu WHERE `Label`='Pools'; +DELETE FROM LorisMenu WHERE `Label`='Biobank'; + +DELETE FROM permissions WHERE + `code`='biobank_specimen_view' OR + `code`='biobank_specimen_create' OR + `code`='biobank_specimen_update' OR + `code`='biobank_container_view' OR + `code`='biobank_container_create' OR + `code`='biobank_container_update' OR + `code`='biobank_pool_view' OR + `code`='biobank_pool_create'; + +DELETE FROM ConfigSettings WHERE + `Name`='biobankPath'; + +/*Loris Menu*/ +UPDATE LorisMenu SET `OrderNumber`=5 WHERE `Label`='Reports'; +UPDATE LorisMenu SET `OrderNumber`=6 WHERE `Label`='Tools'; +UPDATE LorisMenu SET `OrderNumber`=7 WHERE `Label`='Admin'; + +INSERT INTO LorisMenu (Label, OrderNumber) VALUES + ('Biobank', 4) +; + +INSERT INTO LorisMenu (Label, Link, Parent, OrderNumber) VALUES + ('Specimens', 'biobank#specimens', (SELECT ID FROM LorisMenu as L WHERE Label='Biobank'), 1), + ('Containers', 'biobank#containers', (SELECT ID FROM LorisMenu as L WHERE Label='Biobank'), 2), + ('Pools', 'biobank#pools', (SELECT ID FROM LorisMenu as L WHERE Label='Biobank'), 3) +; + +/*Permissions*/ +INSERT INTO permissions (code, description, categoryID) VALUES + ('biobank_specimen_view', 'Biobank: View Specimen Data', 2), + ('biobank_specimen_create', 'Biobank: Create Specimen Data', 2), + ('biobank_specimen_update', 'Biobank: Update Specimen Data', 2), + ('biobank_container_view', 'Biobank: View Container Data', 2), + ('biobank_container_create', 'Biobank: Create Container Data', 2), + ('biobank_container_update', 'Biobank: Update Container Data', 2), + ('biobank_pool_view', 'Biobank: View Pool Data', 2), + ('biobank_pool_create', 'Biobank: Create Pool Data', 2) +; + +/*Config*/ +INSERT INTO ConfigSettings (Name, Description, Visible, AllowMultiple, DataType, Parent, Label, OrderNumber) + SELECT 'biobankPath', 'Path to Biobank data files', 1, 0, 'text', ID, 'Biobank', 10 + FROM ConfigSettings + WHERE Name="paths"; + +/*Specimen*/ +INSERT INTO biobank_specimen_attribute_datatype (Datatype) +VALUES ('boolean'), + ('number'), + ('text'), + ('date'), + ('time'), + ('file') +; + +INSERT INTO biobank_specimen_process (Label) +VALUES ('Collection'), + ('Analysis'), + ('Preparation') +; + +/*Container*/ +INSERT INTO biobank_container_status (Label) +VALUES ('Available'), + ('Reserved'), + ('Dispensed'), + ('Discarded') +; + diff --git a/jsx/Form.js b/jsx/Form.js index 0e49f0a0b9b..1dde1019a22 100644 --- a/jsx/Form.js +++ b/jsx/Form.js @@ -1062,7 +1062,7 @@ class DateElement extends Component {
+ * @license http://www.gnu.org/licenses/gpl-3.0.txt GPLv3 + * @link https://github.com/aces/Loris + */ + +/** + * The NotFound exception is thrown when a resource can not + * be found. It maps to a 404 error. + * + * @category Errors + * @package Loris + * @author Loris Team + * @license http://www.gnu.org/licenses/gpl-3.0.txt GPLv3 + * @link https://github.com/aces/Loris + */ + +class Forbidden extends LorisException +{ +} + diff --git a/php/exceptions/UploadException.class.inc b/php/exceptions/UploadException.class.inc new file mode 100644 index 00000000000..c6dd5941351 --- /dev/null +++ b/php/exceptions/UploadException.class.inc @@ -0,0 +1,80 @@ + + * @license http://www.gnu.org/licenses/gpl-3.0.txt GPLv3 + * @link https://github.com/aces/Loris + */ + +/** + * The UploadException class + * + * @category Errors + * @package Loris + * @author Xavier Lecours Boucher + * @license http://www.gnu.org/licenses/gpl-3.0.txt GPLv3 + * @link https://github.com/aces/Loris + */ +class UploadException extends \LorisException +{ + /** + * Contructor that takes the upload error code to generate the message. + * + * @param int $code The error code + * + * @see http://php.net/manual/en/features.file-upload.errors.php + */ + public function __construct(int $code) + { + $message = $this->_codeToMessage($code); + parent::__construct($message, $code); + } + + /** + * Mapper function to retreive the corresponding error message. + * + * @param int $code The error code + * + * @return string + */ + private function _codeToMessage(int $code) : string + { + switch ($code) { + case UPLOAD_ERR_INI_SIZE: + $message = 'The uploaded file exceeds the upload_max_filesize ' . + 'directive in php.ini'; + break; + case UPLOAD_ERR_FORM_SIZE: + $message = 'The uploaded file exceeds the MAX_FILE_SIZE ' . + 'directive that was specified in the HTML form'; + break; + case UPLOAD_ERR_PARTIAL: + $message = 'The uploaded file was only partially uploaded'; + break; + case UPLOAD_ERR_NO_FILE: + $message = 'No file was uploaded'; + break; + case UPLOAD_ERR_NO_TMP_DIR: + $message = 'Missing a temporary folder'; + break; + case UPLOAD_ERR_CANT_WRITE: + $message = 'Failed to write file to disk'; + break; + case UPLOAD_ERR_EXTENSION: + $message = 'File upload stopped by extension'; + break; + + default: + $message = 'Unknown upload error'; + break; + } + return $message; + } +} + diff --git a/php/libraries/Database.class.inc b/php/libraries/Database.class.inc index 7f66b49fa57..4649f2bab42 100644 --- a/php/libraries/Database.class.inc +++ b/php/libraries/Database.class.inc @@ -815,7 +815,7 @@ class Database // If you get here, we just need to build the new array $filteredResult[$row[$uniqueKey]] = $row; - unset($filteredResult[$row[$uniqueKey]][$uniqueKey]); + //unset($filteredResult[$row[$uniqueKey]][$uniqueKey]); } return $filteredResult; diff --git a/php/libraries/FilesUploadHandler.class.inc b/php/libraries/FilesUploadHandler.class.inc new file mode 100644 index 00000000000..bd37fcbce37 --- /dev/null +++ b/php/libraries/FilesUploadHandler.class.inc @@ -0,0 +1,230 @@ + + * @license http://www.gnu.org/licenses/gpl-3.0.txt GPLv3 + * @link https://www.github.com/aces/Loris + */ +namespace LORIS; + +use \Psr\Http\Message\ResponseInterface; +use \Psr\Http\Message\ServerRequestInterface; +use \Psr\Http\Server\RequestHandlerInterface; + +/** + * Class to validate file uploads to LORIS. + * + * @category Main + * @package Behavioural + * @author John Saigle + * @license http://www.gnu.org/licenses/gpl-3.0.txt GPLv3 + * @link https://www.github.com/aces/Loris + */ +class FilesUploadHandler implements RequestHandlerInterface +{ + + /** + * The target upload directory. + * + * @var \SplFileInfo + */ + private $_uploadDirectory; + + /** + * A whitelist of all MIME types to accept. + * + * @var string[] + */ + private $_permittedMIMETypes = array(); + + /** + * A UNIX permissions octet. + * + * @var int + */ + private $_permissions = 0644; + + /** + * Whether existing files should be overwritten. + * + * @var bool + */ + private $_overwrite = false; + + /** + * Create new instance of a File Uploader. + * + * @param \SplFileInfo $uploadDirectory The target upload directory + */ + public function __construct(\SplFileInfo $uploadDirectory) + { + $this->_uploadDirectory = $uploadDirectory; + + if (! $this->_uploadDirectory->isDir()) { + throw new \LorisException( + 'Upload directory is not a directory' + ); + } + + if (! $this->_uploadDirectory->isWritable()) { + throw new \LorisException( + 'Upload directory is not writable' + ); + } + } + + /** + * Generates a new FilesUploadHandler with customized permissions + * + * @param int $permissions The new UNIX permissions octet + * + * @return FilesUploadHandler + */ + public function withPermissions(int $permissions): FilesUploadHandler + { + $new = clone($this); + $new->_permissions = $permissions; + return $new; + } + + /** + * Generates a new FilesUploadHandler with customized permitted MIME Types + * + * @param string ...$mimetypes A variadic amount of strings + * + * @return FilesUploadHandler + */ + public function withPermittedMIMETypes(string ...$mimetypes): FilesUploadHandler + { + $new = clone($this); + $new->_permittedMIMETypes = $mimetypes; + return $new; + } + + /** + * Generates a new FilesUploadHandler with customized overwrite value + * + * @param bool $overwrite Whether existing files should be overwritten. + * + * @return FilesUploadHandler + */ + public function withOverwrite(bool $overwrite): FilesUploadHandler + { + $new = clone($this); + $new->_overwrite = $overwrite; + return $new; + } + + /** + * Given an HTTP request, upload all the files to the server in the + * same uploadDirectory. + * + * All files uploaded will get the same permissions. + * + * If the $overwrite parameter is set to true, existing files will be + * overwritten. + * + * If the files need different permissions on need to go in different + * directories, the file must be split in different request an passed to a + * FileUploadHandler with the correct variables. + * + * @param ServerRequestInterface $request An HTTP Request that contains files. + * + * @return ResponseInterface + */ + public function handle(ServerRequestInterface $request) : ResponseInterface + { + $files = $request->getUploadedFiles(); + + foreach ($files as $file) { + if ($file->getError() !== \UPLOAD_ERR_OK) { + $message = (new \LORIS\UploadException($file->getError())) + ->getMessage(); + + return (new \LORIS\Http\Response()) + ->withStatus(500) + ->withBody( + new \LORIS\Http\StringStream( + json_encode( + array('error' => $message) + ) + ) + ); + } + + /* basename() is used here to prevent path traversal characters + * from being used. + */ + $targetPath = $this->_uploadDirectory->getPathname() . '/' . basename( + $file->getClientFilename() + ); + + /* If file exists, set response code to 'Conflict' unless the + * calling code wants to overwrite the file. + */ + if (file_exists($targetPath) && $this->_overwrite === false) { + (new \LORIS\Http\Response()) + ->withStatus(409, 'Conflict') + ->withBody( + new \LORIS\Http\StringStream( + json_encode( + array('error' => 'This file has already been uploaded.') + ) + ) + ); + } + + // Validate that the MIME type of the file is allowed + if (!empty($this->_permittedMIMETypes)) { + if (!in_array( + $file->getClientMediaType(), + $this->_permittedMIMETypes, + true + )) { + return (new \LORIS\Http\Response()) + ->withStatus(400) + ->withBody( + new \LORIS\Http\StringStream( + json_encode( + array('error' => 'Unacceptable MIME type') + ) + ) + ); + } + } + + // Move the file to $targetPath + try { + $file->moveTo($targetPath); + } catch (\Exception $e) { + error_log( + 'Could not upload file: ' . $e->getMessage() + ); + return (new \LORIS\Http\Response()) + ->withStatus(500) + ->withBody( + new \LORIS\Http\StringStream( + json_encode( + array('error' => 'Could not upload file') + ) + ) + ); + } + chmod($targetPath, $this->_permissions); + } + + return (new \LORIS\Http\Response()) + ->withStatus(200); + } +} + From 6c6d03dcce64415f8dcc255740bca6645a35ac1f Mon Sep 17 00:00:00 2001 From: Loris Admin Date: Thu, 18 Jul 2019 16:24:08 -0400 Subject: [PATCH 17/95] updating Biobank --- jsx/Form.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/jsx/Form.js b/jsx/Form.js index 1dde1019a22..72a0285575d 100644 --- a/jsx/Form.js +++ b/jsx/Form.js @@ -1066,8 +1066,6 @@ class DateElement extends Component { className="form-control" name={this.props.name} id={this.props.id} - min={minFullDate} - max={maxFullDate} onChange={this.handleChange} value={this.props.value || ''} required={required} From 16419d0c0f1b12391537db57818b2317f5ffbbfa Mon Sep 17 00:00:00 2001 From: Loris Admin Date: Mon, 22 Jul 2019 12:28:34 -0400 Subject: [PATCH 18/95] Updated Form to work with Biobank Module --- jsx/Form.js | 139 ++++++++++++++++------------------------------------ 1 file changed, 43 insertions(+), 96 deletions(-) diff --git a/jsx/Form.js b/jsx/Form.js index 72a0285575d..659c71194ff 100644 --- a/jsx/Form.js +++ b/jsx/Form.js @@ -258,9 +258,11 @@ class SearchableDropdown extends Component { componentDidUpdate(prevProps) { // need to clear out currentInput for when props.value gets wiped // if the previous value prop contained data and the current one doesn't - // clear currentInput + // clear currentInput. if (prevProps.value && !this.props.value) { this.setState({currentInput: ''}); + } else if (this.props.value !== prevProps.value && this.props.value) { + this.setState({currentInput: this.props.options[this.props.value]}); } } @@ -341,7 +343,6 @@ class SearchableDropdown extends Component { className="form-control" disabled={disabled} placeholder={this.props.placeHolder} - autoFocus={this.props.autoFocus} onChange={this.handleChange} onBlur={this.handleBlur} required={required} @@ -371,10 +372,8 @@ SearchableDropdown.propTypes = { class: PropTypes.string, disabled: PropTypes.bool, required: PropTypes.bool, - sortByValue: PropTypes.bool, errorMessage: PropTypes.string, placeHolder: PropTypes.string, - autoFocus: PropTypes.bool, onUserInput: PropTypes.func, }; @@ -391,7 +390,6 @@ SearchableDropdown.defaultProps = { sortByValue: true, errorMessage: '', placeHolder: '', - autoFocus: false, onUserInput: function() { console.warn('onUserInput() callback is not set'); }, @@ -410,8 +408,6 @@ class SelectElement extends Component { handleChange(e) { let value = e.target.value; let options = e.target.options; - const id = e.target.id; - const type = e.target.localName; const numOfOptions = options.length; // Multiple values @@ -424,8 +420,7 @@ class SelectElement extends Component { } } - // TODO: use this concept elsewhere in the code. - this.props.onUserInput(this.props.name, value, id, type); + this.props.onUserInput(this.props.name, value, e.target.id, 'select'); } render() { @@ -438,7 +433,6 @@ class SelectElement extends Component { let emptyOptionHTML = null; let requiredHTML = null; let elementClass = 'row form-group'; - let label = null; // Add required asterisk if (required) { @@ -452,7 +446,7 @@ class SelectElement extends Component { // Add error message if (this.props.errorMessage || (this.props.required && this.props.value === '')) { - errorMessage = {this.props.errorMessage}; + errorMessage = {this.props.errorMessagei || 'The field is required!'}; elementClass = 'row form-group has-error'; } @@ -480,19 +474,13 @@ class SelectElement extends Component { // Default to empty string for regular select and to empty array for 'multiple' select const value = this.props.value || (multiple ? [] : ''); - if (this.props.label) { - label = ( + return ( +
- ); - } - - return ( -
- {label} -
+
{ - // Update date in the input field - $(this).datepicker('setDate', new Date(y, m - 1, d.selectedDay)); - }, - onSelect: (dateText, picker) => { - this.props.onUserInput(this.props.name, dateText); - }, - }); - monthInputs.attr('placeholder', 'yyyy-mm'); - monthInputs.on('keydown paste', (e) => { - e.preventDefault(); - }); - } - } - handleChange(e) { - this.props.onUserInput(this.props.name, e.target.value, e.target.id, 'date'); + this.props.onUserInput(this.props.name, e.target.value); } render() { let disabled = this.props.disabled ? 'disabled' : null; let required = this.props.required ? 'required' : null; - let errorMessage = null; let requiredHTML = null; + let errorMessage = null; let elementClass = 'row form-group'; // Add required asterix @@ -1062,12 +1004,14 @@ class DateElement extends Component {
@@ -1085,10 +1029,8 @@ DateElement.propTypes = { id: PropTypes.string, maxYear: PropTypes.string, minYear: PropTypes.string, - dateFormat: PropTypes.string, disabled: PropTypes.bool, required: PropTypes.bool, - errorMessage: PropTypes.func, onUserInput: PropTypes.func, }; @@ -1097,12 +1039,10 @@ DateElement.defaultProps = { label: '', value: '', id: null, - maxYear: '9999', - minYear: '1000', - dateFormat: 'YMd', + maxYear: '9999-12-31', + minYear: '1000-01-01', disabled: false, required: false, - errorMessage: '', onUserInput: function() { console.warn('onUserInput() callback is not set'); }, @@ -1126,8 +1066,8 @@ class TimeElement extends Component { render() { let disabled = this.props.disabled ? 'disabled' : null; let required = this.props.required ? 'required' : null; - let errorMessage = null; let requiredHTML = null; + let errorMessage = null; let elementClass = 'row form-group'; // Add required asterix @@ -1174,7 +1114,6 @@ TimeElement.propTypes = { id: PropTypes.string, disabled: PropTypes.bool, required: PropTypes.bool, - errorMessage: PropTypes.string, onUserInput: PropTypes.func, }; @@ -1185,7 +1124,6 @@ TimeElement.defaultProps = { id: '', disabled: false, required: false, - errorMessage: '', onUserInput: function() { console.warn('onUserInput() callback is not set'); }, @@ -1209,9 +1147,22 @@ class NumericElement extends Component { let disabled = this.props.disabled ? 'disabled' : null; let required = this.props.required ? 'required' : null; let requiredHTML = null; + let errorMessage = null; + let elementClass = 'row form-group'; + + // Add required asterix + if (required) { + requiredHTML = *; + } + + // Add error message + if (this.props.errorMessage) { + errorMessage = {this.props.errorMessage}; + elementClass = 'row form-group has-error'; + } return ( -
+
); @@ -1303,7 +1255,7 @@ class FileElement extends Component { }; // Add error message - if (this.props.hasError) { + if (this.props.errorMessage) { errorMessage = this.props.errorMessage; elementClass = 'row form-group has-error'; } @@ -1378,7 +1330,6 @@ FileElement.propTypes = { id: PropTypes.string, disabled: PropTypes.bool, required: PropTypes.bool, - hasError: PropTypes.bool, errorMessage: PropTypes.string, onUserInput: PropTypes.func, }; @@ -1390,8 +1341,6 @@ FileElement.defaultProps = { id: null, disabled: false, required: false, - hasError: false, - errorMessage: 'The field is required!', onUserInput: function() { console.warn('onUserInput() callback is not set'); }, @@ -1419,10 +1368,10 @@ class StaticElement extends Component { render() { return (
-
; + case 'Parent Specimens': + const barcodes = value && value.map((id) => { + return {value}; + }).reduce((prev, curr) => [prev, ', ', curr]); + return ; + case 'PSCID': + const pscidURL = loris.BaseURL + '/' + + Object.values(this.props.options.candidates).find((cand) => cand.pscid == value).id; + return ; + case 'Visit Label': + const visitLabelURL = loris.BaseURL+'/instrument_list/?candID='+row['PSCID']+ + '&sessionID='+Object.values(this.props.options.sessions).find((sess) => sess.label == value).id; + return ; + case 'Status': + switch (value) { + case 'Available': + return ; + case 'Reserved': + return ; + case 'Dispensed': + return ; + case 'Discarded': + return ; + default: + return ; + } + case 'Projects': + return ; + case 'Container Barcode': + return ; + default: + return ; + } + } + + mapContainerColumns(column, value) { + switch (column) { + case 'Type': + return this.props.options.container.types[value].label; + case 'Status': + return this.props.options.container.stati[value].label; + case 'Projects': + return value.map((id) => this.props.options.projects[id]); + case 'Site': + return this.props.options.centers[value]; + case 'Parent Barcode': + return (value && this.props.data.containers.nonPrimary[value].barcode); + default: + return value; + } + } + + formatContainerColumns(column, value, row) { + value = this.mapContainerColumns(column, value); + switch (column) { + case 'Barcode': + return ; + case 'Status': + switch (value) { + case 'Available': + return ; + case 'Reserved': + return ; + case 'Dispensed': + return ; + case 'Discarded': + return ; + default: + return ; + } + case 'Projects': + return ; + case 'Parent Barcode': + return ; + default: + return ; + } + } + + mapPoolColumns(column, value) { + switch (column) { + case 'Pooled Specimens': + return value.map((id) => { + return (this.props.data.containers.primary[this.props.data.specimens[id].containerId]||{}).barcode; + }); + case 'PSCID': + return this.props.options.candidates[value].pscid; + case 'Visit Label': + return this.props.options.sessions[value].label; + case 'Type': + return this.props.options.specimen.types[value].label; + default: + return value; + } + } + + formatPoolColumns(column, value, row) { + value = this.mapPoolColumns(column, value); + switch (column) { + case 'Pooled Specimens': + const barcodes = value + .map((barcode) => { + if (loris.userHasPermission('biobank_specimen_view')) { + return {barcode}; + } + }) + .reduce((prev, curr) => [prev, ', ', curr]); + return ; + case 'PSCID': + const pscidURL = loris.BaseURL + '/' + + Object.values(this.props.options.candidates).find((cand) => cand.pscid == value).id; + return ; + case 'Visit Label': + const visitLabelURL = loris.BaseURL+'/instrument_list/?candID='+row['PSCID']+ + '&sessionID='+Object.values(this.props.options.sessions).find((sess) => sess.label == value).id; + return ; + case 'Aliquot': + return ; + default: + return ; + } + } + + renderSpecimenForm() { + if (!loris.userHasPermission('biobank_specimen_create')) { + return; + }; + return ( + + + + + + ); + } + + renderPoolForm() { + if (!loris.userHasPermission('biobank_pool_create')) { + return; + } + return ( + + + + ); + } + + renderBatchPreparationForm() { + if (!loris.userHasPermission('biobank_specimen_create')) { + return; + } + return ( + + + + ); + } + + specimenTab() { + const barcodesPrimary = this.props.mapFormOptions( + this.props.data.containers.primary, 'barcode' + ); + const specimenTypes = this.props.mapFormOptions( + this.props.options.specimen.types, 'label' + ); + const stati = this.props.mapFormOptions( + this.props.options.container.stati, 'label' + ); + const pscids = this.props.mapFormOptions( + this.props.options.candidates, 'pscid' + ); + + const data = Object.values(this.props.data.specimens).map((specimen) => { + const container = this.props.data.containers.primary[specimen.containerId]; + const parentContainer = this.props.data.containers.nonPrimary[container.parentContainerId] || {}; + + return [ + container.barcode, + specimen.typeId, + specimen.quantity+' '+this.props.options.specimen.units[specimen.unitId].label, + specimen.fTCycle || null, + specimen.parentSpecimenIds, + specimen.candidateId, + specimen.sessionId, + specimen.poolId ? this.props.data.pools[specimen.poolId].label : null, + container.statusId, + container.projectIds, + container.centerId, + specimen.collection.date, + parentContainer.barcode, + ]; + }); + + const fields = [ + {label: 'Barcode', show: true, filter: { + name: 'barcode', + type: 'text', + }}, + {label: 'Type', show: true, filter: { + name: 'type', + type: 'select', + options: specimenTypes, + }}, + {label: 'Quantity', show: true}, + {label: 'F/T Cycle', show: false, filter: { + name: 'fTCycle', + type: 'text', + hide: true, + }}, + {label: 'Parent Specimen(s)', show: false, filter: { + name: 'parentSpecimens', + type: 'text', + hide: true, + }}, + {label: 'PSCID', show: true, filter: { + name: 'pscid', + type: 'text', + options: pscids, + }}, + {label: 'Visit Label', show: true, filter: { + name: 'visitLabel', + type: 'text', + }}, + {label: 'Pool', show: false, filter: { + name: 'pool', + type: 'text', + hide: true, + }}, + {label: 'Status', show: true, filter: { + name: 'status', + type: 'select', + options: stati, + }}, + {label: 'Projects', show: true}, + {label: 'Site', show: true, filter: { + name: 'site', + type: 'select', + options: this.props.options.centers, + }}, + {label: 'Date Collected', show: true}, + {label: 'Container Barcode', show: true, filter: { + name: 'containerBarcode', + type: 'text', + }}, + ]; + + const actions = [ + {name: 'goToSpecimen', label: 'Go To Specimen', action: this.openSearchSpecimen}, + {name: 'addSpecimen', label: 'Add Specimen', action: this.openSpecimenForm}, + {name: 'poolSpecimen', label: 'Pool Specimens', action: this.openPoolForm}, + {name: 'batchPreparation', label: 'Batch Preparation', action: this.openBatchPreparationForm}, + ]; + + return ( +
+ + + {this.renderSpecimenForm()} + {this.renderPoolForm()} + {this.renderBatchPreparationForm()} +
+ ); + } + + renderContainerForm() { + if (!loris.userHasPermission('biobank_container_create')) { + return; + } + const containerTypesNonPrimary = this.props.mapFormOptions( + this.props.options.container.typesNonPrimary, 'label' + ); + return ( + + + + + + ); + } + + containerTab() { + const stati = this.props.mapFormOptions( + this.props.options.container.stati, 'label' + ); + const containerTypesNonPrimary = this.props.mapFormOptions( + this.props.options.container.typesNonPrimary, 'label' + ); + const barcodesNonPrimary = this.props.mapFormOptions( + this.props.data.containers.nonPrimary, 'barcode' + ); + + const data = Object.values(this.props.data.containers.nonPrimary).map( + (container) => { + return [ + container.barcode, + container.typeId, + container.statusId, + container.projectIds, + container.centerId, + container.parentContainerId, + ]; + } + ); + + const fields = [ + {label: 'Barcode', show: true, filter: { + name: 'barcode', + type: 'text', + }}, + {label: 'Type', show: true, filter: { + name: 'type', + type: 'select', + options: containerTypesNonPrimary, + }}, + {label: 'Status', show: true, filter: { + name: 'status', + type: 'select', + options: stati, + }}, + {label: 'Projects', show: true}, + {label: 'Site', show: true, filter: { + name: 'site', + type: 'select', + options: this.props.options.centers, + }}, + {label: 'Parent Barcode', show: true, filter: { + name: 'parentBarcode', + type: 'text', + }}, + ]; + + const actions = [ + {name: 'goToContainer', label: 'Go To Container', action: this.openSearchContainer}, + {name: 'addContainer', label: 'Add Container', action: this.openContainerForm}, + ]; + + return ( +
+ + + {this.renderContainerForm()} +
+ ); + } + + // TODO: This should be fixed. A lot of hacks are being used to initialize + // this form and there's definitely better ways to be doing it. + renderAliquotForm() { + if (!(loris.userHasPermission('biobank_specimen_create') && this.props.current.poolId)) { + return; + } + const specimens = Object.values(this.props.data.specimens).filter( + (specimen) => specimen.poolId == this.props.current.poolId + ); + const parents = specimens.map( + (specimen) => { + return {specimen: specimen, container: this.props.data.containers.primary[specimen.containerId]}; + } + ); + + return ( + + + + + + ); + } + + poolTab() { + const pscids = this.props.mapFormOptions( + this.props.options.candidates, 'pscid' + ); + const specimenTypes = this.props.mapFormOptions( + this.props.options.specimen.types, 'label' + ); + const data = Object.values(this.props.data.pools).map((pool) => { + return [ + pool.id, + pool.label, + pool.quantity+' '+this.props.options.specimen.units[pool.unitId].label, + pool.specimenIds, + pool.candidateId, + pool.sessionId, + pool.typeId, + this.props.options.centers[pool.centerId], + pool.date, + pool.time, + ]; + }); + + const fields = [ + {label: 'ID', show: false}, + {label: 'Label', show: true, filter: { + name: 'barcode', + type: 'text', + }}, + {label: 'Quantity', show: true}, + {label: 'Pooled Specimens', show: true}, + {label: 'PSCID', show: true, filter: { + name: 'pscid', + type: 'select', + options: pscids, + }}, + {label: 'Visit Label', show: true, filter: { + name: 'visit', + type: 'text', + }}, + {label: 'Type', show: true, filter: { + name: 'type', + type: 'select', + options: specimenTypes, + }}, + {label: 'Site', show: true, filter: { + name: 'site', + type: 'select', + options: this.props.options.centers, + }}, + {label: 'Date', show: true}, + {label: 'Time', show: true}, + {label: 'Aliquot', show: true}, + ]; + + return ( +
+ + {this.renderAliquotForm()} +
+ ); + } + + render() { + const tabs = () => { + const tabInfo = []; + const tabList = []; + if (loris.userHasPermission('biobank_specimen_view')) { + tabInfo.push({id: 'specimens', content: this.specimenTab}); + tabList.push({id: 'specimens', label: 'Specimens'}); + } + if (loris.userHasPermission('biobank_container_view')) { + tabInfo.push({id: 'containers', content: this.containerTab}); + tabList.push({id: 'containers', label: 'Containers'}); + } + if (loris.userHasPermission('biobank_pool_view')) { + tabInfo.push({id: 'pools', content: this.poolTab}); + tabList.push({id: 'pools', label: 'Pools'}); + } + + const tabContent = Object.keys(tabInfo).map((key) => { + return {tabInfo[key].content()}; + }); + + return ( + + {tabContent} + + ); + }; + + return ( +
+ {tabs()} +
+ ); + } +} + +BiobankFilter.propTypes = { + filter: PropTypes.object.isRequired, + data: PropTypes.object.isRequired, + options: PropTypes.object.isRequired, + editable: PropTypes.object.isRequired, + loadContainer: PropTypes.func.isRequired, + loadTransfer: PropTypes.func.isRequired, + updateSpecimenFilter: PropTypes.func.isRequired, + updateContainerFilter: PropTypes.func.isRequired, + mapFormOptions: PropTypes.func.isRequired, + edit: PropTypes.func.isRequired, + clearAll: PropTypes.func.isRequired, +}; + +BiobankFilter.defaultProps = { +}; + +class Search extends Component { + render() { + return ( + + + { + if (this.props.barcodes[value]) { + this.props.history.push(`/barcode=${this.props.barcodes[value]}`); + this.props.clearAll(); + } + }} + placeHolder='Please Scan or Select Barcode' + autoFocus={true} + /> + + + ); + } +} + +Search.propTypes = { + +}; + +Search.defaultProps = { + +}; + +export default BiobankFilter; diff --git a/modules/biobank_nottracked/jsx/globals.js b/modules/biobank_nottracked/jsx/globals.js new file mode 100644 index 00000000000..05cbd6691cf --- /dev/null +++ b/modules/biobank_nottracked/jsx/globals.js @@ -0,0 +1,809 @@ +import React, {Component} from 'react'; +import PropTypes from 'prop-types'; +import {Link} from 'react-router-dom'; + +import Modal from 'Modal'; +import ContainerParentForm from './containerParentForm'; + +/** + * Biobank Globals Component + * + * @author Henri Rabalais + * @version 1.0.0 + * + **/ + +class Globals extends Component { + constructor() { + super(); + this.increaseCycle = this.increaseCycle.bind(this); + this.decreaseCycle = this.decreaseCycle.bind(this); + } + + increaseCycle() { + this.props.editSpecimen(this.props.target.specimen) + .then(() => { + let cycle = this.props.specimen.fTCycle; + cycle++; + this.props.setSpecimen('fTCycle', cycle); + }) + .then(()=>this.props.updateSpecimen(this.props.specimen)); + } + + decreaseCycle() { + this.props.editSpecimen(this.props.target.specimen) + .then(() => { + let cycle = this.props.specimen.fTCycle; + cycle--; + this.props.setSpecimen('fTCycle', cycle); + }) + .then(()=>this.props.updateSpecimen(this.props.specimen)); + } + + render() { + const {container, data, editable, options, specimen, target} = this.props; + + const specimenTypeField = () => { + if (target.specimen) { + return ( +
+
+ Specimen Type +
+ {options.specimen.types[target.specimen.typeId].label} +
+
+
+ ); + } + }; + + const containerTypeField = () => { + return ( +
+
+ Container Type +
+ {options.container.types[target.container.typeId].label} +
+
+
+ ); + }; + + const poolField = () => { + if ((target.specimen||{}).poolId) { + return ( +
+
+ Pool +
+ {data.pools[target.specimen.poolId].label} +
+
+
+ ); + } + }; + + const updateQuantity = () => { + if (loris.userHasPermission('biobank_specimen_update')) { + return ( +
+
{ + this.props.edit('quantity'); + this.props.editSpecimen(target.specimen); + }} + > + +
+
+ ); + } + }; + + const quantityField = () => { + if (target.specimen) { + if (!editable.quantity) { + return ( +
+
+ Quantity +
+ {target.specimen.quantity} + {' '+options.specimen.units[target.specimen.unitId].label} +
+
+ {updateQuantity()} +
+ ); + } else { + const units = this.props.mapFormOptions( + options.specimen.typeUnits[target.specimen.typeId], 'label' + ); + + return ( +
+
+ Quantity + this.props.updateSpecimen(specimen)} + /> +
+
+ ); + } + } + }; + + const fTCycleField = () => { + if (target.specimen + && options.specimen.types[ + target.specimen.typeId + ].freezeThaw == 1) { + const decreaseCycle = () => { + if (target.specimen.fTCycle > 0) { + return ( +
+ + + +
+ ); + } + }; + + const increaseCycle = () => { + return ( +
+ + + +
+ ); + }; + + const updateFTCycle = () => { + if (loris.userHasPermission('biobank_specimen_update')) { + return
{decreaseCycle()} {increaseCycle()}
; + } + }; + + return ( +
+
+ Freeze-Thaw Cycle +
+ {target.specimen.fTCycle} +
+
+ {updateFTCycle()} +
+ ); + } + }; + + const updateTemperature = () => { + if (loris.userHasPermission('biobank_container_update')) { + return ( +
+ { + this.props.edit('temperature') + .then(() => this.props.editContainer(target.container)); + }} + > + + +
+ ); + } + }; + + const temperatureField = () => { + if (!editable.temperature) { + return ( +
+
+ Temperature +
+ {target.container.temperature + '°C'} +
+
+ {updateTemperature()} +
+ ); + } else { + return ( +
+
+ Temperature + +
+
+ ); + } + }; + + const updateStatus = () => { + if (loris.userHasPermission('biobank_container_update')) { + return ( +
+ { + this.props.edit('status'); + this.props.editContainer(target.container); + }} + > + + +
+ ); + } + }; + + const statusField = () => { + if (!editable.status) { + return ( +
+
+ Status +
+ {options.container.stati[target.container.statusId].label} +
+
+ {updateStatus()} +
+ ); + } else { + const stati = this.props.mapFormOptions(options.container.stati, 'label'); + return ( +
+
+ Status + +
+
+ ); + } + }; + + const updateProject = () => { + if (loris.userHasPermission('biobank_container_update')) { + return ( +
+ { + this.props.edit('project'); + this.props.editContainer(target.container); + }} + > + + +
+ ); + } + }; + + const projectField = () => { + if (!editable.project) { + return ( +
+
+ Projects +
+ {target.container.projectIds.length != 0 ? + target.container.projectIds + .map((id) => options.projects[id]) + .join(', ') : 'None'} +
+
+ {updateProject()} +
+ ); + } else { + return ( +
+
+ Projects + +
+
+ ); + } + }; + + const updateCenter = () => { + if (loris.userHasPermission('biobank_container_update')) { + return ( +
+ { + this.props.edit('center'); + this.props.editContainer(target.container); + }} + > + + +
+ ); + } + }; + + const centerField = () => { + if (!editable.center) { + return ( +
+
+ Current Site +
+ {options.centers[target.container.centerId]} +
+
+ {updateCenter()} +
+ ); + } else { + return ( +
+
+ Current Site + +
+
+ ); + } + }; + + const originField = () => { + return ( +
+
+ Origin Site +
+ {options.centers[target.container.originId]} +
+
+
+ ); + }; + + const parentSpecimenField = () => { + if ((target.specimen||{}).parentSpecimenIds) { + const parentSpecimenBarcodes = Object.values(target.specimen.parentSpecimenIds) + .map((id) => { + const barcode = data.containers.primary[ + data.specimens[id].containerId + ].barcode; + return {barcode}; + }) + .reduce((prev, curr) => [prev, ', ', curr]); + + return ( +
+
+ Parent Specimen +
+ {parentSpecimenBarcodes || 'None'} +
+
+
+ ); + } + }; + + const parentContainerField = () => { + if (loris.userHasPermission('biobank_container_view')) { + // Set Parent Container Barcode Value if it exists + const parentContainerBarcodeValue = () => { + if (target.container.parentContainerId) { + const barcode = data.containers.nonPrimary[ + target.container.parentContainerId + ].barcode; + return {barcode}; + } + }; + + const updateParentContainer = () => { + if (loris.userHasPermission('biobank_container_update')) { + return ( +
+
+ { + this.props.edit('containerParentForm'); + this.props.editContainer(target.container); + }} + > + + +
+
+ this.props.updateContainer(container)} + > + + +
+
+ ); + } + }; + + let coordinate; + if (target.container.coordinate) { + coordinate = this.props.getCoordinateLabel(target.container); + } + + return ( +
+
+ Parent Container +
+ {parentContainerBarcodeValue() || 'None'} +
+ {(parentContainerBarcodeValue && target.container.coordinate) ? + 'Coordinate '+ coordinate : null} +
+ {updateParentContainer()} +
+ ); + } + }; + + const candidateSessionField = () => { + if (target.specimen) { + return ( +
+ +
+ Visit Label + + ); + + return ( +
+ {fieldList} +
+ ); + } +} + +Globals.propTypes = { +}; + +// TODO: The following fields should be condensed into a single component. + +/** + * Biobank Container Status Field + * + * @author Henri Rabalais + * @version 1.0.0 + * + * */ + +class StatusField extends Component { + render() { + return ( +
+ ); + } +} + +StatusField.propTypes = { + setContainer: PropTypes.func.isRequired, + clearAll: PropTypes.func, + stati: PropTypes.object.isRequired, + container: PropTypes.object.isRequired, + updateContainer: PropTypes.func.isRequired, + className: PropTypes.string, +}; + +class ProjectField extends Component { + render() { + return ( +
+
+ +
+
+ this.props.updateContainer(this.props.container)} + columnSize= 'col-lg-11' + /> +
+ +
+ ); + } +} + +ProjectField.propTypes = { + setContainer: PropTypes.func.isRequired, + clearAll: PropTypes.func, + projects: PropTypes.object.isRequired, + container: PropTypes.object.isRequired, + updateContainer: PropTypes.func.isRequired, + className: PropTypes.string, +}; + +/** + * Biobank Container Temperature Form + * + * @author Henri Rabalais + * @version 1.0.0 + * + * */ + +class TemperatureField extends Component { + render() { + return ( +
+
+ +
+
+ this.props.updateContainer(this.props.container)} + columnSize= 'col-lg-11' + /> +
+ +
+ ); + } +} + +TemperatureField.propTypes = { + setContainer: PropTypes.func.isRequired, + clearAll: PropTypes.func, + container: PropTypes.object.isRequired, + updateContainer: PropTypes.func.isRequired, + className: PropTypes.string, +}; + +/** + * Biobank Container Center Field + * + * @author Henri Rabalais + * @version 1.0.0 + * + * */ + +class CenterField extends Component { + render() { + return ( +
+
+ +
+
+ this.props.updateContainer(this.props.container)} + columnSize= 'col-lg-11' + /> +
+ +
+ ); + } +} + +CenterField.propTypes = { + setContainer: PropTypes.func.isRequired, + clearAll: PropTypes.func.isRequired, + centerIds: PropTypes.object.isRequired, + container: PropTypes.object.isRequired, + updateContainer: PropTypes.func.isRequired, + className: PropTypes.string, +}; + +/** + * Biobank Specimen Quantity Field + * + * @author Henri Rabalais + * @version 1.0.0 + * + * */ +class QuantityField extends Component { + render() { + return ( +
+
+ +
+
+ +
+
+ +
+ +
+ ); + } +} + +QuantityField.propTypes = { + setSpecimen: PropTypes.func, + clearAll: PropTypes.func, + specimen: PropTypes.object, + updateSpecimen: PropTypes.func, + className: PropTypes.string, +}; + +export default Globals; diff --git a/modules/biobank_nottracked/jsx/lifeCycle.js b/modules/biobank_nottracked/jsx/lifeCycle.js new file mode 100644 index 00000000000..d5264c633ce --- /dev/null +++ b/modules/biobank_nottracked/jsx/lifeCycle.js @@ -0,0 +1,113 @@ +/** + * LifeCycle + * + * @author Henri Rabalais + * @version 1.0.0 + * + **/ + +// TODO: revise this component once Shipments are enabled. +class LifeCycle extends React.Component { + mouseOver(e) { + // this isn't a very 'react' way of doing things, so consider revision + $('.collection').css({ + 'border': '2px solid #093782', + 'box-shadow': '0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19)', + }); + } + + mouseLeave(e) { + // this isn't a very 'react' way of doing things, so consider revision + $('.collection').css({ + 'border': '2px solid #A6D3F5', 'box-shadow': 'none', + }); + } + + mouseOverPreparation(e) { + // this isn't a very 'react' way of doing things, so consider revision + $('.preparation').css({ + 'border': '2px solid #093782', + 'box-shadow': '0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19)', + }); + } + + mouseLeavePreparation(e) { + // this isn't a very 'react' way of doing things, so consider revision + $('.preparation').css({'border': '2px solid #A6D3F5', 'box-shadow': 'none'}); + } + + render() { + // Create Collection Node + let collectionNode; + if ((this.props.specimen||{}).collection || this.props.container) { + collectionNode = ( +
this.mouseOver(e)} + onMouseLeave={(e) => this.mouseLeave(e)} + className='lifecycle-node collection' + > +
+ C +
+
+ ); + } + + // Create Preparation Node + let preparationNode; + if ((this.props.specimen||{}).preparation) { + preparationNode = ( +
+
+ P +
+
+ ); + } + + // Create Analysis Node + let analysisNode; + if ((this.props.specimen||{}).analysis) { + analysisNode = ( +
+
+
A
+
+
+ ); + } + + // Create Lines + let line; + let nodes = 0; + for (let i in this.props.specimen) { + if (i === 'collection' || i === 'preparation' || i === 'analysis') { + nodes++; + } + } + let lineWidth = nodes > 1 ? 60/(nodes-1) : 0; + let lineStyle = {width: lineWidth+'%'}; + line = (
); + + return ( +
+
+ {collectionNode} + {preparationNode ? line : null} + {preparationNode} + {analysisNode ? line : null} + {analysisNode} +
+
+ ); + } +} + +LifeCycle.propTypes = { +}; + +export default LifeCycle; diff --git a/modules/biobank_nottracked/jsx/poolSpecimenForm.js b/modules/biobank_nottracked/jsx/poolSpecimenForm.js new file mode 100644 index 00000000000..45473c57619 --- /dev/null +++ b/modules/biobank_nottracked/jsx/poolSpecimenForm.js @@ -0,0 +1,176 @@ +/** + * Biobank Pool Specimen Form + * + * TODO: DESCRIPTION + * + * @author Henri Rabalais + * @version 1.0.0 + * + **/ +class PoolSpecimenForm extends React.Component { + render() { + const {current, data, errors, options, setPool, setPoolList} = this.props; + const list = current.list; + + // Create options for barcodes based on match candidateId, sessionId and + // typeId and don't already belong to a pool. + const barcodesPrimary = Object.values(data.containers.primary) + .filter((container) => { + const specimen = Object.values(data.specimens).find( + (specimen) => specimen.containerId == container.id + ); + const availableId = Object.keys(options.container.stati).find( + (key) => options.container.stati[key].label === 'Available' + ); + + if (specimen.quantity != 0 && + container.statusId == availableId && + specimen.poolId == null) { + if (current.candidateId) { + if ( + specimen.candidateId == current.candidateId && + specimen.sessionId == current.sessionId && + specimen.typeId == current.typeId && + container.centerId == current.centerId + ) { + return true; + } + } else { + return true; + } + } + return false; + }) + .filter((container) => !Object.values(list).find((i) => i.container.id == container.id)) + .reduce((result, container) => { + result[container.id] = container.barcode; + return result; + }, {}); + + const barcodeInput = ( + { + containerId && setPoolList(containerId); + }} + options={barcodesPrimary} + value={current.containerId} + errorMessage={errors.pool.total} + /> + ); + + const specimenUnits = this.props.mapFormOptions(options.specimen.units, 'label'); + + const glyphStyle = { + color: '#DDDDDD', + marginLeft: 10, + cursor: 'pointer', + }; + const barcodeList = Object.entries(current.list) + .map(([key, item]) => { + return ( +
+
{item.container.barcode}
+
this.props.removeListItem(key)} + /> +
+ ); + }); + + return ( + +
+
+ + + + +
+
+

Barcode Input

+
+ {barcodeInput} +
+
+

Barcode List

+
+
+ {barcodeList} +
+
+
+
+ + + + + +
+
+ + ); + } +} + +PoolSpecimenForm.propTypes = { +}; + +export default PoolSpecimenForm; diff --git a/modules/biobank_nottracked/jsx/processForm.js b/modules/biobank_nottracked/jsx/processForm.js new file mode 100644 index 00000000000..8a3b8d7386f --- /dev/null +++ b/modules/biobank_nottracked/jsx/processForm.js @@ -0,0 +1,302 @@ +import React, {Component} from 'react'; +import PropTypes from 'prop-types'; + +import CustomFields from './customFields'; + +/** + * Biobank Specimen Process Form + * + * @author Henri Rabalais + * @version 1.0.0 + * + **/ + +class SpecimenProcessForm extends Component { + constructor() { + super(); + + this.setProcess = this.setProcess.bind(this); + this.addData = this.addData.bind(this); + this.setData = this.setData.bind(this); + this.setProtocol = this.setProtocol.bind(this); + } + + setProcess(name, value) { + let process = this.props.process; + process[name] = value; + this.props.setParent(this.props.processStage, process); + } + + // TODO: this function may not be necessary + addData() { + let process = this.props.process; + process.data = {}; + this.props.setParent(this.props.processStage, process); + } + + setData(name, value) { + const data = this.props.process.data; + if (value instanceof File) { + data[name] = value.name; + const files = this.props.current.files; + files[value.name] = value; + this.props.setCurrent('files', files); + } else { + data[name] = value; + } + this.setProcess('data', data); + } + + setProtocol(name, value) { + // Clear data first. + this.setProcess('data', {}); + this.setProcess(name, value); + } + + render() { + const {specimen, process, processStage, typeId, options, errors, edit} = this.props; + const {mapFormOptions} = this.props; + + const renderUpdateButton = () => { + if (!this.props.specimen) { + return; + }; + return ( + this.props.updateSpecimen(specimen)} + /> + ); + }; + + let specimenProtocols = {}; + let specimenProtocolAttributes = {}; + Object.entries(options.specimen.protocols).forEach(([id, protocol]) => { + // FIXME: I really don't like this 'toLowerCase()' function, but it's the + // only way I can get it to work at the moment. + if (typeId == protocol.typeId && options.specimen.processes[protocol.processId].label.toLowerCase() == processStage) { + specimenProtocols[id] = protocol.label; + specimenProtocolAttributes[id] = options.specimen.protocolAttributes[id]; + } + }); + + const renderProtocolFields = () => { + if (specimenProtocolAttributes[process.protocolId]) { + if (process.data) { + return ( + + ); + } else { + this.addData(); + } + } + }; + + const renderCollectionFields = () => { + if (processStage === 'collection') { + const specimenTypeUnits = Object.keys(options.specimen.typeUnits[typeId]||{}).reduce((result, id) => { + result[id] = options.specimen.typeUnits[typeId][id].label; + return result; + }, {}); + return ( +
+ + +
+ ); + } + }; + + // const renderContainerFields = () => { + // if (process.protocolId) { + // if (process.data) { + // return options.specimen.protocolContainers[process.protocolId].map((typeId) => { + // return ( + //
+ // + // + //
+ // ); + // }); + // } + // } + // }; + + const examiners = mapFormOptions(options.examiners, 'label'); + const renderProcessFields = () => { + if (typeId && edit === true) { + return ( +
+ + + {renderCollectionFields()} + {renderProtocolFields()} + + + + {renderUpdateButton()} +
+ ); + } else if (edit === false) { + const renderProtocolStaticFields = () => { + if (process.data) { + const protocolAttributes = process.data; + return Object.keys(protocolAttributes).map((key) => { + const renderValue = () => { + if (protocolAttributes[key] === true) { + return '✔️'; + } else if (protocolAttributes[key] === false) { + return '❌'; + } else { + return protocolAttributes[key]; + } + }; + if (options.specimen.protocolAttributes[process.protocolId]) { + if (options.specimen.protocolAttributes[process.protocolId][key]) { + return ( + + ); + } + } + }); + } + }; + const renderCollectionStaticFields = () => { + if (processStage === 'collection') { + return ( + + ); + } + }; + + return ( +
+ + + + {renderCollectionStaticFields()} + {renderProtocolStaticFields()} + + + +
+ ); + } + }; + + return ( +
+ {renderProcessFields()} +
+ ); + } +} + + +SpecimenProcessForm.propTypes = { + setParent: PropTypes.func.isRequired, + updateSpecimen: PropTypes.func, + specimen: PropTypes.object.isRequired, + attributeDatatypes: PropTypes.object.isRequired, + attributeOptions: PropTypes.object.isRequired, + specimenTypeUnits: PropTypes.object.isRequired, + specimenTypeAttributes: PropTypes.object.isRequired, +}; + +SpecimenProcessForm.defaultProps = { + errors: {}, +}; + +export default SpecimenProcessForm; diff --git a/modules/biobank_nottracked/jsx/specimen.js b/modules/biobank_nottracked/jsx/specimen.js new file mode 100644 index 00000000000..19c4b74c114 --- /dev/null +++ b/modules/biobank_nottracked/jsx/specimen.js @@ -0,0 +1,418 @@ +import React, {Component} from 'react'; +import PropTypes from 'prop-types'; + +import Modal from 'Modal'; +import Globals from './globals.js'; +import SpecimenProcessForm from './processForm'; +import BiobankSpecimenForm from './specimenForm.js'; +import LifeCycle from './lifeCycle.js'; +import ContainerCheckout from './containerCheckout.js'; + +/** + * Biobank Specimen + * + * @author Henri Rabalais + * @version 1.0.0 + * + */ +class BiobankSpecimen extends Component { + constructor() { + super(); + this.openAliquotForm = this.openAliquotForm.bind(this); + this.addPreparation = this.addPreparation.bind(this); + this.addAnalysis = this.addAnalysis.bind(this); + this.alterCollection = this.alterCollection.bind(this); + this.alterPreparation = this.alterPreparation.bind(this); + this.alterAnalysis = this.alterAnalysis.bind(this); + this.submitAliquotForm = this.submitAliquotForm.bind(this); + } + + addPreparation() { + this.addProcess('preparation'); + } + + addAnalysis() { + this.addProcess('analysis'); + } + + addProcess(process) { + this.props.editSpecimen(this.props.target.specimen) + .then(() => { + const specimen = this.props.current.specimen; + specimen[process] = {centerId: this.props.target.container.centerId}; + this.props.setCurrent('specimen', specimen); + }) + .then(() => this.props.edit(process)); + } + + alterCollection() { + this.alterProcess('collection'); + } + + alterPreparation() { + this.alterProcess('preparation'); + } + + alterAnalysis() { + this.alterProcess('preparation'); + } + + alterProcess(process) { + this.props.editSpecimen(this.props.target.specimen) + .then(() => this.props.edit(process)); + } + + openAliquotForm() { + this.props.edit('aliquotForm') + .then(() => this.props.editSpecimen(this.props.target.specimen)) + .then(() => this.props.addListItem('specimen')); + } + + submitAliquotForm() { + this.props.createSpecimens() + .then(() => this.props.updateSpecimen(this.props.current.specimen)) + .then(() => this.props.clearAll()); + } + + render() { + const {current, data, editable, errors, options, target} = this.props; + + const status = options.container.stati[target.container.statusId].label; + const renderActionButton = () => { + if (status == 'Available' && target.specimen.quantity > 0 && !target.specimen.poolId) { + return ( +
+ + +
+ ); + } else { + return
+
; + } + }; + const addAliquotForm = () => { + if (loris.userHasPermission('biobank_specimen_create')) { + return ( +
+
+ {renderActionButton()} +
+
+ + + + + +
+
+ ); + } + }; + + /** + * Collection Form + */ + + const alterCollection = () => { + if (loris.userHasPermission('biobank_specimen_alter')) { + return ( + + ); + } + }; + + const cancelAlterCollection = () => { + if (editable.collection) { + return ( + + Cancel + + ); + } + }; + + const collectionPanel = ( +
+
+
+
C
+
+
+ Collection +
+ {alterCollection()} +
+
+ + + + {cancelAlterCollection()} +
+
+ ); + + /** + * Preparation Form + */ + + const alterPreparation = () => { + if (loris.userHasPermission('biobank_specimen_alter')) { + return ( + + ); + } + }; + + const cancelAlterPreparation = () => { + if (editable.preparation) { + return ( + + Cancel + + ); + } + }; + + const preparationPanel = () => { + const protocolExists = Object.values(options.specimen.protocols).find( + (protocol) => { + return protocol.typeId == target.specimen.typeId && + options.specimen.processes[protocol.processId].label == 'Preparation'; + } + ); + if (protocolExists && + !target.specimen.preparation && + !editable.preparation && + loris.userHasPermission('biobank_specimen_update')) { + return ( +
+
+ +
+
ADD PREPARATION
+
+ ); + } else if (target.specimen.preparation || editable.preparation) { + return ( +
+
+
+
P
+
+
+ Preparation +
+ {alterPreparation()} +
+
+ + + + {cancelAlterPreparation()} +
+
+ ); + } + }; + + /** + * Analysis Form + */ + + const alterAnalysis = () => { + if (loris.userHasPermission('biobank_specimen_alter')) { + return ( + + ); + } + }; + + const cancelAlterAnalysis = () => { + if (editable.analysis) { + return ( + + Cancel + + ); + } + }; + + const analysisPanel = () => { + const protocolExists = Object.values(options.specimen.protocols).find( + (protocol) => { + return protocol.typeId == target.specimen.typeId && + options.specimen.processes[protocol.processId].label == 'Analysis'; + } + ); + if (protocolExists && + !target.specimen.preparation && + !editable.analysis && + loris.userHasPermission('biobank_specimen_update')) { + return ( +
+
+ +
+
ADD ANALYSIS
+
+ ); + } else if (target.specimen.analysis || editable.analysis) { + return ( +
+
+
+
A
+
+
+ Analysis +
+ {alterAnalysis()} +
+
+ + + + {cancelAlterAnalysis()} +
+
+ ); + } + }; + + let globals = ( + + ); + + const parentBarcodes = this.props.getParentContainerBarcodes(target.container); + const barcodePathDisplay = this.props.getBarcodePathDisplay(parentBarcodes); + return ( +
+
+
+
+ Barcode +
+ {target.container.barcode} +
+ + Address: {barcodePathDisplay}
+ Lot Number: {target.container.lotNumber}
+ Expiration Date: {target.container.expirationDate} +
+
+ {addAliquotForm()} + +
+ +
+
+ {globals} +
+ {collectionPanel} + {preparationPanel()} + {analysisPanel()} +
+
+
+ ); + } +} + +BiobankSpecimen.propTypes = { + specimenPageDataURL: PropTypes.string.isRequired, +}; + +export default BiobankSpecimen; diff --git a/modules/biobank_nottracked/jsx/specimenForm.js b/modules/biobank_nottracked/jsx/specimenForm.js new file mode 100644 index 00000000000..43f50895113 --- /dev/null +++ b/modules/biobank_nottracked/jsx/specimenForm.js @@ -0,0 +1,466 @@ +import SpecimenProcessForm from './processForm'; +import ContainerParentForm from './containerParentForm'; + +/** + * Biobank Collection Form + * + * Fetches data from Loris backend and displays a form allowing + * to specimen a biobank file attached to a specific instrument + * + * @author Henri Rabalais + * @version 1.0.0 + * + * */ +class BiobankSpecimenForm extends React.Component { + constructor() { + super(); + this.setSession = this.setSession.bind(this); + } + + componentWillMount() { + // TODO: This is a band-aid solution, fix it! + if (this.props.parent) { + const parentSpecimenIds = Object.values(this.props.parent).map( + (item) => item.specimen.id + ); + const {setCurrent} = this.props; + setCurrent('candidateId', this.props.parent[0].specimen.candidateId); + setCurrent('sessionId', this.props.parent[0].specimen.sessionId); + setCurrent('typeId', this.props.parent[0].specimen.typeId); + setCurrent('originId', this.props.parent[0].container.originId); + setCurrent('centerId', this.props.parent[0].container.centerId); + setCurrent('parentSpecimenIds', parentSpecimenIds); + + if (this.props.parent > 1) { + setCurrent('quantity', 0); + } + } + } + + setSession(session, sessionId) { + let centerId = this.props.options.sessionCenters[sessionId].centerId; + this.props.setCurrent(session, sessionId); + this.props.setCurrent('centerId', centerId); + this.props.setCurrent('originId', centerId); + } + + render() { + const {current, errors, options, data, parent} = this.props; + const {mapFormOptions, addListItem, toggleCollapse, setCurrent} = this.props; + + // Generates new Barcode Form everytime the addBarcodeForm button is pressed + const barcodes = Object.entries(current.list).map(([key, specimen], i, list) => { + return ( + 1 ? + () => { + this.props.removeListItem(key); + } : null + } + addSpecimen={i+1 == list.length ? + () => { + addListItem('specimen'); + } : null + } + multiplier={current.multiplier} + copySpecimen={i+1 == list.length && specimen ? this.props.copyListItem : null} + setListItem={this.props.setListItem} + options={options} + data={data} + /> + ); + }); + + const renderNote = () => { + if (parent) { + return ( + + ); + } else { + return ( + + ); + } + }; + + const renderGlobalFields = () => { + if (parent) { + const parentBarcodes = Object.values(parent).map((item) => item.container.barcode); + const parentBarcodesString = parentBarcodes.join(', '); + return ( +
+ + + +
+ ); + } else { + const sessions = current.candidateId ? + mapFormOptions(options.candidateSessions[current.candidateId], 'label') + : {}; + const candidates = mapFormOptions(options.candidates, 'pscid'); + return ( +
+ + +
+ ); + } + }; + + const renderRemainingQuantityFields = () => { + if (parent) { + if (loris.userHasPermission('biobank_specimen_update') && parent.length === 1) { + const specimenUnits = mapFormOptions(options.specimen.units, 'label'); + return ( +
+ + +
+ ); + } + } + }; + + return ( +
+
+
+ {renderNote()} + {renderGlobalFields()} + setCurrent(name, [value])} + required={true} + value={current.projectIds} + disabled={current.candidateId ? false : true} + errorMessage={errors.container.projectIds} + /> + {renderRemainingQuantityFields()} +
+
+ {barcodes} +
+ ); + } +} + +BiobankSpecimenForm.propTypes = { +}; + +BiobankSpecimenForm.defaultProps = { + specimenList: {}, +}; + +/** + * Biobank Barcode Form + * + * Acts a subform for BiobankSpecimenForm + * + * @author Henri Rabalais + * @version 1.0.0 + * + **/ +class SpecimenBarcodeForm extends React.Component { + constructor() { + super(); + this.setContainer = this.setContainer.bind(this); + this.setSpecimen = this.setSpecimen.bind(this); + this.copy = this.copy.bind(this); + } + + setContainer(name, value) { + let container = this.props.specimen.container; + container[name] = value; + this.props.setListItem('container', container, this.props.barcodeKey); + } + + setSpecimen(name, value) { + this.props.setListItem(name, value, this.props.barcodeKey); + } + + copy() { + this.props.copySpecimen(this.props.barcodeKey); + } + + render() { + const {mapFormOptions, setCurrent} = this.props; + const {addSpecimen, copySpecimen, removeSpecimen} = this.props; + const {options, current, errors, specimen, data} = this.props; + + const renderAddSpecimenButton = () => { + if (addSpecimen) { + return ( +
+ +
+
+
+ + New Entry + +
+ ); + } + }; + + const renderCopySpecimenButton = () => { + if (copySpecimen) { + return ( +
+ +
+ +
+
+ + { + setCurrent('multiplier', e.target.value); + }} + value={this.props.multiplier} + /> + Copies + +
+ ); + } + }; + + const renderRemoveSpecimenButton = () => { + if (removeSpecimen) { + const glyphStyle = { + color: '#DDDDDD', + marginLeft: 10, + cursor: 'pointer', + fontSize: 15, + }; + return ( + + ); + } + }; + + // FIXME: This was made in a rush and can likely be done better. + // XXX: Only allow the selection of child types + const renderSpecimenTypes = () => { + let specimenTypes; + if (current.typeId) { + specimenTypes = Object.entries(options.specimen.types).reduce( + (result, [id, type]) => { + if (id == current.typeId) { + result[id] = type; + } + + if (type.parentTypeIds) { + type.parentTypeIds.forEach((i) => { + if (i == current.typeId) { + result[id] = type; + } + }); + } + + return result; + }, {} + ); + } else { + specimenTypes = options.specimen.types; + } + + return mapFormOptions(specimenTypes, 'label'); + }; + const containerTypesPrimary = mapFormOptions(options.container.typesPrimary, 'label'); + + // FIXME: This logic was made in a rush and is a bit of a mess. + const validContainers = {}; + if (specimen.typeId && options.specimen.typeContainerTypes[specimen.typeId]) { + Object.keys(containerTypesPrimary).forEach((id) => { + options.specimen.typeContainerTypes[specimen.typeId].forEach((i) => { + if (id == i) { + validContainers[id] = containerTypesPrimary[id]; + } + }); + }); + } + return ( +
+
+
+
+ +
+
+
+ { + this.props.toggleCollapse(this.props.barcodeKey); + }} + /> + {renderRemoveSpecimenButton()} +
+
+
+
+
+ + + + + + +
+
+
+
+
+
+
+ {renderAddSpecimenButton()} +
+
+ {renderCopySpecimenButton()} +
+
+
+
+ ); + } +} + +SpecimenBarcodeForm.propTypes = { +}; + +SpecimenBarcodeForm.defaultProps = { + specimen: {}, +}; + +export default BiobankSpecimenForm; diff --git a/modules/biobank_nottracked/php/analysis.class.inc b/modules/biobank_nottracked/php/analysis.class.inc new file mode 100644 index 00000000000..8be88a8762e --- /dev/null +++ b/modules/biobank_nottracked/php/analysis.class.inc @@ -0,0 +1,75 @@ + + * @license http://www.gnu.org/licenses/gpl-3.0.txt GPLv3 + * @link https://www.github.com/aces/Loris/ + */ + +namespace LORIS\biobank; + +/** + * Specimen Analysis Class + * This class contains an instance of a database handling that is needed to + * permanently store and retrieve Specimen Analysis instances. + * + * PHP Version 7.2 + * + * @category Entity + * @package Loris + * @subpackage Biobank + * @author Henri Rabalais + * @license http://www.gnu.org/licenses/gpl-3.0.txt GPLv3 + * @link https://www.github.com/aces/Loris/ + */ + +class Analysis extends Process +{ + /** + * Instatiates a Analysis Object using the values sent from the client-side. + * + * @param array $data Data to be used to instantiate the Analysis Object. + * + * @return Process + */ + public function fromArray(array $data) : Process + { + parent::fromArray($data); + + return $this; + } + + /** + * A wrapper function for the jsonSerialize method of the Analysis Instance + * Class. This converts this Specimen Analysis into an array + * + * @return array Specimen Array + */ + public function toArray() + { + return $this->jsonSerialize(); + } + + /** + * Returns an array representing the state of the Specimen. + * + * @return array + */ + public function jsonSerialize() : array + { + $parent = parent::jsonSerialize(); + return array_merge( + $parent, + array() + ); + } +} + diff --git a/modules/biobank_nottracked/php/biobank.class.inc b/modules/biobank_nottracked/php/biobank.class.inc new file mode 100644 index 00000000000..99b9f800899 --- /dev/null +++ b/modules/biobank_nottracked/php/biobank.class.inc @@ -0,0 +1,89 @@ + + * @license http://www.gnu.org/licenses/gpl-3.0.text GPLv3 + * @link http://www.github.com/aces/Loris/ + */ +namespace LORIS\biobank; +use \Psr\Http\Message\ServerRequestInterface; +use \Psr\Http\Message\ResponseInterface; + +/** + * This class features the code that enables access to the LORIS Biobank Module. + * + * PHP Version 7.2 + * + * @category Page + * @package Loris + * @subpackage Biobank + * @author Henri Rabalais + * @license http://www.gnu.org/licenses/gpl-3.0.text GPLv3 + * @link http://www.github.com/aces/Loris/ + */ +class Biobank extends \NDB_Menu_Filter +{ + /** + * Determine whether the user has permission to view this page. + * + * @param User $user to be checked. + * + * @return bool whether the user has access. + */ + function _hasAccess(\User $user) : bool + { + return $user->hasPermission('biobank_specimen_view') + || $user->hasPermission('biobank_container_view') + || $user->hasPermission('biobank_pool_view'); + } + + /** + * Set up the variables required by for construction of page + * + * @return void + */ + function _setupVariables() + { + $this->skipTemplate = true; + $this->AjaxModule = true; + } + + /** + * Include additional CSS files: + * + * @return array of javascript to be inserted + */ + function getCSSDependencies(): array + { + $factory = \NDB_Factory::singleton(); + $baseURL = $factory->settings()->getBaseURL(); + $deps = parent::getCSSDependencies(); + return array_merge( + $deps, + [$baseURL . "/biobank/css/biobank.css"] + ); + } + + /** + * Include additional JS files + * + * @return array of javascript to be inserted + */ + function getJSDependencies() + { + $factory = \NDB_Factory::singleton(); + $baseURL = $factory->settings()->getBaseURL(); + $deps = parent::getJSDependencies(); + return array_merge( + $deps, + [$baseURL . "/biobank/js/biobankIndex.js"] + ); + } +} + diff --git a/modules/biobank_nottracked/php/collection.class.inc b/modules/biobank_nottracked/php/collection.class.inc new file mode 100644 index 00000000000..cd2e2122804 --- /dev/null +++ b/modules/biobank_nottracked/php/collection.class.inc @@ -0,0 +1,134 @@ + + * @license http://www.gnu.org/licenses/gpl-3.0.txt GPLv3 + * @link https://www.github.com/aces/Loris/ + */ +namespace LORIS\biobank; + +/** + * Collection Object Class + * This class contains an instance of a database handling that is needed to + * permanently store and retrieve Collection Object instances. + * + * PHP Version 7.2 + * + * @category Entity + * @package Loris + * @subpackage Biobank + * @author Henri Rabalais + * @license http://www.gnu.org/licenses/gpl-3.0.txt GPLv3 + * @link https://www.github.com/aces/Loris/ + */ +class Collection extends Process +{ + /** + * Persistent Instance variables. + * + * These variables describe a collection instance. + * + * @var string $quantity + * @var int $unitId + */ + private $quantity; + private $unitId; + + /** + * Sets the current quantity of specimen available. This associated unit + * can be found in the `biobank_unit` using the unit ID. + * + * @param string $quantity the current amount of specimen available + * + * @return void + */ + public function setQuantity(string $quantity) : void + { + $this->quantity = $quantity; + } + + /** + * Gets the current amount of specimen available + * + * @return ?string + */ + public function getQuantity() : ?string + { + return $this->quantity; + } + + /** + * Sets the ID of the specimen's unit of quantity + * + * @param int $unitId the ID of the quantity's unit + * + * @return void + */ + public function setUnitId(int $unitId) : void + { + $this->unitId = $unitId; + } + + /** + * Gets the ID of the specimen's unit of quantity + * + * @return ?int + */ + public function getUnitId() : ?int + { + return $this->unitId; + } + + /** + * Instatiates a Collection Object using the values sent from the client-side. + * + * @param array $data Data to be used to instantiate the Collection Object. + * + * @return Process + */ + public function fromArray(array $data) : Process + { + parent::fromArray($data); + isset($data['quantity']) && $this->setQuantity((string) $data['quantity']); + isset($data['unitId']) && $this->setUnitId((int) $data['unitId']); + + return $this; + } + + /** + * A wrapper function for the jsonSerialize method of the Collection Instance + * Class. This converts this Specimen Collection into an array + * + * @return array Collection Array + */ + public function toArray() + { + return $this->jsonSerialize(); + } + + /** + * Returns an array representing the state of the Collection. + * + * @return array + */ + public function jsonSerialize() : array + { + $parent = parent::jsonSerialize(); + return array_merge( + $parent, + array( + 'quantity' => $this->quantity, + 'unitId' => $this->unitId, + ) + ); + } +} + diff --git a/modules/biobank_nottracked/php/container.class.inc b/modules/biobank_nottracked/php/container.class.inc new file mode 100644 index 00000000000..85863e2897a --- /dev/null +++ b/modules/biobank_nottracked/php/container.class.inc @@ -0,0 +1,481 @@ + + * @license http://www.gnu.org/licenses/gpl-3.0.txt GPLv3 + * @link https://www.github.com/aces/Loris/ + */ + +namespace LORIS\biobank; + +/** + * Container Object Class + * This class contains an instance of a database handling that is needed to + * permanently store and retrieve Container Object instances. + * + * PHP Version 7.2 + * + * @category Loris + * @package Biobank + * @author Henri Rabalais + * @license http://www.gnu.org/licenses/gpl-3.0.txt GPLv3 + * @link https://www.github.com/aces/Loris/ + */ + +class Container implements \JsonSerializable, \LORIS\Data\DataInstance +{ + /** + * Persistent Instance variables. + * + * These properties describe a container entity. + * + * @var int $id + * @var string $barcode + * @var int $typeId + * @var int $dimensionId + * @var float $temperature + * @var int $statusId + * @var array $projectIds + * @var int $originId + * @var int $centerId + * @var int $parentContainerId + * @var array $childContainerIds + * @var int $coordinate + * @var string $lotNumber + * @var \DateTime $expirationDate + * + * @access private + */ + private $id; + private $barcode; + private $typeId; + private $dimensionId; + private $temperature; + private $statusId; + private $projectIds; + private $originId; + private $centerId; + private $parentContainerId; + private $childContainerIds; + private $coordinate; + private $lotNumber; + private $expirationDate; + + /** + * Initiliazes a new instance of the Container Class + */ + function __construct() + { + } + + /** + * Sets the container's ID + * + * @param int $id the container's ID + * + * @return void + */ + public function setId(int $id) : void + { + if ($id > 0) { + $this->id = $id; + } + } + + /** + * Gets the container's ID + * + * @return ?int + */ + public function getId() : ?int + { + return $this->id; + } + + /** + * Sets the container's barcode + * + * @param string $barcode the container's barcode + * + * @return void + */ + public function setBarcode(string $barcode) : void + { + $this->barcode = $barcode; + } + + /** + * Gets the container's barcode + * + * @return ?string + */ + public function getBarcode() : ?string + { + return $this->barcode; + } + + /** + * Sets the ID of the container type + * + * @param int $typeId ID of the container type + * + * @return void + */ + public function setTypeId(int $typeId) : void + { + if ($typeId > 0) { + $this->typeId = $typeId; + } + } + + /** + * Gets the ID of the container type + * + * @return ?int + */ + public function getTypeId() : ?int + { + return $this->typeId; + } + + /** + * Sets the ID of the container's dimensions + * + * @param int $dimensionId ID of the container's dimensions + * + * @return void + */ + public function setDimensionId(int $dimensionId) : void + { + if ($dimensionId > 0) { + $this->dimensionId = $dimensionId; + } + } + + /** + * Gets the ID of the container's dimensions + * + * @return ?int + */ + public function getDimensionId() : ?int + { + return $this->dimensionId; + } + + /** + * Sets the container's temperature in Celsius. + * + * @param float $temperature the container's temperature. + * + * @return void + */ + public function setTemperature(float $temperature) : void + { + $this->temperature = $temperature; + } + + /** + * Gets the container's temperature in Celsius. + * + * @return ?float + */ + public function getTemperature() : ?float + { + return $this->temperature; + } + + /** + * Sets the ID of the container's current projects + * + * @param int $projectIds the IDs of the container's current projects + * + * @return void + */ + public function setProjectIds(array $projectIds) : void + { + $this->projectIds = $projectIds; + } + + /** + * Gets the ID of the container's current projects + * + * @return ?array + */ + public function getProjectIds() : ?array + { + return $this->projectIds; + } + + /** + * Sets the ID of the container's current status + * + * @param int $statusId the ID of the container's current status + * + * @return void + */ + public function setStatusId(int $statusId) : void + { + if ($statusId > 0) { + $this->statusId = $statusId; + } + } + + /** + * Gets the ID of the container's current status + * + * @return ?int + */ + public function getStatusId() : ?int + { + return $this->statusId; + } + + /** + * Sets the ID of the container's origin + * + * @param int $originId the ID of the container's origin + * + * @return void + */ + public function setOriginId(int $originId) : void + { + if ($originId > 0) { + $this->originId = $originId; + } + } + + /** + * Gets the ID of the container's origin + * + * @return ?int + */ + public function getOriginId() : ?int + { + return $this->originId; + } + + /** + * Sets the ID of the container's current centerId + * + * @param int $centerId the ID of the container's current centerId + * + * @return none + */ + public function setCenterId(int $centerId) : void + { + if ($centerId > 0) { + $this->centerId = $centerId; + } + } + + /** + * Gets the ID of the container's current centerId + * + * @return ?int + */ + public function getCenterId() : ?int + { + return $this->centerId; + } + + /** + * Sets the parent container's ID + * + * @param int $parentContainerId the parent container's ID + * + * @return void + */ + public function setParentContainerId(int $parentContainerId) : void + { + if ($parentContainerId > 0) { + $this->parentContainerId = $parentContainerId; + } + } + + /** + * Gets the parent container's ID + * + * @return ?int + */ + public function getParentContainerId() : ?int + { + return $this->parentContainerId; + } + + /** + * Sets the IDs of the children containers + * + * @param array $childContainerIds array of IDs of children container + * + * @return void + */ + public function setChildContainerIds(array $childContainerIds) : void + { + $this->childContainerIds = $childContainerIds; + } + + /** + * Gets the IDs of the children containers + * + * @return ?array + */ + public function getChildContainerIds() : ?array + { + return $this->childContainerIds; + } + + /** + * Sets the container's current coordinate in storage + * + * @param int $coordinate the container's current coordinate + * + * @return void + */ + public function setCoordinate(int $coordinate = null) : void + { + if ($coordinate > 0) { + $this->coordinate = intval($coordinate); + } + } + + /** + * Gets the container's current coordinate in storage + * + * @return ?int + */ + public function getCoordinate() : ?int + { + return $this->coordinate; + } + + /** + * Sets the container's lot number + * + * @param string $lotNumber the container's lot number. + * + * @return void + */ + public function setLotNumber(string $lotNumber = null) : void + { + $this->lotNumber = $lotNumber; + } + + /** + * Gets the container's lot number in storage + * + * @return ?string + */ + public function getLotNumber() : ?string + { + return $this->lotNumber; + } + + /** + * Sets the expiration date + * + * @param \DateTime $date the expiration date + * + * @return void + */ + public function setExpirationDate(\DateTime $date = null) : void + { + $this->expirationDate = $date; + } + + /** + * Gets the expiration date + * + * @return \DateTime + */ + public function getExpirationDate() : ?\DateTime + { + return $this->expirationDate; + } + + /** + * Instatiates a Container Object using the information from the client-side + * + * @param array $data Data to be used to instantiate the Container Object + * + * @return Container $container Instantiated Container Object + */ + public function fromArray(array $data) : Container + { + isset($data['id']) && $this->setId((int) $data['id']); + isset($data['barcode']) && $this->setBarcode((string) $data['barcode']); + isset($data['typeId']) && $this->setTypeId((int) $data['typeId']); + isset($data['dimensionId']) && $this->setDimensionId((int) $data['dimensionId']); + isset($data['temperature']) && $this->setTemperature((float) ($data['temperature'])); + isset($data['statusId']) && $this->setStatusId((int) $data['statusId']); + isset($data['projectIds']) && $this->setProjectIds($data['projectIds']); + isset($data['originId']) && $this->setOriginId((int) $data['originId']); + isset($data['centerId']) && $this->setCenterId((int) $data['centerId']); + isset($data['parentContainerId']) && $this->setParentContainerId((int) $data['parentContainerId']); + isset($data['childContainerIds']) && $this->setChildContainerIds($data['childContainerIds']); + isset($data['coordinate']) && $this->setCoordinate((int) $data['coordinate']); + isset($data['lotNumber']) && $this->setLotNumber((string) $data['lotNumber']); + isset($data['expirationDate']) && $this->setExpirationDate(new \DateTime($data['expirationDate'])); + + return $this; + } + + /** + * A wrapper function for the jsonSerialize method of the Container Instance + * Class. This converts the Container Instance into an array. + * + * @return array + */ + public function toArray() : array + { + return $this->jsonSerialize(); + } + + /** + * Gets an array representing the state of the Container + * + * @return array + */ + public function jsonSerialize() : array + { + $expirationDate = $this->expirationDate; + if ($expirationDate) { + $expirationDate = $this->expirationDate->format('Y-m-d'); + } + + return array( + 'id' => $this->id, + 'barcode' => $this->barcode, + 'typeId' => $this->typeId, + 'dimensionId' => $this->dimensionId, + 'temperature' => $this->temperature, + 'statusId' => $this->statusId, + 'projectIds' => $this->projectIds, + 'originId' => $this->originId, + 'centerId' => $this->centerId, + 'parentContainerId' => $this->parentContainerId, + 'childContainerIds' => $this->childContainerIds, + 'coordinate' => $this->coordinate, + 'lotNumber' => $this->lotNumber, + 'expirationDate' => $expirationDate, + ); + } + + /** + * Returns a JSON encoded string of the state of the Container + * + * @return string JSON encoded string of Container data + */ + public function toJSON() : string + { + return json_encode($this); + } +} + diff --git a/modules/biobank_nottracked/php/containercontroller.class.inc b/modules/biobank_nottracked/php/containercontroller.class.inc new file mode 100644 index 00000000000..0fd15158faa --- /dev/null +++ b/modules/biobank_nottracked/php/containercontroller.class.inc @@ -0,0 +1,545 @@ + + * @license http://www.gnu.org/licenses/gpl-3.0.text GPLv3 + * @link http://www.github.com/aces/Loris/ + */ +namespace LORIS\biobank; + +/** + * This class features the code that enables access to the containers of the + * LORIS Biobank Module. + * + * PHP Version 7.2 + * + * @category Controller + * @package Loris + * @subpackage Biobank + * @author Henri Rabalais + * @license http://www.gnu.org/licenses/gpl-3.0.text GPLv3 + * @link http://www.github.com/aces/Loris/ + */ +class ContainerController +{ + + // TODO: These values were decided based on the realm of possible values. + // These value should instead be queried from the back end so that they + // are Project configurable. + const MINTEMP = -273.15; + const MAXTEMP = 100; + + /** + * Private instances of the Database, User and ContainerDAO classes. + * + * @var \Database $db + * @var \User $user + * @var ContainerDAO $dao + */ + private $db; + private $user; + private $dao; + + /** + * Class Constructor + * + * @param Database $db Database Instance. + * @param User $user User Instance. + */ + function __construct(\Database $db, \User $user) + { + $this->db = $db; + $this->user = $user; + $this->dao = $this->getDataProvisioner(); + } + + /** + * Get all Container Objects permitted by the Container Data Provisioner (DAO). + * + * @return array $specimens All permissable Container Objects + */ + public function getInstances() : array + { + $this->validatePermission('view'); + $containers = array(); + $containerIt = $this->dao->execute($this->user); + foreach ($containerIt as $id => $container) { + $containers[$id] = $container; + } + + return $containers; + } + + /** + * This method takes in a list of container arrays from the front-end, + * validates them, instantiates them and then sends them to the DAO to be + * saved to the database. + * + * @param array $list A list of container arrays to be created. + * + * @return array $containerIds A list of IDs from the containers that were + * created. + */ + public function createInstances(array $list) : array + { + $this->validatePermission('create'); + $containerList = array(); + foreach ($list as $i => $item) { + $container = (new Container)->fromArray($item); + $this->validateInstance($container); + $containerList[$i] = $container; + } + + $this->validateInstances($containerList); + + // Save Containers + $newContainers = array(); + foreach ($containerList as $i => $container) { + $containerId = $this->dao->saveInstance($container); + $newContainers[$i] = $this->dao->getInstanceFromId($containerId); + } + + return $newContainers; + } + + /** + * This method takes in a container array from the front-end, + * validates them, instantiates them and then sends them to the DAO to be + * saved to the database. + * + * @param array $containerArray container array to be created + * + * @return array + */ + public function updateInstance(array $containerArray) : array + { + $this->validatePermission('update'); + $container = (new Container)->fromArray($containerArray); + $containerId = $container->getId(); + $oldContainer = $this->dao->getInstanceFromId($containerId); + + $this->validateInstance($container); + $this->dao->saveInstance($container); + + $updatedContainers = []; + $oldContainerParentId = $oldContainer->getParentContainerId(); + if ($oldContainerParentId) { + $updatedContainers[] = $this->dao->getInstanceFromId($oldContainerParentId); + } + $newContainerParentId = $container->getParentContainerId(); + if ($newContainerParentId) { + $updatedContainers[] = $this->dao->getInstanceFromId($newContainerParentId); + } + $updatedContainers[] = $this->dao->getInstanceFromId($containerId); + + return $updateContainers; + } + + /** + * Get all data associated with the Container Entity. This will be used + * for front-end mapping and populating form options. + * + * @return array Associative array of option data. + */ + public function getOptions() : array + { + $this->validatePermission('view'); + return array( + 'types' => $this->dao->getTypes(), + 'typesPrimary' => $this->dao->getTypes(['Primary' => 1]), + 'typesNonPrimary' => $this->dao->getTypes(['Primary' => 0]), + 'dimensions' => $this->dao->getDimensions(), + 'stati' => $this->dao->getStati(), + ); + } + + /** + * Treats the Container DAO as a Provisioner that can be iterated through + * to provide the permissable Container Objects for the current User. + * + * @return \LORIS\Data\Provisioner + */ + private function getDataProvisioner() : \LORIS\Data\Provisioner + { + $dao = new ContainerDAO($this->db); + if ($this->user->hasPermission('access_all_profiles') === false) { + $dao = $dao->filter(new \LORIS\Data\Filters\UserSiteMatch()); + } + if ($this->user->hasPermission('biobank_container_view') === false) { + $dao = $dao->filter(new PrimaryContainerFilter(0)); + } + if ($this->user->hasPermission('biobank_specimen_view') === false) { + $dao = $dao->filter(new PrimaryContainerFilter(1)); + } + return $dao; + } + + /** + * Checks User Permissions for creating or updating Container Objects. + * + * @param string $method User requested method. + * + * @return void + */ + private function validatePermission(string $method) : void + { + switch($method) { + case 'view': + if (!$this->user->hasPermission('biobank_container_view')) { + throw new \Forbidden('Container: View Permission Denied'); + } + case 'update': + if (!$this->user->hasPermission('biobank_container_update')) { + throw new \Forbidden('Container: Update Permission Denied'); + } + case 'create': + if (!$this->user->hasPermission('biobank_container_create')) { + throw new \Forbidden('Container: Create Permission Denied'); + } + } + } + + /** + * Validates Container Object before being saved + * + * @param Container $container Container to be validated + * + * @return void + */ + public function validateInstance(Container $container) : void + { + // TODO: Check whether the value changed before validating it. + $this->validateBarcode($container); + $this->validateTypeId($container); + $this->validateTemperature($container); + $this->validateStatusId($container); + $this->validateProjectIds($container); + $this->validateCenterId($container); + $this->validateParentContainerId($container); + $this->validateCoordinate($container); + $this->validateLotNumber($container); + $this->validateExpirationDate($container); + } + + /** + * Validates the container list to ensure that no barcodes are identical + * + * @param array $containers List of Containers to be validated + * + * @return void + */ + public function validateInstances(array $containers) : void + { + $barcode = null; + foreach ($containers as $container) { + if ($container->getBarcode() === $barcode) { + throw new \BadRequest('Barcode must be unique for each entry.'); + } + $barcode = $container->getBarcode(); + } + } + + /** + * Validates Container Object Barcode + * + * @param Container $container Container to be checked. + * + * @throws BadRequest if the provided Container does not meet validation requirements + * + * @return void + */ + private function validateBarcode(Container $container) : void + { + if (is_null($container->getBarcode())) { + throw new \BadRequest('Barcode value must be set.'); + } + + $id = $container->getId(); + $barcode = $container->getBarcode(); + $containerList = $this->dao->selectInstances(['barcode' => $barcode]); + if (!empty($containerList)) { + foreach ($containerList as $c) { + $b = $c->getBarcode(); + $i = $c->getId(); + // If the barcodes are identical but the ids are not + if ($b === $barcode && $i !== $id) { + throw new \BadRequest('Barcode must be unique.'); + } + } + } + + if ($id) { + $prevContainer = $this->dao->getInstanceFromId($id); + if ($container->getBarcode() !== $prevContainer->getBarcode()) { + throw new \BadRequest('Barcode can not be changed.'); + } + } + + // TODO: Regex check on Barcode. Currently, regex has been removed from + // the schema. Once it's reintroduced, this can be implemented. + //$specimenTypes = $this->dao->getSpecimenTypes(); + //$regex = $specimenTypes[$specimen['typeId']]['regex']; + //if (isset($regex)) { + // if (preg_match($regex, $container['barcode']) !== 1) { + // throw new \BadRequest('Barcode is not of proper format for the + // selected specimen type'); + // } + //} + } + + /** + * Validates Container Object Type ID. + * + * @param Container $container Container to be checked. + * + * @throws BadRequest if the provided Container does not meet validation requirements + * + * @return void + */ + private function validateTypeId(Container $container) : void + { + if (is_null($container->getTypeId())) { + throw new \BadRequest('Type value must be set'); + } + } + + /** + * Validates Container Object Temperature. + * + * @param Container $container Container to be checked. + * + * @throws BadRequest if the provided Container does not meet validation requirements + * + * @return void + */ + private function validateTemperature(Container $container) : void + { + $temperature = $container->getTemperature(); + if (is_null($temperature)) { + throw new \BadRequest('Temperature value must be set.'); + } + if (!(is_numeric($temperature) && is_float(floatval($temperature)))) { + throw new \BadRequest('Temperature must be a number.'); + } + if ($temperature <= self::MINTEMP || $temperature > self::MAXTEMP) { + throw new \BadRequest('Temperature must be between '.self::MINTEMP.'°C and '.self::MAXTEMP.'°C.'); + } + } + + /** + * Validates Container Object Status ID. + * + * @param Container $container Container to be checked. + * + * @throws BadRequest if the provided Container does not meet validation requirements + * + * @return void + */ + private function validateStatusId(Container $container) : void + { + if ($container->getId()) { + $prevContainer = $this->dao->getInstanceFromId($container->getId()); + $statusLabel = $this->dao->getStati()[$prevContainer->getStatusId()]['label']; + if ($statusLabel == 'Dispensed') { + // TODO: figure out what else should not be changed if the container + // is dispensed. This should eventually be blocked in the front-end + // as well. These validations can wait until more testing has + // been done on the module. + + if ($prevContainer->getTemperature() != $container->getTemperature()) { + throw new \BadRequest("Temperature cannot be changed if Container + is Dispensed."); + } + } + } + + if (is_null($container->getStatusId())) { + throw new \BadRequest("Status value must be set."); + } + } + + /** + * Validates Container Object Project ID. + * + * @param Container $container Container to be checked. + * + * @throws BadRequest if the provided Container does not meet validation requirements + * + * @return void + */ + private function validateProjectIds(Container $container) : void + { + $projectIds = $container->getProjectIds(); + + // Check that current container's projects are a subset of the parent + // Container's projects. + $parentContainerId = $container->getParentContainerId(); + if ($parentContainerId) { + $parentContainer = $this->dao->getInstanceFromId($parentContainerId); + $parentProjectIds = $parentContainer->getProjectIds(); + if (array_intersect($projectIds, $parentProjectIds) != $projectIds) { + $barcode = $container->getBarcode(); + $parentBarcode = $parentContainer->getBarcode(); + throw new \BadRequest("The Projects to which $barcode + belongs must be a subset of the Projects to + which $parentBarcode + belongs."); + } + } + + // Check the current container's projects are a superset of the child + // Containers' projects. + $childContainerIds = $container->getChildContainerIds(); + if ($childContainerIds) { + forEach ($childContainerIds as $id) { + $childContainer = $this->dao->getInstanceFromId((int) $id); + $childProjectIds = $childContainer->getProjectIds(); + if (array_intersect($childProjectIds, $projectIds) != $childProjectIds) { + $barcode = $container->getBarcode(); + throw new \BadRequest("The projects to which $barcode + belongs must be a superset + of it's child Containers' Projects"); + } + } + } + } + + /** + * Validates Container Object Center ID. + * + * @param Container $container Container to be checked. + * + * @throws BadRequest if the provided Container does not meet validation requirements + * + * @return void + */ + private function validateCenterId(Container $container) : void + { + if (is_null($container->getCenterId())) { + throw new \BadRequest("Center value must be set."); + } + + $parentContainerId = $container->getParentContainerId(); + if (isset($parentContainerId)) { + $parentContainer = $this->dao->getInstanceFromId($parentContainerId); + if ($container->getCenterID() !== $parentContainer->getCenterID()) { + $barcode = $container->getBarcode(); + throw new \BadRequest( + $container->getBarcode()." must be at the same location + as ".$parentContainer->getBarcode()." to execute this + action" + ); + } + } + } + + /** + * Validates Container Object Parent Container ID. + * + * @param Container $container Container to be checked. + * + * @return void + */ + private function validateParentContainerId(Container $container) : void + { + $this->validateParentContainers($container); + } + + /** + * Recursive function that checks if the Parent Container is a child of the + * Container Object + * + * @param Container $container Container to be validated + * + * @throws BadRequest if the provided Container does not meet validation requirements + * + * @return void + */ + private function validateParentContainers(Container $container) : void + { + $parentContainerId = $container->getParentContainerId(); + if (isset($parentContainerId)) { + if ($container->getId() == $parentContainerId) { + throw new \BadRequest( + 'A container can not be placed within itself or + within one of its descendant containers.' + ); + } + $childContainers = $this->dao->getChildContainers($container); + if (isset($childContainers)) { + foreach ($childContainers as $child) { + $this->validateParentContainerId($child); + } + } + } + } + + /** + * Validates Container Object Coordinate. + * + * @param Container $container Container to be checked. + * + * @throws BadRequest if the provided Container does not meet validation requirements + * + * @return void + */ + private function validateCoordinate(Container $container) + { + $coordinate = $container->getCoordinate(); + if (!is_null($coordinate)) { + if (!((is_int($coordinate) || ctype_digit($coordinate)) && (int)$coordinate > 0)) { + throw new \BadRequest('Coordinate must be a positive integer.'); + } + + $parentContainerId = $container->getParentContainerId(); + if (!isset($parentContainerId)) { + throw new \BadRequest( + 'Coordinate can not be set without a Parent + Container.' + ); + } + + $parentContainer = $this->dao->getInstanceFromId($parentContainerId); + $dimensions = $this->dao->getDimensions()[$parentContainer->getDimensionId()]; + $capacity = $dimensions['x'] * $dimensions['y'] * $dimensions['z']; + if ($container->getCoordinate() > $capacity) { + throw new \BadRequest( + 'Coordinate value exceeds the capacity of the Parent Container' + ); + } + } + } + + /** + * Validates Container Lot Number. + * + * @param Container $container Container to be checked. + * + * @throws BadRequest if the provided Container does not meet validation requirements + * + * @return void + */ + private function validateLotNumber(Container $container) + { + } + + /** + * Validates Container Expiration Date. + * + * @param Container $container Container to be checked. + * + * @throws BadRequest if the provided Container does not meet validation requirements + * + * @return void + */ + private function validateExpirationDate(Container $container) + { + } +} diff --git a/modules/biobank_nottracked/php/containerdao.class.inc b/modules/biobank_nottracked/php/containerdao.class.inc new file mode 100644 index 00000000000..7bb8daaa6a8 --- /dev/null +++ b/modules/biobank_nottracked/php/containerdao.class.inc @@ -0,0 +1,529 @@ + + * @license http://www.gnu.org/licenses/gpl-3.0.txt GPLv3 + * @link https://www.github.com/aces/Loris/ + */ +namespace LORIS\biobank; + +/** + * Container Data Access Object (DAO) Class + * This class contains all database handling that is needed to + * permanently store and retrieve Container Object instances + * + * PHP Version 7.2 + * + * @category Data + * @package Loris + * @subpackage Biobank + * @author Henri Rabalais + * @license http://www.gnu.org/licenses/gpl-3.0.txt GPLv3 + * @link https://www.github.com/aces/Loris/ + */ +class ContainerDAO extends \LORIS\Data\ProvisionerInstance +{ + /** + * Private instance of the Database class. + * + * @var \Database $dao + */ + private $db; + + /** + * Initializes a new instance of the ContainerDAO Class + * + * @param Database $db Instance of the LORIS Database class + */ + function __construct(\Database $db) + { + $this->db = $db; + } + + // XXX: I'm not sure if this function is really necessary since it is only + // being used once, and should likely not be accessed outside this class. + /** + * This method is used when the DAO class needs to create a new Container + * instance. + * + * @return Container + */ + public function getInstance() : Container + { + return new Container(); + } + + /** + * This will load all container persistence variables from the database + * for a given $id into a Container object, and return the object. + * + * @param int $id Value of the $id for the Container that will be + * instantiated. + * + * @return Container $container Container Instance. + */ + public function getInstanceFromId(int $id) : Container + { + $containerData = $this->getInstanceDataFromId($id); + $childContainerIds = $this->getChildContainerIds($id); + $projectIds = $this->getProjectIds($id); + $container = $this->getInstanceFromSQL($containerData, $childContainerIds, $projectIds); + + return $container; + } + + /** + * Queries data from the database for the Container at the requested ID. + * + * @param int $id Value of the $id for the Container whose data is being + * queried. + * + * @return array $container Container Data at that ID. + */ + private function getInstanceDataFromId(int $id) + { + $query = 'SELECT bc.ContainerID, + bc.Barcode, + bc.ContainerTypeID, + bct.ContainerCapacityID, + bct.ContainerDimensionID, + bc.ContainerStatusID, + bc.Temperature, + bc.OriginCenterID, + bc.CurrentCenterID, + bcp.ParentContainerID, + bcp.Coordinate, + bc.LotNumber, + bc.ExpirationDate, + bc.DateTimeUpdate, + bc.DateTimeCreate + FROM biobank_container bc + LEFT JOIN biobank_container_parent bcp + USING (ContainerID) + JOIN biobank_container_type bct + USING (ContainerTypeID) + WHERE bc.ContainerID=:i'; + $container = $this->db->pselectrow($query, array('i' => $id)); + + return $container; + } + + /** + * Returns an array of all the Child Container IDs associated with + * the given Container ID from the biobank_container_parent table. + * + * @param ?int $id of Container + * + * @return array $childContainerIds List of Container IDs that are + * children of the Container ID + */ + private function getChildContainerIds(?int $id) : array + { + $query = 'SELECT ContainerID + FROM biobank_container_parent + WHERE ParentContainerID=:i'; + $childContainerIds = $this->db->pselectcol($query, array('i' => $id)); + + return $childContainerIds; + } + + /** + * Returns an array of all the Project IDs associated with the given + * Container ID from the biobank_container_project_rel table. + * + * @param ?int $id of Container + * + * @return $projectIds List of Project Ids that are associated with the + * Container ID. + */ + private function getProjectIds(?int $id) : array + { + $query = 'SELECT ProjectID + FROM biobank_container_project_rel + WHERE ContainerID=:i'; + $projectIds = $this->db->pselectCol($query, array('i' => $id)); + + return $projectIds; + } + + // XXX: Currently this function is never used with any conditions passed as + // parameters. Decide if this is a necessary feature. It is likely useful, + // but I need to figure out how to integrate it wit the dataprovisioner. + /** + * This will select all containers from the database that match the + * attribute values passed by $conditions and will return an array + * of container objects. + * + * @param array $conditions Conditions to be met by the query + * + * @return array $containers List of Container Objects that match the query + */ + public function selectInstances(array $conditions = null) : array + { + $query = 'SELECT ContainerID + FROM biobank_container + LEFT JOIN biobank_container_parent + USING (ContainerID) + JOIN biobank_container_type + USING (ContainerTypeID)'; + $query .= $conditions ? ' WHERE '.$this->db->_implodeWithKeys(' AND ', $conditions) : ''; + + $result = $this->db->pselect($query, array()); + $containers = array(); + if (!empty($result)) { + foreach ($result as $row) { + $id = (int) $row['ContainerID']; + $container = $this->getInstanceFromId($id); + $containers[$id] = $container; + } + } + + return $containers; + } + + /** + * Instantiates an ArrayIterator class that is composed of all the Container + * Objects. + * + * @return traversable Iterator of Container Objects + */ + protected function getAllInstances() : \Traversable + { + return new \ArrayIterator($this->selectInstances()); + } + + // XXX: The conditions parameter is only used to differentiate primary types + // from non primary types. Decide if this is a front-end concern. + /** + * Queries all rows of the biobank_container_type table and returns a nested + * array with the ID field as the index. Conditions may be passed to filter + * the results + * + * @param array $conditions Conditions to be met by the query + * + * @return array $containerTypes All data concerning each container type + */ + public function getTypes(array $conditions = null) : array + { + $query = 'SELECT ContainerTypeID as id, + Brand as brand, + ProductNumber as productNumber, + Label as label, + `Primary` as `primary`, + ContainerCapacityID as capacityId, + ContainerDimensionID as dimensionId + FROM biobank_container_type'; + $query .= $conditions ? ' WHERE '.$this->db->_implodeWithKeys(' AND ', $conditions) : null; + $types = $this->db->pselectWithIndexKey($query, array(), 'id'); + + return $types; + } + + // XXX: Althought container capacities were at first thought to be important + // in the design of this entity, they are not being used in any way + // throughout the module. Decide if container capacities are still + // important, or if they should be deprecated. + /** + * Queries all rows of the biobank_container_capacity table and returns a + * nested array with the ID field as the index. + * + * @return array $containerCapacities All data concerning each container + * capacity + */ + public function getCapacities() : array + { + $query = 'SELECT ContainerCapacityID as id, + Quantity as quantity, + UnitID as unitId + FROM biobank_container_capacity'; + $capacities = $this->db->pselectWithIndexKey($query, array(), 'id'); + + return $capacities; + } + + // XXX: Although container units were at first thought to be important + // in the design of this entity, they are only being used by Specimen Objects + // in this module. Decide if container units are still important, or if they + // should be deprecated. + /** + * Queries all rows of the biobank_unit table and returns a + * nested array with the ID field as the index. + * + * @return array $containerUnits All data concerning each unit + */ + public function getUnits() : array + { + $query = "SELECT UnitID as id, + Label as unit + FROM biobank_unit"; + $units = $this->db->pselectWithIndexKey($query, array(), 'id'); + + return $units; + } + + /** + * Queries all rows of the biobank_container_dimension table and returns a + * nested array with the ID field as the index. + * + * @return array $containerDimensions All data concerning each container dimension + */ + public function getDimensions() : array + { + $query = "SELECT ContainerDimensionID as id, + X as x, + XNumerical as xNum, + Y as y, + YNumerical as yNum, + Z as z, + ZNumerical as zNum + FROM biobank_container_dimension"; + $dimensions = $this->db->pselectWithIndexKey($query, array(), 'id'); + + return $dimensions; + } + + /** + * Queries all rows of the biobank_container_status table and returns a + * nested array with the ID field as the index. + * + * @return array $containerStati All data concerning each container status + */ + public function getStati() : array + { + $query = "SELECT ContainerStatusID as id, + Label as label + FROM biobank_container_status"; + $stati = $this->db->pselectWithIndexKey($query, array(), 'id'); + + return $stati; + } + + /** + * This function receives a Container Object, converts it into a SQL format + * and inserts it into all relevant tables in the database. Certain + * information is then cascaded to the children of the Container. + * + * @param Container $container The Container Object to be saved into the + * database. + * + * @return int $containerId The ID of the Container that was saved. + */ + public function saveInstance(Container $container) : int + { + // Converts Container Object into SQL format. + $data = $this->getSQLFromInstance($container); + + // Inserts or Updates the biobank_container table with given data. + $this->db->insertOnDuplicateUpdate( + 'biobank_container', + $data['biobank_container'] + ); + + if ($container->getId() !== null) { + // If update: + $oldContainer = $this->getInstanceFromId($container->getId()); + $oldParentContainerId = $oldContainer->getParentContainerId(); + // If there is no longer an associated Parent Container ID, delete + // it from the entry from the biobank_container_parent table. + if (isset($oldParentContainerId) && !isset($parentContainerId)) { + $this->db->delete( + 'biobank_container_parent', + array('ContainerID' => $container->getId()) + ); + } + } else { + // If insert: + $container->setId((int) $this->db->getLastInsertId()); + // set the respective data array index to the value of the new + // container ID. + $data['biobank_container_parent']['ContainerID'] = $container->getId(); + foreach ($data['biobank_container_project_rel'] as $id => $insert) { + $data['biobank_container_project_rel'][$id]['ContainerID'] = $container->getId(); + } + } + + $parentContainerId = $container->getParentContainerId(); + // If parent container ID exists, create an association in the + // biobank_container_parent rel table + if (isset($parentContainerId)) { + $this->db->insertOnDuplicateUpdate( + 'biobank_container_parent', + $data['biobank_container_parent'] + ); + } + + // insert on update biobank_container_project_rel with relevant data. + $this->db->delete( + 'biobank_container_project_rel', + array('ContainerID' => $container->getId()) + ); + foreach ($data['biobank_container_project_rel'] as $insert) { + $this->db->insert( + 'biobank_container_project_rel', + $insert + ); + } + + //Cascade changes in temperature, status, and center to all child Containers + $temperature = $container->getTemperature(); + $this->cascadeToChildren($container, 'Temperature', $temperature); + $statusId = $container->getStatusId(); + $this->cascadeToChildren($container, 'ContainerStatusID', $statusId); + $centerId = $container->getCenterID(); + $this->cascadeToChildren($container, 'CurrentCenterID', $centerId); + + return $container->getId(); + } + + /** + * This recursive function cascades the $value to the specified $field of + * all the children of the $container Object. + * + * @param object $container Container Object from which to retrieve children + * @param string $field The field at which to associate the $value + * @param mixed $value The value to assigned to the $field in question. + * It is mixed since it may receive multiple types + * of data. + * + * @return void + */ + private function cascadeToChildren( + Container $container, + string $field, + $value + ) : void { + $childContainers = $this->getChildContainers($container); + + if (!empty($childContainers)) { + foreach ($childContainers as $id=>$childContainer) { + $data = $this->getSQLFromInstance($childContainer); + $data['biobank_container'][$field] = $value; + $this->db->insertOnDuplicateUpdate( + 'biobank_container', + $data['biobank_container'] + ); + + $this->cascadeToChildren($childContainer, $field, $value); + } + } + } + + /** + * This function takes a Container Object and retrieves an array of objects + * representing the children of the $container. + * + * @param object $container Container Object from which to retrieve + * children + * + * @return array $childContainers Array of child container instances + */ + public function getChildContainers(Container $container) : array + { + $childContainers = array(); + $childContainerIds = $this->getChildContainerIds($container->getId()); + if (!empty($childContainerIds)) { + foreach ($childContainerIds as $id) { + $childContainers[$id] = $this->getInstanceFromId((int) $id); + } + } + return $childContainers; + } + + public function getAllChildContainers(Container $container, $containerList = []) : array + { + if ($container) { + $childContainers = $this->getChildContainers($container); + foreach($childContainers as $childContainer) { + $containerList[] = $childContainer; + $this->getAllChildContainers($childContainer, $containerList); + } + } + return $containerList; + } + + /** + * This function takes a Container Object and prepares the data to be + * inserted into the database by converting it to a data array. This mapping + * is done to enable the update or insertion of data into the database + * directly from the resulting arrays. + * + * @param Container $container Container Object to be converted + * + * @return array $data Array containing the data to be inserted + */ + private function getSQLFromInstance(Container $container) : array + { + $expirationDate = $container->getExpirationDate(); + if ($expirationDate) { + $expirationDate = $expirationDate->format('Y-m-d'); + } + $containerData = array( + 'ContainerID' => $container->getId(), + 'Barcode' => $container->getBarcode(), + 'ContainerTypeID' => $container->getTypeId(), + 'Temperature' => $container->getTemperature(), + 'ContainerStatusID' => $container->getStatusId(), + 'OriginCenterID' => $container->getOriginId(), + 'CurrentCenterID' => $container->getCenterId(), + 'LotNumber' => $container->getLotNumber(), + 'ExpirationDate' => $expirationDate, + ); + + $parentData = array( + 'ContainerID' => $container->getId(), + 'ParentContainerID' => $container->getParentContainerId(), + 'Coordinate' => $container->getCoordinate(), + ); + + foreach ($container->getProjectIds() as $id) { + $containerProjectData[$id] = array( + 'ContainerID' => $container->getId(), + 'ProjectID' => $id, + ); + } + + return $data = array( + 'biobank_container' => $containerData, + 'biobank_container_parent' => $parentData, + 'biobank_container_project_rel' => $containerProjectData, + ); + } + + /** + * This function takes an array that resulted from an SQL query and + * instantiates it as a Container Object + * + * @param array $data Values to be instantiated. + * @param ?array $childContainerIds List of child container ids. + * + * @return Container + */ + private function getInstanceFromSQL(array $data, ?array $childContainerIds, ?array $projectIds) : Container + { + $container = $this->getInstance(); + isset($data['ContainerID']) && $container->setId((int) $data['ContainerID']); + isset($data['Barcode']) && $container->setBarcode((string) $data['Barcode']); + isset($data['ContainerTypeID']) && $container->setTypeId((int) $data['ContainerTypeID']); + isset($data['ContainerDimensionID']) && $container->setDimensionId((int) $data['ContainerDimensionID']); + isset($data['Temperature']) && $container->setTemperature((float) $data['Temperature']); + isset($data['ContainerStatusID']) && $container->setStatusId((int) $data['ContainerStatusID']); + isset($projectIds) && $container->setProjectIds($projectIds); + isset($data['OriginCenterID']) && $container->setOriginId((int) $data['OriginCenterID']); + isset($data['CurrentCenterID']) && $container->setCenterId((int) $data['CurrentCenterID']); + isset($data['ParentContainerID']) && $container->setParentContainerId((int) $data['ParentContainerID']); + isset($childContainerIds) && $container->setChildContainerIds($childContainerIds); + isset($data['Coordinate']) && $container->setCoordinate((int) $data['Coordinate']); + isset($data['LotNumber']) && $container->setLotNumber((string) $data['LotNumber']); + isset($data['ExpirationDate']) && $container->setExpirationDate(new \DateTime($data['ExpirationDate'])); + + return $container; + } +} diff --git a/modules/biobank_nottracked/php/containerendpoint.class.inc b/modules/biobank_nottracked/php/containerendpoint.class.inc new file mode 100644 index 00000000000..918c4aedf07 --- /dev/null +++ b/modules/biobank_nottracked/php/containerendpoint.class.inc @@ -0,0 +1,127 @@ + + * @license http://www.gnu.org/licenses/gpl-3.0.text GPLv3 + * @link http://www.github.com/aces/Loris/ + */ +namespace LORIS\biobank; +use \Psr\Http\Message\ServerRequestInterface; +use \Psr\Http\Server\RequestHandlerInterface; +use \Psr\Http\Message\ResponseInterface; + +/** + * A class for handling the /biobank/containers/ endpoint. + * + * PHP Version 7.2 + * + * @category API + * @package Loris + * @subpackage Biobank + * @author Henri Rabalais + * @license http://www.gnu.org/licenses/gpl-3.0.text GPLv3 + * @link http://www.github.com/aces/Loris/ + */ +class ContainerEndpoint implements RequestHandlerInterface +{ + /** + * Returns true if user has access to this endpoint. + * + * @param \User $user The user whose access is being checked + * + * @return bool + */ + function _hasAccess(\User $user) : bool + { + return true; + } + + /** + * Return which methods are supported by this endpoint. + * + * @return array supported HTTP methods + */ + protected function allowedMethods() : array + { + return array( + 'GET', + 'PUT', + 'POST', + 'OPTIONS', + ); + } + + /** + * This function passes the request to the handler. This is necessary since + * the Endpoint bypass the Module class. + * + * XXX: This function should be extracted to a parent class. + * + * @param ServerRequestInterface $request The PSR7 request. + * @param RequestHandlerInterface $handler The request handler. + * + * @return ResponseInterface The outgoing PSR7 response. + */ + public function process( + ServerRequestInterface $request, + RequestHandlerInterface $handler + ) : ResponseInterface { + return $handler->handle($request); + } + + /** + * Handles Endpoint requests. + * + * @param ServerRequestInterface $request The incoming PSR7 request + * + * @return ResponseInterface The outgoing PSR7 response + */ + public function handle(ServerRequestInterface $request) : ResponseInterface + { + $db = \Database::singleton(); + $user = $request->getAttribute('user'); + $contCont = new ContainerController($db, $user); + + try { + $db->beginTransaction(); + switch($request->getMethod()) { + case 'GET': + $containers = $contCont->getInstances(); + return new \LORIS\Http\Response\OK($containers); + case 'POST': + $containers = json_decode($request->getBody()->getContents(), true); + $createdContainers = $contCont->createInstances($containers); + return new \LORIS\Http\Response\OK($createdContainers); + case 'PUT': + $containerArray = json_decode($request->getBody()->getContents(), true); + $updatedContainers = $contCont->updateInstance($containerArray); + return new \LORIS\Http\Response\OK($updatedContainers); + case 'OPTIONS': + return (new \LORIS\Http\Response()) + ->withHeader('Allow', $this->allowedMethods()); + } + } catch (\BadRequest $e) { + $db->rollBack(); + return new \LORIS\Http\Response\BadRequest($e->getMessage()); + } catch (\Forbidden $e) { + $db->rollBack(); + return new \LORIS\Http\Response\Forbidden($e->getMessage()); + } catch (\TypeError $e) { + $db->rollBack(); + return new \LORIS\Http\Response\InternalServerError($e->getMessage()); + } catch (\DatabaseException $e) { + $db->rollBack(); + return new \LORIS\Http\Response\InternalServerError($e->getMessage()); + } finally { + if ($db->inTransaction()) { + $db->commit(); + } + } + } +} diff --git a/modules/biobank_nottracked/php/labelendpoint.class.inc b/modules/biobank_nottracked/php/labelendpoint.class.inc new file mode 100644 index 00000000000..f62f892fcd1 --- /dev/null +++ b/modules/biobank_nottracked/php/labelendpoint.class.inc @@ -0,0 +1,97 @@ + + * @license http://www.gnu.org/licenses/gpl-3.0.text GPLv3 + * @link http://www.github.com/aces/Loris/ + */ +namespace LORIS\biobank; +use \Psr\Http\Message\ServerRequestInterface; +use \Psr\Http\Server\RequestHandlerInterface; +use \Psr\Http\Message\ResponseInterface; + +/** + * A class for handling the /biobank/containers/ endpoint. + * + * PHP Version 7.2 + * + * @category API + * @package Loris + * @subpackage Biobank + * @author Henri Rabalais + * @license http://www.gnu.org/licenses/gpl-3.0.text GPLv3 + * @link http://www.github.com/aces/Loris/ + */ +class LabelEndpoint implements RequestHandlerInterface +{ + /** + * Returns true if user has access to this endpoint. + * + * @param \User $user The user whose access is being checked + * + * @return bool + */ + function _hasAccess(\User $user) : bool + { + return true; + } + + /** + * Return which methods are supported by this endpoint. + * + * @return array supported HTTP methods + */ + protected function allowedMethods() : array + { + return array( + 'GET', + ); + } + + /** + * This function passes the request to the handler. This is necessary since + * the Endpoint bypass the Module class. + * + * XXX: This function should be extracted to a parent class. + * + * @param ServerRequestInterface $request The PSR7 request. + * @param RequestHandlerInterface $handler The request handler. + * + * @return ResponseInterface The outgoing PSR7 response. + */ + public function process( + ServerRequestInterface $request, + RequestHandlerInterface $handler + ) : ResponseInterface { + return $handler->handle($request); + } + + /** + * Handles Endpoint requests. + * + * @param ServerRequestInterface $request The incoming PSR7 request + * + * @return ResponseInterface The outgoing PSR7 response + */ + public function handle(ServerRequestInterface $request) : ResponseInterface + { + $db = \Database::singleton(); + $user = $request->getAttribute('user'); + $contCont = new ContainerController($db, $user); + + switch($request->getMethod()) { + case 'GET': + $barcode = $request->getBody()->getContents(); + return new \LORIS\Http\Response\OK($barcode); + case 'OPTIONS': + return (new \LORIS\Http\Response()) + ->withHeader('Allow', $this->allowedMethods()); + } + } +} diff --git a/modules/biobank_nottracked/php/module.class.inc b/modules/biobank_nottracked/php/module.class.inc new file mode 100644 index 00000000000..9b00c75f8ce --- /dev/null +++ b/modules/biobank_nottracked/php/module.class.inc @@ -0,0 +1,149 @@ + + * @license http://www.gnu.org/licenses/gpl-3.0.txt GPLv3 + * @link https://www.github.com/aces/Loris-Trunk/ + */ +namespace LORIS\biobank; +use \Psr\Http\Message\ServerRequestInterface; +use \Psr\Http\Message\ResponseInterface; + +/** + * Class module implements the basic LORIS module functionality + * + * @category Module + * @package Main + * @subpackage Biobank + * @author Henri Rabalais + * @license http://www.gnu.org/licenses/gpl-3.0.txt GPLv3 + * @link https://www.github.com/aces/Loris-Trunk/ + */ +class Module extends \Module +{ + /** + * The default handler for a module routes to a page of the first component of + * the URL's name, or the same name as the module if serving the root of the + * module. + * + * Modules extend PrefixRouter, so that the parent handler knows that the + * css, static, and js routes should be routed through the file system to + * retrieve the files before trying to load any specific pages. + * + * @param ServerRequestInterface $request The incoming PSR7 request + * + * @return ResponseInterface the outgoing PSR7 response + */ + public function handle(ServerRequestInterface $request) : ResponseInterface + { + $resp = parent::handle($request); + if ($resp->getStatusCode() != 404) { + $path = $request->getURI()->getPath(); + if (preg_match('/(\.css)$/', $path) == 1) { + $resp = $resp->withHeader( + "Content-Type", + "text/css" + ); + } + if (preg_match('/(\.js)$/', $path) == 1) { + $resp = $resp->withHeader( + "Content-Type", + "application/javascript" + ); + } + return $resp; + } + + $pagename = $this->getName(); + $path = trim($request->getURI()->getPath(), "/"); + if ($path == 'optionsendpoint' || + $path == 'poolendpoint' || + $path == 'containerendpoint' || + $path == 'specimenendpoint') { + // There is a subpage + $pagename = explode("/", $path)[0]; + } + + try { + $user = $request->getAttribute("user") ?? new \LORIS\AnonymousUser(); + $page = $this->loadPage($pagename); + // FIXME: Hack required for breadcrumbs. This should be removed, + // but some tests depend on it. + if ($this->getName() === $pagename) { + $_REQUEST['test_name'] = $pagename; + } else { + $_REQUEST['subtest'] = $pagename; + } + + $user = $request->getAttribute("user") ?? new \LORIS\AnonymousUser(); + if ($page->_hasAccess($user) !== true) { + return (new \LORIS\Middleware\PageDecorationMiddleware( + $user + ))->process( + $request, + new \LORIS\Router\NoopResponder( + new \LORIS\Http\Error( + $request, + 403, + "You do not have access to this page." + ) + ) + ); + } + } catch (\NotFound $e) { + return (new \LORIS\Middleware\PageDecorationMiddleware( + $user + ))->process( + $request, + new \LORIS\Router\NoopResponder( + new \LORIS\Http\Error( + $request, + 404, + "File not found: " . $request->getURI()->__toString() + ) + ) + ); + /* The order of these catch statements matter and should go from + * most to least specific. Otherwise all Exceptions will be caught + * as their more generic parent class which reduces precision. + */ + } catch (\DatabaseException $e) { + error_log($e); + return $this->responseStatus500( + $request, + $user, + self::GENERIC_500_ERROR + ); + } catch (\ConfigurationException $e) { + error_log($e); + return $this->responseStatus500( + $request, + $user, + self::CONFIGURATION_ERROR + ); + } catch (\LorisException $e) { + error_log($e); + return $this->responseStatus500( + $request, + $user, + self::GENERIC_500_ERROR + ); + } catch (\Exception $e) { + error_log($e); + return $this->responseStatus500( + $request, + $user, + self::GENERIC_500_ERROR + ); + } + + return $page->process($request, $page); + } +} diff --git a/modules/biobank_nottracked/php/optionsendpoint.class.inc b/modules/biobank_nottracked/php/optionsendpoint.class.inc new file mode 100644 index 00000000000..0faad7a0c7b --- /dev/null +++ b/modules/biobank_nottracked/php/optionsendpoint.class.inc @@ -0,0 +1,177 @@ + + * @license http://www.gnu.org/licenses/gpl-3.0.text GPLv3 + * @link http://www.github.com/aces/Loris + */ +namespace LORIS\biobank; +use \Psr\Http\Message\ServerRequestInterface; +use \Psr\Http\Server\RequestHandlerInterface; +use \Psr\Http\Message\ResponseInterface; + +/** + * A class for handling the /biobank/options/ endpoint. + * + * PHP Version 7.2 + * + * @category API + * @package Loris + * @subpackage Biobank + * @author Henri Rabalais + * @license http://www.gnu.org/licenses/gpl-3.0.text GPLv3 + * @link http://www.github.com/aces/Loris/ + */ +class OptionsEndpoint implements RequestHandlerInterface +{ + /** + * Returns true if user has access to this endpoint. + * + * @param \User $user The user whose access is being checked. + * + * @return bool + */ + function _hasAccess(\User $user) : bool + { + return true; + } + + /** + * Return which methods are supported by this endpoint. + * + * @return array supported HTTP methods + */ + protected function allowedMethods() : array + { + return array( + 'GET', + 'OPTIONS', + ); + } + + /** + * This function passes the request to the handler. This is necessary since + * the Endpoint bypass the Module class. + * + * XXX: This function should be extracted to a parent class. + * + * @param ServerRequestInterface $request The PSR7 request. + * @param RequestHandlerInterface $handler The request handler. + * + * @return ResponseInterface The outgoing PSR7 response. + */ + public function process( + ServerRequestInterface $request, + RequestHandlerInterface $handler + ) : ResponseInterface { + return $handler->handle($request); + } + + /** + * Handles endpoint requests. + * + * @param ServerRequestInterface $request The incoming PSR7 request + * + * @return ResponseInterface The outgoing PSR7 response + */ + public function handle(ServerRequestInterface $request) : ResponseInterface + { + $db = \Database::singleton(); + $user = $request->getAttribute('user'); + + try { + switch($request->getMethod()) { + case 'GET': + $options = $this->getOptions($db, $user); + return new \LORIS\Http\Response\OK($options); + case 'OPTIONS': + return (new \LORIS\Http\Response()) + ->withHeader('Allow', $this->allowedMethods()); + } + } catch (\Invalid $e) { + return \LORIS\Http\Response\BadRequest($e->getMessage()); + } catch (\Forbidden $e) { + return \LORIS\Http\Response\Forbidden($e->getMessage()); + } + } + + /** + * Retrieves all options for populating forms and mapping front-end data. + * + * @param Database $db Database instance + * @param User $user User instance + * + * @return array All options required by the Biobank Module + */ + function getOptions(\Database $db, \User $user) + { + $contCont = new ContainerController($db, $user); + $specCont = new SpecimenController($db, $user); + + // XXX: This should eventually be replaced by a call directly to a + // Candidate endpoint or Candidate controller that will be able to + // provide Candidate Objects. + $query = 'SELECT CandID as id, PSCID as pscid FROM candidate'; + $candidates = $db->pselectWithIndexKey($query, array(), 'id'); + + // XXX: This should eventually be replaced by a call directly to a + // Session endpoint or Session controller that will be able to provide + // Session Objects. + $query = 'SELECT ID as id, Visit_label as label FROM session'; + $sessions = $db->pselectWithIndexKey($query, array(), 'id'); + + // XXX: This should eventually be replaced by a call directly to a + // Examiner endpoint or Examiner controller that will be able to provide + // Examiner Objects. + $query = 'SELECT examinerID as id, full_name as label FROM examiners'; + $examiners = $db->pselectWithIndexKey($query, array(), 'id'); + + // XXX: This should eventually be replaced by a call directly to a + // Center Endpoint or Center Controller that will be able to provide + // Center Objects. + $centers = \Utility::getSiteList(); + foreach ($centers as $id => $center) { + if ($user->hasCenter($id) === false) { + unset($centers[$id]); + } + } + + // XXX: This should eventually be replaced by a call directly to a + // Session Controller or Session Options endpoint that will be able to + // provide these options. + $query = 'SELECT c.CandID as candidateId, + s.ID sessionId, + s.Visit_label as label, + s.CenterID as centerId + FROM candidate c + LEFT JOIN session s + USING(CandID)'; + $result = $db->pselect($query, array()); + $candidateSessions = array(); + $sessionCenters = array(); + foreach ($result as $row) { + foreach ($row as $column=>$value) { + $candidateSessions[$row['candidateId']][$row['sessionId']]['label'] = $row['label']; + $sessionCenters[$row['sessionId']]['centerId'] = $row['centerId']; + } + } + + return array( + 'candidates' => $candidates, + 'sessions' => $sessions, + 'projects' => \Utility::getProjectList(), + 'centers' => $centers, + 'examiners' => $examiners, + 'candidateSessions' => $candidateSessions, + 'sessionCenters' => $sessionCenters, + 'container' => $contCont->getOptions(), + 'specimen' => $specCont->getOptions(), + ); + } +} diff --git a/modules/biobank_nottracked/php/pool.class.inc b/modules/biobank_nottracked/php/pool.class.inc new file mode 100644 index 00000000000..d685033ea34 --- /dev/null +++ b/modules/biobank_nottracked/php/pool.class.inc @@ -0,0 +1,393 @@ + + * @license http://www.gnu.org/licenses/gpl-3.0.txt GPLv3 + * @link https://www.github.com/aces/Loris/ + */ +namespace LORIS\biobank; + +/** + * Pool Class + * This class contains an instance of a database handling that is needed to + * permanently store and retrieve Pool Object instances. + * + * PHP Version 7.2 + * + * @category Entity + * @package Loris + * @subpackage Biobank + * @author Henri Rabalais + * @license http://www.gnu.org/licenses/gpl-3.0.txt GPLv3 + * @link https://www.github.com/aces/Loris/ + */ +class Pool implements \JsonSerializable, \LORIS\Data\DataInstance +{ + /** + * Persistent Instance variables. + * + * These properties describe a pool entity. + * + * @var string $id + * @var string $label + * @var float $quantity + * @var int $unitId + * @var array $specimenIds + * @var int $candidateId + * @var int $sessionId + * @var int $typeId + * @var int $centerId + * @var \DateTime $date + * @var \DateTime $time + */ + private $id; + private $label; + private $quantity; + private $unitId; + private $specimenIds; + private $candidateId; + private $sessionId; + private $typeId; + private $centerId; + private $date; + private $time; + + /** + * Initiliazes a new instance of the Pool Class + */ + function __construct() + { + } + + /** + * Sets the pool's ID + * + * @param int $id the pool's ID + * + * @return void + */ + public function setId(int $id) : void + { + if ($id > 0) { + $this->id = $id; + } + } + + /** + * Gets the pool's ID + * + * @return ?int + */ + public function getId() : ?int + { + return $this->id; + } + + /** + * Sets the label of the pool + * + * @param string $label the pool's label + * + * @return void + */ + public function setLabel(string $label) : void + { + $this->label = $label; + } + + /** + * Gets the label of the pool + * + * @return string + */ + public function getLabel() : string + { + return $this->label; + } + + /** + * Sets the quantity of the pool + * + * @param float $quantity the pool's quantity + * + * @return void + */ + public function setQuantity(float $quantity) : void + { + $this->quantity = $quantity; + } + + /** + * Gets the quantity of the pool + * + * @return float + */ + public function getQuantity() : float + { + return $this->quantity; + } + + /** + * Sets the Unit ID of the pool + * + * @param int $unitId Unit ID of the pool + * + * @return void + */ + public function setUnitId(int $unitId) : void + { + if ($unitId > 0) { + $this->unitId = $unitId; + } + } + + /** + * Gets the Unit ID of the pool + * + * @return ?int + */ + public function getUnitId() : ?int + { + return $this->unitId; + } + + /** + * Sets the Specimen IDs of the pool + * + * @param array $specimenIds Specimen IDs of the pool + * + * @return void + */ + public function setSpecimenIds(array $specimenIds) : void + { + $this->specimenIds = $specimenIds; + } + + /** + * Gets the Specimen IDs of the pool + * + * @return array + */ + public function getSpecimenIds() : array + { + return $this->specimenIds; + } + + /** + * Sets the Candidate ID of the pool + * + * @param int $candidateId Candidate ID of the pool + * + * @return void + */ + public function setCandidateId(int $candidateId) : void + { + if ($candidateId > 0) { + $this->candidateId = $candidateId; + } + } + + /** + * Gets the Candidate ID of the pool + * + * @return ?int + */ + public function getCandidateId() : ?int + { + return $this->candidateId; + } + + /** + * Sets the Session ID of the pool + * + * @param ?int $sessionId Session ID of the pool + * + * @return void + */ + public function setSessionId(?int $sessionId) : void + { + if ($sessionId > 0) { + $this->sessionId = $sessionId; + } + } + + /** + * Gets the Session ID of the pool + * + * @return ?int + */ + public function getSessionId() : ?int + { + return $this->sessionId; + } + + /** + * Sets the Type ID of the pool + * + * @param ?int $typeId Type ID of the pool + * + * @return void + */ + public function setTypeId(?int $typeId) : void + { + if ($typeId > 0) { + $this->typeId = $typeId; + } + } + + /** + * Gets the Type ID of the pool + * + * @return ?int + */ + public function getTypeId() : ?int + { + return $this->typeId; + } + + /** + * Sets the Center ID of the pool + * + * @param array $centerId Center ID of the pool + * + * @return void + */ + public function setCenterId(int $centerId) : void + { + if ($centerId > 0) { + $this->centerId = $centerId; + } + } + + /** + * Gets the Center ID of the pool + * + * @return int + */ + public function getCenterId() : int + { + return $this->centerId; + } + + /** + * Sets the date at which the pool was created. + * + * @param \DateTime $date the date of the pool + * + * @return void + */ + public function setDate(\DateTime $date) : void + { + $this->date = $date; + } + + /** + * Gets the date that the pool was created. + * + * @return \DateTime + */ + public function getDate() : \DateTime + { + return $this->date; + } + + /** + * Sets the time at which the pool was created. + * + * @param \DateTime $time the time of the pool + * + * @return void + */ + public function setTime(\DateTime $time) : void + { + $this->time = $time; + } + + /** + * Gets the time of pool at which the pool was created. + * + * @return \DateTime + */ + public function getTime() : \DateTime + { + return $this->time; + } + + /** + * Loads a Pool Object from an array. + * + * @param array $data Data to be used to load the Pool Object. + * + * @return Pool + */ + public function fromArray(array $data) : Pool + { + isset($data['id']) && $this->setId((int) ($data['id'])); + isset($data['label']) && $this->setLabel((string) $data['label']); + isset($data['quantity']) && $this->setQuantity((float) $data['quantity']); + isset($data['unitId']) && $this->setUnitId((int) $data['unitId']); + isset($data['specimenIds']) && $this->setSpecimenIds($data['specimenIds']); + isset($data['candidateId']) && $this->setCandidateId((int) $data['candidateId']); + isset($data['sessionId']) && $this->setSessionId((int) $data['sessionId']); + isset($data['typeId']) && $this->setTypeId((int) $data['typeId']); + isset($data['centerId']) && $this->setCenterId((int) $data['centerId']); + isset($data['date']) && $this->setDate(new \DateTime($data['date'])); + isset($data['time']) && $this->setTime(new \DateTime($data['time'])); + + return $this; + } + + /** + * A wrapper function for the jsonSerialize method of the Pool Instance + * Class. This converts the Pool Instance into an array. + * + * @return array Pool Array. + */ + public function toArray() : array + { + return $this->jsonSerialize(); + } + + /** + * Returns an array representing the state of the Pool. + * + * @return array + */ + public function jsonSerialize() : array + { + // TODO: Date and Time formats should be gotten from some sort of + // config setting. + return array( + 'id' => $this->id, + 'label' => $this->label, + 'quantity' => $this->quantity, + 'unitId' => $this->unitId, + 'specimenIds' => $this->specimenIds, + 'candidateId' => $this->candidateId, + 'sessionId' => $this->sessionId, + 'typeId' => $this->typeId, + 'centerId' => $this->centerId, + 'date' => $this->date->format('d-m-Y'), + 'time' => $this->time->format('H:i'), + ); + } + + /** + * Returns a JSON encoded string of the state of the Pool + * + * @return string JSON encoded string of Pool data + */ + public function toJSON() : string + { + return json_encode($this); + } +} + diff --git a/modules/biobank_nottracked/php/poolcontroller.class.inc b/modules/biobank_nottracked/php/poolcontroller.class.inc new file mode 100644 index 00000000000..9045141a20b --- /dev/null +++ b/modules/biobank_nottracked/php/poolcontroller.class.inc @@ -0,0 +1,298 @@ + + * @license http://www.gnu.org/licenses/gpl-3.0.text GPLv3 + * @link http://www.github.com/aces/Loris/ + */ +namespace LORIS\biobank; + +/** + * This class features the code that enables access to the Pools of the + * LORIS Biobank Module. + * + * PHP Version 7.2 + * + * @category Controller + * @package Loris + * @subpackage Biobank + * @author Henri Rabalais + * @license http://www.gnu.org/licenses/gpl-3.0.text GPLv3 + * @link http://www.github.com/aces/Loris/ + */ +class PoolController +{ + /** + * Private instances of the Database, User and PoolDAO classes. + * + * @var \Database $db + * @var \User $user + * @var PoolDAO $dao + */ + private $db, $user, $dao; + + /** + * Pool Controller Class constructor. + * + * @param Database $db Database Instance. + * @param User $user User Instance. + */ + function __construct(\Database $db, \User $user) + { + $this->db = $db; + $this->user = $user; + $this->dao = $this->getDataProvisioner(); + } + + /** + * Get all Pool Objects permitted by the Pool Data Provisioner. + * + * @return array of all permissable Pool Objects + */ + public function getInstances() : array + { + $this->validatePermission('view'); + $pools = array(); + $poolIt = $this->dao->execute($this->user); + foreach ($poolIt as $id => $pool) { + $pools[$id] = $pool; + } + + return $pools; + } + + // TODO: Decide if this should be able to handle a list of pools rather + // than a singular pool array. + /** + * Takes a list of pool arrays from the client-side, validates them, + * instantiates them and sends them to the DAO to be saved to the database. + * + * @param array $poolArray pool array to be created. + * + * @return string a json encoded string of all permissable Pool Objects. + */ + public function createInstance(array $poolArray) + { + $this->validatePermission('create'); + $pool = (new Pool())->fromArray($poolArray); + $this->validateInstance($pool); + $this->dao->saveInstance($pool); + } + + /** + * Treats the Pool DAO as a Provisioner that can be iterated through to + * provide the permissible Pool Objects for the current User + * + * @return \LORIS\Data\Provisioner + */ + private function getDataProvisioner() : \LORIS\Data\Provisioner + { + $dao = new PoolDAO($this->db); + if ($this->user->hasPermission('access_all_profiles') == false) { + $dao = $dao->filter(new \LORIS\Data\Filters\UserSiteMatch()); + } + return $dao; + } + + /** + * Checks user Permissions for given requested action. + * + * @param string $method to be executed. + * + * @return void + */ + private function validatePermission(string $method) : void + { + switch ($method) { + case 'view': + if (!$this->user->hasPermission('biobank_pool_view')) { + throw new \Forbidden('Pool: View Permission Denied'); + } + case 'create': + if (!$this->user->hasPermission('biobank_pool_create')) { + throw new \Forbidden('Pool: Create Permission Denied'); + } + } + } + + /** + * Validates Pool Object before being saved + * + * @param Pool $pool Pool to be validated + * + * @return void + */ + function validateInstance(Pool $pool) : void + { + $this->validateLabel($pool); + $this->validateQuantity($pool); + $this->validateUnitId($pool); + $this->validateSpecimenIds($pool); + $this->validateCenterId($pool); + $this->validateDate($pool); + $this->validateTime($pool); + } + + /** + * Validates Pool Object Label + * + * @param Pool $pool Pool to be checked. + * + * @throws BadRequest if the provided Pool does not meet validation requirements + * + * @return void + */ + private function validateLabel(Pool $pool) : void + { + //TODO: Validate Label with Regex and required + } + + /** + * Validates Pool Object Quantity + * + * @param Pool $pool Pool to be checked. + * + * @throws BadRequest if the provided Pool does not meet validation requirements + * + * @return void + */ + private function validateQuantity(Pool $pool) : void + { + //TODO: Validate Quantity + } + + /** + * Validates Pool Object UnitId + * + * @param Pool $pool Pool to be checked. + * + * @throws BadRequest if the provided Pool does not meet validation requirements + * + * @return void + */ + private function validateUnitId(Pool $pool) : void + { + //TODO: Validate UnitId + } + + /** + * Validates Pool Object Specimen IDs + * + * @param Pool $pool Pool to be checked. + * + * @throws BadRequest if the provided Pool does not meet validation requirements + * + * @return void + */ + private function validateSpecimenIds(Pool $pool) : void + { + $specimenIds = $pool->getSpecimenIds(); + if (count($specimenIds) < 2) { + throw new \BadRequest( + 'At least 2 specimens must be provided to create a Pool' + ); + } + + $specimenDAO = new SpecimenDAO($this->db); + $containerDAO = new ContainerDAO($this->db); + $baseSpecimen = $specimenDAO->getInstanceFromId($specimenIds[0]); + $baseContainer = $containerDAO->getInstanceFromId($baseSpecimen->getContainerId()); + + foreach ($specimenIds as $specimenId) { + $specimen = $specimenDAO->getInstanceFromId($specimenId); + $container = $containerDAO->getInstanceFromId($specimen->getContainerId()); + $barcode = $container->getBarcode(); + + if ($baseSpecimen->getCandidateId() !== $specimen->getCandidateId()) { + throw new \BadRequest( + 'Pooled specimens must belong to the same Candidate' + ); + } + + if ($baseSpecimen->getSessionId() !== $specimen->getSessionId()) { + throw new \BadRequest('Pooled specimens must belong to the same Session'); + } + + if ($baseSpecimen->getTypeId() !== $specimen->getTypeId()) { + throw new \BadRequest('Pooled specimens must be of the same Type'); + } + + if ($baseContainer->getCenterID() !== $container->getCenterID()) { + throw new \BadRequest('Pooled specimens must be at the same Site'); + } + + if ($specimen->getQuantity() === 0 ) { + throw new \BadRequest("Quantity of '$barcode' must be greater than '0'"); + } + + if ($specimen->getPoolId() !== null) { + throw new \BadRequest("Specimen '$barcode' already belongs to a Pool"); + } + + if ($containerDAO->getStati()[$container->getStatusId()]['label'] !== 'Available') { + throw new \BadRequest("Specimen '$barcode' is not 'Available'"); + } + } + } + + /** + * Validates Pool Object Center ID + * + * @param Pool $pool Pool to be checked. + * + * @throws BadRequest if the provided Pool does not meet validation requirements + * + * @return void + */ + private function validateCenterId(Pool $pool) : void + { + if (is_null($pool->getCenterId())) { + throw new \BadRequest('Pool Center must be set'); + } + } + + /** + * Validates Pool Object Date + * + * @param Pool $pool Pool to be checked. + * + * @throws BadRequest if the provided Pool does not meet validation requirements + * + * @return void + */ + private function validateDate(Pool $pool) : void + { + // TODO: query date format from backend configuration. + // $format = 'd-m-Y'; + // $date = \DateTime::createFromFormat($format, $pool->getDate()); + // if ($date && $date->format($format) !== $pool->getDate()) { + // throw new \BadRequest("Pooling date must be of the format: $format"); + // } + } + + /** + * Validates Pool Object Time + * + * @param Pool $pool Pool to be checked. + * + * @throws BadRequest if the provided Pool does not meet validation requirements + * + * @return void + */ + private function validateTime(Pool $pool) : void + { + // TODO: query time format from backend configuration. + // $format = 'H:i'; + // $time = \DateTime::createFromFormat($format, $pool->getTime()); + // if ($time && $time->format($format) !== $pool->getTime()) { + // throw new \BadRequest("Pooling time must be of the format: $format"); + // } + } +} diff --git a/modules/biobank_nottracked/php/pooldao.class.inc b/modules/biobank_nottracked/php/pooldao.class.inc new file mode 100644 index 00000000000..f71ee3abb44 --- /dev/null +++ b/modules/biobank_nottracked/php/pooldao.class.inc @@ -0,0 +1,283 @@ + + * @license http://www.gnu.org/licenses/gpl-3.0.txt GPLv3 + * @link https://www.github.com/aces/Loris/ + */ + +namespace LORIS\biobank; + +/** + * Pool Data Access Object (DAO) Class + * This class contains all database handling that is needed to + * permanently store and retrieve Pool Object instances + * + * PHP Version 7.2 + * + * @category DAO + * @package Loris + * @subpackage Biobank + * @author Henri Rabalais + * @license http://www.gnu.org/licenses/gpl-3.0.txt GPLv3 + * @link https://www.github.com/aces/Loris/ + */ + +class PoolDAO extends \LORIS\Data\ProvisionerInstance +{ + /** + * Private instance of the Database class. + * + * @var \Dabatase $dao + */ + private $db; + + /** + * Initializes a new instance of the PoolDAO Class + * + * @param Database $db Instance of the LORIS Database class + */ + function __construct(\Database $db) + { + $this->db = $db; + } + + // XXX: I'm not sure if this function is really necessary since it is only + // being used once, and should likely not be accessed outside this class. + /** + * This method is used when the DAO class needs to create new Pool + * instance. + * + * @return Pool + */ + private function getInstance() : Pool + { + return new Pool(); + } + + /** + * This will load all pool persistence variables from the database for a + * given $id into a Pool object, and return the object. + * + * @param int $id Value of the $id for the Pool that will be + * instantiated. + * + * @return Pool $pool Pool Instance. + */ + public function getInstanceFromId(int $id) : Pool + { + $specimenDAO = new SpecimenDAO($this->db); + $specimenIds = $this->getSpecimenIdsFromId($id); + $specimen = $specimenDAO->getInstanceFromId(intval($specimenIds[0])); + + $poolArray = $this->getInstanceDataFromId($id); + $poolArray['CandidateID'] = $specimen->getCandidateId(); + $poolArray['SessionID'] = $specimen->getSessionId(); + $poolArray['TypeID'] = $specimen->getTypeId(); + + $pool = $this->getInstanceFromSQL($poolArray, $specimenIds); + + return $pool; + } + + /** + * Queries data from the databse for the Pool at the requested ID. + * + * @param int $id Value of the $id for the Pool whose data is being queried. + * + * @return array Pool Data at that ID. + */ + private function getInstanceDataFromId(int $id) + { + // TODO: query date and time format from backend to know how to query + // them from the database. + $query = "SELECT bp.PoolID, + bp.Label, + bp.Quantity, + bp.UnitID, + bp.CenterID, + bp.Date, + DATE_FORMAT(bp.Time, '%H:%i') as Time + FROM biobank_pool bp + WHERE bp.PoolID=:i"; + return $this->db->pselectRow($query, array('i' => $id)); + } + + /** + * This function returns an array of all the Specimen Ids that are + * associated with the given Pool Instance's ID in the + * biobank_specimen_pool_rel table. + * + * @param int $id Pool id from which to query Specimen IDs + * + * @return array $specimenIds array of associated Specimen IDs + */ + private function getSpecimenIdsFromId(int $id) : array + { + $query = 'SELECT SpecimenID + FROM biobank_specimen_pool_rel + WHERE PoolID=:i'; + return $this->db->pselectcol($query, array('i' => $id)); + } + + // XXX: Currently this function is never used with any conditions passed as + // paramters. Decide if this is a necessary feature. + /** + * This will select all pools from the database that match the + * attribute values passed through $poolData and will return an array + * of pool objects. + * + * @param array $conditions Conditions to be met by the query + * + * @return array $pools List of Pool Objects that match the query + */ + public function selectInstances(array $conditions = null) : array + { + $query = 'SELECT PoolID + FROM biobank_pool'; + $query .= $conditions ? ' WHERE '.$this->db->implodeWithKeys(' AND ', $conditions) : ''; + + $result = $this->db->pselect($query, array()); + $pools = array(); + if (!empty($result)) { + foreach ($result as $row) { + $id = (int) $row['PoolID']; + $pool = $this->getInstanceFromId($id); + $pools[$id] = $pool; + } + } + + return $pools; + } + + /** + * Instantiates an ArrayIterator class that is composed of all the Pool + * Objects + * + * @return traversable Iterator of Pool Objects + */ + protected function getAllInstances() : \Traversable + { + return new \ArrayIterator($this->selectInstances()); + } + + /** + * This function recieves a Pool Object, converts it into an SQL format + * and inserts it into all relevant tables in the database. Certain + * information is then cascaded to the children of the Pool. + * + * @param Pool $pool The Pool to be inserted into the database. + * + * @return void + */ + public function saveInstance(Pool $pool) : void + { + //Convert Pool to SQL format. + $data = $this->getSQLFromInstance($pool); + + // TODO: Introduce a SQL Transaction here with a try catch. + // Insert or Update the biobank_pool table with respective data. + $this->db->insertOnDuplicateUpdate( + 'biobank_pool', + $data['biobank_pool'] + ); + + $poolId = $pool->getId(); + if (isset($poolId)) { + // If update: + // Do nothing. + } else { + // If insert: + $poolId = $this->db->getLastInsertId(); + // set the respective data array index to the value of the new + // pool ID + $specimenIds = $pool->getSpecimenIds(); + foreach ($specimenIds as $id) { + $data['biobank_specimen_pool_rel'][$id]['PoolID'] = $poolId; + } + } + + // insert or update biobank_specimen_pool_rel with relevant data. + foreach ($data['biobank_specimen_pool_rel'] as $insert) { + $this->db->insertOnDuplicateUpdate( + 'biobank_specimen_pool_rel', + $insert + ); + } + + // XXX: decide if quantity of all pooled specimens should go to 0. + // XXX: logic for adding preparations to pools will likely go here as well. + } + + /** + * This function takes a Pool array and prepares the data to be inserted + * into the database by converting it to a data array. This mapping is done + * to enable the update or insertion of data into the database directly from + * the resuling array. + * + * @param Pool $pool Pool array to be converted + * + * @return array $data Array containing the data to be inserted + */ + private function getSQLFromInstance(Pool $pool) : array + { + $poolData = array( + 'PoolID' => $pool->getId(), + 'Label' => $pool->getLabel(), + 'Quantity' => $pool->getQuantity(), + 'UnitID' => $pool->getUnitId(), + 'CenterID' => $pool->getCenterId(), + 'Date' => $pool->getDate()->format('Y-m-d'), + 'Time' => $pool->getTime()->format('H:i'), + ); + + $specimenIds = $pool->getSpecimenIds(); + foreach ($specimenIds as $id) { + $specimenPoolData[$id] = array( + 'PoolID' => $pool->getId(), + 'SpecimenID' => $id, + ); + } + + return array( + 'biobank_pool' => $poolData, + 'biobank_specimen_pool_rel' => $specimenPoolData, + ); + } + + /** + * This function takes an array that resulted from an SQL query and + * instantiates it as a Pool Object + * + * @param array $data Values to be reassigned. + * @param array $specimenIds List of specimen IDs associated with the given + * Pool. + * + * @return Pool + */ + private function getInstanceFromSQL(array $data, array $specimenIds) : Pool + { + $pool = new Pool(); + isset($data['PoolID']) && $pool->setId((int) $data['PoolID']); + isset($data['Label']) && $pool->setLabel((string) $data['Label']); + isset($data['Quantity']) && $pool->setQuantity((float) $data['Quantity']); + isset($data['UnitID']) && $pool->setUnitId((int) $data['UnitID']); + !empty($specimenIds) && $pool->setSpecimenIds($specimenIds); + isset($data['CandidateID']) && $pool->setCandidateId((int) $data['CandidateID']); + isset($data['SessionID']) && $pool->setSessionId((int) $data['SessionID']); + isset($data['TypeID']) && $pool->setTypeId((int) $data['TypeID']); + isset($data['CenterID']) && $pool->setCenterId((int) $data['CenterID']); + isset($data['Date']) && $pool->setDate(new \DateTime($data['Date'])); + isset($data['Time']) && $pool->setTime(new \DateTime($data['Time'])); + + return $pool; + } +} diff --git a/modules/biobank_nottracked/php/poolendpoint.class.inc b/modules/biobank_nottracked/php/poolendpoint.class.inc new file mode 100644 index 00000000000..901b5466935 --- /dev/null +++ b/modules/biobank_nottracked/php/poolendpoint.class.inc @@ -0,0 +1,122 @@ + + * @license http://www.gnu.org/licenses/gpl-3.0.text GPLv3 + * @link http://www.github.com/aces/Loris + */ +namespace LORIS\biobank; +use \Psr\Http\Message\ServerRequestInterface; +use \Psr\Http\Server\RequestHandlerInterface; +use \Psr\Http\Message\ResponseInterface; + +/** + * A class for handling the /biobank/pool/ endpoint. + * + * PHP Version 7.2 + * + * @category API + * @package Loris + * @subpackage Biobank + * @author Henri Rabalais + * @license http://www.gnu.org/licenses/gpl-3.0.text GPLv3 + * @link http://www.github.com/aces/Loris/ + */ +class PoolEndpoint implements RequestHandlerInterface +{ + /** + * Returns true if user has access to this endpoint. + * + * @param \User $user The user whose access is being checked. + * + * @return bool + */ + function _hasAccess(\User $user) : bool + { + return true; + } + + /** + * Return which methods are supported by this endpoint. + * + * @return array supported HTTP methods + */ + protected function allowedMethods() : array + { + return array( + 'GET', + 'POST', + 'OPTIONS', + ); + } + + /** + * This function passes the request to the handler. This is necessary since + * the Endpoint bypass the Module class. + * + * XXX: This function should be extracted to a parent class. + * + * @param ServerRequestInterface $request The PSR7 request. + * @param RequestHandlerInterface $handler The request handler. + * + * @return ResponseInterface The outgoing PSR7 response. + */ + public function process( + ServerRequestInterface $request, + RequestHandlerInterface $handler + ) : ResponseInterface { + return $handler->handle($request); + } + + /** + * Handles endpoint requests. + * + * @param ServerRequestInterface $request The incoming PSR7 request + * + * @return ResponseInterface The outgoing PSR7 response + */ + public function handle(ServerRequestInterface $request) : ResponseInterface + { + $db = \Database::singleton(); + $user = $request->getAttribute('user'); + $poolCont = new PoolController($db, $user); + + try { + $db->beginTransaction(); + switch($request->getMethod()) { + case 'GET': + $pools = $poolCont->getInstances(); + return new \LORIS\Http\Response\OK($pools); + case 'POST': + $pool = json_decode($request->getBody()->getContents(), true); + $poolCont->createInstance($pool); + return new \LORIS\Http\Response\OK(); + case 'OPTIONS': + return (new \LORIS\Http\Response()) + ->withHeader('Allow', $this->allowedMethods()); + } + } catch (\BadRequest $e) { + $db->rollBack(); + return new \LORIS\Http\Response\BadRequest($e->getMessage()); + } catch (\Forbidden $e) { + $db->rollBack(); + return new \LORIS\Http\Response\Forbidden($e->getMessage()); + } catch (\TypeError $e) { + $db->rollback(); + return new \LORIS\Http\Response\InternalServerError($e->getMessage()); + } catch (\DatabaseException $e) { + $db->rollBack(); + return new \LORIS\Http\Response\InternalServerError($e->getMessage()); + } finally { + if ($db->inTransaction()) { + $db->commit(); + } + } + } +} diff --git a/modules/biobank_nottracked/php/preparation.class.inc b/modules/biobank_nottracked/php/preparation.class.inc new file mode 100644 index 00000000000..0971c505260 --- /dev/null +++ b/modules/biobank_nottracked/php/preparation.class.inc @@ -0,0 +1,73 @@ + + * @license http://www.gnu.org/licenses/gpl-3.0.txt GPLv3 + * @link https://www.github.com/aces/Loris/ + */ + +namespace LORIS\biobank; + +/** + * Preparation Object Class + * This class contains an instance of a database handling that is needed to + * permanently store and retrieve Preparation Object instances. + * + * PHP Version 7.2 + * + * @category Entity + * @package Loris + * @subpackage Biobank + * @author Henri Rabalais + * @license http://www.gnu.org/licenses/gpl-3.0.txt GPLv3 + * @link https://www.github.com/aces/Loris/ + */ +class Preparation extends Process +{ + /** + * Instatiates a Preparation Object using the values sent from the client-side. + * + * @param array $data Data to be used to instantiate the Preparation Object. + * + * @return Process + */ + public function fromArray(array $data) : Process + { + parent::fromArray($data); + + return $this; + } + + /** + * A wrapper function for the jsonSerialize method of the Preparation Instance + * Class. This converts this Specimen Preparation into an array + * + * @return array Specimen Array + */ + public function toArray() + { + return $this->jsonSerialize(); + } + + /** + * Returns an array representing the state of the Specimen. + * + * @return array + */ + public function jsonSerialize() : array + { + $parent = parent::jsonSerialize(); + return array_merge( + $parent, + array() + ); + } +} + diff --git a/modules/biobank_nottracked/php/primarycontainerfilter.class.inc b/modules/biobank_nottracked/php/primarycontainerfilter.class.inc new file mode 100644 index 00000000000..c49d50b2359 --- /dev/null +++ b/modules/biobank_nottracked/php/primarycontainerfilter.class.inc @@ -0,0 +1,65 @@ + + * @license http://www.gnu.org/licenses/gpl-3.0.txt GPLv3 + * @link https://www.github.com/aces/Loris/ + */ +namespace LORIS\biobank; + +/** + * PrimaryContainerFilter filters out primary or non primary containers, + * depending on the value passed to the constructor. + * + * PHP Version 7.2 + * + * @category Filter + * @package Loris + * @subpackage Biobank + * @author Henri Rabalais + * @license http://www.gnu.org/licenses/gpl-3.0.txt GPLv3 + * @link https://www.github.com/aces/Loris/ + */ +class PrimaryContainerFilter implements \LORIS\Data\Filter +{ + + /** + * $primary determines whether to filter primary or non primary containers. + * If the value is '1', primary containers will be filtered. If the value + * '0', non primary containers will be filtered. + */ + private $primary; + + /** + * Class constructor. + * + * @param int $primary A value of '0' or '1' which indicates if the + * container is primary. + */ + function __construct(int $primary) + { + $this->primary = $primary; + } + + /** + * Implements the \LORIS\Data\Filter interface + * + * @param User $user The user that the data is being filtered for. + * @param Container $container The container being filtered. + * + * @return bool true if the container is of type primary. + */ + public function filter(\User $user, \Loris\Data\DataInstance $container) : bool + { + $db = \Database::singleton(); + $containerDAO = new ContainerDAO($db); + $containerTypes = $containerDAO->getContainerTypes(); + return $containerTypes[$container->getTypeId()]['primary'] === $this->primary; + } +} diff --git a/modules/biobank_nottracked/php/process.class.inc b/modules/biobank_nottracked/php/process.class.inc new file mode 100644 index 00000000000..9f270ec6f0b --- /dev/null +++ b/modules/biobank_nottracked/php/process.class.inc @@ -0,0 +1,263 @@ + + * @license http://www.gnu.org/licenses/gpl-3.0.txt GPLv3 + * @link https://www.github.com/aces/Loris/ + */ +namespace LORIS\biobank; + +/** + * Process Object Class + * This class contains an instance of a database handling that is needed to + * permanently store and retrieve Process Object instances. + * + * PHP Version 7.2 + * + * @category Entity + * @package Loris + * @subpackage Biobank + * @author Henri Rabalais + * @license http://www.gnu.org/licenses/gpl-3.0.txt GPLv3 + * @link https://www.github.com/aces/Loris/ + */ +abstract class Process implements \JsonSerializable +{ + /** + * Persistent Instance variables. + * + * These variables describe a process instance. + * + * @var int $protocolId + * @var int $centerId + * @var int $examinerId + * @var \DateTime $date + * @var \DateTime $time + * @var string $comments + * @var array $data + */ + private $protocolId; + private $centerId; + private $examinerId; + private $date; + private $time; + private $comments; + private $data; + + /** + * Initiliazes a new instance of the Process Class + */ + function __construct() + { + } + + /** + * Sets the ID of the specimen's processing protocol. + * + * @param int $protocolId the ID of the processing protocol + * + * @return void + */ + public function setProtocolId(int $protocolId) : void + { + if ($protocolId > 0) { + $this->protocolId = $protocolId; + } + } + + /** + * Gets the ID of the specimen's processing protocol. + * + * @return int + */ + public function getProtocolId() : int + { + return $this->protocolId; + } + + /** + * Sets the ID of the specimen's center at time of processing. + * + * @param int $centerId the ID of the processing center + * + * @return void + */ + public function setCenterId(int $centerId) : void + { + if ($centerId > 0) { + $this->centerId = $centerId; + } + } + + /** + * Gets the ID of the specimen's processing center + * + * @return int + */ + public function getCenterId() : int + { + return $this->centerId; + } + + /** + * Sets the ID of the specimen's examiner at time of processing. + * + * @param int $examinerId the ID of the processing center + * + * @return void + */ + public function setExaminerId(int $examinerId) : void + { + if ($examinerId > 0) { + $this->examinerId = $examinerId; + } + } + + /** + * Gets the ID of the specimen's processing examiner + * + * @return int + */ + public function getExaminerId() : int + { + return $this->examinerId; + } + + /** + * Sets the date of collection + * + * @param \DateTime $date the date of processing + * + * @return void + */ + public function setDate(\DateTime $date) : void + { + $this->date = $date; + } + + /** + * Gets the date of processing + * + * @return \DateTime + */ + public function getDate() : \DateTime + { + return $this->date; + } + + /** + * Sets the time of processing + * + * @param \DateTime $time the time of processing + * + * @return void + */ + public function setTime(\DateTime $time) : void + { + $this->time = $time; + } + + /** + * Gets the time of processing + * + * @return DateTime + */ + public function getTime() : \DateTime + { + return $this->time; + } + + /** + * Sets processing comments + * + * @param string $comments comments relating to processing + * + * @return void + */ + public function setComments(string $comments) : void + { + $this->comments = $comments; + } + + /** + * Gets the processing comments + * + * @return ?string + */ + public function getComments() : ?string + { + return $this->comments; + } + + /** + * Sets the Data array that contains custom attributes and values. + * + * @param array $data of custom attributes and values. + * + * @return void + */ + public function setData(array $data) : void + { + $this->data = $data; + } + + /** + * Gets the Data array that contains custom attributes and values. + * + * @return ?array + */ + public function getData() : ?array + { + return $this->data; + } + + /** + * Instatiates a Process Object using the values sent from the client-side. + * + * @param array $data Data to be used to instantiate the Process Object. + * + * @return Process + */ + public function fromArray(array $data) : Process + { + isset($data['protocolId']) && $this->setProtocolId((int) $data['protocolId']); + isset($data['centerId']) && $this->setCenterId((int) $data['centerId']); + isset($data['examinerId']) && $this->setExaminerId((int) $data['examinerId']); + isset($data['date']) && $this->setDate(new \DateTime($data['date'])); + isset($data['time']) && $this->setTime(new \DateTime($data['time'])); + isset($data['data']) && $this->setData($data['data']); + isset($data['comments']) && $this->setComments((string) $data['comments']); + + return $this; + } + + + /** + * Returns an array representing the state of the Process. + * + * @return array + */ + public function jsonSerialize() : array + { + // TODO: Date and Time formats should be gotten from some sort of config + // setting. + return array( + 'protocolId' => $this->protocolId, + 'centerId' => $this->centerId, + 'examinerId' => $this->examinerId, + 'date' => $this->date->format('Y-m-d'), + 'time' => $this->time->format('H:i'), + 'comments' => $this->comments, + 'data' => $this->data, + ); + } +} + diff --git a/modules/biobank_nottracked/php/specimen.class.inc b/modules/biobank_nottracked/php/specimen.class.inc new file mode 100644 index 00000000000..eb09df45067 --- /dev/null +++ b/modules/biobank_nottracked/php/specimen.class.inc @@ -0,0 +1,482 @@ + + * @license http://www.gnu.org/licenses/gpl-3.0.txt GPLv3 + * @link https://www.github.com/aces/Loris/ + */ +namespace LORIS\biobank; + +/** + * Specimen Object Class + * This class contains an instance of a database handling that is needed to + * permanently store and retrieve Specimen Object instances. + * + * PHP Version 7.2 + * + * @category Entity + * @package Loris + * @subpackage Biobank + * @author Henri Rabalais + * @license http://www.gnu.org/licenses/gpl-3.0.txt GPLv3 + * @link https://www.github.com/aces/Loris/ + */ +class Specimen implements \JsonSerializable, \LORIS\Data\DataInstance +{ + /** + * Persistent Instance variables. + * + * These properties describe a specimen entity. + * + * @var int $id + * @var int $containerId + * @var int $typeId + * @var string $quantity + * @var int $unitId + * @var int $fTCycle + * @var array $parentSpecimenIds + * @var int $candidateId + * @var int $sessionId + * @var int $poolId + * @var Collection $collection + * @var Preparation $preparation + * @var Analysis $analysis + */ + private $id; + private $containerId; + private $typeId; + private $quantity; + private $unitId; + private $fTCycle; + private $parentSpecimenIds; + private $candidateId; + private $sessionId; + private $poolId; + private $collection; + private $preparation; + private $analysis; + + /** + * Initiliazes a new instance of the Specimen Class + */ + function __construct() + { + } + + /** + * Sets the specimen's ID. + * + * @param int $id the specimen's ID + * + * @return void + */ + public function setId(int $id) : void + { + if ($id > 0) { + $this->id = $id; + } + } + + /** + * Gets the specimen's ID + * + * @return int + */ + public function getId() : ?int + { + return $this->id; + } + + /** + * Sets the ID of the specimen's container + * + * @param int $containerId the ID of the specimen's container + * + * @return void + */ + public function setContainerId($containerId) : void + { + if ($containerId > 0) { + $this->containerId = $containerId; + } + } + + /** + * Gets the ID of the specimen's container + * + * @return int + */ + public function getContainerId() : ?int + { + return $this->containerId; + } + + /** + * Sets the ID of the specimen type + * + * @param int $typeId ID of the specimen type + * + * @return void + */ + public function setTypeId(int $typeId) : void + { + if ($typeId > 0) { + $this->typeId = $typeId; + } + } + + /** + * Gets the ID of the specimen type + * + * @return int + */ + public function getTypeId() : int + { + return $this->typeId; + } + + /** + * Sets the current amount of specimen available + * + * @param string $quantity the current amount of specimen available + * + * @return void + */ + public function setQuantity(string $quantity) : void + { + $this->quantity = $quantity; + } + + /** + * Gets the current amount of specimen available + * + * @return ?string + */ + public function getQuantity() : ?string + { + return $this->quantity; + } + + /** + * Sets the ID of the specimen's unit of quantity + * + * @param int $unitId the ID of the quantity's unit + * + * @return void + */ + public function setUnitId(int $unitId) : void + { + if ($unitId > 0) { + $this->unitId = $unitId; + } + } + + /** + * Gets the ID of the specimen's unit of quantity + * + * @return ?int + */ + public function getUnitId() : ?int + { + return $this->unitId; + } + + /** + * Sets the specimen's current Freeze-Thaw cycle. + * + * @param int $fTCycle the specimen's current F-T cycle + * + * @return void + */ + public function setFTCycle(int $fTCycle) : void + { + if ($fTCycle >= 0) { + $this->fTCycle = $fTCycle; + } + } + + /** + * Gets the specimen's current Freeze-Thaw cycle + * + * @return int + */ + public function getFTCycle() : ?int + { + return $this->fTCycle; + } + + /** + * Sets the parent specimen's ID. + * + * @param array $parentSpecimenIds the parent specimen's IDs + * + * @return void + */ + public function setParentSpecimenIds(array $parentSpecimenIds) : void + { + $this->parentSpecimenIds = $parentSpecimenIds; + } + + /** + * Gets the parent specimen's ID + * + * @return array + */ + public function getParentSpecimenIds() : ?array + { + return $this->parentSpecimenIds; + } + + /** + * Sets the ID of the candidate to which the specimen belongs + * + * @param int $candidateId ID of the specimen's donor + * + * @return void + */ + public function setCandidateId(int $candidateId) : void + { + if ($candidateId > 0) { + $this->candidateId = $candidateId; + } + } + + /** + * Gets the ID of the candidate to which the specimen belongs + * + * @return ?int + */ + public function getCandidateId() : ?int + { + return $this->candidateId; + } + + /** + * Sets the ID of the candidate's session/timepoint in which the specimen was collected + * + * @param int $sessionId the ID of the specimen's session of collection + * + * @return void + */ + public function setSessionId(int $sessionId) : void + { + if ($sessionId > 0) { + $this->sessionId = $sessionId; + } + } + + /** + * Gets the ID of the candidate's session/timepoint in which the specimen + * was collected. + * + * @return ?int + */ + public function getSessionId() : ?int + { + return $this->sessionId; + } + + /** + * Sets the ID of the specimen's pool group, if it exists. + * + * @param int $poolId the ID of the specimen's pool group + * + * @return void + */ + public function setPoolId(int $poolId) : void + { + if ($poolId > 0) { + $this->poolId = $poolId; + } + } + + /** + * Gets the ID of the specimen's pool group. + * + * @return int + */ + public function getPoolId() : ?int + { + return $this->poolId; + } + + /** + * Sets a Collection object for the Specimen. + * + * @param Collection $collection A collection instance + * + * @return void + */ + public function setCollection(Collection $collection) : void + { + $this->collection = $collection; + } + + /** + * Gets an associative array of data stored for the specimen's collection stage + * + * @return ?Collection + */ + public function getCollection() : ?Collection + { + return $this->collection; + } + + /** + * Sets a Preparation object for the Specimen. + * + * @param Preparation $preparation A Preparation Instance + * + * @return void + */ + public function setPreparation(Preparation $preparation) : void + { + $this->preparation = $preparation; + } + + /** + * Gets an associative array of data stored for the specimen's preparation + * stage. + * + * @return Preparation|null + */ + public function getPreparation() : ?Preparation + { + return $this->preparation; + } + + /** + * Sets an Analysis object for the Specimen. + * + * @param Analysis $analysis An Analysis Instance. + * + * @return void + */ + public function setAnalysis(Analysis $analysis) : void + { + $this->analysis = $analysis; + } + + /** + * Gets an associative array of data stored for the specimen's analysis stage + * + * @return Analysis|null + */ + public function getAnalysis() : ?Analysis + { + return $this->analysis; + } + + // FIXME: THIS IS A MASSIVE HACK. Specimens should not be provisioned if + // their Container is not provisioned. Therefore, a check must be made that + // the Container's Center ID is accesibile by the current User. This function + // allows this check to happen upon provisioner filtering. + /** + * Return Center ID of affiliated specimen container. + * + * @return int + */ + public function getCenterId() + { + $db = \Database::singleton(); + $containerDAO = new ContainerDAO($db); + $containerId = $this->getContainerId(); + $container = $containerDAO->getInstanceFromId($containerId); + return $container->getCenterId(); + } + + /** + * Instatiates a Specimen Object using the values sent from the front-end. + * + * @param array $data Data to be used to instantiate the Specimen Object. + * + * @return Specimen $specimen Instantiated Specimen Object + */ + public function fromArray(array $data) : Specimen + { + isset($data['id']) && $this->setId((int) $data['id']); + isset($data['containerId']) && $this->setContainerId((int) $data['containerId']); + isset($data['typeId']) && $this->setTypeId((int) $data['typeId']); + isset($data['quantity']) && $this->setQuantity((string) $data['quantity']); + isset($data['unitId']) && $this->setUnitId((int) $data['unitId']); + isset($data['fTCycle']) && $this->setFTCycle((int) $data['fTCycle']); + isset($data['parentSpecimenIds']) && $this->setParentSpecimenIds($data['parentSpecimenIds']); + isset($data['candidateId']) && $this->setCandidateId((int) $data['candidateId']); + isset($data['sessionId']) && $this->setSessionId((int) $data['sessionId']); + isset($data['poolId']) && $this->setPoolId((int) $data['poolId']); + + if (isset($data['collection'])) { + $collection = (new Collection())->fromArray($data['collection']); + $this->setCollection($collection); + } + + if (isset($data['preparation'])) { + $preparation = (new Preparation())->fromArray($data['preparation']); + $this->setPreparation($preparation); + } + if (isset($data['analysis'])) { + $analysis = (new Analysis())->fromArray($data['analysis']); + $this->setAnalysis($analysis); + } + + return $this; + } + + /** + * A wrapper function for the jsonSerialize method of the Specimen Instance + * Class. This converts this Specimen Instance into an array + * + * @return array + */ + public function toArray() : array + { + return $this->jsonSerialize(); + } + + /** + * Returns an array representing the state of the Specimen. + * + * @return array + */ + public function jsonSerialize() : array + { + $array = array( + 'id' => $this->id, + 'containerId' => $this->containerId, + 'typeId' => $this->typeId, + 'quantity' => $this->quantity, + 'unitId' => $this->unitId, + 'fTCycle' => $this->fTCycle, + 'parentSpecimenIds' => $this->parentSpecimenIds, + 'candidateId' => $this->candidateId, + 'sessionId' => $this->sessionId, + 'poolId' => $this->poolId, + 'collection' => $this->collection->jsonSerialize(), + ); + if ($this->preparation) { + $array['preparation'] = $this->preparation->jsonSerialize(); + } + if ($this->analysis) { + $array['analysis'] = $this->analysis->jsonSerialize(); + } + return $array; + } + + /** + * Returns a JSON encoded string of the state of the Specimen + * + * @return string JSON encoded string of Specimen data + */ + public function toJSON() : string + { + return json_encode($this); + } +} diff --git a/modules/biobank_nottracked/php/specimencontroller.class.inc b/modules/biobank_nottracked/php/specimencontroller.class.inc new file mode 100644 index 00000000000..3bb5bc7fbaa --- /dev/null +++ b/modules/biobank_nottracked/php/specimencontroller.class.inc @@ -0,0 +1,569 @@ + + * @license http://www.gnu.org/licenses/gpl-3.0.text GPLv3 + * @link http://www.github.com/aces/Lors/ + */ +namespace LORIS\biobank; + +/** + * This class features the code that enables access to the Specimens of the LORIS + * Biobank Module. + * + * PHP Version 7.2 + * + * @category Controller + * @package Loris + * @subpackage Biobank + * @author Henri Rabalais + * @license http://www.gnu.org/licenses/gpl-3.0.text GPLv3 + * @link http://www.github.com/aces/Lors/ + */ +class SpecimenController +{ + /** + * Private instances of the Database, User and ContainerDAO classes + * + * @var \Database $db + * @var \User $user + * @var SpecimenDAO $dao + */ + private $db; + private $user; + private $dao; + + /** + * Specimen Controller Class constructor + * + * @param Database $db Database Instance. + * @param User $user User Instance. + */ + function __construct(\Database $db, \User $user) + { + $this->db = $db; + $this->user = $user; + $this->dao = $this->getDataProvisioner(); + } + + /** + * Get all Specimen Objects permitted by the Specimen Data Provisioner (DAO). + * + * @return array + */ + public function getInstances() : array + { + $this->validatePermission('view'); + $specimens = array(); + $specimenIt = $this->dao->execute($this->user); + foreach ($specimenIt as $id => $specimen) { + $specimens[$id] = $specimen; + } + + return $specimens; + } + + /** + * This method takes in a list of specimen and container arrays from the + * front-end. The specimens are validated while the containers are + * sent to their respective controller to be validated and saved. The ids of + * the saved containers are set to the specimen instances which are then + * sent to the DAO to be saved. + * + * @param array $list a list of specimen and container arrays to be created. + */ + public function createInstances(array $list) : void + { + $this->validatePermission('create'); + + foreach ($list as $i => $specimen) { + $containerList[$i] = $specimen['container']; + $specimenList[$i] = $this->prepare($specimen); + } + + $contController = new ContainerController($this->db, $this->user); + $containers = $contController->createInstances($containerList); + + foreach ($specimenList as $i => $specimen) { + $specimen->setContainerId($containers[$i]->getId()); + $this->dao->saveInstance($specimen); + } + } + + /** + * This method takes in a specimen array from the front-end, validates it, + * instantiates it and then sends it to the DAO to be saved to the + * database. + * + * @param array $specimenArray specimen array to be created + * + * @return \Specimen updated specimen + */ + public function updateInstance(array $specimenArray) : Specimen + { + $this->validatePermission('update'); + $specimen = $this->prepare($specimenArray); + $specimenId = $this->dao->saveInstance($specimen); + return $this->dao->getInstanceFromId($specimenId); + } + + /** + * Converts data into a specimen intance validates the specimen. + * + * @param array $specimenArray Specimen data to be instantiated + * + * @return Specimen $specimen to be submitted + */ + private function prepare(array $specimenArray) : Specimen + { + $specimen = (new Specimen)->fromArray($specimenArray); + $this->validateInstance($specimen); + + return $specimen; + } + + /** + * Get all data associated with the Specimen entity. This is used for + * front-end mapping and populating form options. + * + * @return array Associative array of option data. + */ + public function getOptions() : array + { + $this->validatePermission('view'); + return array( + 'types' => $this->dao->getTypes(), + 'typeUnits' => $this->dao->getTypeUnits(), + 'typeContainerTypes' => $this->dao->getTypeContainerTypes(), + 'protocols' => $this->dao->getProtocols(), + 'processes' => $this->dao->getProcesses(), + 'protocolAttributes' => $this->dao->getProtocolAttributes(), + 'protocolContainers' => $this->dao->getProtocolContainers(), + 'units' => $this->dao->getUnits(), + 'attributeDatatypes' => $this->dao->getAttributeDatatypes(), + 'attributeOptions' => $this->dao->getAttributeReferenceTableOptions(), + ); + } + + /** + * Treats the Specimen DAO as a Provisioner that can be iteratated + * through to provide the permissable Specimen Objects for the current User. + * + * @return \LORIS\Data\Provisioner + */ + private function getDataProvisioner() : \LORIS\Data\Provisioner + { + $dao = new SpecimenDAO($this->db); + + if ($this->user->hasPermission('access_all_profiles') === false) { + $dao = $dao->filter(new \LORIS\Data\Filters\UserSiteMatch()); + } + return $dao; + } + + /** + * Checks User Permissions for creating or updating Specimen Objects. + * + * @param string $method User requested action + * + * @return void + */ + private function validatePermission(string $method) : void + { + switch($method) { + case 'view': + if (!$this->user->hasPermission('biobank_specimen_view')) { + throw new \Forbidden('Specimen: View Permission Denied'); + } + case 'update': + if (!$this->user->hasPermission('biobank_specimen_update')) { + throw new \Forbidden('Specimen: Update Permission Denied'); + } + case 'create': + if (!$this->user->hasPermission('biobank_specimen_create')) { + throw new \Forbidden('Specimen: Create Permission Denied'); + } + } + } + + /** + * Validates Specimen Data before being saved + * + * @param Specimen $specimen Specimen to be validated. + * + * @return void + */ + private function validateInstance(Specimen $specimen) : void + { + $this->validateTypeId($specimen); + $this->validateQuantity($specimen); + $this->validateUnitId($specimen); + $this->validateFTCycle($specimen); + $this->validateParentSpecimenIds($specimen); + $this->validateCandidateId($specimen); + $this->validateSessionId($specimen); + $this->validateCollection($specimen); + $this->validatePreparation($specimen); + $this->validateAnalysis($specimen); + } + + /** + * Validates Specimen Object Type ID. + * + * @param Specimen $specimen Specimen to be validated. + * + * @throws BadRequest if the provided Specimen does not meet validation requirements. + * + * @return void + */ + private function validateTypeId(Specimen $specimen) : void + { + if (is_null($specimen->getTypeId())) { + throw new \BadRequest("Specimen Type value must be set"); + } + } + + /** + * Validates Specimen Object Quantity. + * + * @param Specimen|Process $object Object to be validated. + * + * @throws BadRequest if the provided object does not meet validation requirements. + * + * @return void + */ + private function validateQuantity(object $object) : void + { + $quantity = $object->getQuantity(); + if (is_null($quantity)) { + throw new \BadRequest('Specimen Quantity value must be set'); + } + if (!(is_numeric($quantity) && is_float(floatval($quantity)))) { + throw new \BadRequest('Specimen Quantity value must be a number'); + } + //TODO: This is where a capacity check would go, i.e. $quantity > $capacity. + if ($quantity < 0) { + throw new \BadRequest('Specimen Quantity cannot be less than 0'); + } + } + + /** + * Validates Specimen Object Unit ID. + * + * @param Specimen|Process $object Object to be validated. + * + * @throws BadRequest if the provided object does not meet validation requirements. + * + * @return void + */ + private function validateUnitId(object $object) : void + { + if (is_null($object->getUnitId())) { + throw new \BadRequest("Specimen Unit value must be set"); + } + } + + /** + * Validates Specimen Object FT Cycle. + * + * @param Specimen $specimen Specimen to be validated. + * + * @throws BadRequest if the provided Specimen does not meet validation requirements. + * + * @return void + */ + private function validateFTCycle(Specimen $specimen) : void + { + $fTCycle = $specimen->getFTCycle(); + if (isset($fTCycle)) { + if (!is_numeric($fTCycle) || intval($fTCycle) < 0) { + throw new \BadRequest("F/T Cycle must be 0 or more"); + } + } + } + + /** + * Validates Specimen Object Parent Specimen IDs. + * + * @param Specimen $specimen Specimen to be validated. + * + * @throws BadRequest if the provided Specimen does not meet validation requirements. + * + * @return void + */ + private function validateParentSpecimenIds(Specimen $specimen) : void + { + $parentSpecimenIds = $specimen->getParentSpecimenIds(); + if ($parentSpecimenIds) { + $baseParentSpecimen = $this->dao->getInstanceFromId((int) $parentSpecimenIds[0]); + } + $specimenTypes = $this->dao->getTypes(); + + foreach ($parentSpecimenIds as $parentSpecimenId) { + $parentSpecimen = $this->dao->getInstanceFromId((int) $parentSpecimenId); + + if ($baseParentSpecimen->getCandidateId() != $parentSpecimen->getCandidateId()) { + throw new \BadRequest('Parent Specimens must be from the same Candidate'); + } + + if ($baseParentSpecimen->getSessionId() != $parentSpecimen->getSessionId()) { + throw new \BadRequest('Parent Specimens must be from the same Session'); + } + + if ($baseParentSpecimen->getTypeId() != $parentSpecimen->getTypeId()) { + throw new \BadRequest('Parent Specimens must be of the same Type'); + } + + if (!in_array($parentSpecimen->getTypeId(), + $specimenTypes[$specimen->getTypeId()]['parentTypeIds']) + ) { + throw new \BadRequest('Parent Specimens must be of a type that + is a parent to the current Specimen type'); + } + } + } + + /** + * Validates Specimen Object Candidate ID. + * + * @param Specimen $specimen Specimen to be validated. + * + * @throws BadRequest if the provided Specimen does not meet validation requirements. + * + * @return void + */ + private function validateCandidateId(Specimen $specimen) : void + { + if (is_null($specimen->getCandidateId())) { + throw new \BadRequest("PSCID value must be set"); + } + } + + /** + * Validates Specimen Object Session ID. + * + * @param Specimen $specimen Specimen to be validated. + * + * @throws BadRequest if the provided Specimen does not meet validation requirements. + * + * @return void + */ + private function validateSessionId(Specimen $specimen) : void + { + if (is_null($specimen->getSessionId())) { + throw new \BadRequest("Visit Label value must be set"); + } + } + + /** + * Validates Specimen Object Collection. + * + * @param Specimen $specimen Specimen to be validated. + * + * @throws BadRequest if the provided Specimen does not meet validation requirements. + * + * @return void + */ + private function validateCollection(Specimen $specimen) : void + { + $collection = $specimen->getCollection(); + $this->validateProtocolId($collection); + $this->validateExaminerId($collection); + $this->validateQuantity($collection); + $this->validateUnitId($collection); + $this->validateCenterId($collection); + $this->validateDate($collection); + $this->validateTime($collection); + $this->validateData($collection); + } + + /** + * Validates Specimen Object Preparation. + * + * @param Specimen $specimen Specimen to be validated. + * + * @throws BadRequest if the provided Specimen does not meet validation requirements. + * + * @return void + */ + private function validatePreparation(Specimen $specimen) : void + { + $preparation = $specimen->getPreparation(); + if (isset($preparation)) { + $this->validateProtocolId($preparation); + $this->validateExaminerId($preparation); + $this->validateCenterId($preparation); + $this->validateDate($preparation); + $this->validateTime($preparation); + $this->validateData($preparation); + } + } + + /** + * Validates Specimen Object Type ID. + * + * @param Specimen $specimen Specimen to be validated. + * + * @throws BadRequest if the provided Specimen does not meet validation requirements. + * + * @return void + */ + private function validateAnalysis(Specimen $specimen) : void + { + // Validate Analysis + $analysis = $specimen->getAnalysis(); + if (isset($analysis)) { + $this->validateProtocolId($analysis); + $this->validateExaminerId($analysis); + $this->validateCenterId($analysis); + $this->validateDate($analysis); + $this->validateTime($analysis); + $this->validateData($analysis); + } + } + + /** + * Validates Specimen Process Protocol ID. + * + * @param Process $process Process to be validated. + * + * @throws BadRequest if the provided Specimen does not meet validation requirements. + * + * @return void + */ + private function validateProtocolId(Process $process) : void + { + if (is_null($process->getProtocolId())) { + throw new \BadRequest('Specimen Processing Protocol must be set'); + } + } + + /** + * Validates Specimen Process Examiner ID. + * + * @param Process $process Process to be validated. + * + * @throws BadRequest if the provided Specimen does not meet validation requirements. + * + * @return void + */ + private function validateExaminerId(Process $process) : void + { + if (is_null($process->getProtocolId())) { + throw new \BadRequest('Specimen Processing Examiner must be set'); + } + // TODO: Potentially check that examinerId is within the set of possible + // values. I.e. an ID of the examiner table. + } + + /** + * Validates Specimen Process Center ID. + * + * @param Process $process Process to be validated. + * + * @throws BadRequest if the provided Process does not meet validation requirements. + * + * @return void + */ + private function validateCenterId(Process $process) : void + { + if (is_null($process->getCenterId())) { + throw new \BadRequest('Specimen Processing Center must be set'); + } + } + + // XXX: Now that the DateTime object is used to store date and time, + // I don't know if these checks are as important because the DateTime + // doesn't have a native format. As long as it can be converted to + // datetime properly, then there isn't really need for validation here. + // TODO: + /** + * Validates Specimen Process Date. + * + * @param Process $process Process to be validated. + * + * @throws BadRequest if the provided Process does not meet validation requirements. + * + * @return void + */ + private function validateDate(Process $process) : void + { + // TODO: query date format from backend configuration. + // $format = 'd-m-Y'; + // $date = \DateTime::createFromFormat($format, $pool->getDate()); + // if ($date && $date->format($format) !== $pool->getDate()) { + // throw new \BadRequest("Processing date must be of the format: $format"); + // } + } + + /** + * Validates Specimen Process Time. + * + * @param Process $process Process to be validated. + * + * @throws BadRequest if the provided Process does not meet validation requirements. + * + * @return void + */ + private function validateTime(Process $process) : void + { + // TODO: query time format from backend configuration. + // $format = 'H:i'; + // $time = \DateTime::createFromFormat($format, $pool->getTime()); + // if ($time && $time->format($format) !== $pool->getTime()) { + // throw new \BadRequest("Processing time must be of the format: $format"); + // } + } + + /** + * Validates Specimen Process Data. + * + * @param Process $process Process to be validated. + * + * @throws BadRequest if the provided Process does not meet validation requirements. + * + * @return void + */ + private function validateData(Process $process) : void + { + $protocolAttributes = $this->dao->getProtocolAttributes(); + $attributeDatatypes = $this->dao->getAttributeDatatypes(); + $protocolId = $process->getProtocolId(); + $attributes = $protocolAttributes[$protocolId]; + $data = $process->getData(); + + foreach ($data as $attributeId => $value) { + $attribute = $attributes[$attributeId]; + + if (!array_key_exists($attributeId, $attributes)) { + throw new \BadRequest(""); + } + + if ($attributeDatatypes[$attribute['datatypeId']]['datatype'] === 'boolean') { + if (false) { + throw new \BadRequest($attribute['label'] . " must be a boolean ". $value); + } + } + if ($attributeDatatypes[$attribute['datatypeId']]['datatype'] === 'number') { + if (false) { + throw new \BadRequest(""); + } + } + if ($attributeDatatypes[$attribute['datatypeId']]['datatype'] === 'text') { + } + if ($attributeDatatypes[$attribute['datatypeId']]['datatype'] === 'date') { + } + if ($attributeDatatypes[$attribute['datatypeId']]['datatype'] === 'time') { + } + if ($attributeDatatypes[$attribute['datatypeId']]['datatype'] === 'file') { + } + } + } +} diff --git a/modules/biobank_nottracked/php/specimendao.class.inc b/modules/biobank_nottracked/php/specimendao.class.inc new file mode 100644 index 00000000000..433f3645b58 --- /dev/null +++ b/modules/biobank_nottracked/php/specimendao.class.inc @@ -0,0 +1,678 @@ + + * @license http://www.gnu.org/licenses/gpl-3.0.txt GPLv3 + * @link https://www.github.com/aces/Loris/ + */ +namespace LORIS\biobank; + +/** + * Specimen Data Access Object (DAO) Class + * This class contains all database handling that is needed to + * permanently store and retrieve Specimen Object instances + * + * PHP Version 7.2 + * + * @category DAO + * @package Loris + * @subpackage Biobank + * @author Henri Rabalais + * @license http://www.gnu.org/licenses/gpl-3.0.txt GPLv3 + * @link https://www.github.com/aces/Loris/ + */ +class SpecimenDAO extends \LORIS\Data\ProvisionerInstance +{ + /** + * Private instance of the Database class. + * + * @var \Database $dao + */ + private $db; + + /** + * Initializes a new instance of the SpecimenDAO Class + * + * @param Database $db Instance of the LORIS Database class + */ + function __construct(\Database $db) + { + $this->db = $db; + } + + // XXX: I'm not sure if this function is really necessary since it is only + // being used once, and should likely not be accessed outside this class. + /** + * This method is used when the DAO class needs to create a new Specimen + * instance. + * + * @return Specimen + */ + private function getInstance() : Specimen + { + return new Specimen(); + } + + /** + * This will load all specimen persistence variables from the database for a + * given $id into a Specimen object, and return the object. + * + * @param int $id Value of the $id for the Specimen that will be + * instantiated + * + * @return Specimen $specimen Specimen Instance. + */ + public function getInstanceFromId(int $id) : Specimen + { + $specimenData = $this->getInstanceDataFromId($id); + $parentSpecimenIds = $this->getParentSpecimenIdsFromId($id); + $specimen = $this->getInstanceFromSQL($specimenData, $parentSpecimenIds); + + return $specimen; + } + + /** + * Queries data from the database for the Specimen at the requested ID. + * + * @param int $id Value of the $id for the Specimen whose data is being + * queried. + * + * @return array Specimen Data at that ID. + */ + private function getInstanceDataFromId(int $id) + { + $query = "SELECT bs.SpecimenID, + bs.ContainerID, + bs.SpecimenTypeID, + bs.Quantity, + bs.UnitID, + bsf.FreezeThawCycle, + s.CandID as CandidateID, + bs.SessionID, + bspr.PoolID, + bsc.SpecimenProtocolID as CollectionProtocolID, + bsc.Quantity as CollectionQuantity, + bsc.UnitID as CollectionUnitID, + bsc.CenterID as CollectionCenterID, + bsc.ExaminerID as CollectionExaminerID, + bsc.Date as CollectionDate, + bsc.Time as CollectionTime, + bsc.Comments as CollectionComments, + bsc.Data as CollectionData, + bsp.SpecimenProtocolID as PreparationProtocolID, + bsp.CenterID as PreparationCenterID, + bsp.ExaminerID as PreparationExaminerID, + bsp.Date as PreparationDate, + bsp.Time as PreparationTime, + bsp.Comments as PreparationComments, + bsp.Data as PreparationData, + bsa.SpecimenProtocolID as AnalysisProtocolID, + bsa.CenterID as AnalysisCenterID, + bsa.ExaminerID as AnalysisExaminerID, + bsa.Date as AnalysisDate, + bsa.Time as AnalysisTime, + bsa.Comments as AnalysisComments, + bsa.Data as AnalysisData + FROM biobank_specimen bs + LEFT JOIN biobank_specimen_freezethaw bsf + USING (SpecimenID) + LEFT JOIN session s + ON bs.SessionID=s.ID + LEFT JOIN biobank_specimen_pool_rel bspr + USING (SpecimenID) + LEFT JOIN biobank_specimen_collection bsc + USING (SpecimenID) + LEFT JOIN biobank_specimen_preparation bsp + USING (SpecimenID) + LEFT JOIN biobank_specimen_analysis bsa + USING (SpecimenID) + WHERE bs.SpecimenID=:i"; + return $this->db->pselectRow($query, array('i' => $id)); + } + + /** + * This function returns an array of all the Parent Specimen IDs that are + * associated with the given Specimen ID in the biobank_specimen_parent + * table. + * + * @param int $id of Specimen + * + * @return array $parentSpecimenIds List of Specimen IDs that are + * parents of the given Specimen ID + */ + public function getParentSpecimenIdsFromId(int $id) : array + { + $query = 'SELECT ParentSpecimenID + FROM biobank_specimen_parent + WHERE SpecimenID=:i'; + return $this->db->pselectcol($query, array('i' => $id)); + } + + /** + * This will select all specimens from the database that match the + * attribute values passed by $conditions and will return an array + * of specimen objects. + * + * @param array $conditions Conditions to be met by the query + * + * @return array $specimens List of Specimen Objects that match the query + */ + public function selectInstances(array $conditions = null) : array + { + $query = 'SELECT SpecimenID + FROM biobank_specimen'; + $query .= $conditions ? ' WHERE '.$this->db->implodeWithKeys(' AND ', $conditions) : ''; + + $result = $this->db->pselect($query, array()); + $specimens = array(); + if (!empty($result)) { + foreach ($result as $row) { + $id = intval($row['SpecimenID']); + $specimen = $this->getInstanceFromId($id); + $specimens[$id] = $specimen; + } + } + + return $specimens; + } + + /** + * Instantiates an ArrayIterator class that is composed of all the Specimen + * Objects. + * + * @return traversable Iterator of Specimen Objects + */ + protected function getAllInstances() : \Traversable + { + return new \ArrayIterator($this->selectInstances()); + } + + + /** + * Queries all rows of the biobank_specimen_type table and returns a nested + * array with the ID field as the index. + * + * @return array $types All data concerning each specimen type + */ + public function getTypes() : array + { + $query = "SELECT SpecimenTypeID as id, + Label as label, + FreezeThaw as freezeThaw + FROM biobank_specimen_type"; + $types = $this->db->pselectWithIndexKey($query, array(), 'id'); + + $query = "SELECT SpecimenTypeID as id, + ParentSpecimenTypeID as parentId + FROM biobank_specimen_type_parent"; + $result = $this->db->pselect($query, array()); + foreach ($result as $row) { + $types[$row['id']]['parentTypeIds'][] = $row['parentId']; + } + + return $types; + } + + /** + * Queries all rows of the biobank_specimen_protocol table and returns a + * nested array with the ID field as the index. + * + * @return array $protocols All data concerning each specimen + * protocol. + */ + public function getProtocols() : array + { + $query = "SELECT SpecimenProtocolID as id, + Label as label, + SpecimenProcessID as processId, + SpecimenTypeID as typeId + FROM biobank_specimen_protocol"; + $protocols = $this->db->pselectWithIndexKey($query, array(), 'id'); + + return $protocols; + } + + /** + * Queries all rows of the biobank_specimen_process table and returns a + * nested array with the ID field as the index. + * + * @return array $processes All data concerning each specimen + * process. + */ + public function getProcesses() : array + { + $query = "SELECT SpecimenProcessID as id, + Label as label + FROM biobank_specimen_process"; + $processes = $this->db->pselectWithIndexKey($query, array(), 'id'); + + return $processes; + } + + /** + * Queries all rows of the biobank_datatype table and returns a nested array + * with the ID field as the index + * + * @return array $attributeDatatypes All data concerning each attribute datatype + */ + public function getAttributeDatatypes() : array + { + $query = 'SELECT DatatypeID as id, + Datatype as datatype + FROM biobank_specimen_attribute_datatype'; + $attributeDatatypes = $this->db->pselectWithIndexKey($query, array(), 'id'); + + return $attributeDatatypes; + } + + /** + * Queries all rows the biobank_reference_table table. This data is used to + * query the referenced tables and columns and build a nested array of + * reference table option values, with the Reference Table ID as the index. + * + * @return array $attributeOptions A nested array of attribute reference + * table options indexed by Reference Table + * ID + */ + public function getAttributeReferenceTableOptions() : array + { + $query = 'SELECT ReferenceTableID as id, + TableName as tableName, + ColumnName as columnName + FROM biobank_specimen_attribute_referencetable'; + $attributeOptionsReferences = $this->db->pselect($query, array()); + + $attributeOptions = array(); + foreach ($attributeOptionsReferences as $reference) { + $query = 'SELECT '.$reference['columnName'].' FROM '.$reference['tableName']; + $result = $this->db->pselect($query, array()); + + $options = array(); + foreach ($result as $row) { + $options[$row[$reference['columnName']]] = $row[$reference['columnName']]; + } + + $attributeOptions[$reference['id']] = $options; + } + + return $attributeOptions; + } + + + // XXX: This should potentially be queried from a table called + // `biobank_specimen_units` since containers are not currently using units. + // Discussions need to be had with Rida regarding this. + /** + * Queries all rows of the biobank_unit table and returns a nested + * array with the ID field as the index. + * + * @return array $specimenUnits All data concerning each unit + */ + public function getUnits() : array + { + $query = "SELECT UnitID as id, + Label as label + FROM biobank_unit"; + $units = $this->db->pselectWithIndexKey($query, array(), 'id'); + + return $units; + } + + /** + * Queries all rows of the biobank_specimen_type_unit_rel table and returns + * a nested array of specimen unit values, with the Type ID as the first index, + * and the Unit ID as the second index. + * + * @return array $typeUnits A nested array of unit values index by + * Type ID and Unit ID + */ + public function getTypeUnits() : array + { + $query = "SELECT bst.SpecimenTypeID as typeId, + bu.UnitID as unitId, + bu.Label as label + FROM biobank_specimen_type_unit_rel bstu + JOIN biobank_specimen_type bst USING (SpecimenTypeID) + JOIN biobank_unit bu USING (UnitID)"; + $result = $this->db->pselect($query, array()); + $typeUnits = array(); + foreach ($result as $row) { + foreach ($row as $value) { + $typeUnits[$row['typeId']][$row['unitId']]['label'] = $row['label']; + } + } + + return $typeUnits; + } + + /** + * Queries all rows of the biobank_specimen_type_container_type_rel table + * and returns a nested array of container type value, with the specimen + * Type ID as the index. + * + * @return array $typeContainerTypes A nested array of container type values + * indexex by Specimen Type ID. + */ + public function getTypeContainerTypes() : array + { + $query = "SELECT SpecimenTypeID as specimenTypeId, + ContainerTypeID as containerTypeId + FROM biobank_specimen_type_container_type_rel"; + $result = $this->db->pselect($query, array()); + $typeContainerTypes = array(); + foreach ($result as $row) { + $typeContainerTypes[$row['specimenTypeId']][] = $row['containerTypeId']; + } + + return $typeContainerTypes; + } + + /** + * Queries all rows from the biobank_specimen_protocol_attribute_rel table + * and returns a nested array of specimen-protocol-specific attribute data + * with the Protocol ID as the first index, and the Attribute ID as the + * second index. + * + * @return array $pA A nested array of attribute data indexed by Protocol + * ID and Attribute ID + */ + public function getProtocolAttributes() : array + { + $query = "SELECT bsp.SpecimenProtocolID as protocolId, + bsa.SpecimenAttributeID as attributeId, + bsa.Label as label, + bsa.DatatypeID as datatypeId, + bsa.ReferenceTableID as refTableId, + bspa.Required as required + FROM biobank_specimen_protocol_attribute_rel bspa + LEFT JOIN biobank_specimen_protocol bsp + USING (SpecimenProtocolID) + LEFT JOIN biobank_specimen_attribute bsa + USING (SpecimenAttributeID)"; + $result = $this->db->pselect($query, array()); + $pA = array(); //protocolAttributes + foreach ($result as $row) { + foreach ($row as $value) { + $pA[$row['protocolId']][$row['attributeId']]['label'] = $row['label']; + $pA[$row['protocolId']][$row['attributeId']]['datatypeId'] = $row['datatypeId']; + $pA[$row['protocolId']][$row['attributeId']]['refTableId'] = $row['refTableId']; + $pA[$row['protocolId']][$row['attributeId']]['required'] = (int) $row['required']; + } + } + + return $pA; + } + + /** + * Queries all rows from the biobank_specimen_protocol_container_type_rel + * table and returns a nested array of specimen-protocol-specific attribute + * data with the Protocol ID as the first index, and the Attribute ID as the + * second index. + * + * @return array $pA A nested array of attribute data indexed by Protocol + * ID and Attribute ID + */ + public function getProtocolContainers() : array + { + $query = "SELECT SpecimenProtocolID as protocolId, + ContainerTypeID as typeId + FROM biobank_specimen_protocol_container_type_rel"; + $result = $this->db->pselect($query, array()); + $pC = array(); //protocolContainers + foreach ($result as $row) { + $type[] = $row['typeId']; + $pC[$row['protocolId']] = $type; + } + + return $pC; + } + + /** + * This function receives a Specimen Object, converts it into a SQL format + * and inserts it into all relevant tables in the database. + * + * @param Specimen $specimen The Specimen Object to be saved the + * database. + * + * @return void + */ + public function saveInstance(Specimen $specimen) : int + { + // Converts Specimen Object into SQL format. + $data = $this->getSQLFromInstance($specimen); + + // Inserts or Updates the biobank_specimen table with respective data. + $this->db->insertOnDuplicateUpdate( + 'biobank_specimen', + $data['biobank_specimen'] + ); + + $specimenId = $specimen->getId(); + if (isset($specimenId)) { + // If update: + // Do nothing. + } else { + // If insert: + $specimen->setId((int) $this->db->getLastInsertId()); + // set the respective data array index to the value of the new + // specimen ID + $parentSpecimenIds = $specimen->getParentSpecimenIds(); + foreach ($parentSpecimenIds as $id) { + $data['biobank_specimen_parent'][$id] + = array( + 'SpecimenID' => $specimen->getId(), + 'ParentSpecimenID' => $id, + ); + } + $data['biobank_specimen_freezethaw']['SpecimenID'] = $specimen->getId(); + $data['biobank_specimen_collection']['SpecimenID'] = $specimen->getId(); + $data['biobank_specimen_preparation']['SpecimenID'] = $specimen->getId(); + $data['biobank_specimen_analysis']['SpecimenID'] = $specimen->getId(); + } + + // Insert or update biobank_specimen_collection with respective data. + $this->db->unsafeInsertOnDuplicateUpdate( + 'biobank_specimen_collection', + $data['biobank_specimen_collection'] + ); + + // If protocol exists, insert or update biobank_specimen_preparation + // with respective data. + if (isset($data['biobank_specimen_preparation']['SpecimenProtocolID'])) { + $this->db->unsafeInsertOnDuplicateUpdate( + 'biobank_specimen_preparation', + $data['biobank_specimen_preparation'] + ); + } + + // If method exists, insert or update biobank_specimen_analysis + // with respective data. + if (isset($data['biobank_specimen_analysis']['SpecimenMethodID'])) { + $this->db->unsafeInsertOnDuplicateUpdate( + 'biobank_specimen_analysis', + $data['biobank_specimen_analysis'] + ); + } + + // If parent exists, insert or update biobank_specimen_parent + // with respective data. + if (isset($data['biobank_specimen_parent'])) { + foreach ($data['biobank_specimen_parent'] as $insert) { + $this->db->insertOnDuplicateUpdate( + 'biobank_specimen_parent', + $insert + ); + } + } + + // If F/T Cycle exists, insert or update biobank_specimen_freezethaw + // with respective data. + $fTCycle = $specimen->getFTCycle(); + if (isset($fTCycle)) { + $this->db->insertOnDuplicateUpdate( + 'biobank_specimen_freezethaw', + $data['biobank_specimen_freezethaw'] + ); + } + + return $specimen->getId(); + } + + /** + * This function takes a Specimen Instance and prepares the data to be + * inserted into the database by converting it to a data array. This one to + * one mapping is done to enable the update or insertion of data into the + * database directly from the resulting arrays. + * + * @param Specimen $specimen Specimen Instance to be converted + * + * @return array $data Array containing the data to be inserted + */ + private function getSQLFromInstance(Specimen $specimen) : array + { + $specimenData = array( + 'SpecimenID' => $specimen->getId(), + 'ContainerID' => $specimen->getContainerId(), + 'SpecimenTypeID' => $specimen->getTypeId(), + 'Quantity' => $specimen->getQuantity(), + 'UnitID' => $specimen->getUnitId(), + 'SessionID' => $specimen->getSessionId(), + ); + + $freezeThawData = array( + 'SpecimenID' => $specimen->getId(), + 'FreezeThawCycle' => $specimen->getFTCycle(), + ); + + $collection = $specimen->getCollection(); + $collectionData = array( + 'SpecimenID' => $specimen->getId(), + 'SpecimenProtocolID' => $collection->getProtocolId(), + 'Quantity' => $collection->getQuantity(), + 'UnitID' => $collection->getUnitId(), + 'CenterID' => $collection->getCenterId(), + 'ExaminerID' => $collection->getExaminerId(), + 'Date' => $collection->getDate()->format('Y-m-d H:i'), + 'Time' => $collection->getTime()->format('Y-m-d H:i'), + 'Comments' => $collection->getComments(), + ); + if ($collection->getData()) { + $collectionData['Data'] = json_encode($collection->getData()); + } + + $preparation = $specimen->getPreparation(); + if (isset($preparation)) { + $preparationData = array( + 'SpecimenID' => $specimen->getId(), + 'SpecimenProtocolID' => $preparation->getProtocolId(), + 'CenterID' => $preparation->getCenterId(), + 'ExaminerID' => $preparation->getExaminerId(), + 'Date' => $preparation->getDate()->format('Y-m-d H:i'), + 'Time' => $preparation->getTime()->format('Y-m-d H:i'), + 'Comments' => $preparation->getComments(), + ); + + if ($preparation->getData()) { + $preparationData['Data'] = json_encode($preparation->getData()); + } + } + + $analysis = $specimen->getAnalysis(); + if (isset($analysis)) { + $analysisData = array( + 'SpecimenID' => $specimen->getId(), + 'SpecimenProtocolID' => $analysis->getProtocolId(), + 'CenterID' => $analysis->getCenterId(), + 'ExaminerID' => $analysis->getExaminerId(), + 'Date' => $analysis->getDate()->format('Y-m-d H:i'), + 'Time' => $analysis->getTime()->format('Y-m-d H:i'), + 'Comments' => $analysis->getComments(), + ); + + if ($analysis->getData()) { + $analysisData['Data'] = json_encode($analysis->getData()); + } + } + + return $data = array( + 'biobank_specimen' => $specimenData, + 'biobank_specimen_freezethaw' => $freezeThawData, + 'biobank_specimen_collection' => $collectionData, + 'biobank_specimen_preparation' => $preparationData, + 'biobank_specimen_analysis' => $analysisData, + ); + } + + /** + * This function takes an array that resulted from an SQL query and + * instantiates it as a Specimen Object. + * + * @param array $data Values to be converted to array. + * @param array $parentSpecimenIds IDs of the parent Specimen. + * + * @return Specimen + */ + private function getInstanceFromSQL(array $data, array $parentSpecimenIds) : Specimen + { + $specimen = $this->getInstance(); + isset($data['SpecimenID']) && $specimen->setId((int) $data['SpecimenID']); + isset($data['ContainerID']) && $specimen->setContainerId((int) $data['ContainerID']); + isset($data['SpecimenTypeID']) && $specimen->setTypeId((int) $data['SpecimenTypeID']); + isset($data['Quantity']) && $specimen->setQuantity((string) $data['Quantity']); + isset($data['UnitID']) && $specimen->setUnitId((int) $data['UnitID']); + isset($data['FreezeThawCycle']) && $specimen->setFTCycle((int) $data['FreezeThawCycle']); + !empty($parentSpecimenIds) && $specimen->setParentSpecimenIds(!empty($parentSpecimenIds) ? $parentSpecimenIds : null); + isset($data['CandidateID']) && $specimen->setCandidateId((int) $data['CandidateID']); + isset($data['SessionID']) && $specimen->setSessionId((int) $data['SessionID']); + isset($data['PoolID']) && $specimen->setPoolId((int) $data['PoolID']); + + $collection = new Collection(); + isset($data['CollectionProtocolID']) && $collection->setProtocolId((int) $data['CollectionProtocolID']); + isset($data['CollectionQuantity']) && $collection->setQuantity((string) $data['CollectionQuantity']); + isset($data['CollectionUnitID']) && $collection->setUnitId((int) $data['CollectionUnitID']); + isset($data['CollectionCenterID']) && $collection->setCenterId((int) $data['CollectionCenterID']); + isset($data['CollectionExaminerID']) && $collection->setExaminerId((int) $data['CollectionExaminerID']); + isset($data['CollectionDate']) && $collection->setDate(new \DateTime($data['CollectionDate'])); + isset($data['CollectionTime']) && $collection->setTime(new \DateTime($data['CollectionTime'])); + isset($data['CollectionComments']) && $collection->setComments((string) $data['CollectionComments']); + isset($data['CollectionData']) && $collection->setData(json_decode($data['CollectionData'], true)); + $specimen->setCollection($collection); + + // XXX: These checks for instantiating $prepartion and $analysis are not + // the best. Perhaps they should be queried separately and it should be + // checked whether or not the array itself exists. + $preparation = new Preparation(); + if ($data['PreparationProtocolID']) { + isset($data['PreparationProtocolID']) && $preparation->setProtocolId((int) $data['PreparationProtocolID']); + isset($data['PreparationCenterID']) && $preparation->setCenterId((int) $data['PreparationCenterID']); + isset($data['PreparationExaminerID']) && $preparation->setExaminerId((int) $data['PreparationExaminerID']); + isset($data['PreparationDate']) && $preparation->setDate(new \DateTime($data['PreparationDate'])); + isset($data['PreparationTime']) && $preparation->setTime(new \DateTime($data['PreparationTime'])); + isset($data['PreparationComments']) && $preparation->setComments((string) $data['PreparationComments']); + isset($data['PreparationData']) && $preparation->setData(json_decode($data['PreparationData'], true)); + $specimen->setPreparation($preparation); + } + + if ($data['AnalysisProtocolID']) { + $analysis = new Analysis(); + isset($data['AnalysisProtocolID']) && $analysis->setProtocolId((int) $data['AnalysisProtocolID']); + isset($data['AnalysisCenterID']) && $analysis->setCenterId((int) $data['AnalysisCenterID']); + isset($data['AnalysisExaminerID']) && $analysis->setExaminerId((int) $data['AnalysisExaminerID']); + isset($data['AnalysisDate']) && $analysis->setDate(new \DateTime($data['AnalysisDate'])); + isset($data['AnalysisTime']) && $analysis->setTime(new \DateTime($data['AnalysisTime'])); + isset($data['AnalysisComments']) && $analysis->setComments((string) $data['AnalysisComments']); + isset($data['AnalysisData']) && $analysis->setData(json_decode($data['AnalysisData'], true)); + $specimen->setAnalysis($analysis); + } + + return $specimen; + } +} diff --git a/modules/biobank_nottracked/php/specimenendpoint.class.inc b/modules/biobank_nottracked/php/specimenendpoint.class.inc new file mode 100644 index 00000000000..24bdc28c8d2 --- /dev/null +++ b/modules/biobank_nottracked/php/specimenendpoint.class.inc @@ -0,0 +1,171 @@ + + * @license http://www.gnu.org/licenses/gpl-3.0.text GPLv3 + * @link http://www.github.com/aces/Loris/ + */ +namespace LORIS\biobank; +use \Psr\Http\Message\ServerRequestInterface; +use \Psr\Http\Server\RequestHandlerInterface; +use \Psr\Http\Message\ResponseInterface; + +/** + * A class for handling the /biobank/specimens/ endpoint. + * + * PHP Version 7.2 + * + * @category Biobank + * @package Main + * @subpackage Biobank + * @author Henri Rabalais + * @license http://www.gnu.org/licenses/gpl-3.0.text GPLv3 + * @link http://www.github.com/aces/Lors/ + */ +class SpecimenEndpoint implements RequestHandlerInterface +{ + /** + * Returns true if user has acces to this Endpoint. + * + * @param \User $user The user whose access is being checked + * + * @return bool + */ + function _hasAccess(\User $user) : bool + { + return true; + } + + /** + * Return which methods are supported by this endpoint. + * + * @return array supported HTTP methods + */ + protected function allowedMethods() : array + { + return array( + 'GET', + 'PUT', + 'POST', + 'OPTIONS', + ); + } + + /** + * This function passes the request to the handler. This is necessary since + * the Endpoint bypass the Module class. + * + * TODO: This function should be extracted to a parent class. + * + * @param ServerRequestInterface $request The PSR7 request. + * @param RequestHandlerInterface $handler The request handler. + * + * @return ResponseInterface The outgoing PSR7 response. + */ + public function process( + ServerRequestInterface $request, + RequestHandlerInterface $handler + ) : ResponseInterface { + return $handler->handle($request); + } + + /** + * Handles Endpoint requests + * + * @param ServerRequestInterface $request The incoming PSR7 request + * + * @return ResponseInterface The outgoing PSR7 response + */ + public function handle(ServerRequestInterface $request) : ResponseInterface + { + $db = \Database::singleton(); + $user = $request->getAttribute('user'); + $specCont = new SpecimenController($db, $user); + + try { + $db->beginTransaction(); + switch($request->getMethod()) { + case 'GET': + $specimens = $specCont->getInstances(); + return new \LORIS\Http\Response\OK($specimens); + case 'POST': + $specimens = json_decode($request->getBody()->getContents(), true); + $specCont->createInstances($specimens); + + if (!empty($request->getUploadedFiles())) { + $response = $this->uploadFiles($request); + if ($response->getStatusCode() !== 200) { + $db->rollBack(); + return $response; + } + } + return new \LORIS\Http\Response\OK(); + case 'PUT': + $specimenArray = json_decode($request->getBody()->getContents(), true); + $specimen = $specCont->updateInstance($specimenArray); + return new \LORIS\Http\Response\OK([$specimen]); + case 'OPTIONS': + return (new \LORIS\Http\Response()) + ->withHeader('Allow', $this->allowedMethods()); + } + + // I would like to move this logic into the controller, but the only + // way to do that while maintaining + } catch (\BadRequest $e) { + $db->rollBack(); + return new \LORIS\Http\Response\BadRequest($e->getMessage()); + } catch (\Forbidden $e) { + $db->rollBack(); + return new \LORIS\Http\Response\Forbidden($e->getMessage()); + } catch (\NotFound $e) { + $db->rollBack(); + return new \LORIS\Http\Response\NotFound($e->getMessage()); + } catch (\DatabaseException $e) { + $db->rollBack(); + return new \LORIS\Http\Response\InternalServerError($e->getMessage()); + } catch (\TypeError $e) { + $db->rollBack(); + return new \LORIS\Http\Response\InternalServerError($e->getMessage()); + } catch (\Exception $e) { + $db->rollBack(); + // PUT SOMETHING HERE LATER + return new \LORIS\Http\Response\BadRequest($e->getMessage()); + } finally { + if ($db->inTransaction()) { + $db->commit(); + } + } + } + + /** + * Validates and Uploades files + * + * @param ServerRequestInterface $request The incoming PSR7 request + * containg the files to be uploaded. + * + * @return ResponseInterface + */ + public function uploadFiles(ServerRequestInterface $request) : ResponseInterface + { + $config = \NDB_Config::singleton(); + $path = $config->getSetting('biobankPath'); + + if (!isset($path)) { + throw new \NotFound('Biobank File Upload Path is not configured'); + } + $targetdir = new \SplFileInfo($path); + + $uploader = (new \LORIS\FilesUploadHandler($targetdir)) + ->withPermittedMIMETypes( + 'text/plain' + ); + + return $uploader->handle($request); + } +} diff --git a/modules/biobank_nottracked/sql/CRUDATA.sql b/modules/biobank_nottracked/sql/CRUDATA.sql new file mode 100644 index 00000000000..71e9c926aef --- /dev/null +++ b/modules/biobank_nottracked/sql/CRUDATA.sql @@ -0,0 +1,321 @@ +/*Container*/ +INSERT INTO biobank_unit (Label) +VALUES ('µL'), + ('mL') +; + +INSERT INTO biobank_container_capacity (Quantity, UnitId) +VALUES (10, (select UnitID from biobank_unit where Label='mL')), + (1000, (select UnitID from biobank_unit where Label='µL')) +; + +INSERT INTO biobank_container_dimension (X, XNumerical, Y, YNumerical, Z, ZNumerical) +VALUES (1, 1, 5, 1, 1, 1), + (6, 1, 1, 1, 1, 1), + (4, 1, 4, 1, 1, 1), + (1, 1, 3, 1, 1, 1), + (4, 1, 1, 1, 1, 1), + (6, 1, 4, 1, 1, 1), + (10, 0, 10, 1, 1, 1), + (5, 0, 5, 1, 1, 1), + (1, 1, 12, 1, 1, 1) +; + +INSERT INTO biobank_container_type (Brand, ProductNumber, Label, `Primary`, ContainerCapacityID, ContainerDimensionID) +VALUES ('FreezerCo.', '##1', 'Freezer - 5 Shelf', 0, NULL, + (select ContainerDimensionID from biobank_container_dimension where X=1 and Y=5 and Z=1)), + ('ShelfCo.', '##1', 'Shelf - 6 Rack', 0, NULL, + (select ContainerDimensionID from biobank_container_dimension where X=6 and Y=1 and Z=1)), + ('RackCo.', '##1', 'Rack - 16 Box', 0, NULL, + (select ContainerDimensionID from biobank_container_dimension where X=4 and Y=4 and Z=1)), + ('FreezerCo.', '##2', 'Freezer - 3 Shelf', 0, NULL, + (select ContainerDimensionID from biobank_container_dimension where X=1 and Y=3 and Z=1)), + ('ShelfCo.', '##2', 'Shelf - 4 Rack', 0, NULL, + (select ContainerDimensionID from biobank_container_dimension where X=4 and Y=1 and Z=1)), + ('RackCo.', '##2', 'Rack - 28 Box', 0, NULL, + (select ContainerDimensionID from biobank_container_dimension where X=6 and Y=4 and Z=1)), + ('MatrixCo.', '##1', 'Matrix Box - 10x10', 0, NULL, + (select ContainerDimensionID from biobank_container_dimension where X=10 and Y=10 and Z=1)), + ('Core Cryolab', 'MVE HEco Series 800-190', 'LN2 Tank', 0, NULL, + (select ContainerDimensionID from biobank_container_dimension where X=4 and Y=4 and Z=1)), + ('RackCo.', '##3', 'LN2 Rack - 10x10 box', 0, NULL, + (select ContainerDimensionID from biobank_container_dimension where X=1 and Y=12 and Z=1)), + ('RackCo.', '##4', 'LN2 Rack - 5x5 box', 0, NULL, + (select ContainerDimensionID from biobank_container_dimension where X=1 and Y=12 and Z=1)), + ('MatrixCo.', '##2', 'Matrix Box - 5x5', 0, NULL, + (select ContainerDimensionID from biobank_container_dimension where X=5 and Y=5 and Z=1)), + ('Vacutainer', '366430', 'Red Top Tube (RTT)', 1, + (select ContainerCapacityID from biobank_container_capacity where Quantity=10 + and UnitID=(select UnitID from biobank_unit where Label='mL')), + NULL), + ('Vacutainer', '366480', 'Green Top Tube (GTT)', 1, + (select ContainerCapacityID from biobank_container_capacity where Quantity=10 + and UnitID=(select UnitID from biobank_unit where Label='mL')), + NULL), + ('Vacutainer', '366643', 'Purple Top Tube (PTT)', 1, + (select ContainerCapacityID from biobank_container_capacity where Quantity=10 + and UnitID=(select UnitID from biobank_unit where Label='mL')), + NULL), + ('Vacutainer', '###', 'Cryotube Vial', 1, + (select ContainerCapacityID from biobank_container_capacity where Quantity=1000 + and UnitID=(select UnitID from biobank_unit where Label='µL')), + NULL) +; + +/*Specimen*/ +INSERT INTO biobank_specimen_type (Label, FreezeThaw) +VALUES ('Blood', 0), + ('Urine', 0), + ('Saliva', 0), + ('Serum', 1), + ('Plasma', 1), + ('DNA', 1), + ('PBMC', 0), + ('IPSC', 0), + ('CSF', 1), + ('Muscle Biopsy', 0), + ('Skin Biopsy', 0) +; + +INSERT INTO biobank_specimen_type_parent (SpecimenTypeID, ParentSpecimenTypeID) +VALUES ((select SpecimenTypeID from biobank_specimen_type where Label='Serum'), + (select SpecimenTypeID from biobank_specimen_type where Label='Blood')), + ((select SpecimenTypeID from biobank_specimen_type where Label='Plasma'), + (select SpecimenTypeID from biobank_specimen_type where Label='Blood')), + ((select SpecimenTypeID from biobank_specimen_type where Label='DNA'), + (select SpecimenTypeID from biobank_specimen_type where Label='Blood')), + ((select SpecimenTypeID from biobank_specimen_type where Label='DNA'), + (select SpecimenTypeID from biobank_specimen_type where Label='Saliva')), + ((select SpecimenTypeID from biobank_specimen_type where Label='PBMC'), + (select SpecimenTypeID from biobank_specimen_type where Label='Blood')) +; + +INSERT INTO biobank_specimen_protocol (Label, SpecimenProcessID, SpecimenTypeID) +VALUES ('Blood Collection', + (SELECT SpecimenProcessID FROM biobank_specimen_process WHERE Label='Collection'), + (SELECT SpecimenTypeID FROM biobank_specimen_type WHERE Label='Blood') + ), + ('Saliva Collection', + (SELECT SpecimenProcessID FROM biobank_specimen_process WHERE Label='Collection'), + (SELECT SpecimenTypeID FROM biobank_specimen_type WHERE Label='Saliva') + ), + ('DNA Isolation From Blood (BB-P-0002)', + (SELECT SpecimenProcessID FROM biobank_specimen_process WHERE Label='Collection'), + (SELECT SpecimenTypeID FROM biobank_specimen_type WHERE Label='DNA') + ), + ('DNA Isolation From Saliva', + (SELECT SpecimenProcessID FROM biobank_specimen_process WHERE Label='Collection'), + (SELECT SpecimenTypeID FROM biobank_specimen_type WHERE Label='DNA') + ), + ('PBMC Isolation (BB-P-0001)', + (SELECT SpecimenProcessID FROM biobank_specimen_process WHERE Label='Collection'), + (SELECT SpecimenTypeID FROM biobank_specimen_type WHERE Label='PBMC') + ), + ('Serum Isolation (BB-P-0003)', + (SELECT SpecimenProcessID FROM biobank_specimen_process WHERE Label='Collection'), + (SELECT SpecimenTypeID FROM biobank_specimen_type WHERE Label='Serum') + ), + ('Blood Processing for PBMC (BB-P-0001)', + (SELECT SpecimenProcessID FROM biobank_specimen_process WHERE Label='Preparation'), + (SELECT SpecimenTypeID FROM biobank_specimen_type WHERE Label='Blood') + ), + ('Blood Processing for Serum (BB-P-0003)', + (SELECT SpecimenProcessID FROM biobank_specimen_process WHERE Label='Preparation'), + (SELECT SpecimenTypeID FROM biobank_specimen_type WHERE Label='Blood') + ), + ('Blood Processing for DNA (BB-P-0002)', + (SELECT SpecimenProcessID FROM biobank_specimen_process WHERE Label='Preparation'), + (SELECT SpecimenTypeID FROM biobank_specimen_type WHERE Label='Blood') + ), + ('Skin Biopsy Processing', + (SELECT SpecimenProcessID FROM biobank_specimen_process WHERE Label='Preparation'), + (SELECT SpecimenTypeID FROM biobank_specimen_type WHERE Label='Skin Biopsy') + ), + ('Saliva Processing for DNA', + (SELECT SpecimenProcessID FROM biobank_specimen_process WHERE Label='Preparation'), + (SELECT SpecimenTypeID FROM biobank_specimen_type WHERE Label='Saliva') + ), + ('CSF Processing', + (SELECT SpecimenProcessID FROM biobank_specimen_process WHERE Label='Preparation'), + (SELECT SpecimenTypeID FROM biobank_specimen_type WHERE Label='CSF') + ) +; + +INSERT INTO biobank_specimen_attribute (Label, DatatypeID, ReferenceTableID) +VALUES ('Clotted', (SELECT DatatypeID FROM biobank_specimen_attribute_datatype WHERE Datatype='boolean'), NULL), + ('Tube Expired', (SELECT DatatypeID FROM biobank_specimen_attribute_datatype WHERE Datatype='boolean'), NULL), + ('Centrifuge Start #1', (SELECT DatatypeID FROM biobank_specimen_attribute_datatype WHERE Datatype='time'), NULL), + ('Centrifuge End #1', (SELECT DatatypeID FROM biobank_specimen_attribute_datatype WHERE Datatype='time'), NULL), + ('Centrifuge Start #2', (SELECT DatatypeID FROM biobank_specimen_attribute_datatype WHERE Datatype='time'), NULL), + ('Centrifuge End #2', (SELECT DatatypeID FROM biobank_specimen_attribute_datatype WHERE Datatype='time'), NULL), + ('Centrifuge Start #3', (SELECT DatatypeID FROM biobank_specimen_attribute_datatype WHERE Datatype='time'), NULL), + ('Centrifuge End #3', (SELECT DatatypeID FROM biobank_specimen_attribute_datatype WHERE Datatype='time'), NULL), + ('Centrifuge Start #4', (SELECT DatatypeID FROM biobank_specimen_attribute_datatype WHERE Datatype='time'), NULL), + ('Centrifuge End #4', (SELECT DatatypeID FROM biobank_specimen_attribute_datatype WHERE Datatype='time'), NULL), + ('Red Pellet', (SELECT DatatypeID FROM biobank_specimen_attribute_datatype WHERE Datatype='boolean'), NULL), + ('Total PBMC Count (10⁶/mL cells)', (SELECT DatatypeID FROM biobank_specimen_attribute_datatype WHERE Datatype='number'), NULL), + ('Milky Serum', (SELECT DatatypeID FROM biobank_specimen_attribute_datatype WHERE Datatype='boolean'), NULL), + ('Hemolyzed', (SELECT DatatypeID FROM biobank_specimen_attribute_datatype WHERE Datatype='boolean'), NULL), + ('Hemodialysis Index', (SELECT DatatypeID FROM biobank_specimen_attribute_datatype WHERE Datatype='number'), NULL), + ('No Visible Pellet', (SELECT DatatypeID FROM biobank_specimen_attribute_datatype WHERE Datatype='boolean'), NULL), + ('DNA Concentration (ng/µL)', (SELECT DatatypeID FROM biobank_specimen_attribute_datatype WHERE Datatype='number'), NULL), + ('260/280 Ratio', (SELECT DatatypeID FROM biobank_specimen_attribute_datatype WHERE Datatype='number'), NULL), + ('Incubation Start #1', (SELECT DatatypeID FROM biobank_specimen_attribute_datatype WHERE Datatype='time'), NULL), + ('Incubation End #1', (SELECT DatatypeID FROM biobank_specimen_attribute_datatype WHERE Datatype='time'), NULL), + ('Incubation Start #2', (SELECT DatatypeID FROM biobank_specimen_attribute_datatype WHERE Datatype='time'), NULL), + ('Incubation End #2', (SELECT DatatypeID FROM biobank_specimen_attribute_datatype WHERE Datatype='time'), NULL), + ('Incubation Start #3', (SELECT DatatypeID FROM biobank_specimen_attribute_datatype WHERE Datatype='time'), NULL), + ('Incubation End #3', (SELECT DatatypeID FROM biobank_specimen_attribute_datatype WHERE Datatype='time'), NULL), + ('Airdry Start #1', (SELECT DatatypeID FROM biobank_specimen_attribute_datatype WHERE Datatype='time'), NULL), + ('Airdry End #1', (SELECT DatatypeID FROM biobank_specimen_attribute_datatype WHERE Datatype='time'), NULL), + ('Blood Contamination', (SELECT DatatypeID FROM biobank_specimen_attribute_datatype WHERE Datatype='boolean'), NULL), + ('Bring To Pathology', (SELECT DatatypeID FROM biobank_specimen_attribute_datatype WHERE Datatype='boolean'), NULL), + ('Bring To Pathology Start #1', (SELECT DatatypeID FROM biobank_specimen_attribute_datatype WHERE Datatype='time'), NULL), + ('Bring To Pathology End #1', (SELECT DatatypeID FROM biobank_specimen_attribute_datatype WHERE Datatype='time'), NULL) + +; + +INSERT INTO biobank_specimen_protocol_attribute_rel (SpecimenProtocolID, SpecimenAttributeID, Required) +VALUES ((select SpecimenProtocolID from biobank_specimen_protocol where Label='Blood Processing for PBMC (BB-P-0001)'), + (select SpecimenAttributeID from biobank_specimen_attribute where Label='Clotted'), 0), + ((select SpecimenProtocolID from biobank_specimen_protocol where Label='Blood Processing for PBMC (BB-P-0001)'), + (select SpecimenAttributeID from biobank_specimen_attribute where Label='Tube Expired'), 0), + ((select SpecimenProtocolID from biobank_specimen_protocol where Label='Blood Processing for PBMC (BB-P-0001)'), + (select SpecimenAttributeID from biobank_specimen_attribute where Label='Centrifuge Start #1'), 1), + ((select SpecimenProtocolID from biobank_specimen_protocol where Label='Blood Processing for PBMC (BB-P-0001)'), + (select SpecimenAttributeID from biobank_specimen_attribute where Label='Centrifuge End #1'), 1), + ((select SpecimenProtocolID from biobank_specimen_protocol where Label='Blood Processing for PBMC (BB-P-0001)'), + (select SpecimenAttributeID from biobank_specimen_attribute where Label='Centrifuge Start #2'), 1), + ((select SpecimenProtocolID from biobank_specimen_protocol where Label='Blood Processing for PBMC (BB-P-0001)'), + (select SpecimenAttributeID from biobank_specimen_attribute where Label='Centrifuge End #2'), 1), + ((select SpecimenProtocolID from biobank_specimen_protocol where Label='Blood Processing for PBMC (BB-P-0001)'), + (select SpecimenAttributeID from biobank_specimen_attribute where Label='Centrifuge Start #3'), 1), + ((select SpecimenProtocolID from biobank_specimen_protocol where Label='Blood Processing for PBMC (BB-P-0001)'), + (select SpecimenAttributeID from biobank_specimen_attribute where Label='Centrifuge End #3'), 1), + ((select SpecimenProtocolID from biobank_specimen_protocol where Label='Blood Processing for Serum (BB-P-0003)'), + (select SpecimenAttributeID from biobank_specimen_attribute where Label='Tube Expired'), 0), + ((select SpecimenProtocolID from biobank_specimen_protocol where Label='Blood Processing for Serum (BB-P-0003)'), + (select SpecimenAttributeID from biobank_specimen_attribute where Label='Centrifuge Start #1'), 1), + ((select SpecimenProtocolID from biobank_specimen_protocol where Label='Blood Processing for Serum (BB-P-0003)'), + (select SpecimenAttributeID from biobank_specimen_attribute where Label='Centrifuge End #1'), 1), + ((select SpecimenProtocolID from biobank_specimen_protocol where Label='Blood Processing for DNA (BB-P-0002)'), + (select SpecimenAttributeID from biobank_specimen_attribute where Label='Tube Expired'), 0), + ((select SpecimenProtocolID from biobank_specimen_protocol where Label='Blood Processing for DNA (BB-P-0002)'), + (select SpecimenAttributeID from biobank_specimen_attribute where Label='Incubation Start #1'), 1), + ((select SpecimenProtocolID from biobank_specimen_protocol where Label='Blood Processing for DNA (BB-P-0002)'), + (select SpecimenAttributeID from biobank_specimen_attribute where Label='Incubation End #1'), 1), + ((select SpecimenProtocolID from biobank_specimen_protocol where Label='Blood Processing for DNA (BB-P-0002)'), + (select SpecimenAttributeID from biobank_specimen_attribute where Label='Centrifuge Start #1'), 1), + ((select SpecimenProtocolID from biobank_specimen_protocol where Label='Blood Processing for DNA (BB-P-0002)'), + (select SpecimenAttributeID from biobank_specimen_attribute where Label='Centrifuge End #1'), 1), + ((select SpecimenProtocolID from biobank_specimen_protocol where Label='Blood Processing for DNA (BB-P-0002)'), + (select SpecimenAttributeID from biobank_specimen_attribute where Label='Centrifuge Start #2'), 1), + ((select SpecimenProtocolID from biobank_specimen_protocol where Label='Blood Processing for DNA (BB-P-0002)'), + (select SpecimenAttributeID from biobank_specimen_attribute where Label='Centrifuge End #2'), 1), + ((select SpecimenProtocolID from biobank_specimen_protocol where Label='Blood Processing for DNA (BB-P-0002)'), + (select SpecimenAttributeID from biobank_specimen_attribute where Label='Centrifuge Start #3'), 1), + ((select SpecimenProtocolID from biobank_specimen_protocol where Label='Blood Processing for DNA (BB-P-0002)'), + (select SpecimenAttributeID from biobank_specimen_attribute where Label='Centrifuge End #3'), 1), + ((select SpecimenProtocolID from biobank_specimen_protocol where Label='Blood Processing for DNA (BB-P-0002)'), + (select SpecimenAttributeID from biobank_specimen_attribute where Label='Centrifuge Start #4'), 1), + ((select SpecimenProtocolID from biobank_specimen_protocol where Label='Blood Processing for DNA (BB-P-0002)'), + (select SpecimenAttributeID from biobank_specimen_attribute where Label='Centrifuge End #4'), 1), + ((select SpecimenProtocolID from biobank_specimen_protocol where Label='Blood Processing for DNA (BB-P-0002)'), + (select SpecimenAttributeID from biobank_specimen_attribute where Label='Airdry Start #1'), 1), + ((select SpecimenProtocolID from biobank_specimen_protocol where Label='Blood Processing for DNA (BB-P-0002)'), + (select SpecimenAttributeID from biobank_specimen_attribute where Label='Airdry End #1'), 1), + ((select SpecimenProtocolID from biobank_specimen_protocol where Label='PBMC Isolation (BB-P-0001)'), + (select SpecimenAttributeID from biobank_specimen_attribute where Label='Clotted'), 0), + ((select SpecimenProtocolID from biobank_specimen_protocol where Label='PBMC Isolation (BB-P-0001)'), + (select SpecimenAttributeID from biobank_specimen_attribute where Label='Red Pellet'), 0), + ((select SpecimenProtocolID from biobank_specimen_protocol where Label='PBMC Isolation (BB-P-0001)'), + (select SpecimenAttributeID from biobank_specimen_attribute where Label='Total PBMC Count (10⁶/mL cells)'), 1), + ((select SpecimenProtocolID from biobank_specimen_protocol where Label='Serum Isolation (BB-P-0003)'), + (select SpecimenAttributeID from biobank_specimen_attribute where Label='Milky Serum'), 0), + ((select SpecimenProtocolID from biobank_specimen_protocol where Label='Serum Isolation (BB-P-0003)'), + (select SpecimenAttributeID from biobank_specimen_attribute where Label='Hemolyzed'), 0), + ((select SpecimenProtocolID from biobank_specimen_protocol where Label='Serum Isolation (BB-P-0003)'), + (select SpecimenAttributeID from biobank_specimen_attribute where Label='Hemodialysis Index'), 0), + ((select SpecimenProtocolID from biobank_specimen_protocol where Label='DNA Isolation From Blood (BB-P-0002)'), + (select SpecimenAttributeID from biobank_specimen_attribute where Label='Red Pellet'), 0), + ((select SpecimenProtocolID from biobank_specimen_protocol where Label='DNA Isolation From Blood (BB-P-0002)'), + (select SpecimenAttributeID from biobank_specimen_attribute where Label='No Visible Pellet'), 0), + ((select SpecimenProtocolID from biobank_specimen_protocol where Label='DNA Isolation From Blood (BB-P-0002)'), + (select SpecimenAttributeID from biobank_specimen_attribute where Label='DNA Concentration (ng/µL)'), 1), + ((select SpecimenProtocolID from biobank_specimen_protocol where Label='DNA Isolation From Blood (BB-P-0002)'), + (select SpecimenAttributeID from biobank_specimen_attribute where Label='260/280 Ratio'), 1), + ((select SpecimenProtocolID from biobank_specimen_protocol where Label='Skin Biopsy Processing'), + (select SpecimenAttributeID from biobank_specimen_attribute where Label='Incubation Start #1'), 1), + ((select SpecimenProtocolID from biobank_specimen_protocol where Label='Skin Biopsy Processing'), + (select SpecimenAttributeID from biobank_specimen_attribute where Label='Incubation End #1'), 1), + ((select SpecimenProtocolID from biobank_specimen_protocol where Label='Saliva Processing for DNA'), + (select SpecimenAttributeID from biobank_specimen_attribute where Label='Tube Expired'), 0), + ((select SpecimenProtocolID from biobank_specimen_protocol where Label='Saliva Processing for DNA'), + (select SpecimenAttributeID from biobank_specimen_attribute where Label='Incubation Start #1'), 1), + ((select SpecimenProtocolID from biobank_specimen_protocol where Label='Saliva Processing for DNA'), + (select SpecimenAttributeID from biobank_specimen_attribute where Label='Incubation End #1'), 1), + ((select SpecimenProtocolID from biobank_specimen_protocol where Label='Saliva Processing for DNA'), + (select SpecimenAttributeID from biobank_specimen_attribute where Label='Incubation Start #2'), 1), + ((select SpecimenProtocolID from biobank_specimen_protocol where Label='Saliva Processing for DNA'), + (select SpecimenAttributeID from biobank_specimen_attribute where Label='Incubation End #2'), 1), + ((select SpecimenProtocolID from biobank_specimen_protocol where Label='Saliva Processing for DNA'), + (select SpecimenAttributeID from biobank_specimen_attribute where Label='Incubation Start #3'), 1), + ((select SpecimenProtocolID from biobank_specimen_protocol where Label='Saliva Processing for DNA'), + (select SpecimenAttributeID from biobank_specimen_attribute where Label='Incubation End #3'), 1), + ((select SpecimenProtocolID from biobank_specimen_protocol where Label='Saliva Processing for DNA'), + (select SpecimenAttributeID from biobank_specimen_attribute where Label='Airdry Start #1'), 1), + ((select SpecimenProtocolID from biobank_specimen_protocol where Label='Saliva Processing for DNA'), + (select SpecimenAttributeID from biobank_specimen_attribute where Label='Airdry End #1'), 1), + ((select SpecimenProtocolID from biobank_specimen_protocol where Label='DNA Isolation From Saliva'), + (select SpecimenAttributeID from biobank_specimen_attribute where Label='Red Pellet'), 0), + ((select SpecimenProtocolID from biobank_specimen_protocol where Label='DNA Isolation From Saliva'), + (select SpecimenAttributeID from biobank_specimen_attribute where Label='No Visible Pellet'), 0), + ((select SpecimenProtocolID from biobank_specimen_protocol where Label='DNA Isolation From Saliva'), + (select SpecimenAttributeID from biobank_specimen_attribute where Label='DNA Concentration (ng/µL)'), 1), + ((select SpecimenProtocolID from biobank_specimen_protocol where Label='DNA Isolation From Saliva'), + (select SpecimenAttributeID from biobank_specimen_attribute where Label='260/280 Ratio'), 1), + ((select SpecimenProtocolID from biobank_specimen_protocol where Label='CSF Processing'), + (select SpecimenAttributeID from biobank_specimen_attribute where Label='Blood Contamination'), 0), + ((select SpecimenProtocolID from biobank_specimen_protocol where Label='CSF Processing'), + (select SpecimenAttributeID from biobank_specimen_attribute where Label='Tube Expired'), 0), + ((select SpecimenProtocolID from biobank_specimen_protocol where Label='CSF Processing'), + (select SpecimenAttributeID from biobank_specimen_attribute where Label='Bring To Pathology'), 0), + ((select SpecimenProtocolID from biobank_specimen_protocol where Label='CSF Processing'), + (select SpecimenAttributeID from biobank_specimen_attribute where Label='Bring To Pathology Start #1'), 0), + ((select SpecimenProtocolID from biobank_specimen_protocol where Label='CSF Processing'), + (select SpecimenAttributeID from biobank_specimen_attribute where Label='Bring To Pathology End #1'), 0) +; + +INSERT INTO biobank_specimen_type_unit_rel (SpecimenTypeID, UnitID) +VALUES ((select SpecimenTypeID from biobank_specimen_type where Label='Blood'), + (select UnitID from biobank_unit where Label='mL')), + ((select SpecimenTypeID from biobank_specimen_type where Label='Urine'), + (select UnitID from biobank_unit where Label='mL')), + ((select SpecimenTypeID from biobank_specimen_type where Label='Serum'), + (select UnitID from biobank_unit where Label='µL')), + ((select SpecimenTypeID from biobank_specimen_type where Label='Plasma'), + (select UnitID from biobank_unit where Label='µL')), + ((select SpecimenTypeID from biobank_specimen_type where Label='DNA'), + (select UnitID from biobank_unit where Label='µL')), + ((select SpecimenTypeID from biobank_specimen_type where Label='PBMC'), + (select UnitID from biobank_unit where Label='mL')), + ((select SpecimenTypeID from biobank_specimen_type where Label='CSF'), + (select UnitID from biobank_unit where Label='µL')) +; + +INSERT INTO biobank_specimen_type_container_type_rel (SpecimenTypeID, ContainerTypeID) +VALUES ((select SpecimenTypeID from biobank_specimen_type where Label='Blood'), + (select ContainerTypeID from biobank_container_type where label='Green Top Tube (GTT)')), + ((select SpecimenTypeID from biobank_specimen_type where Label='Blood'), + (select ContainerTypeID from biobank_container_type where label='Red Top Tube (RTT)')), + ((select SpecimenTypeID from biobank_specimen_type where Label='Blood'), + (select ContainerTypeID from biobank_container_type where label='Purple Top Tube (PTT)')), + ((select SpecimenTypeID from biobank_specimen_type where Label='Serum'), + (select ContainerTypeID from biobank_container_type where label='Cryotube Vial')), + ((select SpecimenTypeID from biobank_specimen_type where Label='Plasma'), + (select ContainerTypeID from biobank_container_type where label='Cryotube Vial')), + ((select SpecimenTypeID from biobank_specimen_type where Label='DNA'), + (select ContainerTypeID from biobank_container_type where label='Cryotube Vial')), + ((select SpecimenTypeID from biobank_specimen_type where Label='PBMC'), + (select ContainerTypeID from biobank_container_type where label='Cryotube Vial')) +; diff --git a/package-lock.json b/package-lock.json index d600803bbec..47efca33dd5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -654,7 +654,7 @@ }, "util": { "version": "0.10.3", - "resolved": "http://registry.npmjs.org/util/-/util-0.10.3.tgz", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", "dev": true, "requires": { @@ -1700,7 +1700,7 @@ }, "buffer": { "version": "4.9.1", - "resolved": "http://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", "dev": true, "requires": { @@ -1784,7 +1784,7 @@ }, "callsites": { "version": "0.2.0", - "resolved": "http://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", "dev": true }, @@ -3824,7 +3824,8 @@ "wrappy": { "version": "1.0.2", "bundled": true, - "dev": true + "dev": true, + "optional": true } } }, @@ -5744,7 +5745,7 @@ }, "regjsgen": { "version": "0.2.0", - "resolved": "http://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", "dev": true }, @@ -5759,7 +5760,7 @@ "dependencies": { "jsesc": { "version": "0.5.0", - "resolved": "http://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", "dev": true } @@ -5805,7 +5806,7 @@ }, "require-uncached": { "version": "1.0.3", - "resolved": "http://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", + "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", "dev": true, "requires": { @@ -6310,7 +6311,7 @@ }, "string_decoder": { "version": "1.1.1", - "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { @@ -6469,7 +6470,7 @@ }, "through": { "version": "2.3.8", - "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", "dev": true }, @@ -7149,7 +7150,8 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "brace-expansion": { "version": "1.1.11", @@ -7174,7 +7176,8 @@ "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "console-control-strings": { "version": "1.1.0", diff --git a/webpack.config.js.BIOBANK b/webpack.config.js.BIOBANK new file mode 100644 index 00000000000..6297f7f7495 --- /dev/null +++ b/webpack.config.js.BIOBANK @@ -0,0 +1,139 @@ +const UglifyJsPlugin = require('uglifyjs-webpack-plugin'); +const path = require('path'); +const fs = require('fs'); + +const config = [{ + entry: { + './htdocs/js/components/DynamicDataTable.js': './jsx/DynamicDataTable.js', + './htdocs/js/components/PaginationLinks.js': './jsx/PaginationLinks.js', + './htdocs/js/components/StaticDataTable.js': './jsx/StaticDataTable.js', + './htdocs/js/components/MultiSelectDropdown.js': './jsx/MultiSelectDropdown.js', + './htdocs/js/components/Breadcrumbs.js': './jsx/Breadcrumbs.js', + './htdocs/js/components/Form.js': './jsx/Form.js', + './htdocs/js/components/Markdown.js': './jsx/Markdown.js', + './modules/media/js/mediaIndex.js': './modules/media/jsx/mediaIndex.js', + './modules/issue_tracker/js/issueTrackerIndex.js': './modules/issue_tracker/jsx/issueTrackerIndex.js', + './modules/issue_tracker/js/index.js': './modules/issue_tracker/jsx/index.js', + './modules/candidate_parameters/js/CandidateParameters.js': './modules/candidate_parameters/jsx/CandidateParameters.js', + './modules/configuration/js/SubprojectRelations.js': './modules/configuration/jsx/SubprojectRelations.js', + './modules/conflict_resolver/js/conflictResolverIndex.js': './modules/conflict_resolver/jsx/conflictResolverIndex.js', + './modules/conflict_resolver/js/resolvedConflictsIndex.js': './modules/conflict_resolver/jsx/resolvedConflictsIndex.js', + './modules/bvl_feedback/js/react.behavioural_feedback_panel.js': './modules/bvl_feedback/jsx/react.behavioural_feedback_panel.js', + './modules/data_team_helper/js/behavioural_qc_module.js': './modules/data_team_helper/jsx/behavioural_qc_module.js', + './modules/candidate_list/js/openProfileForm.js': './modules/candidate_list/jsx/openProfileForm.js', + './modules/biobank/js/biobankIndex.js': './modules/biobank/jsx/biobankIndex.js', + './modules/candidate_list/js/onLoad.js': './modules/candidate_list/jsx/onLoad.js', + './modules/candidate_list/js/candidateListIndex.js': './modules/candidate_list/jsx/candidateListIndex.js', + './modules/datadict/js/dataDictIndex.js': './modules/datadict/jsx/dataDictIndex.js', + './modules/data_integrity_flag/js/dataIntegrityFlagIndex.js': './modules/data_integrity_flag/jsx/dataIntegrityFlagIndex.js', + './modules/dataquery/js/react.app.js': './modules/dataquery/jsx/react.app.js', + './modules/dataquery/js/react.fieldselector.js': './modules/dataquery/jsx/react.fieldselector.js', + './modules/dataquery/js/react.filterBuilder.js': './modules/dataquery/jsx/react.filterBuilder.js', + './modules/dataquery/js/react.paginator.js': './modules/dataquery/jsx/react.paginator.js', + './modules/dataquery/js/react.sidebar.js': './modules/dataquery/jsx/react.sidebar.js', + './modules/dataquery/js/react.tabs.js': './modules/dataquery/jsx/react.tabs.js', + './modules/dicom_archive/js/dicom_archive.js': './modules/dicom_archive/jsx/dicom_archive.js', + './modules/genomic_browser/js/FileUploadModal.js': './modules/genomic_browser/jsx/FileUploadModal.js', + './modules/genomic_browser/js/profileColumnFormatter.js': './modules/genomic_browser/jsx/profileColumnFormatter.js', + './modules/imaging_browser/js/ImagePanel.js': './modules/imaging_browser/jsx/ImagePanel.js', + './modules/imaging_browser/js/imagingBrowserIndex.js': './modules/imaging_browser/jsx/imagingBrowserIndex.js', + './modules/instrument_builder/js/react.instrument_builder.js': './modules/instrument_builder/jsx/react.instrument_builder.js', + './modules/instrument_builder/js/react.questions.js': './modules/instrument_builder/jsx/react.questions.js', + './modules/instrument_manager/js/instrumentManagerIndex.js': './modules/instrument_manager/jsx/instrumentManagerIndex.js', + './modules/survey_accounts/js/surveyAccountsIndex.js': './modules/survey_accounts/jsx/surveyAccountsIndex.js', + './modules/mri_violations/js/mri_protocol_check_violations_columnFormatter.js': './modules/mri_violations/jsx/mri_protocol_check_violations_columnFormatter.js', + './modules/mri_violations/js/columnFormatter.js': './modules/mri_violations/jsx/columnFormatter.js', + './modules/mri_violations/js/columnFormatterUnresolved.js': './modules/mri_violations/jsx/columnFormatterUnresolved.js', + './modules/mri_violations/js/mri_protocol_violations_columnFormatter.js': './modules/mri_violations/jsx/mri_protocol_violations_columnFormatter.js', + './modules/user_accounts/js/userAccountsIndex.js': './modules/user_accounts/jsx/userAccountsIndex.js', + './modules/examiner/js/examinerIndex.js': './modules/examiner/jsx/examinerIndex.js', + './modules/help_editor/js/help_editor.js': './modules/help_editor/jsx/help_editor.js', + './modules/brainbrowser/js/Brainbrowser.js': './modules/brainbrowser/jsx/Brainbrowser.js', + './modules/imaging_uploader/js/index.js': './modules/imaging_uploader/jsx/index.js', + './modules/acknowledgements/js/acknowledgementsIndex.js': './modules/acknowledgements/jsx/acknowledgementsIndex.js', + './modules/new_profile/js/NewProfileIndex.js': './modules/new_profile/jsx/NewProfileIndex.js', + './modules/quality_control/js/qualityControlIndex.js': './modules/quality_control/jsx/qualityControlIndex.js', + './modules/server_processes_manager/js/server_processes_managerIndex.js': './modules/server_processes_manager/jsx/server_processes_managerIndex.js', + './modules/document_repository/js/docIndex.js': './modules/document_repository/jsx/docIndex.js', + './modules/document_repository/js/editFormIndex.js': './modules/document_repository/jsx/editFormIndex.js', + './modules/publication/js/publicationIndex.js': './modules/publication/jsx/publicationIndex.js', + './modules/publication/js/viewProjectIndex.js': './modules/publication/jsx/viewProjectIndex.js', + './modules/biobank/js/biobankIndex.js': './modules/biobank/jsx/biobankIndex.js', + }, + output: { + path: __dirname + '/', + filename: '[name]', + }, + module: { + rules: [ + { + test: /\.(js|jsx)$/, + exclude: /node_modules/, + use: ['babel-loader'], + }, + { + test: /\.js$/, + exclude: /node_modules/, + use: ['babel-loader', 'eslint-loader'], + }, + { + test: /\.json$/, + loader: 'json', + }, + ], + }, + resolve: { + alias: { + util: path.resolve(__dirname, './htdocs/js/util'), + jsx: path.resolve(__dirname, './jsx'), + Breadcrumbs: path.resolve(__dirname, './jsx/Breadcrumbs'), + DataTable: path.resolve(__dirname, './jsx/DataTable'), + DynamicDataTable: path.resolve(__dirname, './jsx/DynamicDataTable'), + Filter: path.resolve(__dirname, './jsx/Filter'), + FilterableDataTable: path.resolve(__dirname, './jsx/FilterableDataTable'), + FilterForm: path.resolve(__dirname, './jsx/FilterForm'), + Form: path.resolve(__dirname, './jsx/Form'), + Loader: path.resolve(__dirname, './jsx/Loader'), + Markdown: path.resolve(__dirname, './jsx/Markdown'), + Modal: path.resolve(__dirname, './jsx/Modal'), + MultiSelectDropdown: path.resolve(__dirname, './jsx/MultiSelectDropdown'), + PaginationLinks: path.resolve(__dirname, './jsx/PaginationLinks'), + Panel: path.resolve(__dirname, './jsx/Panel'), + ProgressBar: path.resolve(__dirname, './jsx/ProgressBar'), + StaticDataTable: path.resolve(__dirname, './jsx/StaticDataTable'), + Tabs: path.resolve(__dirname, './jsx/Tabs'), + TriggerableModal: path.resolve(__dirname, './jsx/TriggerableModal'), + }, + extensions: ['*', '.js', '.jsx', '.json'], + }, + externals: { + react: 'React', + }, + node: { + fs: 'empty', + }, + devtool: 'source-map', + plugins: [], + optimization: { + minimizer: [ + new UglifyJsPlugin({ + cache: true, + parallel: true, + uglifyOptions: { + compress: false, + ecma: 6, + mangle: false, + }, + sourceMap: true, + }), + ], + }, +}]; + +// Support project overrides +if (fs.existsSync('./project/webpack-project.config.js')) { + const projConfig = require('./project/webpack-project.config.js'); + config[0].entry = Object.assign(config[0].entry, projConfig); +} + +module.exports = config; diff --git a/webpack.config.js.ORIG b/webpack.config.js.ORIG new file mode 100644 index 00000000000..c22c0c03872 --- /dev/null +++ b/webpack.config.js.ORIG @@ -0,0 +1,138 @@ +const UglifyJsPlugin = require('uglifyjs-webpack-plugin'); +const path = require('path'); +const fs = require('fs'); + +const config = [{ + entry: { + './htdocs/js/components/DynamicDataTable.js': './jsx/DynamicDataTable.js', + './htdocs/js/components/PaginationLinks.js': './jsx/PaginationLinks.js', + './htdocs/js/components/StaticDataTable.js': './jsx/StaticDataTable.js', + './htdocs/js/components/MultiSelectDropdown.js': './jsx/MultiSelectDropdown.js', + './htdocs/js/components/Breadcrumbs.js': './jsx/Breadcrumbs.js', + './htdocs/js/components/Form.js': './jsx/Form.js', + './htdocs/js/components/Markdown.js': './jsx/Markdown.js', + './modules/media/js/mediaIndex.js': './modules/media/jsx/mediaIndex.js', + './modules/issue_tracker/js/issueTrackerIndex.js': './modules/issue_tracker/jsx/issueTrackerIndex.js', + './modules/issue_tracker/js/index.js': './modules/issue_tracker/jsx/index.js', + './modules/candidate_parameters/js/CandidateParameters.js': './modules/candidate_parameters/jsx/CandidateParameters.js', + './modules/configuration/js/SubprojectRelations.js': './modules/configuration/jsx/SubprojectRelations.js', + './modules/conflict_resolver/js/conflictResolverIndex.js': './modules/conflict_resolver/jsx/conflictResolverIndex.js', + './modules/conflict_resolver/js/resolvedConflictsIndex.js': './modules/conflict_resolver/jsx/resolvedConflictsIndex.js', + './modules/bvl_feedback/js/react.behavioural_feedback_panel.js': './modules/bvl_feedback/jsx/react.behavioural_feedback_panel.js', + './modules/data_team_helper/js/behavioural_qc_module.js': './modules/data_team_helper/jsx/behavioural_qc_module.js', + './modules/candidate_list/js/openProfileForm.js': './modules/candidate_list/jsx/openProfileForm.js', + './modules/biobank/js/biobankIndex.js': './modules/biobank/jsx/biobankIndex.js', + './modules/candidate_list/js/onLoad.js': './modules/candidate_list/jsx/onLoad.js', + './modules/candidate_list/js/candidateListIndex.js': './modules/candidate_list/jsx/candidateListIndex.js', + './modules/datadict/js/dataDictIndex.js': './modules/datadict/jsx/dataDictIndex.js', + './modules/data_integrity_flag/js/dataIntegrityFlagIndex.js': './modules/data_integrity_flag/jsx/dataIntegrityFlagIndex.js', + './modules/dataquery/js/react.app.js': './modules/dataquery/jsx/react.app.js', + './modules/dataquery/js/react.fieldselector.js': './modules/dataquery/jsx/react.fieldselector.js', + './modules/dataquery/js/react.filterBuilder.js': './modules/dataquery/jsx/react.filterBuilder.js', + './modules/dataquery/js/react.paginator.js': './modules/dataquery/jsx/react.paginator.js', + './modules/dataquery/js/react.sidebar.js': './modules/dataquery/jsx/react.sidebar.js', + './modules/dataquery/js/react.tabs.js': './modules/dataquery/jsx/react.tabs.js', + './modules/dicom_archive/js/dicom_archive.js': './modules/dicom_archive/jsx/dicom_archive.js', + './modules/genomic_browser/js/FileUploadModal.js': './modules/genomic_browser/jsx/FileUploadModal.js', + './modules/genomic_browser/js/profileColumnFormatter.js': './modules/genomic_browser/jsx/profileColumnFormatter.js', + './modules/imaging_browser/js/ImagePanel.js': './modules/imaging_browser/jsx/ImagePanel.js', + './modules/imaging_browser/js/imagingBrowserIndex.js': './modules/imaging_browser/jsx/imagingBrowserIndex.js', + './modules/instrument_builder/js/react.instrument_builder.js': './modules/instrument_builder/jsx/react.instrument_builder.js', + './modules/instrument_builder/js/react.questions.js': './modules/instrument_builder/jsx/react.questions.js', + './modules/instrument_manager/js/instrumentManagerIndex.js': './modules/instrument_manager/jsx/instrumentManagerIndex.js', + './modules/survey_accounts/js/surveyAccountsIndex.js': './modules/survey_accounts/jsx/surveyAccountsIndex.js', + './modules/mri_violations/js/mri_protocol_check_violations_columnFormatter.js': './modules/mri_violations/jsx/mri_protocol_check_violations_columnFormatter.js', + './modules/mri_violations/js/columnFormatter.js': './modules/mri_violations/jsx/columnFormatter.js', + './modules/mri_violations/js/columnFormatterUnresolved.js': './modules/mri_violations/jsx/columnFormatterUnresolved.js', + './modules/mri_violations/js/mri_protocol_violations_columnFormatter.js': './modules/mri_violations/jsx/mri_protocol_violations_columnFormatter.js', + './modules/user_accounts/js/userAccountsIndex.js': './modules/user_accounts/jsx/userAccountsIndex.js', + './modules/examiner/js/examinerIndex.js': './modules/examiner/jsx/examinerIndex.js', + './modules/help_editor/js/help_editor.js': './modules/help_editor/jsx/help_editor.js', + './modules/brainbrowser/js/Brainbrowser.js': './modules/brainbrowser/jsx/Brainbrowser.js', + './modules/imaging_uploader/js/index.js': './modules/imaging_uploader/jsx/index.js', + './modules/acknowledgements/js/acknowledgementsIndex.js': './modules/acknowledgements/jsx/acknowledgementsIndex.js', + './modules/new_profile/js/NewProfileIndex.js': './modules/new_profile/jsx/NewProfileIndex.js', + './modules/quality_control/js/qualityControlIndex.js': './modules/quality_control/jsx/qualityControlIndex.js', + './modules/server_processes_manager/js/server_processes_managerIndex.js': './modules/server_processes_manager/jsx/server_processes_managerIndex.js', + './modules/document_repository/js/docIndex.js': './modules/document_repository/jsx/docIndex.js', + './modules/document_repository/js/editFormIndex.js': './modules/document_repository/jsx/editFormIndex.js', + './modules/publication/js/publicationIndex.js': './modules/publication/jsx/publicationIndex.js', + './modules/publication/js/viewProjectIndex.js': './modules/publication/jsx/viewProjectIndex.js', + }, + output: { + path: __dirname + '/', + filename: '[name]', + }, + module: { + rules: [ + { + test: /\.(js|jsx)$/, + exclude: /node_modules/, + use: ['babel-loader'], + }, + { + test: /\.js$/, + exclude: /node_modules/, + use: ['babel-loader', 'eslint-loader'], + }, + { + test: /\.json$/, + loader: 'json', + }, + ], + }, + resolve: { + alias: { + util: path.resolve(__dirname, './htdocs/js/util'), + jsx: path.resolve(__dirname, './jsx'), + Breadcrumbs: path.resolve(__dirname, './jsx/Breadcrumbs'), + DataTable: path.resolve(__dirname, './jsx/DataTable'), + DynamicDataTable: path.resolve(__dirname, './jsx/DynamicDataTable'), + Filter: path.resolve(__dirname, './jsx/Filter'), + FilterableDataTable: path.resolve(__dirname, './jsx/FilterableDataTable'), + FilterForm: path.resolve(__dirname, './jsx/FilterForm'), + Form: path.resolve(__dirname, './jsx/Form'), + Loader: path.resolve(__dirname, './jsx/Loader'), + Markdown: path.resolve(__dirname, './jsx/Markdown'), + Modal: path.resolve(__dirname, './jsx/Modal'), + MultiSelectDropdown: path.resolve(__dirname, './jsx/MultiSelectDropdown'), + PaginationLinks: path.resolve(__dirname, './jsx/PaginationLinks'), + Panel: path.resolve(__dirname, './jsx/Panel'), + ProgressBar: path.resolve(__dirname, './jsx/ProgressBar'), + StaticDataTable: path.resolve(__dirname, './jsx/StaticDataTable'), + Tabs: path.resolve(__dirname, './jsx/Tabs'), + TriggerableModal: path.resolve(__dirname, './jsx/TriggerableModal'), + }, + extensions: ['*', '.js', '.jsx', '.json'], + }, + externals: { + react: 'React', + }, + node: { + fs: 'empty', + }, + devtool: 'source-map', + plugins: [], + optimization: { + minimizer: [ + new UglifyJsPlugin({ + cache: true, + parallel: true, + uglifyOptions: { + compress: false, + ecma: 6, + mangle: false, + }, + sourceMap: true, + }), + ], + }, +}]; + +// Support project overrides +if (fs.existsSync('./project/webpack-project.config.js')) { + const projConfig = require('./project/webpack-project.config.js'); + config[0].entry = Object.assign(config[0].entry, projConfig); +} + +module.exports = config; From cba74d1b1eb4d31b8a3ef2420a56b3df08be9f4d Mon Sep 17 00:00:00 2001 From: Loris Admin Date: Mon, 19 Aug 2019 17:20:05 -0400 Subject: [PATCH 25/95] Update Date and Time Elements --- ...019-02-27_add_biobank_module_to_schema.sql | 3 +- .../vendor/js/react/react-dom.development.js | 5179 +++++++++-------- .../js/react/react-dom.production.min.js | 1933 +++++- htdocs/vendor/js/react/react.development.js | 484 +- .../vendor/js/react/react.production.min.js | 136 +- jsx/DataTable.js | 7 +- jsx/Form.js | 97 +- package-lock.json | 768 +-- 8 files changed, 4952 insertions(+), 3655 deletions(-) diff --git a/SQL/New_patches/2019-02-27_add_biobank_module_to_schema.sql b/SQL/New_patches/2019-02-27_add_biobank_module_to_schema.sql index d07e3eca816..247a6676262 100644 --- a/SQL/New_patches/2019-02-27_add_biobank_module_to_schema.sql +++ b/SQL/New_patches/2019-02-27_add_biobank_module_to_schema.sql @@ -541,6 +541,7 @@ INSERT INTO biobank_container_status (Label) VALUES ('Available'), ('Reserved'), ('Dispensed'), - ('Discarded') + ('Discarded'), + ('Shipped') ; diff --git a/htdocs/vendor/js/react/react-dom.development.js b/htdocs/vendor/js/react/react-dom.development.js index c92d1eeaf62..0315bdaefa4 100644 --- a/htdocs/vendor/js/react/react-dom.development.js +++ b/htdocs/vendor/js/react/react-dom.development.js @@ -9,11 +9,12 @@ 'use strict'; -(function (global, factory) { +(function(global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('react')) : typeof define === 'function' && define.amd ? define(['react'], factory) : (global.ReactDOM = factory(global.React)); -}(this, (function (React) { 'use strict'; +}(this, (function(React) { + 'use strict'; /** * Copyright (c) 2013-present, Facebook, Inc. @@ -24,7 +25,6 @@ */ - /** * Use invariant() to assert state which your program assumes to be true. * @@ -36,7 +36,7 @@ * will remain to ensure logic does not differ in production. */ -var validateFormat = function validateFormat(format) {}; +let validateFormat = function validateFormat(format) {}; { validateFormat = function validateFormat(format) { @@ -50,13 +50,13 @@ function invariant(condition, format, a, b, c, d, e, f) { validateFormat(format); if (!condition) { - var error; + let error; if (format === undefined) { error = new Error('Minified exception occurred; use the non-minified dev environment ' + 'for the full error message and additional helpful warnings.'); } else { - var args = [a, b, c, d, e, f]; - var argIndex = 0; - error = new Error(format.replace(/%s/g, function () { + let args = [a, b, c, d, e, f]; + let argIndex = 0; + error = new Error(format.replace(/%s/g, function() { return args[argIndex++]; })); error.name = 'Invariant Violation'; @@ -67,17 +67,17 @@ function invariant(condition, format, a, b, c, d, e, f) { } } -var invariant_1 = invariant; +let invariant_1 = invariant; // Relying on the `invariant()` implementation lets us // have preserve the format and params in the www builds. !React ? invariant_1(false, 'ReactDOM was loaded before React. Make sure you load the React package before loading ReactDOM.') : void 0; -var invokeGuardedCallback = function (name, func, context, a, b, c, d, e, f) { +let invokeGuardedCallback = function(name, func, context, a, b, c, d, e, f) { this._hasCaughtError = false; this._caughtError = null; - var funcArgs = Array.prototype.slice.call(arguments, 3); + let funcArgs = Array.prototype.slice.call(arguments, 3); try { func.apply(context, funcArgs); } catch (error) { @@ -109,15 +109,15 @@ var invokeGuardedCallback = function (name, func, context, a, b, c, d, e, f) { // Check that the browser supports the APIs we need to implement our special // DEV version of invokeGuardedCallback if (typeof window !== 'undefined' && typeof window.dispatchEvent === 'function' && typeof document !== 'undefined' && typeof document.createEvent === 'function') { - var fakeNode = document.createElement('react'); + let fakeNode = document.createElement('react'); - var invokeGuardedCallbackDev = function (name, func, context, a, b, c, d, e, f) { + let invokeGuardedCallbackDev = function(name, func, context, a, b, c, d, e, f) { // If document doesn't exist we know for sure we will crash in this method // when we call document.createEvent(). However this can cause confusing // errors: https://github.com/facebookincubator/create-react-app/issues/3482 // So we preemptively throw with a better message instead. !(typeof document !== 'undefined') ? invariant_1(false, 'The `document` global was defined when React was initialized, but is not defined anymore. This can happen in a test environment if a component schedules an update from an asynchronous callback, but the test has already finished running. To solve this, you can either unmount the component at the end of your test (and ensure that any asynchronous operations get canceled in `componentWillUnmount`), or you can change the test itself to be asynchronous.') : void 0; - var evt = document.createEvent('Event'); + let evt = document.createEvent('Event'); // Keeps track of whether the user-provided callback threw an error. We // set this to true at the beginning, then set it to false right after @@ -125,12 +125,12 @@ var invokeGuardedCallback = function (name, func, context, a, b, c, d, e, f) { // set to false. This strategy works even if the browser is flaky and // fails to call our global error handler, because it doesn't rely on // the error event at all. - var didError = true; + let didError = true; // Create an event handler for our fake event. We will synchronously // dispatch our fake event using `dispatchEvent`. Inside the handler, we // call the user-provided callback. - var funcArgs = Array.prototype.slice.call(arguments, 3); + let funcArgs = Array.prototype.slice.call(arguments, 3); function callCallback() { // We immediately remove the callback from event listeners so that // nested `invokeGuardedCallback` calls do not clash. Otherwise, a @@ -152,10 +152,10 @@ var invokeGuardedCallback = function (name, func, context, a, b, c, d, e, f) { // erroring and the code that follows the `dispatchEvent` call below. If // the callback doesn't error, but the error event was fired, we know to // ignore it because `didError` will be false, as described above. - var error = void 0; + let error = void 0; // Use this to track whether the error event is ever called. - var didSetError = false; - var isCrossOriginError = false; + let didSetError = false; + let isCrossOriginError = false; function onError(event) { error = event.error; @@ -180,9 +180,9 @@ var invokeGuardedCallback = function (name, func, context, a, b, c, d, e, f) { if (didError) { if (!didSetError) { // The callback errored, but the error event never fired. - error = new Error('An error was thrown inside one of your components, but React ' + "doesn't know what it was. This is likely due to browser " + 'flakiness. React does its best to preserve the "Pause on ' + 'exceptions" behavior of the DevTools, which requires some ' + "DEV-mode only tricks. It's possible that these don't work in " + 'your browser. Try triggering the error in production mode, ' + 'or switching to a modern browser. If you suspect that this is ' + 'actually an issue with React, please file an issue.'); + error = new Error('An error was thrown inside one of your components, but React ' + 'doesn\'t know what it was. This is likely due to browser ' + 'flakiness. React does its best to preserve the "Pause on ' + 'exceptions" behavior of the DevTools, which requires some ' + 'DEV-mode only tricks. It\'s possible that these don\'t work in ' + 'your browser. Try triggering the error in production mode, ' + 'or switching to a modern browser. If you suspect that this is ' + 'actually an issue with React, please file an issue.'); } else if (isCrossOriginError) { - error = new Error("A cross-origin error was thrown. React doesn't have access to " + 'the actual error object in development. ' + 'See https://fb.me/react-crossorigin-error for more information.'); + error = new Error('A cross-origin error was thrown. React doesn\'t have access to ' + 'the actual error object in development. ' + 'See https://fb.me/react-crossorigin-error for more information.'); } this._hasCaughtError = true; this._caughtError = error; @@ -199,7 +199,7 @@ var invokeGuardedCallback = function (name, func, context, a, b, c, d, e, f) { } } -var invokeGuardedCallback$1 = invokeGuardedCallback; +let invokeGuardedCallback$1 = invokeGuardedCallback; var ReactErrorUtils = { // Used by Fiber to simulate a try-catch. @@ -223,7 +223,7 @@ var ReactErrorUtils = { * @param {*} context The context to use when calling the function * @param {...*} args Arguments for function */ - invokeGuardedCallback: function (name, func, context, a, b, c, d, e, f) { + invokeGuardedCallback: function(name, func, context, a, b, c, d, e, f) { invokeGuardedCallback$1.apply(ReactErrorUtils, arguments); }, @@ -237,10 +237,10 @@ var ReactErrorUtils = { * @param {*} context The context to use when calling the function * @param {...*} args Arguments for function */ - invokeGuardedCallbackAndCatchFirstError: function (name, func, context, a, b, c, d, e, f) { + invokeGuardedCallbackAndCatchFirstError: function(name, func, context, a, b, c, d, e, f) { ReactErrorUtils.invokeGuardedCallback.apply(this, arguments); if (ReactErrorUtils.hasCaughtError()) { - var error = ReactErrorUtils.clearCaughtError(); + let error = ReactErrorUtils.clearCaughtError(); if (!ReactErrorUtils._hasRethrowError) { ReactErrorUtils._hasRethrowError = true; ReactErrorUtils._rethrowError = error; @@ -252,29 +252,29 @@ var ReactErrorUtils = { * During execution of guarded functions we will capture the first error which * we will rethrow to be handled by the top level error handler. */ - rethrowCaughtError: function () { + rethrowCaughtError: function() { return rethrowCaughtError.apply(ReactErrorUtils, arguments); }, - hasCaughtError: function () { + hasCaughtError: function() { return ReactErrorUtils._hasCaughtError; }, - clearCaughtError: function () { + clearCaughtError: function() { if (ReactErrorUtils._hasCaughtError) { - var error = ReactErrorUtils._caughtError; + let error = ReactErrorUtils._caughtError; ReactErrorUtils._caughtError = null; ReactErrorUtils._hasCaughtError = false; return error; } else { invariant_1(false, 'clearCaughtError was called but no error was captured. This error is likely caused by a bug in React. Please file an issue.'); } - } + }, }; -var rethrowCaughtError = function () { +var rethrowCaughtError = function() { if (ReactErrorUtils._hasRethrowError) { - var error = ReactErrorUtils._rethrowError; + let error = ReactErrorUtils._rethrowError; ReactErrorUtils._rethrowError = null; ReactErrorUtils._hasRethrowError = false; throw error; @@ -284,12 +284,12 @@ var rethrowCaughtError = function () { /** * Injectable ordering of event plugins. */ -var eventPluginOrder = null; +let eventPluginOrder = null; /** * Injectable mapping from names to event plugin modules. */ -var namesToPlugins = {}; +let namesToPlugins = {}; /** * Recomputes the plugin list using the injected plugins and plugin ordering. @@ -301,17 +301,17 @@ function recomputePluginOrdering() { // Wait until an `eventPluginOrder` is injected. return; } - for (var pluginName in namesToPlugins) { - var pluginModule = namesToPlugins[pluginName]; - var pluginIndex = eventPluginOrder.indexOf(pluginName); + for (let pluginName in namesToPlugins) { + let pluginModule = namesToPlugins[pluginName]; + let pluginIndex = eventPluginOrder.indexOf(pluginName); !(pluginIndex > -1) ? invariant_1(false, 'EventPluginRegistry: Cannot inject event plugins that do not exist in the plugin ordering, `%s`.', pluginName) : void 0; if (plugins[pluginIndex]) { continue; } !pluginModule.extractEvents ? invariant_1(false, 'EventPluginRegistry: Event plugins must implement an `extractEvents` method, but `%s` does not.', pluginName) : void 0; plugins[pluginIndex] = pluginModule; - var publishedEvents = pluginModule.eventTypes; - for (var eventName in publishedEvents) { + let publishedEvents = pluginModule.eventTypes; + for (let eventName in publishedEvents) { !publishEventForPlugin(publishedEvents[eventName], pluginModule, eventName) ? invariant_1(false, 'EventPluginRegistry: Failed to publish event `%s` for plugin `%s`.', eventName, pluginName) : void 0; } } @@ -329,11 +329,11 @@ function publishEventForPlugin(dispatchConfig, pluginModule, eventName) { !!eventNameDispatchConfigs.hasOwnProperty(eventName) ? invariant_1(false, 'EventPluginHub: More than one plugin attempted to publish the same event name, `%s`.', eventName) : void 0; eventNameDispatchConfigs[eventName] = dispatchConfig; - var phasedRegistrationNames = dispatchConfig.phasedRegistrationNames; + let phasedRegistrationNames = dispatchConfig.phasedRegistrationNames; if (phasedRegistrationNames) { - for (var phaseName in phasedRegistrationNames) { + for (let phaseName in phasedRegistrationNames) { if (phasedRegistrationNames.hasOwnProperty(phaseName)) { - var phasedRegistrationName = phasedRegistrationNames[phaseName]; + let phasedRegistrationName = phasedRegistrationNames[phaseName]; publishRegistrationName(phasedRegistrationName, pluginModule, eventName); } } @@ -358,7 +358,7 @@ function publishRegistrationName(registrationName, pluginModule, eventName) { registrationNameDependencies[registrationName] = pluginModule.eventTypes[eventName].dependencies; { - var lowerCasedName = registrationName.toLowerCase(); + let lowerCasedName = registrationName.toLowerCase(); possibleRegistrationNames[lowerCasedName] = registrationName; if (registrationName === 'onDoubleClick') { @@ -429,12 +429,12 @@ function injectEventPluginOrder(injectedEventPluginOrder) { * @see {EventPluginHub.injection.injectEventPluginsByName} */ function injectEventPluginsByName(injectedNamesToPlugins) { - var isOrderingDirty = false; - for (var pluginName in injectedNamesToPlugins) { + let isOrderingDirty = false; + for (let pluginName in injectedNamesToPlugins) { if (!injectedNamesToPlugins.hasOwnProperty(pluginName)) { continue; } - var pluginModule = injectedNamesToPlugins[pluginName]; + let pluginModule = injectedNamesToPlugins[pluginName]; if (!namesToPlugins.hasOwnProperty(pluginName) || namesToPlugins[pluginName] !== pluginModule) { !!namesToPlugins[pluginName] ? invariant_1(false, 'EventPluginRegistry: Cannot inject two different event plugins using the same name, `%s`.', pluginName) : void 0; namesToPlugins[pluginName] = pluginModule; @@ -446,14 +446,14 @@ function injectEventPluginsByName(injectedNamesToPlugins) { } } -var EventPluginRegistry = Object.freeze({ +let EventPluginRegistry = Object.freeze({ plugins: plugins, eventNameDispatchConfigs: eventNameDispatchConfigs, registrationNameModules: registrationNameModules, registrationNameDependencies: registrationNameDependencies, possibleRegistrationNames: possibleRegistrationNames, injectEventPluginOrder: injectEventPluginOrder, - injectEventPluginsByName: injectEventPluginsByName + injectEventPluginsByName: injectEventPluginsByName, }); /** @@ -462,11 +462,11 @@ var EventPluginRegistry = Object.freeze({ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * + * */ function makeEmptyFunction(arg) { - return function () { + return function() { return arg; }; } @@ -476,20 +476,20 @@ function makeEmptyFunction(arg) { * primarily useful idiomatically for overridable function endpoints which * always need to be callable, since JS lacks a null-call idiom ala Cocoa. */ -var emptyFunction = function emptyFunction() {}; +let emptyFunction = function emptyFunction() {}; emptyFunction.thatReturns = makeEmptyFunction; emptyFunction.thatReturnsFalse = makeEmptyFunction(false); emptyFunction.thatReturnsTrue = makeEmptyFunction(true); emptyFunction.thatReturnsNull = makeEmptyFunction(null); -emptyFunction.thatReturnsThis = function () { +emptyFunction.thatReturnsThis = function() { return this; }; -emptyFunction.thatReturnsArgument = function (arg) { +emptyFunction.thatReturnsArgument = function(arg) { return arg; }; -var emptyFunction_1 = emptyFunction; +let emptyFunction_1 = emptyFunction; /** * Copyright (c) 2014-present, Facebook, Inc. @@ -500,9 +500,6 @@ var emptyFunction_1 = emptyFunction; */ - - - /** * Similar to invariant but only logs a warning if the condition is not met. * This can be used to log issues in development environments in critical @@ -510,16 +507,16 @@ var emptyFunction_1 = emptyFunction; * same logic and follow the same code paths. */ -var warning = emptyFunction_1; +let warning = emptyFunction_1; { - var printWarning = function printWarning(format) { + let printWarning = function printWarning(format) { for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { args[_key - 1] = arguments[_key]; } - var argIndex = 0; - var message = 'Warning: ' + format.replace(/%s/g, function () { + let argIndex = 0; + let message = 'Warning: ' + format.replace(/%s/g, function() { return args[argIndex++]; }); if (typeof console !== 'undefined') { @@ -547,19 +544,19 @@ var warning = emptyFunction_1; args[_key2 - 2] = arguments[_key2]; } - printWarning.apply(undefined, [format].concat(args)); + printWarning(...[format].concat(args)); } }; } -var warning_1 = warning; +let warning_1 = warning; -var getFiberCurrentPropsFromNode = null; -var getInstanceFromNode = null; -var getNodeFromInstance = null; +let getFiberCurrentPropsFromNode = null; +let getInstanceFromNode = null; +let getNodeFromInstance = null; -var injection$1 = { - injectComponentTree: function (Injected) { +let injection$1 = { + injectComponentTree: function(Injected) { getFiberCurrentPropsFromNode = Injected.getFiberCurrentPropsFromNode; getInstanceFromNode = Injected.getInstanceFromNode; getNodeFromInstance = Injected.getNodeFromInstance; @@ -567,20 +564,20 @@ var injection$1 = { { !(getNodeFromInstance && getInstanceFromNode) ? warning_1(false, 'EventPluginUtils.injection.injectComponentTree(...): Injected ' + 'module is missing getNodeFromInstance or getInstanceFromNode.') : void 0; } - } + }, }; -var validateEventDispatches = void 0; +let validateEventDispatches = void 0; { - validateEventDispatches = function (event) { - var dispatchListeners = event._dispatchListeners; - var dispatchInstances = event._dispatchInstances; + validateEventDispatches = function(event) { + let dispatchListeners = event._dispatchListeners; + let dispatchInstances = event._dispatchInstances; - var listenersIsArr = Array.isArray(dispatchListeners); - var listenersLen = listenersIsArr ? dispatchListeners.length : dispatchListeners ? 1 : 0; + let listenersIsArr = Array.isArray(dispatchListeners); + let listenersLen = listenersIsArr ? dispatchListeners.length : dispatchListeners ? 1 : 0; - var instancesIsArr = Array.isArray(dispatchInstances); - var instancesLen = instancesIsArr ? dispatchInstances.length : dispatchInstances ? 1 : 0; + let instancesIsArr = Array.isArray(dispatchInstances); + let instancesLen = instancesIsArr ? dispatchInstances.length : dispatchInstances ? 1 : 0; !(instancesIsArr === listenersIsArr && instancesLen === listenersLen) ? warning_1(false, 'EventPluginUtils: Invalid `event`.') : void 0; }; @@ -594,7 +591,7 @@ var validateEventDispatches = void 0; * @param {*} inst Internal component instance */ function executeDispatch(event, simulated, listener, inst) { - var type = event.type || 'unknown-event'; + let type = event.type || 'unknown-event'; event.currentTarget = getNodeFromInstance(inst); ReactErrorUtils.invokeGuardedCallbackAndCatchFirstError(type, listener, undefined, event); event.currentTarget = null; @@ -604,13 +601,13 @@ function executeDispatch(event, simulated, listener, inst) { * Standard/simple iteration through an event's collected dispatches. */ function executeDispatchesInOrder(event, simulated) { - var dispatchListeners = event._dispatchListeners; - var dispatchInstances = event._dispatchInstances; + let dispatchListeners = event._dispatchListeners; + let dispatchInstances = event._dispatchInstances; { validateEventDispatches(event); } if (Array.isArray(dispatchListeners)) { - for (var i = 0; i < dispatchListeners.length; i++) { + for (let i = 0; i < dispatchListeners.length; i++) { if (event.isPropagationStopped()) { break; } @@ -669,7 +666,7 @@ function accumulateInto(current, next) { // certain that x is an Array (x could be a string with concat method). if (Array.isArray(current)) { if (Array.isArray(next)) { - current.push.apply(current, next); + current.push(...next); return current; } current.push(next); @@ -705,7 +702,7 @@ function forEachAccumulated(arr, cb, scope) { * Internal queue of events that have accumulated their dispatches and are * waiting to have their dispatches executed. */ -var eventQueue = null; +let eventQueue = null; /** * Dispatches an event and releases it back into the pool, unless persistent. @@ -714,7 +711,7 @@ var eventQueue = null; * @param {boolean} simulated If the event is simulated (changes exn behavior) * @private */ -var executeDispatchesAndRelease = function (event, simulated) { +let executeDispatchesAndRelease = function(event, simulated) { if (event) { executeDispatchesInOrder(event, simulated); @@ -723,10 +720,10 @@ var executeDispatchesAndRelease = function (event, simulated) { } } }; -var executeDispatchesAndReleaseSimulated = function (e) { +let executeDispatchesAndReleaseSimulated = function(e) { return executeDispatchesAndRelease(e, true); }; -var executeDispatchesAndReleaseTopLevel = function (e) { +let executeDispatchesAndReleaseTopLevel = function(e) { return executeDispatchesAndRelease(e, false); }; @@ -778,7 +775,7 @@ function shouldPreventMouseEvent(name, type, props) { /** * Methods for injecting dependencies. */ -var injection = { +let injection = { /** * @param {array} InjectedEventPluginOrder * @public @@ -788,7 +785,7 @@ var injection = { /** * @param {object} injectedNamesToPlugins Map from names to plugin modules. */ - injectEventPluginsByName: injectEventPluginsByName + injectEventPluginsByName: injectEventPluginsByName, }; /** @@ -797,16 +794,16 @@ var injection = { * @return {?function} The stored callback. */ function getListener(inst, registrationName) { - var listener = void 0; + let listener = void 0; // TODO: shouldPreventMouseEvent is DOM-specific and definitely should not // live here; needs to be moved to a better place soon - var stateNode = inst.stateNode; + let stateNode = inst.stateNode; if (!stateNode) { // Work in progress (ex: onload events in incremental mode). return null; } - var props = getFiberCurrentPropsFromNode(stateNode); + let props = getFiberCurrentPropsFromNode(stateNode); if (!props) { // Work in progress. return null; @@ -827,12 +824,12 @@ function getListener(inst, registrationName) { * @internal */ function extractEvents(topLevelType, targetInst, nativeEvent, nativeEventTarget) { - var events = null; - for (var i = 0; i < plugins.length; i++) { + let events = null; + for (let i = 0; i < plugins.length; i++) { // Not every plugin in the ordering may be loaded at runtime. - var possiblePlugin = plugins[i]; + let possiblePlugin = plugins[i]; if (possiblePlugin) { - var extractedEvents = possiblePlugin.extractEvents(topLevelType, targetInst, nativeEvent, nativeEventTarget); + let extractedEvents = possiblePlugin.extractEvents(topLevelType, targetInst, nativeEvent, nativeEventTarget); if (extractedEvents) { events = accumulateInto(events, extractedEvents); } @@ -848,7 +845,7 @@ function runEventsInBatch(events, simulated) { // Set `eventQueue` to null before processing it so that we can tell if more // events get enqueued while processing. - var processingEventQueue = eventQueue; + let processingEventQueue = eventQueue; eventQueue = null; if (!processingEventQueue) { @@ -866,38 +863,37 @@ function runEventsInBatch(events, simulated) { } function runExtractedEventsInBatch(topLevelType, targetInst, nativeEvent, nativeEventTarget) { - var events = extractEvents(topLevelType, targetInst, nativeEvent, nativeEventTarget); + let events = extractEvents(topLevelType, targetInst, nativeEvent, nativeEventTarget); runEventsInBatch(events, false); } -var EventPluginHub = Object.freeze({ +let EventPluginHub = Object.freeze({ injection: injection, getListener: getListener, runEventsInBatch: runEventsInBatch, - runExtractedEventsInBatch: runExtractedEventsInBatch + runExtractedEventsInBatch: runExtractedEventsInBatch, }); -var IndeterminateComponent = 0; // Before we know whether it is functional or class -var FunctionalComponent = 1; -var ClassComponent = 2; -var HostRoot = 3; // Root of a host tree. Could be nested inside another node. -var HostPortal = 4; // A subtree. Could be an entry point to a different renderer. -var HostComponent = 5; -var HostText = 6; - +let IndeterminateComponent = 0; // Before we know whether it is functional or class +let FunctionalComponent = 1; +let ClassComponent = 2; +let HostRoot = 3; // Root of a host tree. Could be nested inside another node. +let HostPortal = 4; // A subtree. Could be an entry point to a different renderer. +let HostComponent = 5; +let HostText = 6; -var Fragment = 10; -var Mode = 11; -var ContextConsumer = 12; -var ContextProvider = 13; -var ForwardRef = 14; -var Profiler = 15; -var TimeoutComponent = 16; +let Fragment = 10; +let Mode = 11; +let ContextConsumer = 12; +let ContextProvider = 13; +let ForwardRef = 14; +let Profiler = 15; +let TimeoutComponent = 16; -var randomKey = Math.random().toString(36).slice(2); -var internalInstanceKey = '__reactInternalInstance$' + randomKey; -var internalEventHandlersKey = '__reactEventHandlers$' + randomKey; +let randomKey = Math.random().toString(36).slice(2); +let internalInstanceKey = '__reactInternalInstance$' + randomKey; +let internalEventHandlersKey = '__reactEventHandlers$' + randomKey; function precacheFiberNode(hostInst, node) { node[internalInstanceKey] = hostInst; @@ -922,7 +918,7 @@ function getClosestInstanceFromNode(node) { } } - var inst = node[internalInstanceKey]; + let inst = node[internalInstanceKey]; if (inst.tag === HostComponent || inst.tag === HostText) { // In Fiber, this will always be the deepest root. return inst; @@ -936,7 +932,7 @@ function getClosestInstanceFromNode(node) { * instance, or null if the node was not rendered by this React. */ function getInstanceFromNode$1(node) { - var inst = node[internalInstanceKey]; + let inst = node[internalInstanceKey]; if (inst) { if (inst.tag === HostComponent || inst.tag === HostText) { return inst; @@ -971,13 +967,13 @@ function updateFiberProps(node, props) { node[internalEventHandlersKey] = props; } -var ReactDOMComponentTree = Object.freeze({ +let ReactDOMComponentTree = Object.freeze({ precacheFiberNode: precacheFiberNode, getClosestInstanceFromNode: getClosestInstanceFromNode, getInstanceFromNode: getInstanceFromNode$1, getNodeFromInstance: getNodeFromInstance$1, getFiberCurrentPropsFromNode: getFiberCurrentPropsFromNode$1, - updateFiberProps: updateFiberProps + updateFiberProps: updateFiberProps, }); function getParent(inst) { @@ -1000,12 +996,12 @@ function getParent(inst) { * different trees. */ function getLowestCommonAncestor(instA, instB) { - var depthA = 0; - for (var tempA = instA; tempA; tempA = getParent(tempA)) { + let depthA = 0; + for (let tempA = instA; tempA; tempA = getParent(tempA)) { depthA++; } - var depthB = 0; - for (var tempB = instB; tempB; tempB = getParent(tempB)) { + let depthB = 0; + for (let tempB = instB; tempB; tempB = getParent(tempB)) { depthB++; } @@ -1022,7 +1018,7 @@ function getLowestCommonAncestor(instA, instB) { } // Walk in lockstep until we find a match. - var depth = depthA; + let depth = depthA; while (depth--) { if (instA === instB || instA === instB.alternate) { return instA; @@ -1049,12 +1045,12 @@ function getParentInstance(inst) { * Simulates the traversal of a two-phase, capture/bubble event dispatch. */ function traverseTwoPhase(inst, fn, arg) { - var path = []; + let path = []; while (inst) { path.push(inst); inst = getParent(inst); } - var i = void 0; + let i = void 0; for (i = path.length; i-- > 0;) { fn(path[i], 'captured', arg); } @@ -1071,8 +1067,8 @@ function traverseTwoPhase(inst, fn, arg) { * "entered" or "left" that element. */ function traverseEnterLeave(from, to, fn, argFrom, argTo) { - var common = from && to ? getLowestCommonAncestor(from, to) : null; - var pathFrom = []; + let common = from && to ? getLowestCommonAncestor(from, to) : null; + let pathFrom = []; while (true) { if (!from) { break; @@ -1080,14 +1076,14 @@ function traverseEnterLeave(from, to, fn, argFrom, argTo) { if (from === common) { break; } - var alternate = from.alternate; + let alternate = from.alternate; if (alternate !== null && alternate === common) { break; } pathFrom.push(from); from = getParent(from); } - var pathTo = []; + let pathTo = []; while (true) { if (!to) { break; @@ -1095,17 +1091,17 @@ function traverseEnterLeave(from, to, fn, argFrom, argTo) { if (to === common) { break; } - var _alternate = to.alternate; + let _alternate = to.alternate; if (_alternate !== null && _alternate === common) { break; } pathTo.push(to); to = getParent(to); } - for (var i = 0; i < pathFrom.length; i++) { + for (let i = 0; i < pathFrom.length; i++) { fn(pathFrom[i], 'bubbled', argFrom); } - for (var _i = pathTo.length; _i-- > 0;) { + for (let _i = pathTo.length; _i-- > 0;) { fn(pathTo[_i], 'captured', argTo); } } @@ -1115,7 +1111,7 @@ function traverseEnterLeave(from, to, fn, argFrom, argTo) { * "phases" of propagation. This finds listeners by a given phase. */ function listenerAtPhase(inst, event, propagationPhase) { - var registrationName = event.dispatchConfig.phasedRegistrationNames[propagationPhase]; + let registrationName = event.dispatchConfig.phasedRegistrationNames[propagationPhase]; return getListener(inst, registrationName); } @@ -1139,7 +1135,7 @@ function accumulateDirectionalDispatches(inst, phase, event) { { !inst ? warning_1(false, 'Dispatching inst must not be null') : void 0; } - var listener = listenerAtPhase(inst, event, phase); + let listener = listenerAtPhase(inst, event, phase); if (listener) { event._dispatchListeners = accumulateInto(event._dispatchListeners, listener); event._dispatchInstances = accumulateInto(event._dispatchInstances, inst); @@ -1164,8 +1160,8 @@ function accumulateTwoPhaseDispatchesSingle(event) { */ function accumulateTwoPhaseDispatchesSingleSkipTarget(event) { if (event && event.dispatchConfig.phasedRegistrationNames) { - var targetInst = event._targetInst; - var parentInst = targetInst ? getParentInstance(targetInst) : null; + let targetInst = event._targetInst; + let parentInst = targetInst ? getParentInstance(targetInst) : null; traverseTwoPhase(parentInst, accumulateDirectionalDispatches, event); } } @@ -1177,8 +1173,8 @@ function accumulateTwoPhaseDispatchesSingleSkipTarget(event) { */ function accumulateDispatches(inst, ignoredDirection, event) { if (inst && event && event.dispatchConfig.registrationName) { - var registrationName = event.dispatchConfig.registrationName; - var listener = getListener(inst, registrationName); + let registrationName = event.dispatchConfig.registrationName; + let listener = getListener(inst, registrationName); if (listener) { event._dispatchListeners = accumulateInto(event._dispatchListeners, listener); event._dispatchInstances = accumulateInto(event._dispatchInstances, inst); @@ -1213,11 +1209,11 @@ function accumulateDirectDispatches(events) { forEachAccumulated(events, accumulateDirectDispatchesSingle); } -var EventPropagators = Object.freeze({ +let EventPropagators = Object.freeze({ accumulateTwoPhaseDispatches: accumulateTwoPhaseDispatches, accumulateTwoPhaseDispatchesSkipTarget: accumulateTwoPhaseDispatchesSkipTarget, accumulateEnterLeaveDispatches: accumulateEnterLeaveDispatches, - accumulateDirectDispatches: accumulateDirectDispatches + accumulateDirectDispatches: accumulateDirectDispatches, }); /** @@ -1229,8 +1225,7 @@ var EventPropagators = Object.freeze({ */ - -var canUseDOM = !!(typeof window !== 'undefined' && window.document && window.document.createElement); +let canUseDOM = !!(typeof window !== 'undefined' && window.document && window.document.createElement); /** * Simple, lightweight module assisting with the detection and context of @@ -1238,7 +1233,7 @@ var canUseDOM = !!(typeof window !== 'undefined' && window.document && window.do * whether or not they are in a Worker, even if they never include the main * `ReactWorker` dependency. */ -var ExecutionEnvironment = { +let ExecutionEnvironment = { canUseDOM: canUseDOM, @@ -1248,11 +1243,11 @@ var ExecutionEnvironment = { canUseViewport: canUseDOM && !!window.screen, - isInWorker: !canUseDOM // For now, this is true - might change in the future. + isInWorker: !canUseDOM, // For now, this is true - might change in the future. }; -var ExecutionEnvironment_1 = ExecutionEnvironment; +let ExecutionEnvironment_1 = ExecutionEnvironment; // Do not uses the below two methods directly! // Instead use constants exported from DOMTopLevelEventTypes in ReactDOM. @@ -1271,10 +1266,10 @@ function unsafeCastDOMTopLevelTypeToString(topLevelType) { * * @param {string} styleProp * @param {string} eventName - * @returns {object} + * @return {object} */ function makePrefixMap(styleProp, eventName) { - var prefixes = {}; + let prefixes = {}; prefixes[styleProp.toLowerCase()] = eventName.toLowerCase(); prefixes['Webkit' + styleProp] = 'webkit' + eventName; @@ -1288,22 +1283,22 @@ function makePrefixMap(styleProp, eventName) { /** * A list of event names to a configurable list of vendor prefixes. */ -var vendorPrefixes = { +let vendorPrefixes = { animationend: makePrefixMap('Animation', 'AnimationEnd'), animationiteration: makePrefixMap('Animation', 'AnimationIteration'), animationstart: makePrefixMap('Animation', 'AnimationStart'), - transitionend: makePrefixMap('Transition', 'TransitionEnd') + transitionend: makePrefixMap('Transition', 'TransitionEnd'), }; /** * Event names that have already been detected and prefixed (if applicable). */ -var prefixedEventNames = {}; +let prefixedEventNames = {}; /** * Element to check for prefixes on. */ -var style = {}; +let style = {}; /** * Bootstrap if a DOM exists. @@ -1331,7 +1326,7 @@ if (ExecutionEnvironment_1.canUseDOM) { * Attempts to determine the correct vendor prefixed event name. * * @param {string} eventName - * @returns {string} + * @return {string} */ function getVendorPrefixedEventName(eventName) { if (prefixedEventNames[eventName]) { @@ -1340,9 +1335,9 @@ function getVendorPrefixedEventName(eventName) { return eventName; } - var prefixMap = vendorPrefixes[eventName]; + let prefixMap = vendorPrefixes[eventName]; - for (var styleProp in prefixMap) { + for (let styleProp in prefixMap) { if (prefixMap.hasOwnProperty(styleProp) && styleProp in style) { return prefixedEventNames[eventName] = prefixMap[styleProp]; } @@ -1358,98 +1353,98 @@ function getVendorPrefixedEventName(eventName) { * us save some bundle size by avoiding a top level type -> event name map. * The rest of ReactDOM code should import top level types from this file. */ -var TOP_ABORT = unsafeCastStringToDOMTopLevelType('abort'); -var TOP_ANIMATION_END = unsafeCastStringToDOMTopLevelType(getVendorPrefixedEventName('animationend')); -var TOP_ANIMATION_ITERATION = unsafeCastStringToDOMTopLevelType(getVendorPrefixedEventName('animationiteration')); -var TOP_ANIMATION_START = unsafeCastStringToDOMTopLevelType(getVendorPrefixedEventName('animationstart')); -var TOP_BLUR = unsafeCastStringToDOMTopLevelType('blur'); -var TOP_CAN_PLAY = unsafeCastStringToDOMTopLevelType('canplay'); -var TOP_CAN_PLAY_THROUGH = unsafeCastStringToDOMTopLevelType('canplaythrough'); -var TOP_CANCEL = unsafeCastStringToDOMTopLevelType('cancel'); -var TOP_CHANGE = unsafeCastStringToDOMTopLevelType('change'); -var TOP_CLICK = unsafeCastStringToDOMTopLevelType('click'); -var TOP_CLOSE = unsafeCastStringToDOMTopLevelType('close'); -var TOP_COMPOSITION_END = unsafeCastStringToDOMTopLevelType('compositionend'); -var TOP_COMPOSITION_START = unsafeCastStringToDOMTopLevelType('compositionstart'); -var TOP_COMPOSITION_UPDATE = unsafeCastStringToDOMTopLevelType('compositionupdate'); -var TOP_CONTEXT_MENU = unsafeCastStringToDOMTopLevelType('contextmenu'); -var TOP_COPY = unsafeCastStringToDOMTopLevelType('copy'); -var TOP_CUT = unsafeCastStringToDOMTopLevelType('cut'); -var TOP_DOUBLE_CLICK = unsafeCastStringToDOMTopLevelType('dblclick'); -var TOP_DRAG = unsafeCastStringToDOMTopLevelType('drag'); -var TOP_DRAG_END = unsafeCastStringToDOMTopLevelType('dragend'); -var TOP_DRAG_ENTER = unsafeCastStringToDOMTopLevelType('dragenter'); -var TOP_DRAG_EXIT = unsafeCastStringToDOMTopLevelType('dragexit'); -var TOP_DRAG_LEAVE = unsafeCastStringToDOMTopLevelType('dragleave'); -var TOP_DRAG_OVER = unsafeCastStringToDOMTopLevelType('dragover'); -var TOP_DRAG_START = unsafeCastStringToDOMTopLevelType('dragstart'); -var TOP_DROP = unsafeCastStringToDOMTopLevelType('drop'); -var TOP_DURATION_CHANGE = unsafeCastStringToDOMTopLevelType('durationchange'); -var TOP_EMPTIED = unsafeCastStringToDOMTopLevelType('emptied'); -var TOP_ENCRYPTED = unsafeCastStringToDOMTopLevelType('encrypted'); -var TOP_ENDED = unsafeCastStringToDOMTopLevelType('ended'); -var TOP_ERROR = unsafeCastStringToDOMTopLevelType('error'); -var TOP_FOCUS = unsafeCastStringToDOMTopLevelType('focus'); -var TOP_GOT_POINTER_CAPTURE = unsafeCastStringToDOMTopLevelType('gotpointercapture'); -var TOP_INPUT = unsafeCastStringToDOMTopLevelType('input'); -var TOP_INVALID = unsafeCastStringToDOMTopLevelType('invalid'); -var TOP_KEY_DOWN = unsafeCastStringToDOMTopLevelType('keydown'); -var TOP_KEY_PRESS = unsafeCastStringToDOMTopLevelType('keypress'); -var TOP_KEY_UP = unsafeCastStringToDOMTopLevelType('keyup'); -var TOP_LOAD = unsafeCastStringToDOMTopLevelType('load'); -var TOP_LOAD_START = unsafeCastStringToDOMTopLevelType('loadstart'); -var TOP_LOADED_DATA = unsafeCastStringToDOMTopLevelType('loadeddata'); -var TOP_LOADED_METADATA = unsafeCastStringToDOMTopLevelType('loadedmetadata'); -var TOP_LOST_POINTER_CAPTURE = unsafeCastStringToDOMTopLevelType('lostpointercapture'); -var TOP_MOUSE_DOWN = unsafeCastStringToDOMTopLevelType('mousedown'); -var TOP_MOUSE_MOVE = unsafeCastStringToDOMTopLevelType('mousemove'); -var TOP_MOUSE_OUT = unsafeCastStringToDOMTopLevelType('mouseout'); -var TOP_MOUSE_OVER = unsafeCastStringToDOMTopLevelType('mouseover'); -var TOP_MOUSE_UP = unsafeCastStringToDOMTopLevelType('mouseup'); -var TOP_PASTE = unsafeCastStringToDOMTopLevelType('paste'); -var TOP_PAUSE = unsafeCastStringToDOMTopLevelType('pause'); -var TOP_PLAY = unsafeCastStringToDOMTopLevelType('play'); -var TOP_PLAYING = unsafeCastStringToDOMTopLevelType('playing'); -var TOP_POINTER_CANCEL = unsafeCastStringToDOMTopLevelType('pointercancel'); -var TOP_POINTER_DOWN = unsafeCastStringToDOMTopLevelType('pointerdown'); - - -var TOP_POINTER_MOVE = unsafeCastStringToDOMTopLevelType('pointermove'); -var TOP_POINTER_OUT = unsafeCastStringToDOMTopLevelType('pointerout'); -var TOP_POINTER_OVER = unsafeCastStringToDOMTopLevelType('pointerover'); -var TOP_POINTER_UP = unsafeCastStringToDOMTopLevelType('pointerup'); -var TOP_PROGRESS = unsafeCastStringToDOMTopLevelType('progress'); -var TOP_RATE_CHANGE = unsafeCastStringToDOMTopLevelType('ratechange'); -var TOP_RESET = unsafeCastStringToDOMTopLevelType('reset'); -var TOP_SCROLL = unsafeCastStringToDOMTopLevelType('scroll'); -var TOP_SEEKED = unsafeCastStringToDOMTopLevelType('seeked'); -var TOP_SEEKING = unsafeCastStringToDOMTopLevelType('seeking'); -var TOP_SELECTION_CHANGE = unsafeCastStringToDOMTopLevelType('selectionchange'); -var TOP_STALLED = unsafeCastStringToDOMTopLevelType('stalled'); -var TOP_SUBMIT = unsafeCastStringToDOMTopLevelType('submit'); -var TOP_SUSPEND = unsafeCastStringToDOMTopLevelType('suspend'); -var TOP_TEXT_INPUT = unsafeCastStringToDOMTopLevelType('textInput'); -var TOP_TIME_UPDATE = unsafeCastStringToDOMTopLevelType('timeupdate'); -var TOP_TOGGLE = unsafeCastStringToDOMTopLevelType('toggle'); -var TOP_TOUCH_CANCEL = unsafeCastStringToDOMTopLevelType('touchcancel'); -var TOP_TOUCH_END = unsafeCastStringToDOMTopLevelType('touchend'); -var TOP_TOUCH_MOVE = unsafeCastStringToDOMTopLevelType('touchmove'); -var TOP_TOUCH_START = unsafeCastStringToDOMTopLevelType('touchstart'); -var TOP_TRANSITION_END = unsafeCastStringToDOMTopLevelType(getVendorPrefixedEventName('transitionend')); -var TOP_VOLUME_CHANGE = unsafeCastStringToDOMTopLevelType('volumechange'); -var TOP_WAITING = unsafeCastStringToDOMTopLevelType('waiting'); -var TOP_WHEEL = unsafeCastStringToDOMTopLevelType('wheel'); +let TOP_ABORT = unsafeCastStringToDOMTopLevelType('abort'); +let TOP_ANIMATION_END = unsafeCastStringToDOMTopLevelType(getVendorPrefixedEventName('animationend')); +let TOP_ANIMATION_ITERATION = unsafeCastStringToDOMTopLevelType(getVendorPrefixedEventName('animationiteration')); +let TOP_ANIMATION_START = unsafeCastStringToDOMTopLevelType(getVendorPrefixedEventName('animationstart')); +let TOP_BLUR = unsafeCastStringToDOMTopLevelType('blur'); +let TOP_CAN_PLAY = unsafeCastStringToDOMTopLevelType('canplay'); +let TOP_CAN_PLAY_THROUGH = unsafeCastStringToDOMTopLevelType('canplaythrough'); +let TOP_CANCEL = unsafeCastStringToDOMTopLevelType('cancel'); +let TOP_CHANGE = unsafeCastStringToDOMTopLevelType('change'); +let TOP_CLICK = unsafeCastStringToDOMTopLevelType('click'); +let TOP_CLOSE = unsafeCastStringToDOMTopLevelType('close'); +let TOP_COMPOSITION_END = unsafeCastStringToDOMTopLevelType('compositionend'); +let TOP_COMPOSITION_START = unsafeCastStringToDOMTopLevelType('compositionstart'); +let TOP_COMPOSITION_UPDATE = unsafeCastStringToDOMTopLevelType('compositionupdate'); +let TOP_CONTEXT_MENU = unsafeCastStringToDOMTopLevelType('contextmenu'); +let TOP_COPY = unsafeCastStringToDOMTopLevelType('copy'); +let TOP_CUT = unsafeCastStringToDOMTopLevelType('cut'); +let TOP_DOUBLE_CLICK = unsafeCastStringToDOMTopLevelType('dblclick'); +let TOP_DRAG = unsafeCastStringToDOMTopLevelType('drag'); +let TOP_DRAG_END = unsafeCastStringToDOMTopLevelType('dragend'); +let TOP_DRAG_ENTER = unsafeCastStringToDOMTopLevelType('dragenter'); +let TOP_DRAG_EXIT = unsafeCastStringToDOMTopLevelType('dragexit'); +let TOP_DRAG_LEAVE = unsafeCastStringToDOMTopLevelType('dragleave'); +let TOP_DRAG_OVER = unsafeCastStringToDOMTopLevelType('dragover'); +let TOP_DRAG_START = unsafeCastStringToDOMTopLevelType('dragstart'); +let TOP_DROP = unsafeCastStringToDOMTopLevelType('drop'); +let TOP_DURATION_CHANGE = unsafeCastStringToDOMTopLevelType('durationchange'); +let TOP_EMPTIED = unsafeCastStringToDOMTopLevelType('emptied'); +let TOP_ENCRYPTED = unsafeCastStringToDOMTopLevelType('encrypted'); +let TOP_ENDED = unsafeCastStringToDOMTopLevelType('ended'); +let TOP_ERROR = unsafeCastStringToDOMTopLevelType('error'); +let TOP_FOCUS = unsafeCastStringToDOMTopLevelType('focus'); +let TOP_GOT_POINTER_CAPTURE = unsafeCastStringToDOMTopLevelType('gotpointercapture'); +let TOP_INPUT = unsafeCastStringToDOMTopLevelType('input'); +let TOP_INVALID = unsafeCastStringToDOMTopLevelType('invalid'); +let TOP_KEY_DOWN = unsafeCastStringToDOMTopLevelType('keydown'); +let TOP_KEY_PRESS = unsafeCastStringToDOMTopLevelType('keypress'); +let TOP_KEY_UP = unsafeCastStringToDOMTopLevelType('keyup'); +let TOP_LOAD = unsafeCastStringToDOMTopLevelType('load'); +let TOP_LOAD_START = unsafeCastStringToDOMTopLevelType('loadstart'); +let TOP_LOADED_DATA = unsafeCastStringToDOMTopLevelType('loadeddata'); +let TOP_LOADED_METADATA = unsafeCastStringToDOMTopLevelType('loadedmetadata'); +let TOP_LOST_POINTER_CAPTURE = unsafeCastStringToDOMTopLevelType('lostpointercapture'); +let TOP_MOUSE_DOWN = unsafeCastStringToDOMTopLevelType('mousedown'); +let TOP_MOUSE_MOVE = unsafeCastStringToDOMTopLevelType('mousemove'); +let TOP_MOUSE_OUT = unsafeCastStringToDOMTopLevelType('mouseout'); +let TOP_MOUSE_OVER = unsafeCastStringToDOMTopLevelType('mouseover'); +let TOP_MOUSE_UP = unsafeCastStringToDOMTopLevelType('mouseup'); +let TOP_PASTE = unsafeCastStringToDOMTopLevelType('paste'); +let TOP_PAUSE = unsafeCastStringToDOMTopLevelType('pause'); +let TOP_PLAY = unsafeCastStringToDOMTopLevelType('play'); +let TOP_PLAYING = unsafeCastStringToDOMTopLevelType('playing'); +let TOP_POINTER_CANCEL = unsafeCastStringToDOMTopLevelType('pointercancel'); +let TOP_POINTER_DOWN = unsafeCastStringToDOMTopLevelType('pointerdown'); + + +let TOP_POINTER_MOVE = unsafeCastStringToDOMTopLevelType('pointermove'); +let TOP_POINTER_OUT = unsafeCastStringToDOMTopLevelType('pointerout'); +let TOP_POINTER_OVER = unsafeCastStringToDOMTopLevelType('pointerover'); +let TOP_POINTER_UP = unsafeCastStringToDOMTopLevelType('pointerup'); +let TOP_PROGRESS = unsafeCastStringToDOMTopLevelType('progress'); +let TOP_RATE_CHANGE = unsafeCastStringToDOMTopLevelType('ratechange'); +let TOP_RESET = unsafeCastStringToDOMTopLevelType('reset'); +let TOP_SCROLL = unsafeCastStringToDOMTopLevelType('scroll'); +let TOP_SEEKED = unsafeCastStringToDOMTopLevelType('seeked'); +let TOP_SEEKING = unsafeCastStringToDOMTopLevelType('seeking'); +let TOP_SELECTION_CHANGE = unsafeCastStringToDOMTopLevelType('selectionchange'); +let TOP_STALLED = unsafeCastStringToDOMTopLevelType('stalled'); +let TOP_SUBMIT = unsafeCastStringToDOMTopLevelType('submit'); +let TOP_SUSPEND = unsafeCastStringToDOMTopLevelType('suspend'); +let TOP_TEXT_INPUT = unsafeCastStringToDOMTopLevelType('textInput'); +let TOP_TIME_UPDATE = unsafeCastStringToDOMTopLevelType('timeupdate'); +let TOP_TOGGLE = unsafeCastStringToDOMTopLevelType('toggle'); +let TOP_TOUCH_CANCEL = unsafeCastStringToDOMTopLevelType('touchcancel'); +let TOP_TOUCH_END = unsafeCastStringToDOMTopLevelType('touchend'); +let TOP_TOUCH_MOVE = unsafeCastStringToDOMTopLevelType('touchmove'); +let TOP_TOUCH_START = unsafeCastStringToDOMTopLevelType('touchstart'); +let TOP_TRANSITION_END = unsafeCastStringToDOMTopLevelType(getVendorPrefixedEventName('transitionend')); +let TOP_VOLUME_CHANGE = unsafeCastStringToDOMTopLevelType('volumechange'); +let TOP_WAITING = unsafeCastStringToDOMTopLevelType('waiting'); +let TOP_WHEEL = unsafeCastStringToDOMTopLevelType('wheel'); // List of events that need to be individually attached to media elements. // Note that events in this list will *not* be listened to at the top level // unless they're explicitly whitelisted in `ReactBrowserEventEmitter.listenTo`. -var mediaEventTypes = [TOP_ABORT, TOP_CAN_PLAY, TOP_CAN_PLAY_THROUGH, TOP_DURATION_CHANGE, TOP_EMPTIED, TOP_ENCRYPTED, TOP_ENDED, TOP_ERROR, TOP_LOADED_DATA, TOP_LOADED_METADATA, TOP_LOAD_START, TOP_PAUSE, TOP_PLAY, TOP_PLAYING, TOP_PROGRESS, TOP_RATE_CHANGE, TOP_SEEKED, TOP_SEEKING, TOP_STALLED, TOP_SUSPEND, TOP_TIME_UPDATE, TOP_VOLUME_CHANGE, TOP_WAITING]; +let mediaEventTypes = [TOP_ABORT, TOP_CAN_PLAY, TOP_CAN_PLAY_THROUGH, TOP_DURATION_CHANGE, TOP_EMPTIED, TOP_ENCRYPTED, TOP_ENDED, TOP_ERROR, TOP_LOADED_DATA, TOP_LOADED_METADATA, TOP_LOAD_START, TOP_PAUSE, TOP_PLAY, TOP_PLAYING, TOP_PROGRESS, TOP_RATE_CHANGE, TOP_SEEKED, TOP_SEEKING, TOP_STALLED, TOP_SUSPEND, TOP_TIME_UPDATE, TOP_VOLUME_CHANGE, TOP_WAITING]; function getRawEventName(topLevelType) { return unsafeCastDOMTopLevelTypeToString(topLevelType); } -var contentKey = null; +let contentKey = null; /** * Gets the key used to access text content on a DOM node. @@ -1477,10 +1472,10 @@ function getTextContentAccessor() { * * */ -var compositionState = { +let compositionState = { _root: null, _startText: null, - _fallbackText: null + _fallbackText: null, }; function initialize(nativeEventTarget) { @@ -1500,12 +1495,12 @@ function getData() { return compositionState._fallbackText; } - var start = void 0; - var startValue = compositionState._startText; - var startLength = startValue.length; - var end = void 0; - var endValue = getText(); - var endLength = endValue.length; + let start = void 0; + let startValue = compositionState._startText; + let startLength = startValue.length; + let end = void 0; + let endValue = getText(); + let endLength = endValue.length; for (start = 0; start < startLength; start++) { if (startValue[start] !== endValue[start]) { @@ -1513,14 +1508,14 @@ function getData() { } } - var minEnd = startLength - start; + let minEnd = startLength - start; for (end = 1; end <= minEnd; end++) { if (startValue[startLength - end] !== endValue[endLength - end]) { break; } } - var sliceTail = end > 1 ? 1 - end : undefined; + let sliceTail = end > 1 ? 1 - end : undefined; compositionState._fallbackText = endValue.slice(start, sliceTail); return compositionState._fallbackText; } @@ -1532,22 +1527,22 @@ function getText() { return compositionState._root[getTextContentAccessor()]; } -var ReactInternals = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED; +let ReactInternals = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED; -var _assign = ReactInternals.assign; +let _assign = ReactInternals.assign; /* eslint valid-typeof: 0 */ -var didWarnForAddedNewProperty = false; -var EVENT_POOL_SIZE = 10; +let didWarnForAddedNewProperty = false; +let EVENT_POOL_SIZE = 10; -var shouldBeReleasedProperties = ['dispatchConfig', '_targetInst', 'nativeEvent', 'isDefaultPrevented', 'isPropagationStopped', '_dispatchListeners', '_dispatchInstances']; +let shouldBeReleasedProperties = ['dispatchConfig', '_targetInst', 'nativeEvent', 'isDefaultPrevented', 'isPropagationStopped', '_dispatchListeners', '_dispatchInstances']; /** * @interface Event * @see http://www.w3.org/TR/DOM-Level-3-Events/ */ -var EventInterface = { +let EventInterface = { type: null, target: null, // currentTarget is set when dispatching; no use in copying it here @@ -1555,11 +1550,11 @@ var EventInterface = { eventPhase: null, bubbles: null, cancelable: null, - timeStamp: function (event) { + timeStamp: function(event) { return event.timeStamp || Date.now(); }, defaultPrevented: null, - isTrusted: null + isTrusted: null, }; /** @@ -1592,15 +1587,15 @@ function SyntheticEvent(dispatchConfig, targetInst, nativeEvent, nativeEventTarg this._targetInst = targetInst; this.nativeEvent = nativeEvent; - var Interface = this.constructor.Interface; - for (var propName in Interface) { + let Interface = this.constructor.Interface; + for (let propName in Interface) { if (!Interface.hasOwnProperty(propName)) { continue; } { delete this[propName]; // this has a getter/setter for warnings } - var normalize = Interface[propName]; + let normalize = Interface[propName]; if (normalize) { this[propName] = normalize(nativeEvent); } else { @@ -1612,7 +1607,7 @@ function SyntheticEvent(dispatchConfig, targetInst, nativeEvent, nativeEventTarg } } - var defaultPrevented = nativeEvent.defaultPrevented != null ? nativeEvent.defaultPrevented : nativeEvent.returnValue === false; + let defaultPrevented = nativeEvent.defaultPrevented != null ? nativeEvent.defaultPrevented : nativeEvent.returnValue === false; if (defaultPrevented) { this.isDefaultPrevented = emptyFunction_1.thatReturnsTrue; } else { @@ -1623,9 +1618,9 @@ function SyntheticEvent(dispatchConfig, targetInst, nativeEvent, nativeEventTarg } _assign(SyntheticEvent.prototype, { - preventDefault: function () { + preventDefault: function() { this.defaultPrevented = true; - var event = this.nativeEvent; + let event = this.nativeEvent; if (!event) { return; } @@ -1638,8 +1633,8 @@ _assign(SyntheticEvent.prototype, { this.isDefaultPrevented = emptyFunction_1.thatReturnsTrue; }, - stopPropagation: function () { - var event = this.nativeEvent; + stopPropagation: function() { + let event = this.nativeEvent; if (!event) { return; } @@ -1663,7 +1658,7 @@ _assign(SyntheticEvent.prototype, { * them back into the pool. This allows a way to hold onto a reference that * won't be added back into the pool. */ - persist: function () { + persist: function() { this.isPersistent = emptyFunction_1.thatReturnsTrue; }, @@ -1677,14 +1672,14 @@ _assign(SyntheticEvent.prototype, { /** * `PooledClass` looks for `destructor` on each instance it releases. */ - destructor: function () { - var Interface = this.constructor.Interface; - for (var propName in Interface) { + destructor: function() { + let Interface = this.constructor.Interface; + for (let propName in Interface) { { Object.defineProperty(this, propName, getPooledWarningPropertyDefinition(propName, Interface[propName])); } } - for (var i = 0; i < shouldBeReleasedProperties.length; i++) { + for (let i = 0; i < shouldBeReleasedProperties.length; i++) { this[shouldBeReleasedProperties[i]] = null; } { @@ -1692,7 +1687,7 @@ _assign(SyntheticEvent.prototype, { Object.defineProperty(this, 'preventDefault', getPooledWarningPropertyDefinition('preventDefault', emptyFunction_1)); Object.defineProperty(this, 'stopPropagation', getPooledWarningPropertyDefinition('stopPropagation', emptyFunction_1)); } - } + }, }); SyntheticEvent.Interface = EventInterface; @@ -1700,12 +1695,12 @@ SyntheticEvent.Interface = EventInterface; /** * Helper to reduce boilerplate when creating subclasses. */ -SyntheticEvent.extend = function (Interface) { - var Super = this; +SyntheticEvent.extend = function(Interface) { + let Super = this; - var E = function () {}; + let E = function() {}; E.prototype = Super.prototype; - var prototype = new E(); + let prototype = new E(); function Class() { return Super.apply(this, arguments); @@ -1726,30 +1721,30 @@ SyntheticEvent.extend = function (Interface) { * in which some Event properties are set to undefined (GH#10010) */ { - var isProxySupported = typeof Proxy === 'function' && + let isProxySupported = typeof Proxy === 'function' && // https://github.com/facebook/react/issues/12011 !Object.isSealed(new Proxy({}, {})); if (isProxySupported) { - /*eslint-disable no-func-assign */ + /* eslint-disable no-func-assign */ SyntheticEvent = new Proxy(SyntheticEvent, { - construct: function (target, args) { + construct: function(target, args) { return this.apply(target, Object.create(target.prototype), args); }, - apply: function (constructor, that, args) { + apply: function(constructor, that, args) { return new Proxy(constructor.apply(that, args), { - set: function (target, prop, value) { + set: function(target, prop, value) { if (prop !== 'isPersistent' && !target.constructor.Interface.hasOwnProperty(prop) && shouldBeReleasedProperties.indexOf(prop) === -1) { - !(didWarnForAddedNewProperty || target.isPersistent()) ? warning_1(false, "This synthetic event is reused for performance reasons. If you're " + "seeing this, you're adding a new property in the synthetic event object. " + 'The property is never released. See ' + 'https://fb.me/react-event-pooling for more information.') : void 0; + !(didWarnForAddedNewProperty || target.isPersistent()) ? warning_1(false, 'This synthetic event is reused for performance reasons. If you\'re ' + 'seeing this, you\'re adding a new property in the synthetic event object. ' + 'The property is never released. See ' + 'https://fb.me/react-event-pooling for more information.') : void 0; didWarnForAddedNewProperty = true; } target[prop] = value; return true; - } + }, }); - } + }, }); - /*eslint-enable no-func-assign */ + /* eslint-enable no-func-assign */ } } @@ -1763,36 +1758,36 @@ addEventPoolingTo(SyntheticEvent); * @return {object} defineProperty object */ function getPooledWarningPropertyDefinition(propName, getVal) { - var isFunction = typeof getVal === 'function'; + let isFunction = typeof getVal === 'function'; return { configurable: true, set: set, - get: get + get: get, }; function set(val) { - var action = isFunction ? 'setting the method' : 'setting the property'; + let action = isFunction ? 'setting the method' : 'setting the property'; warn(action, 'This is effectively a no-op'); return val; } function get() { - var action = isFunction ? 'accessing the method' : 'accessing the property'; - var result = isFunction ? 'This is a no-op function' : 'This is set to null'; + let action = isFunction ? 'accessing the method' : 'accessing the property'; + let result = isFunction ? 'This is a no-op function' : 'This is set to null'; warn(action, result); return getVal; } function warn(action, result) { - var warningCondition = false; - !warningCondition ? warning_1(false, "This synthetic event is reused for performance reasons. If you're seeing this, " + "you're %s `%s` on a released/nullified synthetic event. %s. " + 'If you must keep the original synthetic event around, use event.persist(). ' + 'See https://fb.me/react-event-pooling for more information.', action, propName, result) : void 0; + let warningCondition = false; + !warningCondition ? warning_1(false, 'This synthetic event is reused for performance reasons. If you\'re seeing this, ' + 'you\'re %s `%s` on a released/nullified synthetic event. %s. ' + 'If you must keep the original synthetic event around, use event.persist(). ' + 'See https://fb.me/react-event-pooling for more information.', action, propName, result) : void 0; } } function getPooledEvent(dispatchConfig, targetInst, nativeEvent, nativeInst) { - var EventConstructor = this; + let EventConstructor = this; if (EventConstructor.eventPool.length) { - var instance = EventConstructor.eventPool.pop(); + let instance = EventConstructor.eventPool.pop(); EventConstructor.call(instance, dispatchConfig, targetInst, nativeEvent, nativeInst); return instance; } @@ -1800,7 +1795,7 @@ function getPooledEvent(dispatchConfig, targetInst, nativeEvent, nativeInst) { } function releasePooledEvent(event) { - var EventConstructor = this; + let EventConstructor = this; !(event instanceof EventConstructor) ? invariant_1(false, 'Trying to release an event instance into a pool of a different type.') : void 0; event.destructor(); if (EventConstructor.eventPool.length < EVENT_POOL_SIZE) { @@ -1814,14 +1809,14 @@ function addEventPoolingTo(EventConstructor) { EventConstructor.release = releasePooledEvent; } -var SyntheticEvent$1 = SyntheticEvent; +let SyntheticEvent$1 = SyntheticEvent; /** * @interface Event * @see http://www.w3.org/TR/DOM-Level-3-Events/#events-compositionevents */ -var SyntheticCompositionEvent = SyntheticEvent$1.extend({ - data: null +let SyntheticCompositionEvent = SyntheticEvent$1.extend({ + data: null, }); /** @@ -1829,16 +1824,16 @@ var SyntheticCompositionEvent = SyntheticEvent$1.extend({ * @see http://www.w3.org/TR/2013/WD-DOM-Level-3-Events-20131105 * /#events-inputevents */ -var SyntheticInputEvent = SyntheticEvent$1.extend({ - data: null +let SyntheticInputEvent = SyntheticEvent$1.extend({ + data: null, }); -var END_KEYCODES = [9, 13, 27, 32]; // Tab, Return, Esc, Space -var START_KEYCODE = 229; +let END_KEYCODES = [9, 13, 27, 32]; // Tab, Return, Esc, Space +let START_KEYCODE = 229; -var canUseCompositionEvent = ExecutionEnvironment_1.canUseDOM && 'CompositionEvent' in window; +let canUseCompositionEvent = ExecutionEnvironment_1.canUseDOM && 'CompositionEvent' in window; -var documentMode = null; +let documentMode = null; if (ExecutionEnvironment_1.canUseDOM && 'documentMode' in document) { documentMode = document.documentMode; } @@ -1846,50 +1841,50 @@ if (ExecutionEnvironment_1.canUseDOM && 'documentMode' in document) { // Webkit offers a very useful `textInput` event that can be used to // directly represent `beforeInput`. The IE `textinput` event is not as // useful, so we don't use it. -var canUseTextInputEvent = ExecutionEnvironment_1.canUseDOM && 'TextEvent' in window && !documentMode; +let canUseTextInputEvent = ExecutionEnvironment_1.canUseDOM && 'TextEvent' in window && !documentMode; // In IE9+, we have access to composition events, but the data supplied // by the native compositionend event may be incorrect. Japanese ideographic // spaces, for instance (\u3000) are not recorded correctly. -var useFallbackCompositionData = ExecutionEnvironment_1.canUseDOM && (!canUseCompositionEvent || documentMode && documentMode > 8 && documentMode <= 11); +let useFallbackCompositionData = ExecutionEnvironment_1.canUseDOM && (!canUseCompositionEvent || documentMode && documentMode > 8 && documentMode <= 11); -var SPACEBAR_CODE = 32; -var SPACEBAR_CHAR = String.fromCharCode(SPACEBAR_CODE); +let SPACEBAR_CODE = 32; +let SPACEBAR_CHAR = String.fromCharCode(SPACEBAR_CODE); // Events and their corresponding property names. -var eventTypes = { +let eventTypes = { beforeInput: { phasedRegistrationNames: { bubbled: 'onBeforeInput', - captured: 'onBeforeInputCapture' + captured: 'onBeforeInputCapture', }, - dependencies: [TOP_COMPOSITION_END, TOP_KEY_PRESS, TOP_TEXT_INPUT, TOP_PASTE] + dependencies: [TOP_COMPOSITION_END, TOP_KEY_PRESS, TOP_TEXT_INPUT, TOP_PASTE], }, compositionEnd: { phasedRegistrationNames: { bubbled: 'onCompositionEnd', - captured: 'onCompositionEndCapture' + captured: 'onCompositionEndCapture', }, - dependencies: [TOP_BLUR, TOP_COMPOSITION_END, TOP_KEY_DOWN, TOP_KEY_PRESS, TOP_KEY_UP, TOP_MOUSE_DOWN] + dependencies: [TOP_BLUR, TOP_COMPOSITION_END, TOP_KEY_DOWN, TOP_KEY_PRESS, TOP_KEY_UP, TOP_MOUSE_DOWN], }, compositionStart: { phasedRegistrationNames: { bubbled: 'onCompositionStart', - captured: 'onCompositionStartCapture' + captured: 'onCompositionStartCapture', }, - dependencies: [TOP_BLUR, TOP_COMPOSITION_START, TOP_KEY_DOWN, TOP_KEY_PRESS, TOP_KEY_UP, TOP_MOUSE_DOWN] + dependencies: [TOP_BLUR, TOP_COMPOSITION_START, TOP_KEY_DOWN, TOP_KEY_PRESS, TOP_KEY_UP, TOP_MOUSE_DOWN], }, compositionUpdate: { phasedRegistrationNames: { bubbled: 'onCompositionUpdate', - captured: 'onCompositionUpdateCapture' + captured: 'onCompositionUpdateCapture', }, - dependencies: [TOP_BLUR, TOP_COMPOSITION_UPDATE, TOP_KEY_DOWN, TOP_KEY_PRESS, TOP_KEY_UP, TOP_MOUSE_DOWN] - } + dependencies: [TOP_BLUR, TOP_COMPOSITION_UPDATE, TOP_KEY_DOWN, TOP_KEY_PRESS, TOP_KEY_UP, TOP_MOUSE_DOWN], + }, }; // Track whether we've ever handled a keypress on the space key. -var hasSpaceKeypress = false; +let hasSpaceKeypress = false; /** * Return whether a native keypress event is assumed to be a command. @@ -1967,7 +1962,7 @@ function isFallbackCompositionEnd(topLevelType, nativeEvent) { * @return {?string} */ function getDataFromCustomEvent(nativeEvent) { - var detail = nativeEvent.detail; + let detail = nativeEvent.detail; if (typeof detail === 'object' && 'data' in detail) { return detail.data; } @@ -1975,14 +1970,14 @@ function getDataFromCustomEvent(nativeEvent) { } // Track the current IME composition status, if any. -var isComposing = false; +let isComposing = false; /** * @return {?object} A SyntheticCompositionEvent. */ function extractCompositionEvent(topLevelType, targetInst, nativeEvent, nativeEventTarget) { - var eventType = void 0; - var fallbackData = void 0; + let eventType = void 0; + let fallbackData = void 0; if (canUseCompositionEvent) { eventType = getCompositionEventType(topLevelType); @@ -2010,14 +2005,14 @@ function extractCompositionEvent(topLevelType, targetInst, nativeEvent, nativeEv } } - var event = SyntheticCompositionEvent.getPooled(eventType, targetInst, nativeEvent, nativeEventTarget); + let event = SyntheticCompositionEvent.getPooled(eventType, targetInst, nativeEvent, nativeEventTarget); if (fallbackData) { // Inject data generated from fallback path into the synthetic event. // This matches the property of native CompositionEventInterface. event.data = fallbackData; } else { - var customData = getDataFromCustomEvent(nativeEvent); + let customData = getDataFromCustomEvent(nativeEvent); if (customData !== null) { event.data = customData; } @@ -2093,7 +2088,7 @@ function getFallbackBeforeInputChars(topLevelType, nativeEvent) { // compositionevent, otherwise extract it at fallback events. if (isComposing) { if (topLevelType === TOP_COMPOSITION_END || !canUseCompositionEvent && isFallbackCompositionEnd(topLevelType, nativeEvent)) { - var chars = getData(); + let chars = getData(); reset(); isComposing = false; return chars; @@ -2151,7 +2146,7 @@ function getFallbackBeforeInputChars(topLevelType, nativeEvent) { * @return {?object} A SyntheticInputEvent. */ function extractBeforeInputEvent(topLevelType, targetInst, nativeEvent, nativeEventTarget) { - var chars = void 0; + let chars = void 0; if (canUseTextInputEvent) { chars = getNativeBeforeInputChars(topLevelType, nativeEvent); @@ -2165,7 +2160,7 @@ function extractBeforeInputEvent(topLevelType, targetInst, nativeEvent, nativeEv return null; } - var event = SyntheticInputEvent.getPooled(eventTypes.beforeInput, targetInst, nativeEvent, nativeEventTarget); + let event = SyntheticInputEvent.getPooled(eventTypes.beforeInput, targetInst, nativeEvent, nativeEventTarget); event.data = chars; accumulateTwoPhaseDispatches(event); @@ -2190,13 +2185,13 @@ function extractBeforeInputEvent(topLevelType, targetInst, nativeEvent, nativeEv * allowing us to share composition fallback code for both `beforeInput` and * `composition` event types. */ -var BeforeInputEventPlugin = { +let BeforeInputEventPlugin = { eventTypes: eventTypes, - extractEvents: function (topLevelType, targetInst, nativeEvent, nativeEventTarget) { - var composition = extractCompositionEvent(topLevelType, targetInst, nativeEvent, nativeEventTarget); + extractEvents: function(topLevelType, targetInst, nativeEvent, nativeEventTarget) { + let composition = extractCompositionEvent(topLevelType, targetInst, nativeEvent, nativeEventTarget); - var beforeInput = extractBeforeInputEvent(topLevelType, targetInst, nativeEvent, nativeEventTarget); + let beforeInput = extractBeforeInputEvent(topLevelType, targetInst, nativeEvent, nativeEventTarget); if (composition === null) { return beforeInput; @@ -2207,38 +2202,38 @@ var BeforeInputEventPlugin = { } return [composition, beforeInput]; - } + }, }; // Use to restore controlled state after a change event has fired. -var fiberHostComponent = null; +let fiberHostComponent = null; -var ReactControlledComponentInjection = { - injectFiberControlledHostComponent: function (hostComponentImpl) { +let ReactControlledComponentInjection = { + injectFiberControlledHostComponent: function(hostComponentImpl) { // The fiber implementation doesn't use dynamic dispatch so we need to // inject the implementation. fiberHostComponent = hostComponentImpl; - } + }, }; -var restoreTarget = null; -var restoreQueue = null; +let restoreTarget = null; +let restoreQueue = null; function restoreStateOfTarget(target) { // We perform this translation at the end of the event loop so that we // always receive the correct fiber here - var internalInstance = getInstanceFromNode(target); + let internalInstance = getInstanceFromNode(target); if (!internalInstance) { // Unmounted return; } !(fiberHostComponent && typeof fiberHostComponent.restoreControlledState === 'function') ? invariant_1(false, 'Fiber needs to be injected to handle a fiber target for controlled events. This error is likely caused by a bug in React. Please file an issue.') : void 0; - var props = getFiberCurrentPropsFromNode(internalInstance.stateNode); + let props = getFiberCurrentPropsFromNode(internalInstance.stateNode); fiberHostComponent.restoreControlledState(internalInstance.stateNode, internalInstance.type, props); } -var injection$2 = ReactControlledComponentInjection; +let injection$2 = ReactControlledComponentInjection; function enqueueStateRestore(target) { if (restoreTarget) { @@ -2260,24 +2255,24 @@ function restoreStateIfNeeded() { if (!restoreTarget) { return; } - var target = restoreTarget; - var queuedTargets = restoreQueue; + let target = restoreTarget; + let queuedTargets = restoreQueue; restoreTarget = null; restoreQueue = null; restoreStateOfTarget(target); if (queuedTargets) { - for (var i = 0; i < queuedTargets.length; i++) { + for (let i = 0; i < queuedTargets.length; i++) { restoreStateOfTarget(queuedTargets[i]); } } } -var ReactControlledComponent = Object.freeze({ +let ReactControlledComponent = Object.freeze({ injection: injection$2, enqueueStateRestore: enqueueStateRestore, needsStateRestore: needsStateRestore, - restoreStateIfNeeded: restoreStateIfNeeded + restoreStateIfNeeded: restoreStateIfNeeded, }); // Used as a way to call batchedUpdates when we don't have a reference to @@ -2287,15 +2282,15 @@ var ReactControlledComponent = Object.freeze({ // scheduled work and instead do synchronous work. // Defaults -var _batchedUpdates = function (fn, bookkeeping) { +let _batchedUpdates = function(fn, bookkeeping) { return fn(bookkeeping); }; -var _interactiveUpdates = function (fn, a, b) { +let _interactiveUpdates = function(fn, a, b) { return fn(a, b); }; -var _flushInteractiveUpdates = function () {}; +let _flushInteractiveUpdates = function() {}; -var isBatching = false; +let isBatching = false; function batchedUpdates(fn, bookkeeping) { if (isBatching) { // If we are currently inside another batch, we need to wait until it @@ -2311,7 +2306,7 @@ function batchedUpdates(fn, bookkeeping) { // https://github.com/facebook/react/issues/1698 // Then we restore state of any controlled component. isBatching = false; - var controlledComponentsHavePendingUpdates = needsStateRestore(); + let controlledComponentsHavePendingUpdates = needsStateRestore(); if (controlledComponentsHavePendingUpdates) { // If a controlled event was fired, we may need to restore the state of // the DOM node back to the controlled value. This is necessary when React @@ -2327,38 +2322,37 @@ function interactiveUpdates(fn, a, b) { } - -var injection$3 = { - injectRenderer: function (renderer) { +let injection$3 = { + injectRenderer: function(renderer) { _batchedUpdates = renderer.batchedUpdates; _interactiveUpdates = renderer.interactiveUpdates; _flushInteractiveUpdates = renderer.flushInteractiveUpdates; - } + }, }; /** * @see http://www.whatwg.org/specs/web-apps/current-work/multipage/the-input-element.html#input-type-attr-summary */ -var supportedInputTypes = { - color: true, - date: true, - datetime: true, +let supportedInputTypes = { + 'color': true, + 'date': true, + 'datetime': true, 'datetime-local': true, - email: true, - month: true, - number: true, - password: true, - range: true, - search: true, - tel: true, - text: true, - time: true, - url: true, - week: true + 'email': true, + 'month': true, + 'number': true, + 'password': true, + 'range': true, + 'search': true, + 'tel': true, + 'text': true, + 'time': true, + 'url': true, + 'week': true, }; function isTextInputElement(elem) { - var nodeName = elem && elem.nodeName && elem.nodeName.toLowerCase(); + let nodeName = elem && elem.nodeName && elem.nodeName.toLowerCase(); if (nodeName === 'input') { return !!supportedInputTypes[elem.type]; @@ -2375,11 +2369,11 @@ function isTextInputElement(elem) { * HTML nodeType values that represent the type of the node */ -var ELEMENT_NODE = 1; -var TEXT_NODE = 3; -var COMMENT_NODE = 8; -var DOCUMENT_NODE = 9; -var DOCUMENT_FRAGMENT_NODE = 11; +let ELEMENT_NODE = 1; +let TEXT_NODE = 3; +let COMMENT_NODE = 8; +let DOCUMENT_NODE = 9; +let DOCUMENT_FRAGMENT_NODE = 11; /** * Gets the target node from a native browser event by accounting for @@ -2391,7 +2385,7 @@ var DOCUMENT_FRAGMENT_NODE = 11; function getEventTarget(nativeEvent) { // Fallback to nativeEvent.srcElement for IE9 // https://github.com/facebook/react/issues/12506 - var target = nativeEvent.target || nativeEvent.srcElement || window; + let target = nativeEvent.target || nativeEvent.srcElement || window; // Normalize SVG element events #4963 if (target.correspondingUseElement) { @@ -2422,11 +2416,11 @@ function isEventSupported(eventNameSuffix, capture) { return false; } - var eventName = 'on' + eventNameSuffix; - var isSupported = eventName in document; + let eventName = 'on' + eventNameSuffix; + let isSupported = eventName in document; if (!isSupported) { - var element = document.createElement('div'); + let element = document.createElement('div'); element.setAttribute(eventName, 'return;'); isSupported = typeof element[eventName] === 'function'; } @@ -2435,8 +2429,8 @@ function isEventSupported(eventNameSuffix, capture) { } function isCheckable(elem) { - var type = elem.type; - var nodeName = elem.nodeName; + let type = elem.type; + let nodeName = elem.nodeName; return nodeName && nodeName.toLowerCase() === 'input' && (type === 'checkbox' || type === 'radio'); } @@ -2449,7 +2443,7 @@ function detachTracker(node) { } function getValueFromNode(node) { - var value = ''; + let value = ''; if (!node) { return value; } @@ -2464,10 +2458,10 @@ function getValueFromNode(node) { } function trackValueOnNode(node) { - var valueField = isCheckable(node) ? 'checked' : 'value'; - var descriptor = Object.getOwnPropertyDescriptor(node.constructor.prototype, valueField); + let valueField = isCheckable(node) ? 'checked' : 'value'; + let descriptor = Object.getOwnPropertyDescriptor(node.constructor.prototype, valueField); - var currentValue = '' + node[valueField]; + let currentValue = '' + node[valueField]; // if someone has already defined a value or Safari, then bail // and don't track value will cause over reporting of changes, @@ -2476,38 +2470,40 @@ function trackValueOnNode(node) { if (node.hasOwnProperty(valueField) || typeof descriptor === 'undefined' || typeof descriptor.get !== 'function' || typeof descriptor.set !== 'function') { return; } - var get = descriptor.get, - set = descriptor.set; + let get = descriptor.get; + + +let set = descriptor.set; Object.defineProperty(node, valueField, { configurable: true, - get: function () { + get: function() { return get.call(this); }, - set: function (value) { + set: function(value) { currentValue = '' + value; set.call(this, value); - } + }, }); // We could've passed this the first time // but it triggers a bug in IE11 and Edge 14/15. // Calling defineProperty() again should be equivalent. // https://github.com/facebook/react/issues/11768 Object.defineProperty(node, valueField, { - enumerable: descriptor.enumerable + enumerable: descriptor.enumerable, }); - var tracker = { - getValue: function () { + let tracker = { + getValue: function() { return currentValue; }, - setValue: function (value) { + setValue: function(value) { currentValue = '' + value; }, - stopTracking: function () { + stopTracking: function() { detachTracker(node); delete node[valueField]; - } + }, }; return tracker; } @@ -2526,15 +2522,15 @@ function updateValueIfChanged(node) { return false; } - var tracker = getTracker(node); + let tracker = getTracker(node); // if there is no tracker at this point it's unlikely // that trying again will succeed if (!tracker) { return true; } - var lastValue = tracker.getValue(); - var nextValue = getValueFromNode(node); + let lastValue = tracker.getValue(); + let nextValue = getValueFromNode(node); if (nextValue !== lastValue) { tracker.setValue(nextValue); return true; @@ -2542,38 +2538,38 @@ function updateValueIfChanged(node) { return false; } -var ReactInternals$1 = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED; +let ReactInternals$1 = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED; -var ReactCurrentOwner = ReactInternals$1.ReactCurrentOwner; -var ReactDebugCurrentFrame = ReactInternals$1.ReactDebugCurrentFrame; +let ReactCurrentOwner = ReactInternals$1.ReactCurrentOwner; +let ReactDebugCurrentFrame = ReactInternals$1.ReactDebugCurrentFrame; -var describeComponentFrame = function (name, source, ownerName) { +let describeComponentFrame = function(name, source, ownerName) { return '\n in ' + (name || 'Unknown') + (source ? ' (at ' + source.fileName.replace(/^.*[\\\/]/, '') + ':' + source.lineNumber + ')' : ownerName ? ' (created by ' + ownerName + ')' : ''); }; // The Symbol used to tag the ReactElement-like types. If there is no native Symbol // nor polyfill, then a plain number is used for performance. -var hasSymbol = typeof Symbol === 'function' && Symbol.for; - -var REACT_ELEMENT_TYPE = hasSymbol ? Symbol.for('react.element') : 0xeac7; -var REACT_PORTAL_TYPE = hasSymbol ? Symbol.for('react.portal') : 0xeaca; -var REACT_FRAGMENT_TYPE = hasSymbol ? Symbol.for('react.fragment') : 0xeacb; -var REACT_STRICT_MODE_TYPE = hasSymbol ? Symbol.for('react.strict_mode') : 0xeacc; -var REACT_PROFILER_TYPE = hasSymbol ? Symbol.for('react.profiler') : 0xead2; -var REACT_PROVIDER_TYPE = hasSymbol ? Symbol.for('react.provider') : 0xeacd; -var REACT_CONTEXT_TYPE = hasSymbol ? Symbol.for('react.context') : 0xeace; -var REACT_ASYNC_MODE_TYPE = hasSymbol ? Symbol.for('react.async_mode') : 0xeacf; -var REACT_FORWARD_REF_TYPE = hasSymbol ? Symbol.for('react.forward_ref') : 0xead0; -var REACT_TIMEOUT_TYPE = hasSymbol ? Symbol.for('react.timeout') : 0xead1; - -var MAYBE_ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator; -var FAUX_ITERATOR_SYMBOL = '@@iterator'; +let hasSymbol = typeof Symbol === 'function' && Symbol.for; + +let REACT_ELEMENT_TYPE = hasSymbol ? Symbol.for('react.element') : 0xeac7; +let REACT_PORTAL_TYPE = hasSymbol ? Symbol.for('react.portal') : 0xeaca; +let REACT_FRAGMENT_TYPE = hasSymbol ? Symbol.for('react.fragment') : 0xeacb; +let REACT_STRICT_MODE_TYPE = hasSymbol ? Symbol.for('react.strict_mode') : 0xeacc; +let REACT_PROFILER_TYPE = hasSymbol ? Symbol.for('react.profiler') : 0xead2; +let REACT_PROVIDER_TYPE = hasSymbol ? Symbol.for('react.provider') : 0xeacd; +let REACT_CONTEXT_TYPE = hasSymbol ? Symbol.for('react.context') : 0xeace; +let REACT_ASYNC_MODE_TYPE = hasSymbol ? Symbol.for('react.async_mode') : 0xeacf; +let REACT_FORWARD_REF_TYPE = hasSymbol ? Symbol.for('react.forward_ref') : 0xead0; +let REACT_TIMEOUT_TYPE = hasSymbol ? Symbol.for('react.timeout') : 0xead1; + +let MAYBE_ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator; +let FAUX_ITERATOR_SYMBOL = '@@iterator'; function getIteratorFn(maybeIterable) { if (maybeIterable === null || typeof maybeIterable === 'undefined') { return null; } - var maybeIterator = MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL]; + let maybeIterator = MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL]; if (typeof maybeIterator === 'function') { return maybeIterator; } @@ -2581,7 +2577,7 @@ function getIteratorFn(maybeIterable) { } function getComponentName(fiber) { - var type = fiber.type; + let type = fiber.type; if (typeof type === 'function') { return type.displayName || type.name; @@ -2640,8 +2636,8 @@ function describeFiber(fiber) { // only during begin or complete phase. Do not call it under any other // circumstances. function getStackAddendumByWorkInProgressFiber(workInProgress) { - var info = ''; - var node = workInProgress; + let info = ''; + let node = workInProgress; do { info += describeFiber(node); // Otherwise this return pointer might point to the wrong tree: @@ -2652,11 +2648,11 @@ function getStackAddendumByWorkInProgressFiber(workInProgress) { function getCurrentFiberOwnerName$1() { { - var fiber = ReactDebugCurrentFiber.current; + let fiber = ReactDebugCurrentFiber.current; if (fiber === null) { return null; } - var owner = fiber._debugOwner; + let owner = fiber._debugOwner; if (owner !== null && typeof owner !== 'undefined') { return getComponentName(owner); } @@ -2666,7 +2662,7 @@ function getCurrentFiberOwnerName$1() { function getCurrentFiberStackAddendum$1() { { - var fiber = ReactDebugCurrentFiber.current; + let fiber = ReactDebugCurrentFiber.current; if (fiber === null) { return null; } @@ -2700,54 +2696,54 @@ var ReactDebugCurrentFiber = { setCurrentFiber: setCurrentFiber, setCurrentPhase: setCurrentPhase, getCurrentFiberOwnerName: getCurrentFiberOwnerName$1, - getCurrentFiberStackAddendum: getCurrentFiberStackAddendum$1 + getCurrentFiberStackAddendum: getCurrentFiberStackAddendum$1, }; // A reserved attribute. // It is handled by React separately and shouldn't be written to the DOM. -var RESERVED = 0; +let RESERVED = 0; // A simple string attribute. // Attributes that aren't in the whitelist are presumed to have this type. -var STRING = 1; +let STRING = 1; // A string attribute that accepts booleans in React. In HTML, these are called // "enumerated" attributes with "true" and "false" as possible values. // When true, it should be set to a "true" string. // When false, it should be set to a "false" string. -var BOOLEANISH_STRING = 2; +let BOOLEANISH_STRING = 2; // A real boolean attribute. // When true, it should be present (set either to an empty string or its name). // When false, it should be omitted. -var BOOLEAN = 3; +let BOOLEAN = 3; // An attribute that can be used as a flag as well as with a value. // When true, it should be present (set either to an empty string or its name). // When false, it should be omitted. // For any other value, should be present with that value. -var OVERLOADED_BOOLEAN = 4; +let OVERLOADED_BOOLEAN = 4; // An attribute that must be numeric or parse as a numeric. // When falsy, it should be removed. -var NUMERIC = 5; +let NUMERIC = 5; // An attribute that must be positive numeric or parse as a positive numeric. // When falsy, it should be removed. -var POSITIVE_NUMERIC = 6; +let POSITIVE_NUMERIC = 6; /* eslint-disable max-len */ -var ATTRIBUTE_NAME_START_CHAR = ':A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD'; +let ATTRIBUTE_NAME_START_CHAR = ':A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD'; /* eslint-enable max-len */ -var ATTRIBUTE_NAME_CHAR = ATTRIBUTE_NAME_START_CHAR + '\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040'; +let ATTRIBUTE_NAME_CHAR = ATTRIBUTE_NAME_START_CHAR + '\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040'; -var ROOT_ATTRIBUTE_NAME = 'data-reactroot'; -var VALID_ATTRIBUTE_NAME_REGEX = new RegExp('^[' + ATTRIBUTE_NAME_START_CHAR + '][' + ATTRIBUTE_NAME_CHAR + ']*$'); +let ROOT_ATTRIBUTE_NAME = 'data-reactroot'; +let VALID_ATTRIBUTE_NAME_REGEX = new RegExp('^[' + ATTRIBUTE_NAME_START_CHAR + '][' + ATTRIBUTE_NAME_CHAR + ']*$'); -var hasOwnProperty = Object.prototype.hasOwnProperty; -var illegalAttributeNameCache = {}; -var validatedAttributeNameCache = {}; +let hasOwnProperty = Object.prototype.hasOwnProperty; +let illegalAttributeNameCache = {}; +let validatedAttributeNameCache = {}; function isAttributeNameSafe(attributeName) { if (hasOwnProperty.call(validatedAttributeNameCache, attributeName)) { @@ -2798,7 +2794,7 @@ function shouldRemoveAttributeWithWarning(name, value, propertyInfo, isCustomCom if (propertyInfo !== null) { return !propertyInfo.acceptsBooleans; } else { - var prefix = name.toLowerCase().slice(0, 5); + let prefix = name.toLowerCase().slice(0, 5); return prefix !== 'data-' && prefix !== 'aria-'; } } @@ -2855,7 +2851,7 @@ var properties = {}; // TODO: This prevents the assignment of defaultValue to regular // elements (not just inputs). Now that ReactDOMInput assigns to the // defaultValue property -- do we need this? -'defaultValue', 'defaultChecked', 'innerHTML', 'suppressContentEditableWarning', 'suppressHydrationWarning', 'style'].forEach(function (name) { +'defaultValue', 'defaultChecked', 'innerHTML', 'suppressContentEditableWarning', 'suppressHydrationWarning', 'style'].forEach(function(name) { properties[name] = new PropertyInfoRecord(name, RESERVED, false, // mustUseProperty name, // attributeName null); @@ -2864,9 +2860,11 @@ var properties = {}; // A few React string attributes have a different name. // This is a mapping from React prop names to the attribute names. -[['acceptCharset', 'accept-charset'], ['className', 'class'], ['htmlFor', 'for'], ['httpEquiv', 'http-equiv']].forEach(function (_ref) { - var name = _ref[0], - attributeName = _ref[1]; +[['acceptCharset', 'accept-charset'], ['className', 'class'], ['htmlFor', 'for'], ['httpEquiv', 'http-equiv']].forEach(function(_ref) { + let name = _ref[0]; + + +let attributeName = _ref[1]; properties[name] = new PropertyInfoRecord(name, STRING, false, // mustUseProperty attributeName, // attributeName @@ -2877,7 +2875,7 @@ var properties = {}; // These are "enumerated" HTML attributes that accept "true" and "false". // In React, we let users pass `true` and `false` even though technically // these aren't boolean attributes (they are coerced to strings). -['contentEditable', 'draggable', 'spellCheck', 'value'].forEach(function (name) { +['contentEditable', 'draggable', 'spellCheck', 'value'].forEach(function(name) { properties[name] = new PropertyInfoRecord(name, BOOLEANISH_STRING, false, // mustUseProperty name.toLowerCase(), // attributeName null); @@ -2888,7 +2886,7 @@ var properties = {}; // In React, we let users pass `true` and `false` even though technically // these aren't boolean attributes (they are coerced to strings). // Since these are SVG attributes, their attribute names are case-sensitive. -['autoReverse', 'externalResourcesRequired', 'preserveAlpha'].forEach(function (name) { +['autoReverse', 'externalResourcesRequired', 'preserveAlpha'].forEach(function(name) { properties[name] = new PropertyInfoRecord(name, BOOLEANISH_STRING, false, // mustUseProperty name, // attributeName null); @@ -2901,7 +2899,7 @@ var properties = {}; // on the client side because the browsers are inconsistent. Instead we call focus(). 'autoFocus', 'autoPlay', 'controls', 'default', 'defer', 'disabled', 'formNoValidate', 'hidden', 'loop', 'noModule', 'noValidate', 'open', 'playsInline', 'readOnly', 'required', 'reversed', 'scoped', 'seamless', // Microdata -'itemScope'].forEach(function (name) { +'itemScope'].forEach(function(name) { properties[name] = new PropertyInfoRecord(name, BOOLEAN, false, // mustUseProperty name.toLowerCase(), // attributeName null); @@ -2913,7 +2911,7 @@ var properties = {}; ['checked', // Note: `option.selected` is not updated if `select.multiple` is // disabled with `removeAttribute`. We have special logic for handling this. -'multiple', 'muted', 'selected'].forEach(function (name) { +'multiple', 'muted', 'selected'].forEach(function(name) { properties[name] = new PropertyInfoRecord(name, BOOLEAN, true, // mustUseProperty name.toLowerCase(), // attributeName null); @@ -2922,7 +2920,7 @@ var properties = {}; // These are HTML attributes that are "overloaded booleans": they behave like // booleans, but can also accept a string value. -['capture', 'download'].forEach(function (name) { +['capture', 'download'].forEach(function(name) { properties[name] = new PropertyInfoRecord(name, OVERLOADED_BOOLEAN, false, // mustUseProperty name.toLowerCase(), // attributeName null); @@ -2930,7 +2928,7 @@ var properties = {}; ); // These are HTML attributes that must be positive numbers. -['cols', 'rows', 'size', 'span'].forEach(function (name) { +['cols', 'rows', 'size', 'span'].forEach(function(name) { properties[name] = new PropertyInfoRecord(name, POSITIVE_NUMERIC, false, // mustUseProperty name.toLowerCase(), // attributeName null); @@ -2938,15 +2936,15 @@ var properties = {}; ); // These are HTML attributes that must be numbers. -['rowSpan', 'start'].forEach(function (name) { +['rowSpan', 'start'].forEach(function(name) { properties[name] = new PropertyInfoRecord(name, NUMERIC, false, // mustUseProperty name.toLowerCase(), // attributeName null); } // attributeNamespace ); -var CAMELIZE = /[\-\:]([a-z])/g; -var capitalize = function (token) { +let CAMELIZE = /[\-\:]([a-z])/g; +let capitalize = function(token) { return token[1].toUpperCase(); }; @@ -2955,23 +2953,23 @@ var capitalize = function (token) { // and have the same names are omitted, just like in the HTML whitelist. // Some of these attributes can be hard to find. This list was created by // scrapping the MDN documentation. -['accent-height', 'alignment-baseline', 'arabic-form', 'baseline-shift', 'cap-height', 'clip-path', 'clip-rule', 'color-interpolation', 'color-interpolation-filters', 'color-profile', 'color-rendering', 'dominant-baseline', 'enable-background', 'fill-opacity', 'fill-rule', 'flood-color', 'flood-opacity', 'font-family', 'font-size', 'font-size-adjust', 'font-stretch', 'font-style', 'font-variant', 'font-weight', 'glyph-name', 'glyph-orientation-horizontal', 'glyph-orientation-vertical', 'horiz-adv-x', 'horiz-origin-x', 'image-rendering', 'letter-spacing', 'lighting-color', 'marker-end', 'marker-mid', 'marker-start', 'overline-position', 'overline-thickness', 'paint-order', 'panose-1', 'pointer-events', 'rendering-intent', 'shape-rendering', 'stop-color', 'stop-opacity', 'strikethrough-position', 'strikethrough-thickness', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', 'stroke-width', 'text-anchor', 'text-decoration', 'text-rendering', 'underline-position', 'underline-thickness', 'unicode-bidi', 'unicode-range', 'units-per-em', 'v-alphabetic', 'v-hanging', 'v-ideographic', 'v-mathematical', 'vector-effect', 'vert-adv-y', 'vert-origin-x', 'vert-origin-y', 'word-spacing', 'writing-mode', 'xmlns:xlink', 'x-height'].forEach(function (attributeName) { - var name = attributeName.replace(CAMELIZE, capitalize); +['accent-height', 'alignment-baseline', 'arabic-form', 'baseline-shift', 'cap-height', 'clip-path', 'clip-rule', 'color-interpolation', 'color-interpolation-filters', 'color-profile', 'color-rendering', 'dominant-baseline', 'enable-background', 'fill-opacity', 'fill-rule', 'flood-color', 'flood-opacity', 'font-family', 'font-size', 'font-size-adjust', 'font-stretch', 'font-style', 'font-variant', 'font-weight', 'glyph-name', 'glyph-orientation-horizontal', 'glyph-orientation-vertical', 'horiz-adv-x', 'horiz-origin-x', 'image-rendering', 'letter-spacing', 'lighting-color', 'marker-end', 'marker-mid', 'marker-start', 'overline-position', 'overline-thickness', 'paint-order', 'panose-1', 'pointer-events', 'rendering-intent', 'shape-rendering', 'stop-color', 'stop-opacity', 'strikethrough-position', 'strikethrough-thickness', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', 'stroke-width', 'text-anchor', 'text-decoration', 'text-rendering', 'underline-position', 'underline-thickness', 'unicode-bidi', 'unicode-range', 'units-per-em', 'v-alphabetic', 'v-hanging', 'v-ideographic', 'v-mathematical', 'vector-effect', 'vert-adv-y', 'vert-origin-x', 'vert-origin-y', 'word-spacing', 'writing-mode', 'xmlns:xlink', 'x-height'].forEach(function(attributeName) { + let name = attributeName.replace(CAMELIZE, capitalize); properties[name] = new PropertyInfoRecord(name, STRING, false, // mustUseProperty attributeName, null); } // attributeNamespace ); // String SVG attributes with the xlink namespace. -['xlink:actuate', 'xlink:arcrole', 'xlink:href', 'xlink:role', 'xlink:show', 'xlink:title', 'xlink:type'].forEach(function (attributeName) { - var name = attributeName.replace(CAMELIZE, capitalize); +['xlink:actuate', 'xlink:arcrole', 'xlink:href', 'xlink:role', 'xlink:show', 'xlink:title', 'xlink:type'].forEach(function(attributeName) { + let name = attributeName.replace(CAMELIZE, capitalize); properties[name] = new PropertyInfoRecord(name, STRING, false, // mustUseProperty attributeName, 'http://www.w3.org/1999/xlink'); }); // String SVG attributes with the xml namespace. -['xml:base', 'xml:lang', 'xml:space'].forEach(function (attributeName) { - var name = attributeName.replace(CAMELIZE, capitalize); +['xml:base', 'xml:lang', 'xml:space'].forEach(function(attributeName) { + let name = attributeName.replace(CAMELIZE, capitalize); properties[name] = new PropertyInfoRecord(name, STRING, false, // mustUseProperty attributeName, 'http://www.w3.org/XML/1998/namespace'); }); @@ -2991,17 +2989,17 @@ null); function getValueForProperty(node, name, expected, propertyInfo) { { if (propertyInfo.mustUseProperty) { - var propertyName = propertyInfo.propertyName; + let propertyName = propertyInfo.propertyName; return node[propertyName]; } else { - var attributeName = propertyInfo.attributeName; + let attributeName = propertyInfo.attributeName; - var stringValue = null; + let stringValue = null; if (propertyInfo.type === OVERLOADED_BOOLEAN) { if (node.hasAttribute(attributeName)) { - var value = node.getAttribute(attributeName); + let value = node.getAttribute(attributeName); if (value === '') { return true; } @@ -3055,7 +3053,7 @@ function getValueForAttribute(node, name, expected) { if (!node.hasAttribute(name)) { return expected === undefined ? undefined : null; } - var value = node.getAttribute(name); + let value = node.getAttribute(name); if (value === '' + expected) { return expected; } @@ -3071,7 +3069,7 @@ function getValueForAttribute(node, name, expected) { * @param {*} value */ function setValueForProperty(node, name, value, isCustomComponentTag) { - var propertyInfo = getPropertyInfo(name); + let propertyInfo = getPropertyInfo(name); if (shouldIgnoreAttribute(name, propertyInfo, isCustomComponentTag)) { return; } @@ -3081,7 +3079,7 @@ function setValueForProperty(node, name, value, isCustomComponentTag) { // If the prop isn't in the special list, treat it as a simple attribute. if (isCustomComponentTag || propertyInfo === null) { if (isAttributeNameSafe(name)) { - var _attributeName = name; + let _attributeName = name; if (value === null) { node.removeAttribute(_attributeName); } else { @@ -3090,13 +3088,13 @@ function setValueForProperty(node, name, value, isCustomComponentTag) { } return; } - var mustUseProperty = propertyInfo.mustUseProperty; + let mustUseProperty = propertyInfo.mustUseProperty; if (mustUseProperty) { - var propertyName = propertyInfo.propertyName; + let propertyName = propertyInfo.propertyName; if (value === null) { - var type = propertyInfo.type; + let type = propertyInfo.type; node[propertyName] = type === BOOLEAN ? false : ''; } else { @@ -3107,15 +3105,17 @@ function setValueForProperty(node, name, value, isCustomComponentTag) { return; } // The rest are treated as attributes with special cases. - var attributeName = propertyInfo.attributeName, - attributeNamespace = propertyInfo.attributeNamespace; + let attributeName = propertyInfo.attributeName; + + +let attributeNamespace = propertyInfo.attributeNamespace; if (value === null) { node.removeAttribute(attributeName); } else { - var _type = propertyInfo.type; + let _type = propertyInfo.type; - var attributeValue = void 0; + let attributeValue = void 0; if (_type === BOOLEAN || _type === OVERLOADED_BOOLEAN && value === true) { attributeValue = ''; } else { @@ -3139,10 +3139,9 @@ function setValueForProperty(node, name, value, isCustomComponentTag) { */ +let ReactPropTypesSecret$1 = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED'; -var ReactPropTypesSecret$1 = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED'; - -var ReactPropTypesSecret_1 = ReactPropTypesSecret$1; +let ReactPropTypesSecret_1 = ReactPropTypesSecret$1; /** * Copyright (c) 2013-present, Facebook, Inc. @@ -3152,7 +3151,6 @@ var ReactPropTypesSecret_1 = ReactPropTypesSecret$1; */ - { var invariant$2 = invariant_1; var warning$2 = warning_1; @@ -3173,7 +3171,7 @@ var ReactPropTypesSecret_1 = ReactPropTypesSecret$1; */ function checkPropTypes(typeSpecs, values, location, componentName, getStack) { { - for (var typeSpecName in typeSpecs) { + for (let typeSpecName in typeSpecs) { if (typeSpecs.hasOwnProperty(typeSpecName)) { var error; // Prop type validation may throw. In case they do, we don't want to @@ -3193,7 +3191,7 @@ function checkPropTypes(typeSpecs, values, location, componentName, getStack) { // same error. loggedTypeFailures[error.message] = true; - var stack = getStack ? getStack() : ''; + let stack = getStack ? getStack() : ''; warning$2(false, 'Failed %s type: %s%s', location, error.message, stack != null ? stack : ''); } @@ -3202,58 +3200,58 @@ function checkPropTypes(typeSpecs, values, location, componentName, getStack) { } } -var checkPropTypes_1 = checkPropTypes; +let checkPropTypes_1 = checkPropTypes; -var ReactControlledValuePropTypes = { - checkPropTypes: null +let ReactControlledValuePropTypes = { + checkPropTypes: null, }; { - var hasReadOnlyValue = { + let hasReadOnlyValue = { button: true, checkbox: true, image: true, hidden: true, radio: true, reset: true, - submit: true + submit: true, }; - var propTypes = { - value: function (props, propName, componentName) { + let propTypes = { + value: function(props, propName, componentName) { if (!props[propName] || hasReadOnlyValue[props.type] || props.onChange || props.readOnly || props.disabled) { return null; } return new Error('You provided a `value` prop to a form field without an ' + '`onChange` handler. This will render a read-only field. If ' + 'the field should be mutable use `defaultValue`. Otherwise, ' + 'set either `onChange` or `readOnly`.'); }, - checked: function (props, propName, componentName) { + checked: function(props, propName, componentName) { if (!props[propName] || props.onChange || props.readOnly || props.disabled) { return null; } return new Error('You provided a `checked` prop to a form field without an ' + '`onChange` handler. This will render a read-only field. If ' + 'the field should be mutable use `defaultChecked`. Otherwise, ' + 'set either `onChange` or `readOnly`.'); - } + }, }; /** * Provide a linked `value` attribute for controlled forms. You should not use * this outside of the ReactDOM controlled form components. */ - ReactControlledValuePropTypes.checkPropTypes = function (tagName, props, getStack) { + ReactControlledValuePropTypes.checkPropTypes = function(tagName, props, getStack) { checkPropTypes_1(propTypes, props, 'prop', tagName, getStack); }; } // TODO: direct imports like some-package/src/* are bad. Fix me. -var getCurrentFiberOwnerName = ReactDebugCurrentFiber.getCurrentFiberOwnerName; -var getCurrentFiberStackAddendum = ReactDebugCurrentFiber.getCurrentFiberStackAddendum; +let getCurrentFiberOwnerName = ReactDebugCurrentFiber.getCurrentFiberOwnerName; +let getCurrentFiberStackAddendum = ReactDebugCurrentFiber.getCurrentFiberStackAddendum; -var didWarnValueDefaultValue = false; -var didWarnCheckedDefaultChecked = false; -var didWarnControlledToUncontrolled = false; -var didWarnUncontrolledToControlled = false; +let didWarnValueDefaultValue = false; +let didWarnCheckedDefaultChecked = false; +let didWarnControlledToUncontrolled = false; +let didWarnUncontrolledToControlled = false; function isControlled(props) { - var usesChecked = props.type === 'checkbox' || props.type === 'radio'; + let usesChecked = props.type === 'checkbox' || props.type === 'radio'; return usesChecked ? props.checked != null : props.value != null; } @@ -3275,14 +3273,14 @@ function isControlled(props) { */ function getHostProps(element, props) { - var node = element; - var checked = props.checked; + let node = element; + let checked = props.checked; - var hostProps = _assign({}, props, { + let hostProps = _assign({}, props, { defaultChecked: undefined, defaultValue: undefined, value: undefined, - checked: checked != null ? checked : node._wrapperState.initialChecked + checked: checked != null ? checked : node._wrapperState.initialChecked, }); return hostProps; @@ -3302,28 +3300,28 @@ function initWrapperState(element, props) { } } - var node = element; - var defaultValue = props.defaultValue == null ? '' : props.defaultValue; + let node = element; + let defaultValue = props.defaultValue == null ? '' : props.defaultValue; node._wrapperState = { initialChecked: props.checked != null ? props.checked : props.defaultChecked, initialValue: getSafeValue(props.value != null ? props.value : defaultValue), - controlled: isControlled(props) + controlled: isControlled(props), }; } function updateChecked(element, props) { - var node = element; - var checked = props.checked; + let node = element; + let checked = props.checked; if (checked != null) { setValueForProperty(node, 'checked', checked, false); } } function updateWrapper(element, props) { - var node = element; + let node = element; { - var _controlled = isControlled(props); + let _controlled = isControlled(props); if (!node._wrapperState.controlled && _controlled && !didWarnUncontrolledToControlled) { warning_1(false, 'A component is changing an uncontrolled input of type %s to be controlled. ' + 'Input elements should not switch from uncontrolled to controlled (or vice versa). ' + 'Decide between using a controlled or uncontrolled input ' + 'element for the lifetime of the component. More info: https://fb.me/react-controlled-components%s', props.type, getCurrentFiberStackAddendum()); @@ -3337,7 +3335,7 @@ function updateWrapper(element, props) { updateChecked(element, props); - var value = getSafeValue(props.value); + let value = getSafeValue(props.value); if (value != null) { if (props.type === 'number') { @@ -3363,11 +3361,11 @@ function updateWrapper(element, props) { } function postMountWrapper(element, props, isHydrating) { - var node = element; + let node = element; if (props.hasOwnProperty('value') || props.hasOwnProperty('defaultValue')) { - var _initialValue = '' + node._wrapperState.initialValue; - var currentValue = node.value; + let _initialValue = '' + node._wrapperState.initialValue; + let currentValue = node.value; // Do not assign value if it is already set. This prevents user text input // from being lost during SSR hydration. @@ -3391,7 +3389,7 @@ function postMountWrapper(element, props, isHydrating) { // will sometimes influence the value of checked (even after detachment). // Reference: https://bugs.chromium.org/p/chromium/issues/detail?id=608416 // We need to temporarily unset name to avoid disrupting radio button groups. - var name = node.name; + let name = node.name; if (name !== '') { node.name = ''; } @@ -3403,15 +3401,15 @@ function postMountWrapper(element, props, isHydrating) { } function restoreControlledState(element, props) { - var node = element; + let node = element; updateWrapper(node, props); updateNamedCousins(node, props); } function updateNamedCousins(rootNode, props) { - var name = props.name; + let name = props.name; if (props.type === 'radio' && name != null) { - var queryRoot = rootNode; + let queryRoot = rootNode; while (queryRoot.parentNode) { queryRoot = queryRoot.parentNode; @@ -3424,10 +3422,10 @@ function updateNamedCousins(rootNode, props) { // the input might not even be in a form. It might not even be in the // document. Let's just use the local `querySelectorAll` to ensure we don't // miss anything. - var group = queryRoot.querySelectorAll('input[name=' + JSON.stringify('' + name) + '][type="radio"]'); + let group = queryRoot.querySelectorAll('input[name=' + JSON.stringify('' + name) + '][type="radio"]'); - for (var i = 0; i < group.length; i++) { - var otherNode = group[i]; + for (let i = 0; i < group.length; i++) { + let otherNode = group[i]; if (otherNode === rootNode || otherNode.form !== rootNode.form) { continue; } @@ -3435,7 +3433,7 @@ function updateNamedCousins(rootNode, props) { // and the same name are rendered into the same form (same as #1939). // That's probably okay; we don't support it just as we don't support // mixing React radio buttons with non-React ones. - var otherProps = getFiberCurrentPropsFromNode$1(otherNode); + let otherProps = getFiberCurrentPropsFromNode$1(otherNode); !otherProps ? invariant_1(false, 'ReactDOMInput: Mixing React and non-React radio inputs with the same `name` is not supported.') : void 0; // We need update the tracked value on the named cousin since the value @@ -3484,18 +3482,18 @@ function getSafeValue(value) { } } -var eventTypes$1 = { +let eventTypes$1 = { change: { phasedRegistrationNames: { bubbled: 'onChange', - captured: 'onChangeCapture' + captured: 'onChangeCapture', }, - dependencies: [TOP_BLUR, TOP_CHANGE, TOP_CLICK, TOP_FOCUS, TOP_INPUT, TOP_KEY_DOWN, TOP_KEY_UP, TOP_SELECTION_CHANGE] - } + dependencies: [TOP_BLUR, TOP_CHANGE, TOP_CLICK, TOP_FOCUS, TOP_INPUT, TOP_KEY_DOWN, TOP_KEY_UP, TOP_SELECTION_CHANGE], + }, }; function createAndAccumulateChangeEvent(inst, nativeEvent, target) { - var event = SyntheticEvent$1.getPooled(eventTypes$1.change, inst, nativeEvent, target); + let event = SyntheticEvent$1.getPooled(eventTypes$1.change, inst, nativeEvent, target); event.type = 'change'; // Flag this event loop as needing state restore. enqueueStateRestore(target); @@ -3505,19 +3503,19 @@ function createAndAccumulateChangeEvent(inst, nativeEvent, target) { /** * For IE shims */ -var activeElement = null; -var activeElementInst = null; +let activeElement = null; +let activeElementInst = null; /** * SECTION: handle `change` event */ function shouldUseChangeEvent(elem) { - var nodeName = elem.nodeName && elem.nodeName.toLowerCase(); + let nodeName = elem.nodeName && elem.nodeName.toLowerCase(); return nodeName === 'select' || nodeName === 'input' && elem.type === 'file'; } function manualDispatchChangeEvent(nativeEvent) { - var event = createAndAccumulateChangeEvent(activeElementInst, nativeEvent, getEventTarget(nativeEvent)); + let event = createAndAccumulateChangeEvent(activeElementInst, nativeEvent, getEventTarget(nativeEvent)); // If change and propertychange bubbled, we'd just bind to it like all the // other events and have it go through ReactBrowserEventEmitter. Since it @@ -3538,7 +3536,7 @@ function runEventInBatch(event) { } function getInstIfValueChanged(targetInst) { - var targetNode = getNodeFromInstance$1(targetInst); + let targetNode = getNodeFromInstance$1(targetInst); if (updateValueIfChanged(targetNode)) { return targetInst; } @@ -3553,7 +3551,7 @@ function getTargetInstForChangeEvent(topLevelType, targetInst) { /** * SECTION: handle `input` event */ -var isInputEventSupported = false; +let isInputEventSupported = false; if (ExecutionEnvironment_1.canUseDOM) { // IE9 claims to support the input event but fails to trigger it when // deleting text, so we ignore its input events. @@ -3640,7 +3638,7 @@ function shouldUseClickEvent(elem) { // Use the `click` event to detect changes to checkbox and radio inputs. // This approach works across all browsers, whereas `change` does not fire // until `blur` in IE8. - var nodeName = elem.nodeName; + let nodeName = elem.nodeName; return nodeName && nodeName.toLowerCase() === 'input' && (elem.type === 'checkbox' || elem.type === 'radio'); } @@ -3657,7 +3655,7 @@ function getTargetInstForInputOrChangeEvent(topLevelType, targetInst) { } function handleControlledInputBlur(node) { - var state = node._wrapperState; + let state = node._wrapperState; if (!state || !state.controlled || node.type !== 'number') { return; @@ -3677,16 +3675,18 @@ function handleControlledInputBlur(node) { * - textarea * - select */ -var ChangeEventPlugin = { +let ChangeEventPlugin = { eventTypes: eventTypes$1, _isInputEventSupported: isInputEventSupported, - extractEvents: function (topLevelType, targetInst, nativeEvent, nativeEventTarget) { - var targetNode = targetInst ? getNodeFromInstance$1(targetInst) : window; + extractEvents: function(topLevelType, targetInst, nativeEvent, nativeEventTarget) { + let targetNode = targetInst ? getNodeFromInstance$1(targetInst) : window; + + let getTargetInstFunc = void 0; + - var getTargetInstFunc = void 0, - handleEventFunc = void 0; +let handleEventFunc = void 0; if (shouldUseChangeEvent(targetNode)) { getTargetInstFunc = getTargetInstForChangeEvent; } else if (isTextInputElement(targetNode)) { @@ -3701,9 +3701,9 @@ var ChangeEventPlugin = { } if (getTargetInstFunc) { - var inst = getTargetInstFunc(topLevelType, targetInst); + let inst = getTargetInstFunc(topLevelType, targetInst); if (inst) { - var event = createAndAccumulateChangeEvent(inst, nativeEvent, nativeEventTarget); + let event = createAndAccumulateChangeEvent(inst, nativeEvent, nativeEventTarget); return event; } } @@ -3716,7 +3716,7 @@ var ChangeEventPlugin = { if (topLevelType === TOP_BLUR) { handleControlledInputBlur(targetNode); } - } + }, }; /** @@ -3728,11 +3728,11 @@ var ChangeEventPlugin = { * `ResponderEventPlugin` must occur before `SimpleEventPlugin` so that * preventing default on events is convenient in `SimpleEventPlugin` handlers. */ -var DOMEventPluginOrder = ['ResponderEventPlugin', 'SimpleEventPlugin', 'TapEventPlugin', 'EnterLeaveEventPlugin', 'ChangeEventPlugin', 'SelectEventPlugin', 'BeforeInputEventPlugin']; +let DOMEventPluginOrder = ['ResponderEventPlugin', 'SimpleEventPlugin', 'TapEventPlugin', 'EnterLeaveEventPlugin', 'ChangeEventPlugin', 'SelectEventPlugin', 'BeforeInputEventPlugin']; -var SyntheticUIEvent = SyntheticEvent$1.extend({ +let SyntheticUIEvent = SyntheticEvent$1.extend({ view: null, - detail: null + detail: null, }); /** @@ -3740,23 +3740,23 @@ var SyntheticUIEvent = SyntheticEvent$1.extend({ * @see http://www.w3.org/TR/DOM-Level-3-Events/#keys-Modifiers */ -var modifierKeyToProp = { +let modifierKeyToProp = { Alt: 'altKey', Control: 'ctrlKey', Meta: 'metaKey', - Shift: 'shiftKey' + Shift: 'shiftKey', }; // IE8 does not implement getModifierState so we simply map it to the only // modifier keys exposed by the event itself, does not support Lock-keys. // Currently, all major browsers except Chrome seems to support Lock-keys. function modifierStateGetter(keyArg) { - var syntheticEvent = this; - var nativeEvent = syntheticEvent.nativeEvent; + let syntheticEvent = this; + let nativeEvent = syntheticEvent.nativeEvent; if (nativeEvent.getModifierState) { return nativeEvent.getModifierState(keyArg); } - var keyProp = modifierKeyToProp[keyArg]; + let keyProp = modifierKeyToProp[keyArg]; return keyProp ? !!nativeEvent[keyProp] : false; } @@ -3768,7 +3768,7 @@ function getEventModifierState(nativeEvent) { * @interface MouseEvent * @see http://www.w3.org/TR/DOM-Level-3-Events/ */ -var SyntheticMouseEvent = SyntheticUIEvent.extend({ +let SyntheticMouseEvent = SyntheticUIEvent.extend({ screenX: null, screenY: null, clientX: null, @@ -3782,16 +3782,16 @@ var SyntheticMouseEvent = SyntheticUIEvent.extend({ getModifierState: getEventModifierState, button: null, buttons: null, - relatedTarget: function (event) { + relatedTarget: function(event) { return event.relatedTarget || (event.fromElement === event.srcElement ? event.toElement : event.fromElement); - } + }, }); /** * @interface PointerEvent * @see http://www.w3.org/TR/pointerevents/ */ -var SyntheticPointerEvent = SyntheticMouseEvent.extend({ +let SyntheticPointerEvent = SyntheticMouseEvent.extend({ pointerId: null, width: null, height: null, @@ -3799,29 +3799,29 @@ var SyntheticPointerEvent = SyntheticMouseEvent.extend({ tiltX: null, tiltY: null, pointerType: null, - isPrimary: null + isPrimary: null, }); -var eventTypes$2 = { +let eventTypes$2 = { mouseEnter: { registrationName: 'onMouseEnter', - dependencies: [TOP_MOUSE_OUT, TOP_MOUSE_OVER] + dependencies: [TOP_MOUSE_OUT, TOP_MOUSE_OVER], }, mouseLeave: { registrationName: 'onMouseLeave', - dependencies: [TOP_MOUSE_OUT, TOP_MOUSE_OVER] + dependencies: [TOP_MOUSE_OUT, TOP_MOUSE_OVER], }, pointerEnter: { registrationName: 'onPointerEnter', - dependencies: [TOP_POINTER_OUT, TOP_POINTER_OVER] + dependencies: [TOP_POINTER_OUT, TOP_POINTER_OVER], }, pointerLeave: { registrationName: 'onPointerLeave', - dependencies: [TOP_POINTER_OUT, TOP_POINTER_OVER] - } + dependencies: [TOP_POINTER_OUT, TOP_POINTER_OVER], + }, }; -var EnterLeaveEventPlugin = { +let EnterLeaveEventPlugin = { eventTypes: eventTypes$2, /** @@ -3831,9 +3831,9 @@ var EnterLeaveEventPlugin = { * browser from outside will not fire a `mouseout` event. In this case, we use * the `mouseover` top-level event. */ - extractEvents: function (topLevelType, targetInst, nativeEvent, nativeEventTarget) { - var isOverEvent = topLevelType === TOP_MOUSE_OVER || topLevelType === TOP_POINTER_OVER; - var isOutEvent = topLevelType === TOP_MOUSE_OUT || topLevelType === TOP_POINTER_OUT; + extractEvents: function(topLevelType, targetInst, nativeEvent, nativeEventTarget) { + let isOverEvent = topLevelType === TOP_MOUSE_OVER || topLevelType === TOP_POINTER_OVER; + let isOutEvent = topLevelType === TOP_MOUSE_OUT || topLevelType === TOP_POINTER_OUT; if (isOverEvent && (nativeEvent.relatedTarget || nativeEvent.fromElement)) { return null; @@ -3844,13 +3844,13 @@ var EnterLeaveEventPlugin = { return null; } - var win = void 0; + let win = void 0; if (nativeEventTarget.window === nativeEventTarget) { // `nativeEventTarget` is probably a window object. win = nativeEventTarget; } else { // TODO: Figure out why `ownerDocument` is sometimes undefined in IE8. - var doc = nativeEventTarget.ownerDocument; + let doc = nativeEventTarget.ownerDocument; if (doc) { win = doc.defaultView || doc.parentWindow; } else { @@ -3858,11 +3858,11 @@ var EnterLeaveEventPlugin = { } } - var from = void 0; - var to = void 0; + let from = void 0; + let to = void 0; if (isOutEvent) { from = targetInst; - var related = nativeEvent.relatedTarget || nativeEvent.toElement; + let related = nativeEvent.relatedTarget || nativeEvent.toElement; to = related ? getClosestInstanceFromNode(related) : null; } else { // Moving to a node from outside the window. @@ -3875,10 +3875,16 @@ var EnterLeaveEventPlugin = { return null; } - var eventInterface = void 0, - leaveEventType = void 0, - enterEventType = void 0, - eventTypePrefix = void 0; + let eventInterface = void 0; + + +let leaveEventType = void 0; + + +let enterEventType = void 0; + + +let eventTypePrefix = void 0; if (topLevelType === TOP_MOUSE_OUT || topLevelType === TOP_MOUSE_OVER) { eventInterface = SyntheticMouseEvent; @@ -3892,15 +3898,15 @@ var EnterLeaveEventPlugin = { eventTypePrefix = 'pointer'; } - var fromNode = from == null ? win : getNodeFromInstance$1(from); - var toNode = to == null ? win : getNodeFromInstance$1(to); + let fromNode = from == null ? win : getNodeFromInstance$1(from); + let toNode = to == null ? win : getNodeFromInstance$1(to); - var leave = eventInterface.getPooled(leaveEventType, from, nativeEvent, nativeEventTarget); + let leave = eventInterface.getPooled(leaveEventType, from, nativeEvent, nativeEventTarget); leave.type = eventTypePrefix + 'leave'; leave.target = fromNode; leave.relatedTarget = toNode; - var enter = eventInterface.getPooled(enterEventType, to, nativeEvent, nativeEventTarget); + let enter = eventInterface.getPooled(enterEventType, to, nativeEvent, nativeEventTarget); enter.type = eventTypePrefix + 'enter'; enter.target = toNode; enter.relatedTarget = fromNode; @@ -3908,7 +3914,7 @@ var EnterLeaveEventPlugin = { accumulateEnterLeaveDispatches(leave, enter, from, to); return [leave, enter]; - } + }, }; /** @@ -3932,7 +3938,7 @@ var EnterLeaveEventPlugin = { * @param {?DOMDocument} doc Defaults to current document. * @return {?DOMElement} */ -function getActiveElement(doc) /*?DOMElement*/{ +function getActiveElement(doc) /* ?DOMElement*/{ doc = doc || (typeof document !== 'undefined' ? document : undefined); if (typeof doc === 'undefined') { return null; @@ -3944,7 +3950,7 @@ function getActiveElement(doc) /*?DOMElement*/{ } } -var getActiveElement_1 = getActiveElement; +let getActiveElement_1 = getActiveElement; /** * Copyright (c) 2013-present, Facebook, Inc. @@ -3953,14 +3959,13 @@ var getActiveElement_1 = getActiveElement; * LICENSE file in the root directory of this source tree. * * @typechecks - * + * */ -/*eslint-disable no-self-compare */ - +/* eslint-disable no-self-compare */ -var hasOwnProperty$1 = Object.prototype.hasOwnProperty; +let hasOwnProperty$1 = Object.prototype.hasOwnProperty; /** * inlined Object.is polyfill to avoid requiring consumers ship their own @@ -3993,15 +3998,15 @@ function shallowEqual(objA, objB) { return false; } - var keysA = Object.keys(objA); - var keysB = Object.keys(objB); + let keysA = Object.keys(objA); + let keysB = Object.keys(objB); if (keysA.length !== keysB.length) { return false; } // Test for A's keys different from B. - for (var i = 0; i < keysA.length; i++) { + for (let i = 0; i < keysA.length; i++) { if (!hasOwnProperty$1.call(objB, keysA[i]) || !is(objA[keysA[i]], objB[keysA[i]])) { return false; } @@ -4010,7 +4015,7 @@ function shallowEqual(objA, objB) { return true; } -var shallowEqual_1 = shallowEqual; +let shallowEqual_1 = shallowEqual; /** * `ReactInstanceMap` maintains a mapping from a public facing stateful @@ -4042,32 +4047,32 @@ function set(key, value) { } // Don't change these two values. They're used by React Dev Tools. -var NoEffect = /* */0; -var PerformedWork = /* */1; +let NoEffect = /* */0; +let PerformedWork = /* */1; // You can change the rest (and add more). -var Placement = /* */2; -var Update = /* */4; -var PlacementAndUpdate = /* */6; -var Deletion = /* */8; -var ContentReset = /* */16; -var Callback = /* */32; -var DidCapture = /* */64; -var Ref = /* */128; -var Snapshot = /* */256; +let Placement = /* */2; +let Update = /* */4; +let PlacementAndUpdate = /* */6; +let Deletion = /* */8; +let ContentReset = /* */16; +let Callback = /* */32; +let DidCapture = /* */64; +let Ref = /* */128; +let Snapshot = /* */256; // Union of all host effects -var HostEffectMask = /* */511; +let HostEffectMask = /* */511; -var Incomplete = /* */512; -var ShouldCapture = /* */1024; +let Incomplete = /* */512; +let ShouldCapture = /* */1024; -var MOUNTING = 1; -var MOUNTED = 2; -var UNMOUNTED = 3; +let MOUNTING = 1; +let MOUNTED = 2; +let UNMOUNTED = 3; function isFiberMountedImpl(fiber) { - var node = fiber; + let node = fiber; if (!fiber.alternate) { // If there is no alternate, this might be a new tree that isn't inserted // yet. If it is, then it will have a pending insertion effect on it. @@ -4101,16 +4106,16 @@ function isFiberMounted(fiber) { function isMounted(component) { { - var owner = ReactCurrentOwner.current; + let owner = ReactCurrentOwner.current; if (owner !== null && owner.tag === ClassComponent) { - var ownerFiber = owner; - var instance = ownerFiber.stateNode; + let ownerFiber = owner; + let instance = ownerFiber.stateNode; !instance._warnedAboutRefsInRender ? warning_1(false, '%s is accessing isMounted inside its render() function. ' + 'render() should be a pure function of props and state. It should ' + 'never access something that requires stale data from the previous ' + 'render, such as refs. Move this logic to componentDidMount and ' + 'componentDidUpdate instead.', getComponentName(ownerFiber) || 'A component') : void 0; instance._warnedAboutRefsInRender = true; } } - var fiber = get(component); + let fiber = get(component); if (!fiber) { return false; } @@ -4122,10 +4127,10 @@ function assertIsMounted(fiber) { } function findCurrentFiberUsingSlowPath(fiber) { - var alternate = fiber.alternate; + let alternate = fiber.alternate; if (!alternate) { // If there is no alternate, then we only need to check if it is mounted. - var state = isFiberMountedImpl(fiber); + let state = isFiberMountedImpl(fiber); !(state !== UNMOUNTED) ? invariant_1(false, 'Unable to find node on an unmounted component.') : void 0; if (state === MOUNTING) { return null; @@ -4135,11 +4140,11 @@ function findCurrentFiberUsingSlowPath(fiber) { // If we have two possible branches, we'll walk backwards up to the root // to see what path the root points to. On the way we may hit one of the // special cases and we'll deal with them. - var a = fiber; - var b = alternate; + let a = fiber; + let b = alternate; while (true) { - var parentA = a.return; - var parentB = parentA ? parentA.alternate : null; + let parentA = a.return; + let parentB = parentA ? parentA.alternate : null; if (!parentA || !parentB) { // We're at the root. break; @@ -4149,7 +4154,7 @@ function findCurrentFiberUsingSlowPath(fiber) { // assume that the child is current. This happens when we bailout on low // priority: the bailed out fiber's child reuses the current child. if (parentA.child === parentB.child) { - var child = parentA.child; + let child = parentA.child; while (child) { if (child === a) { // We've determined that A is the current branch. @@ -4181,8 +4186,8 @@ function findCurrentFiberUsingSlowPath(fiber) { // which child belongs to which set. // // Search parent A's child set - var didFindChild = false; - var _child = parentA.child; + let didFindChild = false; + let _child = parentA.child; while (_child) { if (_child === a) { didFindChild = true; @@ -4234,13 +4239,13 @@ function findCurrentFiberUsingSlowPath(fiber) { } function findCurrentHostFiber(parent) { - var currentParent = findCurrentFiberUsingSlowPath(parent); + let currentParent = findCurrentFiberUsingSlowPath(parent); if (!currentParent) { return null; } // Next we'll drill down this component to find the first HostComponent/Text. - var node = currentParent; + let node = currentParent; while (true) { if (node.tag === HostComponent || node.tag === HostText) { return node; @@ -4267,13 +4272,13 @@ function findCurrentHostFiber(parent) { } function findCurrentHostFiberWithNoPortals(parent) { - var currentParent = findCurrentFiberUsingSlowPath(parent); + let currentParent = findCurrentFiberUsingSlowPath(parent); if (!currentParent) { return null; } // Next we'll drill down this component to find the first HostComponent/Text. - var node = currentParent; + let node = currentParent; while (true) { if (node.tag === HostComponent || node.tag === HostText) { return node; @@ -4312,28 +4317,28 @@ function addEventCaptureListener(element, eventType, listener) { * @see http://www.w3.org/TR/css3-animations/#AnimationEvent-interface * @see https://developer.mozilla.org/en-US/docs/Web/API/AnimationEvent */ -var SyntheticAnimationEvent = SyntheticEvent$1.extend({ +let SyntheticAnimationEvent = SyntheticEvent$1.extend({ animationName: null, elapsedTime: null, - pseudoElement: null + pseudoElement: null, }); /** * @interface Event * @see http://www.w3.org/TR/clipboard-apis/ */ -var SyntheticClipboardEvent = SyntheticEvent$1.extend({ - clipboardData: function (event) { +let SyntheticClipboardEvent = SyntheticEvent$1.extend({ + clipboardData: function(event) { return 'clipboardData' in event ? event.clipboardData : window.clipboardData; - } + }, }); /** * @interface FocusEvent * @see http://www.w3.org/TR/DOM-Level-3-Events/ */ -var SyntheticFocusEvent = SyntheticUIEvent.extend({ - relatedTarget: null +let SyntheticFocusEvent = SyntheticUIEvent.extend({ + relatedTarget: null, }); /** @@ -4347,8 +4352,8 @@ var SyntheticFocusEvent = SyntheticUIEvent.extend({ * @return {number} Normalized `charCode` property. */ function getEventCharCode(nativeEvent) { - var charCode = void 0; - var keyCode = nativeEvent.keyCode; + let charCode = void 0; + let keyCode = nativeEvent.keyCode; if ('charCode' in nativeEvent) { charCode = nativeEvent.charCode; @@ -4381,7 +4386,7 @@ function getEventCharCode(nativeEvent) { * Normalization of deprecated HTML5 `key` values * @see https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent#Key_names */ -var normalizeKey = { +let normalizeKey = { Esc: 'Escape', Spacebar: ' ', Left: 'ArrowLeft', @@ -4393,7 +4398,7 @@ var normalizeKey = { Menu: 'ContextMenu', Apps: 'ContextMenu', Scroll: 'ScrollLock', - MozPrintableKey: 'Unidentified' + MozPrintableKey: 'Unidentified', }; /** @@ -4401,7 +4406,7 @@ var normalizeKey = { * Only special keys supported, all others depend on keyboard layout or browser * @see https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent#Key_names */ -var translateToKey = { +let translateToKey = { '8': 'Backspace', '9': 'Tab', '12': 'Clear', @@ -4437,7 +4442,7 @@ var translateToKey = { '123': 'F12', '144': 'NumLock', '145': 'ScrollLock', - '224': 'Meta' + '224': 'Meta', }; /** @@ -4451,7 +4456,7 @@ function getEventKey(nativeEvent) { // FireFox implements `key` but returns `MozPrintableKey` for all // printable characters (normalized to `Unidentified`), ignore it. - var key = normalizeKey[nativeEvent.key] || nativeEvent.key; + let key = normalizeKey[nativeEvent.key] || nativeEvent.key; if (key !== 'Unidentified') { return key; } @@ -4459,7 +4464,7 @@ function getEventKey(nativeEvent) { // Browser does not implement `key`, polyfill as much of it as we can. if (nativeEvent.type === 'keypress') { - var charCode = getEventCharCode(nativeEvent); + let charCode = getEventCharCode(nativeEvent); // The enter-key is technically both printable and non-printable and can // thus be captured by `keypress`, no other non-printable key should. @@ -4477,7 +4482,7 @@ function getEventKey(nativeEvent) { * @interface KeyboardEvent * @see http://www.w3.org/TR/DOM-Level-3-Events/ */ -var SyntheticKeyboardEvent = SyntheticUIEvent.extend({ +let SyntheticKeyboardEvent = SyntheticUIEvent.extend({ key: getEventKey, location: null, ctrlKey: null, @@ -4488,7 +4493,7 @@ var SyntheticKeyboardEvent = SyntheticUIEvent.extend({ locale: null, getModifierState: getEventModifierState, // Legacy Interface - charCode: function (event) { + charCode: function(event) { // `charCode` is the result of a KeyPress event and represents the value of // the actual printable character. @@ -4499,7 +4504,7 @@ var SyntheticKeyboardEvent = SyntheticUIEvent.extend({ } return 0; }, - keyCode: function (event) { + keyCode: function(event) { // `keyCode` is the result of a KeyDown/Up event and represents the value of // physical keyboard key. @@ -4512,7 +4517,7 @@ var SyntheticKeyboardEvent = SyntheticUIEvent.extend({ } return 0; }, - which: function (event) { + which: function(event) { // `which` is an alias for either `keyCode` or `charCode` depending on the // type of the event. if (event.type === 'keypress') { @@ -4522,22 +4527,22 @@ var SyntheticKeyboardEvent = SyntheticUIEvent.extend({ return event.keyCode; } return 0; - } + }, }); /** * @interface DragEvent * @see http://www.w3.org/TR/DOM-Level-3-Events/ */ -var SyntheticDragEvent = SyntheticMouseEvent.extend({ - dataTransfer: null +let SyntheticDragEvent = SyntheticMouseEvent.extend({ + dataTransfer: null, }); /** * @interface TouchEvent * @see http://www.w3.org/TR/touch-events/ */ -var SyntheticTouchEvent = SyntheticUIEvent.extend({ +let SyntheticTouchEvent = SyntheticUIEvent.extend({ touches: null, targetTouches: null, changedTouches: null, @@ -4545,7 +4550,7 @@ var SyntheticTouchEvent = SyntheticUIEvent.extend({ metaKey: null, ctrlKey: null, shiftKey: null, - getModifierState: getEventModifierState + getModifierState: getEventModifierState, }); /** @@ -4553,22 +4558,22 @@ var SyntheticTouchEvent = SyntheticUIEvent.extend({ * @see http://www.w3.org/TR/2009/WD-css3-transitions-20090320/#transition-events- * @see https://developer.mozilla.org/en-US/docs/Web/API/TransitionEvent */ -var SyntheticTransitionEvent = SyntheticEvent$1.extend({ +let SyntheticTransitionEvent = SyntheticEvent$1.extend({ propertyName: null, elapsedTime: null, - pseudoElement: null + pseudoElement: null, }); /** * @interface WheelEvent * @see http://www.w3.org/TR/DOM-Level-3-Events/ */ -var SyntheticWheelEvent = SyntheticMouseEvent.extend({ - deltaX: function (event) { +let SyntheticWheelEvent = SyntheticMouseEvent.extend({ + deltaX: function(event) { return 'deltaX' in event ? event.deltaX : // Fallback to `wheelDeltaX` for Webkit and normalize (right is positive). 'wheelDeltaX' in event ? -event.wheelDeltaX : 0; }, - deltaY: function (event) { + deltaY: function(event) { return 'deltaY' in event ? event.deltaY : // Fallback to `wheelDeltaY` for Webkit and normalize (down is positive). 'wheelDeltaY' in event ? -event.wheelDeltaY : // Fallback to `wheelDelta` for IE<9 and normalize (down is positive). 'wheelDelta' in event ? -event.wheelDelta : 0; @@ -4580,7 +4585,7 @@ var SyntheticWheelEvent = SyntheticMouseEvent.extend({ // notch on the scroll is always +/- 120, roughly equivalent to pixels. // A good approximation of DOM_DELTA_LINE (1) is 5% of viewport size or // ~40 pixels, for DOM_DELTA_SCREEN (2) it is 87.5% of viewport size. - deltaMode: null + deltaMode: null, }); /** @@ -4602,56 +4607,58 @@ var SyntheticWheelEvent = SyntheticMouseEvent.extend({ * ]); */ -var interactiveEventTypeNames = [[TOP_BLUR, 'blur'], [TOP_CANCEL, 'cancel'], [TOP_CLICK, 'click'], [TOP_CLOSE, 'close'], [TOP_CONTEXT_MENU, 'contextMenu'], [TOP_COPY, 'copy'], [TOP_CUT, 'cut'], [TOP_DOUBLE_CLICK, 'doubleClick'], [TOP_DRAG_END, 'dragEnd'], [TOP_DRAG_START, 'dragStart'], [TOP_DROP, 'drop'], [TOP_FOCUS, 'focus'], [TOP_INPUT, 'input'], [TOP_INVALID, 'invalid'], [TOP_KEY_DOWN, 'keyDown'], [TOP_KEY_PRESS, 'keyPress'], [TOP_KEY_UP, 'keyUp'], [TOP_MOUSE_DOWN, 'mouseDown'], [TOP_MOUSE_UP, 'mouseUp'], [TOP_PASTE, 'paste'], [TOP_PAUSE, 'pause'], [TOP_PLAY, 'play'], [TOP_POINTER_CANCEL, 'pointerCancel'], [TOP_POINTER_DOWN, 'pointerDown'], [TOP_POINTER_UP, 'pointerUp'], [TOP_RATE_CHANGE, 'rateChange'], [TOP_RESET, 'reset'], [TOP_SEEKED, 'seeked'], [TOP_SUBMIT, 'submit'], [TOP_TOUCH_CANCEL, 'touchCancel'], [TOP_TOUCH_END, 'touchEnd'], [TOP_TOUCH_START, 'touchStart'], [TOP_VOLUME_CHANGE, 'volumeChange']]; -var nonInteractiveEventTypeNames = [[TOP_ABORT, 'abort'], [TOP_ANIMATION_END, 'animationEnd'], [TOP_ANIMATION_ITERATION, 'animationIteration'], [TOP_ANIMATION_START, 'animationStart'], [TOP_CAN_PLAY, 'canPlay'], [TOP_CAN_PLAY_THROUGH, 'canPlayThrough'], [TOP_DRAG, 'drag'], [TOP_DRAG_ENTER, 'dragEnter'], [TOP_DRAG_EXIT, 'dragExit'], [TOP_DRAG_LEAVE, 'dragLeave'], [TOP_DRAG_OVER, 'dragOver'], [TOP_DURATION_CHANGE, 'durationChange'], [TOP_EMPTIED, 'emptied'], [TOP_ENCRYPTED, 'encrypted'], [TOP_ENDED, 'ended'], [TOP_ERROR, 'error'], [TOP_GOT_POINTER_CAPTURE, 'gotPointerCapture'], [TOP_LOAD, 'load'], [TOP_LOADED_DATA, 'loadedData'], [TOP_LOADED_METADATA, 'loadedMetadata'], [TOP_LOAD_START, 'loadStart'], [TOP_LOST_POINTER_CAPTURE, 'lostPointerCapture'], [TOP_MOUSE_MOVE, 'mouseMove'], [TOP_MOUSE_OUT, 'mouseOut'], [TOP_MOUSE_OVER, 'mouseOver'], [TOP_PLAYING, 'playing'], [TOP_POINTER_MOVE, 'pointerMove'], [TOP_POINTER_OUT, 'pointerOut'], [TOP_POINTER_OVER, 'pointerOver'], [TOP_PROGRESS, 'progress'], [TOP_SCROLL, 'scroll'], [TOP_SEEKING, 'seeking'], [TOP_STALLED, 'stalled'], [TOP_SUSPEND, 'suspend'], [TOP_TIME_UPDATE, 'timeUpdate'], [TOP_TOGGLE, 'toggle'], [TOP_TOUCH_MOVE, 'touchMove'], [TOP_TRANSITION_END, 'transitionEnd'], [TOP_WAITING, 'waiting'], [TOP_WHEEL, 'wheel']]; +let interactiveEventTypeNames = [[TOP_BLUR, 'blur'], [TOP_CANCEL, 'cancel'], [TOP_CLICK, 'click'], [TOP_CLOSE, 'close'], [TOP_CONTEXT_MENU, 'contextMenu'], [TOP_COPY, 'copy'], [TOP_CUT, 'cut'], [TOP_DOUBLE_CLICK, 'doubleClick'], [TOP_DRAG_END, 'dragEnd'], [TOP_DRAG_START, 'dragStart'], [TOP_DROP, 'drop'], [TOP_FOCUS, 'focus'], [TOP_INPUT, 'input'], [TOP_INVALID, 'invalid'], [TOP_KEY_DOWN, 'keyDown'], [TOP_KEY_PRESS, 'keyPress'], [TOP_KEY_UP, 'keyUp'], [TOP_MOUSE_DOWN, 'mouseDown'], [TOP_MOUSE_UP, 'mouseUp'], [TOP_PASTE, 'paste'], [TOP_PAUSE, 'pause'], [TOP_PLAY, 'play'], [TOP_POINTER_CANCEL, 'pointerCancel'], [TOP_POINTER_DOWN, 'pointerDown'], [TOP_POINTER_UP, 'pointerUp'], [TOP_RATE_CHANGE, 'rateChange'], [TOP_RESET, 'reset'], [TOP_SEEKED, 'seeked'], [TOP_SUBMIT, 'submit'], [TOP_TOUCH_CANCEL, 'touchCancel'], [TOP_TOUCH_END, 'touchEnd'], [TOP_TOUCH_START, 'touchStart'], [TOP_VOLUME_CHANGE, 'volumeChange']]; +let nonInteractiveEventTypeNames = [[TOP_ABORT, 'abort'], [TOP_ANIMATION_END, 'animationEnd'], [TOP_ANIMATION_ITERATION, 'animationIteration'], [TOP_ANIMATION_START, 'animationStart'], [TOP_CAN_PLAY, 'canPlay'], [TOP_CAN_PLAY_THROUGH, 'canPlayThrough'], [TOP_DRAG, 'drag'], [TOP_DRAG_ENTER, 'dragEnter'], [TOP_DRAG_EXIT, 'dragExit'], [TOP_DRAG_LEAVE, 'dragLeave'], [TOP_DRAG_OVER, 'dragOver'], [TOP_DURATION_CHANGE, 'durationChange'], [TOP_EMPTIED, 'emptied'], [TOP_ENCRYPTED, 'encrypted'], [TOP_ENDED, 'ended'], [TOP_ERROR, 'error'], [TOP_GOT_POINTER_CAPTURE, 'gotPointerCapture'], [TOP_LOAD, 'load'], [TOP_LOADED_DATA, 'loadedData'], [TOP_LOADED_METADATA, 'loadedMetadata'], [TOP_LOAD_START, 'loadStart'], [TOP_LOST_POINTER_CAPTURE, 'lostPointerCapture'], [TOP_MOUSE_MOVE, 'mouseMove'], [TOP_MOUSE_OUT, 'mouseOut'], [TOP_MOUSE_OVER, 'mouseOver'], [TOP_PLAYING, 'playing'], [TOP_POINTER_MOVE, 'pointerMove'], [TOP_POINTER_OUT, 'pointerOut'], [TOP_POINTER_OVER, 'pointerOver'], [TOP_PROGRESS, 'progress'], [TOP_SCROLL, 'scroll'], [TOP_SEEKING, 'seeking'], [TOP_STALLED, 'stalled'], [TOP_SUSPEND, 'suspend'], [TOP_TIME_UPDATE, 'timeUpdate'], [TOP_TOGGLE, 'toggle'], [TOP_TOUCH_MOVE, 'touchMove'], [TOP_TRANSITION_END, 'transitionEnd'], [TOP_WAITING, 'waiting'], [TOP_WHEEL, 'wheel']]; -var eventTypes$4 = {}; -var topLevelEventsToDispatchConfig = {}; +let eventTypes$4 = {}; +let topLevelEventsToDispatchConfig = {}; function addEventTypeNameToConfig(_ref, isInteractive) { - var topEvent = _ref[0], - event = _ref[1]; + let topEvent = _ref[0]; + - var capitalizedEvent = event[0].toUpperCase() + event.slice(1); - var onEvent = 'on' + capitalizedEvent; +let event = _ref[1]; - var type = { + let capitalizedEvent = event[0].toUpperCase() + event.slice(1); + let onEvent = 'on' + capitalizedEvent; + + let type = { phasedRegistrationNames: { bubbled: onEvent, - captured: onEvent + 'Capture' + captured: onEvent + 'Capture', }, dependencies: [topEvent], - isInteractive: isInteractive + isInteractive: isInteractive, }; eventTypes$4[event] = type; topLevelEventsToDispatchConfig[topEvent] = type; } -interactiveEventTypeNames.forEach(function (eventTuple) { +interactiveEventTypeNames.forEach(function(eventTuple) { addEventTypeNameToConfig(eventTuple, true); }); -nonInteractiveEventTypeNames.forEach(function (eventTuple) { +nonInteractiveEventTypeNames.forEach(function(eventTuple) { addEventTypeNameToConfig(eventTuple, false); }); // Only used in DEV for exhaustiveness validation. -var knownHTMLTopLevelTypes = [TOP_ABORT, TOP_CANCEL, TOP_CAN_PLAY, TOP_CAN_PLAY_THROUGH, TOP_CLOSE, TOP_DURATION_CHANGE, TOP_EMPTIED, TOP_ENCRYPTED, TOP_ENDED, TOP_ERROR, TOP_INPUT, TOP_INVALID, TOP_LOAD, TOP_LOADED_DATA, TOP_LOADED_METADATA, TOP_LOAD_START, TOP_PAUSE, TOP_PLAY, TOP_PLAYING, TOP_PROGRESS, TOP_RATE_CHANGE, TOP_RESET, TOP_SEEKED, TOP_SEEKING, TOP_STALLED, TOP_SUBMIT, TOP_SUSPEND, TOP_TIME_UPDATE, TOP_TOGGLE, TOP_VOLUME_CHANGE, TOP_WAITING]; +let knownHTMLTopLevelTypes = [TOP_ABORT, TOP_CANCEL, TOP_CAN_PLAY, TOP_CAN_PLAY_THROUGH, TOP_CLOSE, TOP_DURATION_CHANGE, TOP_EMPTIED, TOP_ENCRYPTED, TOP_ENDED, TOP_ERROR, TOP_INPUT, TOP_INVALID, TOP_LOAD, TOP_LOADED_DATA, TOP_LOADED_METADATA, TOP_LOAD_START, TOP_PAUSE, TOP_PLAY, TOP_PLAYING, TOP_PROGRESS, TOP_RATE_CHANGE, TOP_RESET, TOP_SEEKED, TOP_SEEKING, TOP_STALLED, TOP_SUBMIT, TOP_SUSPEND, TOP_TIME_UPDATE, TOP_TOGGLE, TOP_VOLUME_CHANGE, TOP_WAITING]; -var SimpleEventPlugin = { +let SimpleEventPlugin = { eventTypes: eventTypes$4, - isInteractiveTopLevelEventType: function (topLevelType) { - var config = topLevelEventsToDispatchConfig[topLevelType]; + isInteractiveTopLevelEventType: function(topLevelType) { + let config = topLevelEventsToDispatchConfig[topLevelType]; return config !== undefined && config.isInteractive === true; }, - extractEvents: function (topLevelType, targetInst, nativeEvent, nativeEventTarget) { - var dispatchConfig = topLevelEventsToDispatchConfig[topLevelType]; + extractEvents: function(topLevelType, targetInst, nativeEvent, nativeEventTarget) { + let dispatchConfig = topLevelEventsToDispatchConfig[topLevelType]; if (!dispatchConfig) { return null; } - var EventConstructor = void 0; + let EventConstructor = void 0; switch (topLevelType) { case TOP_KEY_PRESS: // Firefox creates a keypress event for function keys too. This removes @@ -4743,17 +4750,17 @@ var SimpleEventPlugin = { EventConstructor = SyntheticEvent$1; break; } - var event = EventConstructor.getPooled(dispatchConfig, targetInst, nativeEvent, nativeEventTarget); + let event = EventConstructor.getPooled(dispatchConfig, targetInst, nativeEvent, nativeEventTarget); accumulateTwoPhaseDispatches(event); return event; - } + }, }; -var isInteractiveTopLevelEventType = SimpleEventPlugin.isInteractiveTopLevelEventType; +let isInteractiveTopLevelEventType = SimpleEventPlugin.isInteractiveTopLevelEventType; -var CALLBACK_BOOKKEEPING_POOL_SIZE = 10; -var callbackBookkeepingPool = []; +let CALLBACK_BOOKKEEPING_POOL_SIZE = 10; +let callbackBookkeepingPool = []; /** * Find the deepest React component completely containing the root of the @@ -4777,7 +4784,7 @@ function findRootContainerNode(inst) { // Used to store ancestor hierarchy in top level callback function getTopLevelCallbackBookKeeping(topLevelType, nativeEvent, targetInst) { if (callbackBookkeepingPool.length) { - var instance = callbackBookkeepingPool.pop(); + let instance = callbackBookkeepingPool.pop(); instance.topLevelType = topLevelType; instance.nativeEvent = nativeEvent; instance.targetInst = targetInst; @@ -4787,7 +4794,7 @@ function getTopLevelCallbackBookKeeping(topLevelType, nativeEvent, targetInst) { topLevelType: topLevelType, nativeEvent: nativeEvent, targetInst: targetInst, - ancestors: [] + ancestors: [], }; } @@ -4802,19 +4809,19 @@ function releaseTopLevelCallbackBookKeeping(instance) { } function handleTopLevel(bookKeeping) { - var targetInst = bookKeeping.targetInst; + let targetInst = bookKeeping.targetInst; // Loop through the hierarchy, in case there's any nested components. // It's important that we build the array of ancestors before calling any // event handlers, because event handlers can modify the DOM, leading to // inconsistencies with ReactMount's node cache. See #1105. - var ancestor = targetInst; + let ancestor = targetInst; do { if (!ancestor) { bookKeeping.ancestors.push(ancestor); break; } - var root = findRootContainerNode(ancestor); + let root = findRootContainerNode(ancestor); if (!root) { break; } @@ -4822,14 +4829,14 @@ function handleTopLevel(bookKeeping) { ancestor = getClosestInstanceFromNode(root); } while (ancestor); - for (var i = 0; i < bookKeeping.ancestors.length; i++) { + for (let i = 0; i < bookKeeping.ancestors.length; i++) { targetInst = bookKeeping.ancestors[i]; runExtractedEventsInBatch(bookKeeping.topLevelType, targetInst, bookKeeping.nativeEvent, getEventTarget(bookKeeping.nativeEvent)); } } // TODO: can we stop exporting these? -var _enabled = true; +let _enabled = true; function setEnabled(enabled) { _enabled = !!enabled; @@ -4852,7 +4859,7 @@ function trapBubbledEvent(topLevelType, element) { if (!element) { return null; } - var dispatch = isInteractiveTopLevelEventType(topLevelType) ? dispatchInteractiveEvent : dispatchEvent; + let dispatch = isInteractiveTopLevelEventType(topLevelType) ? dispatchInteractiveEvent : dispatchEvent; addEventBubbleListener(element, getRawEventName(topLevelType), // Check if interactive and wrap in interactiveUpdates @@ -4872,7 +4879,7 @@ function trapCapturedEvent(topLevelType, element) { if (!element) { return null; } - var dispatch = isInteractiveTopLevelEventType(topLevelType) ? dispatchInteractiveEvent : dispatchEvent; + let dispatch = isInteractiveTopLevelEventType(topLevelType) ? dispatchInteractiveEvent : dispatchEvent; addEventCaptureListener(element, getRawEventName(topLevelType), // Check if interactive and wrap in interactiveUpdates @@ -4888,8 +4895,8 @@ function dispatchEvent(topLevelType, nativeEvent) { return; } - var nativeEventTarget = getEventTarget(nativeEvent); - var targetInst = getClosestInstanceFromNode(nativeEventTarget); + let nativeEventTarget = getEventTarget(nativeEvent); + let targetInst = getClosestInstanceFromNode(nativeEventTarget); if (targetInst !== null && typeof targetInst.tag === 'number' && !isFiberMounted(targetInst)) { // If we get an event (ex: img onload) before committing that // component's mount, ignore it for now (that is, treat it as if it was an @@ -4898,7 +4905,7 @@ function dispatchEvent(topLevelType, nativeEvent) { targetInst = null; } - var bookKeeping = getTopLevelCallbackBookKeeping(topLevelType, nativeEvent, targetInst); + let bookKeeping = getTopLevelCallbackBookKeeping(topLevelType, nativeEvent, targetInst); try { // Event queue being processed in the same cycle allows @@ -4909,13 +4916,15 @@ function dispatchEvent(topLevelType, nativeEvent) { } } -var ReactDOMEventListener = Object.freeze({ - get _enabled () { return _enabled; }, +let ReactDOMEventListener = Object.freeze({ + get _enabled() { + return _enabled; +}, setEnabled: setEnabled, isEnabled: isEnabled, trapBubbledEvent: trapBubbledEvent, trapCapturedEvent: trapCapturedEvent, - dispatchEvent: dispatchEvent + dispatchEvent: dispatchEvent, }); /** @@ -4974,13 +4983,13 @@ var ReactDOMEventListener = Object.freeze({ * React Core . General Purpose Event Plugin System */ -var alreadyListeningTo = {}; -var reactTopListenersCounter = 0; +let alreadyListeningTo = {}; +let reactTopListenersCounter = 0; /** * To ensure no conflicts with other potential React instances on the page */ -var topListenersIDKey = '_reactListenersID' + ('' + Math.random()).slice(2); +let topListenersIDKey = '_reactListenersID' + ('' + Math.random()).slice(2); function getListeningForDocument(mountAt) { // In IE8, `mountAt` is a host object and doesn't have `hasOwnProperty` @@ -5014,11 +5023,11 @@ function getListeningForDocument(mountAt) { * @param {object} mountAt Container where to mount the listener */ function listenTo(registrationName, mountAt) { - var isListening = getListeningForDocument(mountAt); - var dependencies = registrationNameDependencies[registrationName]; + let isListening = getListeningForDocument(mountAt); + let dependencies = registrationNameDependencies[registrationName]; - for (var i = 0; i < dependencies.length; i++) { - var dependency = dependencies[i]; + for (let i = 0; i < dependencies.length; i++) { + let dependency = dependencies[i]; if (!(isListening.hasOwnProperty(dependency) && isListening[dependency])) { switch (dependency) { case TOP_SCROLL: @@ -5060,10 +5069,10 @@ function listenTo(registrationName, mountAt) { } function isListeningToAllDependencies(registrationName, mountAt) { - var isListening = getListeningForDocument(mountAt); - var dependencies = registrationNameDependencies[registrationName]; - for (var i = 0; i < dependencies.length; i++) { - var dependency = dependencies[i]; + let isListening = getListeningForDocument(mountAt); + let dependencies = registrationNameDependencies[registrationName]; + for (let i = 0; i < dependencies.length; i++) { + let dependency = dependencies[i]; if (!(isListening.hasOwnProperty(dependency) && isListening[dependency])) { return false; } @@ -5085,12 +5094,12 @@ function isListeningToAllDependencies(registrationName, mountAt) { * @return {boolean} Whether or not the object is a DOM node. */ function isNode(object) { - var doc = object ? object.ownerDocument || object : document; - var defaultView = doc.defaultView || window; + let doc = object ? object.ownerDocument || object : document; + let defaultView = doc.defaultView || window; return !!(object && (typeof defaultView.Node === 'function' ? object instanceof defaultView.Node : typeof object === 'object' && typeof object.nodeType === 'number' && typeof object.nodeName === 'string')); } -var isNode_1 = isNode; +let isNode_1 = isNode; /** * Copyright (c) 2013-present, Facebook, Inc. @@ -5102,7 +5111,6 @@ var isNode_1 = isNode; */ - /** * @param {*} object The object to check. * @return {boolean} Whether or not the object is a DOM text node. @@ -5111,7 +5119,7 @@ function isTextNode(object) { return isNode_1(object) && object.nodeType == 3; } -var isTextNode_1 = isTextNode; +let isTextNode_1 = isTextNode; /** * Copyright (c) 2013-present, Facebook, Inc. @@ -5119,12 +5127,11 @@ var isTextNode_1 = isTextNode; * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * + * */ - -/*eslint-disable no-bitwise */ +/* eslint-disable no-bitwise */ /** * Checks if a given DOM node contains or is another DOM node. @@ -5147,7 +5154,7 @@ function containsNode(outerNode, innerNode) { } } -var containsNode_1 = containsNode; +let containsNode_1 = containsNode; /** * Given any node return the first leaf node without children. @@ -5186,9 +5193,9 @@ function getSiblingNode(node) { * @return {?object} */ function getNodeForCharacterOffset(root, offset) { - var node = getLeafNode(root); - var nodeStart = 0; - var nodeEnd = 0; + let node = getLeafNode(root); + let nodeStart = 0; + let nodeEnd = 0; while (node) { if (node.nodeType === TEXT_NODE) { @@ -5197,7 +5204,7 @@ function getNodeForCharacterOffset(root, offset) { if (nodeStart <= offset && nodeEnd >= offset) { return { node: node, - offset: offset - nodeStart + offset: offset - nodeStart, }; } @@ -5213,16 +5220,22 @@ function getNodeForCharacterOffset(root, offset) { * @return {?object} */ function getOffsets(outerNode) { - var selection = window.getSelection && window.getSelection(); + let selection = window.getSelection && window.getSelection(); if (!selection || selection.rangeCount === 0) { return null; } - var anchorNode = selection.anchorNode, - anchorOffset = selection.anchorOffset, - focusNode = selection.focusNode, - focusOffset = selection.focusOffset; + let anchorNode = selection.anchorNode; + + +let anchorOffset = selection.anchorOffset; + + +let focusNode = selection.focusNode; + + +let focusOffset = selection.focusOffset; // In Firefox, anchorNode and focusNode can be "anonymous divs", e.g. the // up/down buttons on an . Anonymous divs do not seem to @@ -5254,16 +5267,16 @@ function getOffsets(outerNode) { * Exported only for testing. */ function getModernOffsetsFromPoints(outerNode, anchorNode, anchorOffset, focusNode, focusOffset) { - var length = 0; - var start = -1; - var end = -1; - var indexWithinAnchor = 0; - var indexWithinFocus = 0; - var node = outerNode; - var parentNode = null; + let length = 0; + let start = -1; + let end = -1; + let indexWithinAnchor = 0; + let indexWithinFocus = 0; + let node = outerNode; + let parentNode = null; outer: while (true) { - var next = null; + let next = null; while (true) { if (node === anchorNode && (anchorOffset === 0 || node.nodeType === TEXT_NODE)) { @@ -5318,7 +5331,7 @@ function getModernOffsetsFromPoints(outerNode, anchorNode, anchorOffset, focusNo return { start: start, - end: end + end: end, }; } @@ -5339,27 +5352,27 @@ function setOffsets(node, offsets) { return; } - var selection = window.getSelection(); - var length = node[getTextContentAccessor()].length; - var start = Math.min(offsets.start, length); - var end = offsets.end === undefined ? start : Math.min(offsets.end, length); + let selection = window.getSelection(); + let length = node[getTextContentAccessor()].length; + let start = Math.min(offsets.start, length); + let end = offsets.end === undefined ? start : Math.min(offsets.end, length); // IE 11 uses modern selection, but doesn't support the extend method. // Flip backward selections, so we can set with a single range. if (!selection.extend && start > end) { - var temp = end; + let temp = end; end = start; start = temp; } - var startMarker = getNodeForCharacterOffset(node, start); - var endMarker = getNodeForCharacterOffset(node, end); + let startMarker = getNodeForCharacterOffset(node, start); + let endMarker = getNodeForCharacterOffset(node, end); if (startMarker && endMarker) { if (selection.rangeCount === 1 && selection.anchorNode === startMarker.node && selection.anchorOffset === startMarker.offset && selection.focusNode === endMarker.node && selection.focusOffset === endMarker.offset) { return; } - var range = document.createRange(); + let range = document.createRange(); range.setStart(startMarker.node, startMarker.offset); selection.removeAllRanges(); @@ -5390,15 +5403,15 @@ function isInDocument(node) { * and `selectionEnd` rows. */ function hasSelectionCapabilities(elem) { - var nodeName = elem && elem.nodeName && elem.nodeName.toLowerCase(); + let nodeName = elem && elem.nodeName && elem.nodeName.toLowerCase(); return nodeName && (nodeName === 'input' && (elem.type === 'text' || elem.type === 'search' || elem.type === 'tel' || elem.type === 'url' || elem.type === 'password') || nodeName === 'textarea' || elem.contentEditable === 'true'); } function getSelectionInformation() { - var focusedElem = getActiveElement_1(); + let focusedElem = getActiveElement_1(); return { focusedElem: focusedElem, - selectionRange: hasSelectionCapabilities(focusedElem) ? getSelection$1(focusedElem) : null + selectionRange: hasSelectionCapabilities(focusedElem) ? getSelection$1(focusedElem) : null, }; } @@ -5408,23 +5421,23 @@ function getSelectionInformation() { * nodes and place them back in, resulting in focus being lost. */ function restoreSelection(priorSelectionInformation) { - var curFocusedElem = getActiveElement_1(); - var priorFocusedElem = priorSelectionInformation.focusedElem; - var priorSelectionRange = priorSelectionInformation.selectionRange; + let curFocusedElem = getActiveElement_1(); + let priorFocusedElem = priorSelectionInformation.focusedElem; + let priorSelectionRange = priorSelectionInformation.selectionRange; if (curFocusedElem !== priorFocusedElem && isInDocument(priorFocusedElem)) { if (priorSelectionRange !== null && hasSelectionCapabilities(priorFocusedElem)) { setSelection(priorFocusedElem, priorSelectionRange); } // Focusing a node can change the scroll position, which is undesirable - var ancestors = []; - var ancestor = priorFocusedElem; + let ancestors = []; + let ancestor = priorFocusedElem; while (ancestor = ancestor.parentNode) { if (ancestor.nodeType === ELEMENT_NODE) { ancestors.push({ element: ancestor, left: ancestor.scrollLeft, - top: ancestor.scrollTop + top: ancestor.scrollTop, }); } } @@ -5433,8 +5446,8 @@ function restoreSelection(priorSelectionInformation) { priorFocusedElem.focus(); } - for (var i = 0; i < ancestors.length; i++) { - var info = ancestors[i]; + for (let i = 0; i < ancestors.length; i++) { + let info = ancestors[i]; info.element.scrollLeft = info.left; info.element.scrollTop = info.top; } @@ -5448,20 +5461,20 @@ function restoreSelection(priorSelectionInformation) { * -@return {start: selectionStart, end: selectionEnd} */ function getSelection$1(input) { - var selection = void 0; + let selection = void 0; if ('selectionStart' in input) { // Modern browser with input or textarea. selection = { start: input.selectionStart, - end: input.selectionEnd + end: input.selectionEnd, }; } else { // Content editable or old IE textarea. selection = getOffsets(input); } - return selection || { start: 0, end: 0 }; + return selection || {start: 0, end: 0}; } /** @@ -5471,8 +5484,10 @@ function getSelection$1(input) { * -@offsets Object of same form that is returned from get* */ function setSelection(input, offsets) { - var start = offsets.start, - end = offsets.end; + let start = offsets.start; + + +let end = offsets.end; if (end === undefined) { end = start; @@ -5486,22 +5501,22 @@ function setSelection(input, offsets) { } } -var skipSelectionChangeEvent = ExecutionEnvironment_1.canUseDOM && 'documentMode' in document && document.documentMode <= 11; +let skipSelectionChangeEvent = ExecutionEnvironment_1.canUseDOM && 'documentMode' in document && document.documentMode <= 11; -var eventTypes$3 = { +let eventTypes$3 = { select: { phasedRegistrationNames: { bubbled: 'onSelect', - captured: 'onSelectCapture' + captured: 'onSelectCapture', }, - dependencies: [TOP_BLUR, TOP_CONTEXT_MENU, TOP_FOCUS, TOP_KEY_DOWN, TOP_KEY_UP, TOP_MOUSE_DOWN, TOP_MOUSE_UP, TOP_SELECTION_CHANGE] - } + dependencies: [TOP_BLUR, TOP_CONTEXT_MENU, TOP_FOCUS, TOP_KEY_DOWN, TOP_KEY_UP, TOP_MOUSE_DOWN, TOP_MOUSE_UP, TOP_SELECTION_CHANGE], + }, }; -var activeElement$1 = null; -var activeElementInst$1 = null; -var lastSelection = null; -var mouseDown = false; +let activeElement$1 = null; +let activeElementInst$1 = null; +let lastSelection = null; +let mouseDown = false; /** * Get an object which is a unique representation of the current selection. @@ -5516,15 +5531,15 @@ function getSelection(node) { if ('selectionStart' in node && hasSelectionCapabilities(node)) { return { start: node.selectionStart, - end: node.selectionEnd + end: node.selectionEnd, }; } else if (window.getSelection) { - var selection = window.getSelection(); + let selection = window.getSelection(); return { anchorNode: selection.anchorNode, anchorOffset: selection.anchorOffset, focusNode: selection.focusNode, - focusOffset: selection.focusOffset + focusOffset: selection.focusOffset, }; } } @@ -5545,11 +5560,11 @@ function constructSelectEvent(nativeEvent, nativeEventTarget) { } // Only fire when selection has actually changed. - var currentSelection = getSelection(activeElement$1); + let currentSelection = getSelection(activeElement$1); if (!lastSelection || !shallowEqual_1(lastSelection, currentSelection)) { lastSelection = currentSelection; - var syntheticEvent = SyntheticEvent$1.getPooled(eventTypes$3.select, activeElementInst$1, nativeEvent, nativeEventTarget); + let syntheticEvent = SyntheticEvent$1.getPooled(eventTypes$3.select, activeElementInst$1, nativeEvent, nativeEventTarget); syntheticEvent.type = 'select'; syntheticEvent.target = activeElement$1; @@ -5576,18 +5591,18 @@ function constructSelectEvent(nativeEvent, nativeEventTarget) { * - Fires for collapsed selection. * - Fires after user input. */ -var SelectEventPlugin = { +let SelectEventPlugin = { eventTypes: eventTypes$3, - extractEvents: function (topLevelType, targetInst, nativeEvent, nativeEventTarget) { - var doc = nativeEventTarget.window === nativeEventTarget ? nativeEventTarget.document : nativeEventTarget.nodeType === DOCUMENT_NODE ? nativeEventTarget : nativeEventTarget.ownerDocument; + extractEvents: function(topLevelType, targetInst, nativeEvent, nativeEventTarget) { + let doc = nativeEventTarget.window === nativeEventTarget ? nativeEventTarget.document : nativeEventTarget.nodeType === DOCUMENT_NODE ? nativeEventTarget : nativeEventTarget.ownerDocument; // Track whether all listeners exists for this plugin. If none exist, we do // not extract events. See #3639. if (!doc || !isListeningToAllDependencies('onSelect', doc)) { return null; } - var targetNode = targetInst ? getNodeFromInstance$1(targetInst) : window; + let targetNode = targetInst ? getNodeFromInstance$1(targetInst) : window; switch (topLevelType) { // Track the input node that has focus. @@ -5632,7 +5647,7 @@ var SelectEventPlugin = { } return null; - } + }, }; /** @@ -5650,7 +5665,7 @@ injection.injectEventPluginsByName({ EnterLeaveEventPlugin: EnterLeaveEventPlugin, ChangeEventPlugin: ChangeEventPlugin, SelectEventPlugin: SelectEventPlugin, - BeforeInputEventPlugin: BeforeInputEventPlugin + BeforeInputEventPlugin: BeforeInputEventPlugin, }); /** @@ -5662,20 +5677,19 @@ injection.injectEventPluginsByName({ */ - -var emptyObject = {}; +let emptyObject = {}; { Object.freeze(emptyObject); } -var emptyObject_1 = emptyObject; +let emptyObject_1 = emptyObject; // We capture a local reference to any global, in case it gets polyfilled after // this module is initially evaluated. // We want to be using a consistent implementation. -var localRequestAnimationFrame$1 = typeof requestAnimationFrame === 'function' ? requestAnimationFrame : undefined; +let localRequestAnimationFrame$1 = typeof requestAnimationFrame === 'function' ? requestAnimationFrame : undefined; /** * A scheduling library to allow scheduling work with more granular priority and @@ -5701,53 +5715,53 @@ var localRequestAnimationFrame$1 = typeof requestAnimationFrame === 'function' ? // We capture a local reference to any global, in case it gets polyfilled after // this module is initially evaluated. // We want to be using a consistent implementation. -var localDate = Date; -var localSetTimeout = setTimeout; -var localClearTimeout = clearTimeout; +let localDate = Date; +let localSetTimeout = setTimeout; +let localClearTimeout = clearTimeout; -var hasNativePerformanceNow = typeof performance === 'object' && typeof performance.now === 'function'; +let hasNativePerformanceNow = typeof performance === 'object' && typeof performance.now === 'function'; -var now$1 = void 0; +let now$1 = void 0; if (hasNativePerformanceNow) { - var Performance = performance; - now$1 = function () { + let Performance = performance; + now$1 = function() { return Performance.now(); }; } else { - now$1 = function () { + now$1 = function() { return localDate.now(); }; } -var scheduleWork = void 0; -var cancelScheduledWork = void 0; +let scheduleWork = void 0; +let cancelScheduledWork = void 0; if (!ExecutionEnvironment_1.canUseDOM) { - var timeoutIds = new Map(); + let timeoutIds = new Map(); - scheduleWork = function (callback, options) { + scheduleWork = function(callback, options) { // keeping return type consistent - var callbackConfig = { + let callbackConfig = { scheduledCallback: callback, timeoutTime: 0, next: null, - prev: null + prev: null, }; - var timeoutId = localSetTimeout(function () { + let timeoutId = localSetTimeout(function() { callback({ - timeRemaining: function () { + timeRemaining: function() { return Infinity; }, - didTimeout: false + didTimeout: false, }); }); timeoutIds.set(callback, timeoutId); return callbackConfig; }; - cancelScheduledWork = function (callbackId) { - var callback = callbackId.scheduledCallback; - var timeoutId = timeoutIds.get(callback); + cancelScheduledWork = function(callbackId) { + let callback = callbackId.scheduledCallback; + let timeoutId = timeoutIds.get(callback); timeoutIds.delete(callbackId); localClearTimeout(timeoutId); }; @@ -5758,33 +5772,33 @@ if (!ExecutionEnvironment_1.canUseDOM) { } } - var localRequestAnimationFrame = typeof localRequestAnimationFrame$1 === 'function' ? localRequestAnimationFrame$1 : function (callback) { + let localRequestAnimationFrame = typeof localRequestAnimationFrame$1 === 'function' ? localRequestAnimationFrame$1 : function(callback) { invariant_1(false, 'React depends on requestAnimationFrame. Make sure that you load a polyfill in older browsers. https://fb.me/react-polyfills'); }; - var headOfPendingCallbacksLinkedList = null; - var tailOfPendingCallbacksLinkedList = null; + let headOfPendingCallbacksLinkedList = null; + let tailOfPendingCallbacksLinkedList = null; // We track what the next soonest timeoutTime is, to be able to quickly tell // if none of the scheduled callbacks have timed out. - var nextSoonestTimeoutTime = -1; + let nextSoonestTimeoutTime = -1; - var isIdleScheduled = false; - var isAnimationFrameScheduled = false; + let isIdleScheduled = false; + let isAnimationFrameScheduled = false; - var frameDeadline = 0; + let frameDeadline = 0; // We start out assuming that we run at 30fps but then the heuristic tracking // will adjust this value to a faster fps if we get more frequent animation // frames. - var previousFrameTime = 33; - var activeFrameTime = 33; + let previousFrameTime = 33; + let activeFrameTime = 33; - var frameDeadlineObject = { + let frameDeadlineObject = { didTimeout: false, - timeRemaining: function () { - var remaining = frameDeadline - now$1(); + timeRemaining: function() { + let remaining = frameDeadline - now$1(); return remaining > 0 ? remaining : 0; - } + }, }; /** @@ -5793,9 +5807,9 @@ if (!ExecutionEnvironment_1.canUseDOM) { * - do start a new postMessage callback, to call any remaining callbacks, * - but only if there is an error, so there is not extra overhead. */ - var callUnsafely = function (callbackConfig, arg) { - var callback = callbackConfig.scheduledCallback; - var finishedCalling = false; + let callUnsafely = function(callbackConfig, arg) { + let callback = callbackConfig.scheduledCallback; + let finishedCalling = false; try { callback(arg); finishedCalling = true; @@ -5816,12 +5830,12 @@ if (!ExecutionEnvironment_1.canUseDOM) { * any more have timed out. * Keeps doing this until there are none which have currently timed out. */ - var callTimedOutCallbacks = function () { + let callTimedOutCallbacks = function() { if (headOfPendingCallbacksLinkedList === null) { return; } - var currentTime = now$1(); + let currentTime = now$1(); // TODO: this would be more efficient if deferred callbacks are stored in // min heap. // Or in a linked list with links for both timeoutTime order and insertion @@ -5838,13 +5852,13 @@ if (!ExecutionEnvironment_1.canUseDOM) { // after successfully calling any timed out callbacks. // If a timed out callback throws an error, we could get stuck in a state // where the nextSoonestTimeoutTime was set wrong. - var updatedNextSoonestTimeoutTime = -1; // we will update nextSoonestTimeoutTime below - var timedOutCallbacks = []; + let updatedNextSoonestTimeoutTime = -1; // we will update nextSoonestTimeoutTime below + let timedOutCallbacks = []; // iterate once to find timed out callbacks and find nextSoonestTimeoutTime - var currentCallbackConfig = headOfPendingCallbacksLinkedList; + let currentCallbackConfig = headOfPendingCallbacksLinkedList; while (currentCallbackConfig !== null) { - var _timeoutTime = currentCallbackConfig.timeoutTime; + let _timeoutTime = currentCallbackConfig.timeoutTime; if (_timeoutTime !== -1 && _timeoutTime <= currentTime) { // it has timed out! timedOutCallbacks.push(currentCallbackConfig); @@ -5858,7 +5872,7 @@ if (!ExecutionEnvironment_1.canUseDOM) { if (timedOutCallbacks.length > 0) { frameDeadlineObject.didTimeout = true; - for (var i = 0, len = timedOutCallbacks.length; i < len; i++) { + for (let i = 0, len = timedOutCallbacks.length; i < len; i++) { callUnsafely(timedOutCallbacks[i], frameDeadlineObject); } } @@ -5870,7 +5884,7 @@ if (!ExecutionEnvironment_1.canUseDOM) { // We use the postMessage trick to defer idle work until after the repaint. var messageKey = '__reactIdleCallback$' + Math.random().toString(36).slice(2); - var idleTick = function (event) { + let idleTick = function(event) { if (event.source !== window || event.data !== messageKey) { return; } @@ -5883,10 +5897,10 @@ if (!ExecutionEnvironment_1.canUseDOM) { // First call anything which has timed out, until we have caught up. callTimedOutCallbacks(); - var currentTime = now$1(); + let currentTime = now$1(); // Next, as long as we have idle time, try calling more callbacks. while (frameDeadline - currentTime > 0 && headOfPendingCallbacksLinkedList !== null) { - var latestCallbackConfig = headOfPendingCallbacksLinkedList; + let latestCallbackConfig = headOfPendingCallbacksLinkedList; frameDeadlineObject.didTimeout = false; // callUnsafely will remove it from the head of the linked list callUnsafely(latestCallbackConfig, frameDeadlineObject); @@ -5904,9 +5918,9 @@ if (!ExecutionEnvironment_1.canUseDOM) { // something better for old IE. window.addEventListener('message', idleTick, false); - var animationTick = function (rafTime) { + var animationTick = function(rafTime) { isAnimationFrameScheduled = false; - var nextFrameTime = rafTime - frameDeadline + activeFrameTime; + let nextFrameTime = rafTime - frameDeadline + activeFrameTime; if (nextFrameTime < activeFrameTime && previousFrameTime < activeFrameTime) { if (nextFrameTime < 8) { // Defensive coding. We don't support higher frame rates than 120hz. @@ -5931,8 +5945,8 @@ if (!ExecutionEnvironment_1.canUseDOM) { } }; - scheduleWork = function (callback, options) /* CallbackConfigType */{ - var timeoutTime = -1; + scheduleWork = function(callback, options) /* CallbackConfigType */{ + let timeoutTime = -1; if (options != null && typeof options.timeout === 'number') { timeoutTime = now$1() + options.timeout; } @@ -5940,11 +5954,11 @@ if (!ExecutionEnvironment_1.canUseDOM) { nextSoonestTimeoutTime = timeoutTime; } - var scheduledCallbackConfig = { + let scheduledCallbackConfig = { scheduledCallback: callback, timeoutTime: timeoutTime, prev: null, - next: null + next: null, }; if (headOfPendingCallbacksLinkedList === null) { // Make this callback the head and tail of our list @@ -5954,7 +5968,7 @@ if (!ExecutionEnvironment_1.canUseDOM) { // Add latest callback as the new tail of the list scheduledCallbackConfig.prev = tailOfPendingCallbacksLinkedList; // renaming for clarity - var oldTailOfPendingCallbacksLinkedList = tailOfPendingCallbacksLinkedList; + let oldTailOfPendingCallbacksLinkedList = tailOfPendingCallbacksLinkedList; if (oldTailOfPendingCallbacksLinkedList !== null) { oldTailOfPendingCallbacksLinkedList.next = scheduledCallbackConfig; } @@ -5972,7 +5986,7 @@ if (!ExecutionEnvironment_1.canUseDOM) { return scheduledCallbackConfig; }; - cancelScheduledWork = function (callbackConfig /* CallbackConfigType */ + cancelScheduledWork = function(callbackConfig /* CallbackConfigType */ ) { if (callbackConfig.prev === null && headOfPendingCallbacksLinkedList !== callbackConfig) { // this callbackConfig has already been cancelled. @@ -5994,8 +6008,8 @@ if (!ExecutionEnvironment_1.canUseDOM) { * In this case we point the Head.next to the Tail and the Tail.prev to * the Head. */ - var next = callbackConfig.next; - var prev = callbackConfig.prev; + let next = callbackConfig.next; + let prev = callbackConfig.prev; callbackConfig.next = null; callbackConfig.prev = null; if (next !== null) { @@ -6037,16 +6051,16 @@ if (!ExecutionEnvironment_1.canUseDOM) { }; } -var didWarnSelectedSetOnOption = false; +let didWarnSelectedSetOnOption = false; function flattenChildren(children) { - var content = ''; + let content = ''; // Flatten children and warn if they aren't strings or numbers; // invalid types are ignored. // We can silently skip them because invalid DOM nesting warning // catches these cases in Fiber. - React.Children.forEach(children, function (child) { + React.Children.forEach(children, function(child) { if (child == null) { return; } @@ -6080,8 +6094,8 @@ function postMountWrapper$1(element, props) { } function getHostProps$1(element, props) { - var hostProps = _assign({ children: undefined }, props); - var content = flattenChildren(props.children); + let hostProps = _assign({children: undefined}, props); + let content = flattenChildren(props.children); if (content) { hostProps.children = content; @@ -6091,25 +6105,25 @@ function getHostProps$1(element, props) { } // TODO: direct imports like some-package/src/* are bad. Fix me. -var getCurrentFiberOwnerName$3 = ReactDebugCurrentFiber.getCurrentFiberOwnerName; -var getCurrentFiberStackAddendum$3 = ReactDebugCurrentFiber.getCurrentFiberStackAddendum; +let getCurrentFiberOwnerName$3 = ReactDebugCurrentFiber.getCurrentFiberOwnerName; +let getCurrentFiberStackAddendum$3 = ReactDebugCurrentFiber.getCurrentFiberStackAddendum; -var didWarnValueDefaultValue$1 = void 0; +let didWarnValueDefaultValue$1 = void 0; { didWarnValueDefaultValue$1 = false; } function getDeclarationErrorAddendum() { - var ownerName = getCurrentFiberOwnerName$3(); + let ownerName = getCurrentFiberOwnerName$3(); if (ownerName) { return '\n\nCheck the render method of `' + ownerName + '`.'; } return ''; } -var valuePropNames = ['value', 'defaultValue']; +let valuePropNames = ['value', 'defaultValue']; /** * Validation function for `value` and `defaultValue`. @@ -6117,12 +6131,12 @@ var valuePropNames = ['value', 'defaultValue']; function checkSelectPropTypes(props) { ReactControlledValuePropTypes.checkPropTypes('select', props, getCurrentFiberStackAddendum$3); - for (var i = 0; i < valuePropNames.length; i++) { - var propName = valuePropNames[i]; + for (let i = 0; i < valuePropNames.length; i++) { + let propName = valuePropNames[i]; if (props[propName] == null) { continue; } - var isArray = Array.isArray(props[propName]); + let isArray = Array.isArray(props[propName]); if (props.multiple && !isArray) { warning_1(false, 'The `%s` prop supplied to \n
\n
\n
\n \n \n
\n
\n
\n
\n').replace(/(^|\n)\s*/g,"");var init=function init(params){var c=getContainer();if(c){c.parentNode.removeChild(c);removeClass([document.documentElement,document.body],[swalClasses["no-backdrop"],swalClasses["toast-shown"],swalClasses["has-column"]])}if(isNodeEnv()){error("SweetAlert2 requires document to initialize");return}var container=document.createElement("div");container.className=swalClasses.container;container.innerHTML=sweetHTML;var targetElement=typeof params.target==="string"?document.querySelector(params.target):params.target;targetElement.appendChild(container);var popup=getPopup();var content=getContent();var input=getChildByClass(content,swalClasses.input);var file=getChildByClass(content,swalClasses.file);var range=content.querySelector(".".concat(swalClasses.range," input"));var rangeOutput=content.querySelector(".".concat(swalClasses.range," output"));var select=getChildByClass(content,swalClasses.select);var checkbox=content.querySelector(".".concat(swalClasses.checkbox," input"));var textarea=getChildByClass(content,swalClasses.textarea);popup.setAttribute("role",params.toast?"alert":"dialog");popup.setAttribute("aria-live",params.toast?"polite":"assertive");if(!params.toast){popup.setAttribute("aria-modal","true")}if(window.getComputedStyle(targetElement).direction==="rtl"){addClass(getContainer(),swalClasses.rtl)}var oldInputVal;var resetValidationMessage=function resetValidationMessage(e){if(Swal.isVisible()&&oldInputVal!==e.target.value){Swal.resetValidationMessage()}oldInputVal=e.target.value};input.oninput=resetValidationMessage;file.onchange=resetValidationMessage;select.onchange=resetValidationMessage;checkbox.onchange=resetValidationMessage;textarea.oninput=resetValidationMessage;range.oninput=function(e){resetValidationMessage(e);rangeOutput.value=range.value};range.onchange=function(e){resetValidationMessage(e);range.nextSibling.value=range.value};return popup};var parseHtmlToContainer=function parseHtmlToContainer(param,target){if(!param){return hide(target)}if(param instanceof HTMLElement){target.appendChild(param)}else if(_typeof(param)==="object"){target.innerHTML="";if(0 in param){for(var i=0;i in param;i++){target.appendChild(param[i].cloneNode(true))}}else{target.appendChild(param.cloneNode(true))}}else if(param){target.innerHTML=param}show(target)};var animationEndEvent=function(){if(isNodeEnv()){return false}var testEl=document.createElement("div");var transEndEventNames={WebkitAnimation:"webkitAnimationEnd",OAnimation:"oAnimationEnd oanimationend",animation:"animationend"};for(var i in transEndEventNames){if(transEndEventNames.hasOwnProperty(i)&&typeof testEl.style[i]!=="undefined"){return transEndEventNames[i]}}return false}();var measureScrollbar=function measureScrollbar(){var supportsTouch="ontouchstart"in window||navigator.msMaxTouchPoints;if(supportsTouch){return 0}var scrollDiv=document.createElement("div");scrollDiv.style.width="50px";scrollDiv.style.height="50px";scrollDiv.style.overflow="scroll";document.body.appendChild(scrollDiv);var scrollbarWidth=scrollDiv.offsetWidth-scrollDiv.clientWidth;document.body.removeChild(scrollDiv);return scrollbarWidth};var renderActions=function renderActions(params){var actions=getActions();var confirmButton=getConfirmButton();var cancelButton=getCancelButton();if(!params.showConfirmButton&&!params.showCancelButton){hide(actions)}else{show(actions)}if(params.showCancelButton){cancelButton.style.display="inline-block"}else{hide(cancelButton)}if(params.showConfirmButton){confirmButton.style.removeProperty("display")}else{hide(confirmButton)}confirmButton.innerHTML=params.confirmButtonText;cancelButton.innerHTML=params.cancelButtonText;confirmButton.setAttribute("aria-label",params.confirmButtonAriaLabel);cancelButton.setAttribute("aria-label",params.cancelButtonAriaLabel);confirmButton.className=swalClasses.confirm;addClass(confirmButton,params.confirmButtonClass);cancelButton.className=swalClasses.cancel;addClass(cancelButton,params.cancelButtonClass);if(params.buttonsStyling){addClass([confirmButton,cancelButton],swalClasses.styled);if(params.confirmButtonColor){confirmButton.style.backgroundColor=params.confirmButtonColor}if(params.cancelButtonColor){cancelButton.style.backgroundColor=params.cancelButtonColor}var confirmButtonBackgroundColor=window.getComputedStyle(confirmButton).getPropertyValue("background-color");confirmButton.style.borderLeftColor=confirmButtonBackgroundColor;confirmButton.style.borderRightColor=confirmButtonBackgroundColor}else{removeClass([confirmButton,cancelButton],swalClasses.styled);confirmButton.style.backgroundColor=confirmButton.style.borderLeftColor=confirmButton.style.borderRightColor="";cancelButton.style.backgroundColor=cancelButton.style.borderLeftColor=cancelButton.style.borderRightColor=""}};var renderContent=function renderContent(params){var content=getContent().querySelector("#"+swalClasses.content);if(params.html){parseHtmlToContainer(params.html,content)}else if(params.text){content.textContent=params.text;show(content)}else{hide(content)}};var renderIcon=function renderIcon(params){var icons=getIcons();for(var i=0;i=params.progressSteps.length){warn("Invalid currentProgressStep parameter, it should be less than progressSteps.length "+"(currentProgressStep like JS arrays starts from 0)")}params.progressSteps.forEach(function(step,index){var circle=document.createElement("li");addClass(circle,swalClasses.progresscircle);circle.innerHTML=step;if(index===currentProgressStep){addClass(circle,swalClasses.activeprogressstep)}progressStepsContainer.appendChild(circle);if(index!==params.progressSteps.length-1){var line=document.createElement("li");addClass(line,swalClasses.progressline);if(params.progressStepsDistance){line.style.width=params.progressStepsDistance}progressStepsContainer.appendChild(line)}})}else{hide(progressStepsContainer)}};var renderTitle=function renderTitle(params){var title=getTitle();if(params.titleText){title.innerText=params.titleText}else if(params.title){if(typeof params.title==="string"){params.title=params.title.split("\n").join("
")}parseHtmlToContainer(params.title,title)}};var fixScrollbar=function fixScrollbar(){if(states.previousBodyPadding!==null){return}if(document.body.scrollHeight>window.innerHeight){states.previousBodyPadding=parseInt(window.getComputedStyle(document.body).getPropertyValue("padding-right"));document.body.style.paddingRight=states.previousBodyPadding+measureScrollbar()+"px"}};var undoScrollbar=function undoScrollbar(){if(states.previousBodyPadding!==null){document.body.style.paddingRight=states.previousBodyPadding;states.previousBodyPadding=null}};var iOSfix=function iOSfix(){var iOS=/iPad|iPhone|iPod/.test(navigator.userAgent)&&!window.MSStream;if(iOS&&!hasClass(document.body,swalClasses.iosfix)){var offset=document.body.scrollTop;document.body.style.top=offset*-1+"px";addClass(document.body,swalClasses.iosfix)}};var undoIOSfix=function undoIOSfix(){if(hasClass(document.body,swalClasses.iosfix)){var offset=parseInt(document.body.style.top,10);removeClass(document.body,swalClasses.iosfix);document.body.style.top="";document.body.scrollTop=offset*-1}};var isIE11=function isIE11(){return!!window.MSInputMethodContext&&!!document.documentMode};var fixVerticalPositionIE=function fixVerticalPositionIE(){var container=getContainer();var popup=getPopup();container.style.removeProperty("align-items");if(popup.offsetTop<0){container.style.alignItems="flex-start"}};var IEfix=function IEfix(){if(typeof window!=="undefined"&&isIE11()){fixVerticalPositionIE();window.addEventListener("resize",fixVerticalPositionIE)}};var undoIEfix=function undoIEfix(){if(typeof window!=="undefined"&&isIE11()){window.removeEventListener("resize",fixVerticalPositionIE)}};var setAriaHidden=function setAriaHidden(){var bodyChildren=toArray(document.body.children);bodyChildren.forEach(function(el){if(el===getContainer()||contains(el,getContainer())){return}if(el.hasAttribute("aria-hidden")){el.setAttribute("data-previous-aria-hidden",el.getAttribute("aria-hidden"))}el.setAttribute("aria-hidden","true")})};var unsetAriaHidden=function unsetAriaHidden(){var bodyChildren=toArray(document.body.children);bodyChildren.forEach(function(el){if(el.hasAttribute("data-previous-aria-hidden")){el.setAttribute("aria-hidden",el.getAttribute("data-previous-aria-hidden"));el.removeAttribute("data-previous-aria-hidden")}else{el.removeAttribute("aria-hidden")}})};var RESTORE_FOCUS_TIMEOUT=100;var globalState={};var restoreActiveElement=function restoreActiveElement(){return new Promise(function(resolve){var x=window.scrollX;var y=window.scrollY;globalState.restoreFocusTimeout=setTimeout(function(){if(globalState.previousActiveElement&&globalState.previousActiveElement.focus){globalState.previousActiveElement.focus();globalState.previousActiveElement=null}else if(document.body){document.body.focus()}resolve()},RESTORE_FOCUS_TIMEOUT);if(typeof x!=="undefined"&&typeof y!=="undefined"){window.scrollTo(x,y)}})};var close=function close(onClose,onAfterClose){var container=getContainer();var popup=getPopup();if(!popup){return}if(onClose!==null&&typeof onClose==="function"){onClose(popup)}removeClass(popup,swalClasses.show);addClass(popup,swalClasses.hide);var removePopupAndResetState=function removePopupAndResetState(){if(!isToast()){restoreActiveElement().then(function(){return triggerOnAfterClose(onAfterClose)});globalState.keydownTarget.removeEventListener("keydown",globalState.keydownHandler,{capture:globalState.keydownListenerCapture});globalState.keydownHandlerAdded=false}else{triggerOnAfterClose(onAfterClose)}if(container.parentNode){container.parentNode.removeChild(container)}removeClass([document.documentElement,document.body],[swalClasses.shown,swalClasses["height-auto"],swalClasses["no-backdrop"],swalClasses["toast-shown"],swalClasses["toast-column"]]);if(isModal()){undoScrollbar();undoIOSfix();undoIEfix();unsetAriaHidden()}};if(animationEndEvent&&!hasClass(popup,swalClasses.noanimation)){popup.addEventListener(animationEndEvent,function swalCloseEventFinished(){popup.removeEventListener(animationEndEvent,swalCloseEventFinished);if(hasClass(popup,swalClasses.hide)){removePopupAndResetState()}})}else{removePopupAndResetState()}};var triggerOnAfterClose=function triggerOnAfterClose(onAfterClose){if(onAfterClose!==null&&typeof onAfterClose==="function"){setTimeout(function(){onAfterClose()})}};var isVisible$1=function isVisible(){return!!getPopup()};var clickConfirm=function clickConfirm(){return getConfirmButton().click()};var clickCancel=function clickCancel(){return getCancelButton().click()};function fire(){var Swal=this;for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key]}return _construct(Swal,args)}function withNoNewKeyword(ParentSwal){var NoNewKeywordSwal=function NoNewKeywordSwal(){for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key]}if(!(this instanceof NoNewKeywordSwal)){return _construct(NoNewKeywordSwal,args)}Object.getPrototypeOf(NoNewKeywordSwal).apply(this,args)};NoNewKeywordSwal.prototype=_extends(Object.create(ParentSwal.prototype),{constructor:NoNewKeywordSwal});if(typeof Object.setPrototypeOf==="function"){Object.setPrototypeOf(NoNewKeywordSwal,ParentSwal)}else{NoNewKeywordSwal.__proto__=ParentSwal}return NoNewKeywordSwal}var defaultParams={title:"",titleText:"",text:"",html:"",footer:"",type:null,toast:false,customClass:"",customContainerClass:"",target:"body",backdrop:true,animation:true,heightAuto:true,allowOutsideClick:true,allowEscapeKey:true,allowEnterKey:true,stopKeydownPropagation:true,keydownListenerCapture:false,showConfirmButton:true,showCancelButton:false,preConfirm:null,confirmButtonText:"OK",confirmButtonAriaLabel:"",confirmButtonColor:null,confirmButtonClass:null,cancelButtonText:"Cancel",cancelButtonAriaLabel:"",cancelButtonColor:null,cancelButtonClass:null,buttonsStyling:true,reverseButtons:false,focusConfirm:true,focusCancel:false,showCloseButton:false,closeButtonAriaLabel:"Close this dialog",showLoaderOnConfirm:false,imageUrl:null,imageWidth:null,imageHeight:null,imageAlt:"",imageClass:null,timer:null,width:null,padding:null,background:null,input:null,inputPlaceholder:"",inputValue:"",inputOptions:{},inputAutoTrim:true,inputClass:null,inputAttributes:{},inputValidator:null,validationMessage:null,grow:false,position:"center",progressSteps:[],currentProgressStep:null,progressStepsDistance:null,onBeforeOpen:null,onAfterClose:null,onOpen:null,onClose:null,useRejections:false,expectRejections:false};var deprecatedParams=["useRejections","expectRejections","extraParams"];var toastIncompatibleParams=["allowOutsideClick","allowEnterKey","backdrop","focusConfirm","focusCancel","heightAuto","keydownListenerCapture"];var isValidParameter=function isValidParameter(paramName){return defaultParams.hasOwnProperty(paramName)||paramName==="extraParams"};var isDeprecatedParameter=function isDeprecatedParameter(paramName){return deprecatedParams.indexOf(paramName)!==-1};var showWarningsForParams=function showWarningsForParams(params){for(var param in params){if(!isValidParameter(param)){warn('Unknown parameter "'.concat(param,'"'))}if(params.toast&&toastIncompatibleParams.indexOf(param)!==-1){warn('The parameter "'.concat(param,'" is incompatible with toasts'))}if(isDeprecatedParameter(param)){warnOnce('The parameter "'.concat(param,'" is deprecated and will be removed in the next major release.'))}}};var deprecationWarning='"setDefaults" & "resetDefaults" methods are deprecated in favor of "mixin" method and will be removed in the next major release. For new projects, use "mixin". For past projects already using "setDefaults", support will be provided through an additional package.';var defaults={};function withGlobalDefaults(ParentSwal){var SwalWithGlobalDefaults=function(_ParentSwal){_inherits(SwalWithGlobalDefaults,_ParentSwal);function SwalWithGlobalDefaults(){_classCallCheck(this,SwalWithGlobalDefaults);return _possibleConstructorReturn(this,_getPrototypeOf(SwalWithGlobalDefaults).apply(this,arguments))}_createClass(SwalWithGlobalDefaults,[{key:"_main",value:function _main(params){return _get(_getPrototypeOf(SwalWithGlobalDefaults.prototype),"_main",this).call(this,_extends({},defaults,params))}}],[{key:"setDefaults",value:function setDefaults(params){warnOnce(deprecationWarning);if(!params||_typeof(params)!=="object"){throw new TypeError("SweetAlert2: The argument for setDefaults() is required and has to be a object")}showWarningsForParams(params);Object.keys(params).forEach(function(param){if(ParentSwal.isValidParameter(param)){defaults[param]=params[param]}})}},{key:"resetDefaults",value:function resetDefaults(){warnOnce(deprecationWarning);defaults={}}}]);return SwalWithGlobalDefaults}(ParentSwal);if(typeof window!=="undefined"&&_typeof(window._swalDefaults)==="object"){SwalWithGlobalDefaults.setDefaults(window._swalDefaults)}return SwalWithGlobalDefaults}function mixin(mixinParams){return withNoNewKeyword(function(_this){_inherits(MixinSwal,_this);function MixinSwal(){_classCallCheck(this,MixinSwal);return _possibleConstructorReturn(this,_getPrototypeOf(MixinSwal).apply(this,arguments))}_createClass(MixinSwal,[{key:"_main",value:function _main(params){return _get(_getPrototypeOf(MixinSwal.prototype),"_main",this).call(this,_extends({},mixinParams,params))}}]);return MixinSwal}(this))}var currentSteps=[];var queue=function queue(steps){var swal=this;currentSteps=steps;var resetQueue=function resetQueue(){currentSteps=[];document.body.removeAttribute("data-swal2-queue-step")};var queueResult=[];return new Promise(function(resolve){(function step(i,callback){if(i.swal2-modal{box-shadow:0 0 10px rgba(0,0,0,.4)}body.swal2-no-backdrop .swal2-shown.swal2-top{top:0;left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%)}body.swal2-no-backdrop .swal2-shown.swal2-top-left,body.swal2-no-backdrop .swal2-shown.swal2-top-start{top:0;left:0}body.swal2-no-backdrop .swal2-shown.swal2-top-end,body.swal2-no-backdrop .swal2-shown.swal2-top-right{top:0;right:0}body.swal2-no-backdrop .swal2-shown.swal2-center{top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}body.swal2-no-backdrop .swal2-shown.swal2-center-left,body.swal2-no-backdrop .swal2-shown.swal2-center-start{top:50%;left:0;-webkit-transform:translateY(-50%);transform:translateY(-50%)}body.swal2-no-backdrop .swal2-shown.swal2-center-end,body.swal2-no-backdrop .swal2-shown.swal2-center-right{top:50%;right:0;-webkit-transform:translateY(-50%);transform:translateY(-50%)}body.swal2-no-backdrop .swal2-shown.swal2-bottom{bottom:0;left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%)}body.swal2-no-backdrop .swal2-shown.swal2-bottom-left,body.swal2-no-backdrop .swal2-shown.swal2-bottom-start{bottom:0;left:0}body.swal2-no-backdrop .swal2-shown.swal2-bottom-end,body.swal2-no-backdrop .swal2-shown.swal2-bottom-right{right:0;bottom:0}.swal2-container{display:flex;position:fixed;top:0;right:0;bottom:0;left:0;flex-direction:row;align-items:center;justify-content:center;padding:10px;background-color:transparent;z-index:1060;overflow-x:hidden;-webkit-overflow-scrolling:touch}.swal2-container.swal2-top{align-items:flex-start}.swal2-container.swal2-top-left,.swal2-container.swal2-top-start{align-items:flex-start;justify-content:flex-start}.swal2-container.swal2-top-end,.swal2-container.swal2-top-right{align-items:flex-start;justify-content:flex-end}.swal2-container.swal2-center{align-items:center}.swal2-container.swal2-center-left,.swal2-container.swal2-center-start{align-items:center;justify-content:flex-start}.swal2-container.swal2-center-end,.swal2-container.swal2-center-right{align-items:center;justify-content:flex-end}.swal2-container.swal2-bottom{align-items:flex-end}.swal2-container.swal2-bottom-left,.swal2-container.swal2-bottom-start{align-items:flex-end;justify-content:flex-start}.swal2-container.swal2-bottom-end,.swal2-container.swal2-bottom-right{align-items:flex-end;justify-content:flex-end}.swal2-container.swal2-grow-fullscreen>.swal2-modal{display:flex!important;flex:1;align-self:stretch;justify-content:center}.swal2-container.swal2-grow-row>.swal2-modal{display:flex!important;flex:1;align-content:center;justify-content:center}.swal2-container.swal2-grow-column{flex:1;flex-direction:column}.swal2-container.swal2-grow-column.swal2-bottom,.swal2-container.swal2-grow-column.swal2-center,.swal2-container.swal2-grow-column.swal2-top{align-items:center}.swal2-container.swal2-grow-column.swal2-bottom-left,.swal2-container.swal2-grow-column.swal2-bottom-start,.swal2-container.swal2-grow-column.swal2-center-left,.swal2-container.swal2-grow-column.swal2-center-start,.swal2-container.swal2-grow-column.swal2-top-left,.swal2-container.swal2-grow-column.swal2-top-start{align-items:flex-start}.swal2-container.swal2-grow-column.swal2-bottom-end,.swal2-container.swal2-grow-column.swal2-bottom-right,.swal2-container.swal2-grow-column.swal2-center-end,.swal2-container.swal2-grow-column.swal2-center-right,.swal2-container.swal2-grow-column.swal2-top-end,.swal2-container.swal2-grow-column.swal2-top-right{align-items:flex-end}.swal2-container.swal2-grow-column>.swal2-modal{display:flex!important;flex:1;align-content:center;justify-content:center}.swal2-container:not(.swal2-top):not(.swal2-top-start):not(.swal2-top-end):not(.swal2-top-left):not(.swal2-top-right):not(.swal2-center-start):not(.swal2-center-end):not(.swal2-center-left):not(.swal2-center-right):not(.swal2-bottom):not(.swal2-bottom-start):not(.swal2-bottom-end):not(.swal2-bottom-left):not(.swal2-bottom-right):not(.swal2-grow-fullscreen)>.swal2-modal{margin:auto}@media all and (-ms-high-contrast:none),(-ms-high-contrast:active){.swal2-container .swal2-modal{margin:0!important}}.swal2-container.swal2-fade{transition:background-color .1s}.swal2-container.swal2-shown{background-color:rgba(0,0,0,.4)}.swal2-popup{display:none;position:relative;flex-direction:column;justify-content:center;width:32em;max-width:100%;padding:1.25em;border-radius:.3125em;background:#fff;font-family:inherit;font-size:1rem;box-sizing:border-box}.swal2-popup:focus{outline:0}.swal2-popup.swal2-loading{overflow-y:hidden}.swal2-popup .swal2-header{display:flex;flex-direction:column;align-items:center}.swal2-popup .swal2-title{display:block;position:relative;max-width:100%;margin:0 0 .4em;padding:0;color:#595959;font-size:1.875em;font-weight:600;text-align:center;text-transform:none;word-wrap:break-word}.swal2-popup .swal2-actions{flex-wrap:wrap;align-items:center;justify-content:center;margin:1.25em auto 0;z-index:1}.swal2-popup .swal2-actions:not(.swal2-loading) .swal2-styled[disabled]{opacity:.4}.swal2-popup .swal2-actions:not(.swal2-loading) .swal2-styled:hover{background-image:linear-gradient(rgba(0,0,0,.1),rgba(0,0,0,.1))}.swal2-popup .swal2-actions:not(.swal2-loading) .swal2-styled:active{background-image:linear-gradient(rgba(0,0,0,.2),rgba(0,0,0,.2))}.swal2-popup .swal2-actions.swal2-loading .swal2-styled.swal2-confirm{width:2.5em;height:2.5em;margin:.46875em;padding:0;border:.25em solid transparent;border-radius:100%;border-color:transparent;background-color:transparent!important;color:transparent;cursor:default;box-sizing:border-box;-webkit-animation:swal2-rotate-loading 1.5s linear 0s infinite normal;animation:swal2-rotate-loading 1.5s linear 0s infinite normal;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.swal2-popup .swal2-actions.swal2-loading .swal2-styled.swal2-cancel{margin-right:30px;margin-left:30px}.swal2-popup .swal2-actions.swal2-loading :not(.swal2-styled).swal2-confirm::after{display:inline-block;width:15px;height:15px;margin-left:5px;border:3px solid #999;border-radius:50%;border-right-color:transparent;box-shadow:1px 1px 1px #fff;content:'';-webkit-animation:swal2-rotate-loading 1.5s linear 0s infinite normal;animation:swal2-rotate-loading 1.5s linear 0s infinite normal}.swal2-popup .swal2-styled{margin:.3125em;padding:.625em 2em;font-weight:500;box-shadow:none}.swal2-popup .swal2-styled:not([disabled]){cursor:pointer}.swal2-popup .swal2-styled.swal2-confirm{border:0;border-radius:.25em;background:initial;background-color:#3085d6;color:#fff;font-size:1.0625em}.swal2-popup .swal2-styled.swal2-cancel{border:0;border-radius:.25em;background:initial;background-color:#aaa;color:#fff;font-size:1.0625em}.swal2-popup .swal2-styled:focus{outline:0;box-shadow:0 0 0 2px #fff,0 0 0 4px rgba(50,100,150,.4)}.swal2-popup .swal2-styled::-moz-focus-inner{border:0}.swal2-popup .swal2-footer{justify-content:center;margin:1.25em 0 0;padding:1em 0 0;border-top:1px solid #eee;color:#545454;font-size:1em}.swal2-popup .swal2-image{max-width:100%;margin:1.25em auto}.swal2-popup .swal2-close{position:absolute;top:0;right:0;justify-content:center;width:1.2em;height:1.2em;padding:0;transition:color .1s ease-out;border:none;border-radius:0;outline:initial;background:0 0;color:#ccc;font-family:serif;font-size:2.5em;line-height:1.2;cursor:pointer;overflow:hidden}.swal2-popup .swal2-close:hover{-webkit-transform:none;transform:none;color:#f27474}.swal2-popup>.swal2-checkbox,.swal2-popup>.swal2-file,.swal2-popup>.swal2-input,.swal2-popup>.swal2-radio,.swal2-popup>.swal2-select,.swal2-popup>.swal2-textarea{display:none}.swal2-popup .swal2-content{justify-content:center;margin:0;padding:0;color:#545454;font-size:1.125em;font-weight:300;line-height:normal;z-index:1;word-wrap:break-word}.swal2-popup #swal2-content{text-align:center}.swal2-popup .swal2-checkbox,.swal2-popup .swal2-file,.swal2-popup .swal2-input,.swal2-popup .swal2-radio,.swal2-popup .swal2-select,.swal2-popup .swal2-textarea{margin:1em auto}.swal2-popup .swal2-file,.swal2-popup .swal2-input,.swal2-popup .swal2-textarea{width:100%;transition:border-color .3s,box-shadow .3s;border:1px solid #d9d9d9;border-radius:.1875em;font-size:1.125em;box-shadow:inset 0 1px 1px rgba(0,0,0,.06);box-sizing:border-box}.swal2-popup .swal2-file.swal2-inputerror,.swal2-popup .swal2-input.swal2-inputerror,.swal2-popup .swal2-textarea.swal2-inputerror{border-color:#f27474!important;box-shadow:0 0 2px #f27474!important}.swal2-popup .swal2-file:focus,.swal2-popup .swal2-input:focus,.swal2-popup .swal2-textarea:focus{border:1px solid #b4dbed;outline:0;box-shadow:0 0 3px #c4e6f5}.swal2-popup .swal2-file::-webkit-input-placeholder,.swal2-popup .swal2-input::-webkit-input-placeholder,.swal2-popup .swal2-textarea::-webkit-input-placeholder{color:#ccc}.swal2-popup .swal2-file:-ms-input-placeholder,.swal2-popup .swal2-input:-ms-input-placeholder,.swal2-popup .swal2-textarea:-ms-input-placeholder{color:#ccc}.swal2-popup .swal2-file::-ms-input-placeholder,.swal2-popup .swal2-input::-ms-input-placeholder,.swal2-popup .swal2-textarea::-ms-input-placeholder{color:#ccc}.swal2-popup .swal2-file::placeholder,.swal2-popup .swal2-input::placeholder,.swal2-popup .swal2-textarea::placeholder{color:#ccc}.swal2-popup .swal2-range input{width:80%}.swal2-popup .swal2-range output{width:20%;font-weight:600;text-align:center}.swal2-popup .swal2-range input,.swal2-popup .swal2-range output{height:2.625em;margin:1em auto;padding:0;font-size:1.125em;line-height:2.625em}.swal2-popup .swal2-input{height:2.625em;padding:0 .75em}.swal2-popup .swal2-input[type=number]{max-width:10em}.swal2-popup .swal2-file{font-size:1.125em}.swal2-popup .swal2-textarea{height:6.75em;padding:.75em}.swal2-popup .swal2-select{min-width:50%;max-width:100%;padding:.375em .625em;color:#545454;font-size:1.125em}.swal2-popup .swal2-checkbox,.swal2-popup .swal2-radio{align-items:center;justify-content:center}.swal2-popup .swal2-checkbox label,.swal2-popup .swal2-radio label{margin:0 .6em;font-size:1.125em}.swal2-popup .swal2-checkbox input,.swal2-popup .swal2-radio input{margin:0 .4em}.swal2-popup .swal2-validation-message{display:none;align-items:center;justify-content:center;padding:.625em;background:#f0f0f0;color:#666;font-size:1em;font-weight:300;overflow:hidden}.swal2-popup .swal2-validation-message::before{display:inline-block;width:1.5em;min-width:1.5em;height:1.5em;margin:0 .625em;border-radius:50%;background-color:#f27474;color:#fff;font-weight:600;line-height:1.5em;text-align:center;content:'!';zoom:normal}@supports (-ms-accelerator:true){.swal2-range input{width:100%!important}.swal2-range output{display:none}}@media all and (-ms-high-contrast:none),(-ms-high-contrast:active){.swal2-range input{width:100%!important}.swal2-range output{display:none}}@-moz-document url-prefix(){.swal2-close:focus{outline:2px solid rgba(50,100,150,.4)}}.swal2-icon{position:relative;justify-content:center;width:5em;height:5em;margin:1.25em auto 1.875em;border:.25em solid transparent;border-radius:50%;line-height:5em;cursor:default;box-sizing:content-box;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;zoom:normal}.swal2-icon-text{font-size:3.75em}.swal2-icon.swal2-error{border-color:#f27474}.swal2-icon.swal2-error .swal2-x-mark{position:relative;flex-grow:1}.swal2-icon.swal2-error [class^=swal2-x-mark-line]{display:block;position:absolute;top:2.3125em;width:2.9375em;height:.3125em;border-radius:.125em;background-color:#f27474}.swal2-icon.swal2-error [class^=swal2-x-mark-line][class$=left]{left:1.0625em;-webkit-transform:rotate(45deg);transform:rotate(45deg)}.swal2-icon.swal2-error [class^=swal2-x-mark-line][class$=right]{right:1em;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}.swal2-icon.swal2-warning{border-color:#facea8;color:#f8bb86}.swal2-icon.swal2-info{border-color:#9de0f6;color:#3fc3ee}.swal2-icon.swal2-question{border-color:#c9dae1;color:#87adbd}.swal2-icon.swal2-success{border-color:#a5dc86}.swal2-icon.swal2-success [class^=swal2-success-circular-line]{position:absolute;width:3.75em;height:7.5em;-webkit-transform:rotate(45deg);transform:rotate(45deg);border-radius:50%}.swal2-icon.swal2-success [class^=swal2-success-circular-line][class$=left]{top:-.4375em;left:-2.0635em;-webkit-transform:rotate(-45deg);transform:rotate(-45deg);-webkit-transform-origin:3.75em 3.75em;transform-origin:3.75em 3.75em;border-radius:7.5em 0 0 7.5em}.swal2-icon.swal2-success [class^=swal2-success-circular-line][class$=right]{top:-.6875em;left:1.875em;-webkit-transform:rotate(-45deg);transform:rotate(-45deg);-webkit-transform-origin:0 3.75em;transform-origin:0 3.75em;border-radius:0 7.5em 7.5em 0}.swal2-icon.swal2-success .swal2-success-ring{position:absolute;top:-.25em;left:-.25em;width:100%;height:100%;border:.25em solid rgba(165,220,134,.3);border-radius:50%;z-index:2;box-sizing:content-box}.swal2-icon.swal2-success .swal2-success-fix{position:absolute;top:.5em;left:1.625em;width:.4375em;height:5.625em;-webkit-transform:rotate(-45deg);transform:rotate(-45deg);z-index:1}.swal2-icon.swal2-success [class^=swal2-success-line]{display:block;position:absolute;height:.3125em;border-radius:.125em;background-color:#a5dc86;z-index:2}.swal2-icon.swal2-success [class^=swal2-success-line][class$=tip]{top:2.875em;left:.875em;width:1.5625em;-webkit-transform:rotate(45deg);transform:rotate(45deg)}.swal2-icon.swal2-success [class^=swal2-success-line][class$=long]{top:2.375em;right:.5em;width:2.9375em;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}.swal2-progresssteps{align-items:center;margin:0 0 1.25em;padding:0;font-weight:600}.swal2-progresssteps li{display:inline-block;position:relative}.swal2-progresssteps .swal2-progresscircle{width:2em;height:2em;border-radius:2em;background:#3085d6;color:#fff;line-height:2em;text-align:center;z-index:20}.swal2-progresssteps .swal2-progresscircle:first-child{margin-left:0}.swal2-progresssteps .swal2-progresscircle:last-child{margin-right:0}.swal2-progresssteps .swal2-progresscircle.swal2-activeprogressstep{background:#3085d6}.swal2-progresssteps .swal2-progresscircle.swal2-activeprogressstep~.swal2-progresscircle{background:#add8e6}.swal2-progresssteps .swal2-progresscircle.swal2-activeprogressstep~.swal2-progressline{background:#add8e6}.swal2-progresssteps .swal2-progressline{width:2.5em;height:.4em;margin:0 -1px;background:#3085d6;z-index:10}[class^=swal2]{-webkit-tap-highlight-color:transparent}.swal2-show{-webkit-animation:swal2-show .3s;animation:swal2-show .3s}.swal2-show.swal2-noanimation{-webkit-animation:none;animation:none}.swal2-hide{-webkit-animation:swal2-hide .15s forwards;animation:swal2-hide .15s forwards}.swal2-hide.swal2-noanimation{-webkit-animation:none;animation:none}.swal2-rtl .swal2-close{right:auto;left:0}.swal2-animate-success-icon .swal2-success-line-tip{-webkit-animation:swal2-animate-success-line-tip .75s;animation:swal2-animate-success-line-tip .75s}.swal2-animate-success-icon .swal2-success-line-long{-webkit-animation:swal2-animate-success-line-long .75s;animation:swal2-animate-success-line-long .75s}.swal2-animate-success-icon .swal2-success-circular-line-right{-webkit-animation:swal2-rotate-success-circular-line 4.25s ease-in;animation:swal2-rotate-success-circular-line 4.25s ease-in}.swal2-animate-error-icon{-webkit-animation:swal2-animate-error-icon .5s;animation:swal2-animate-error-icon .5s}.swal2-animate-error-icon .swal2-x-mark{-webkit-animation:swal2-animate-error-x-mark .5s;animation:swal2-animate-error-x-mark .5s}@-webkit-keyframes swal2-rotate-loading{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes swal2-rotate-loading{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@media print{body.swal2-shown:not(.swal2-no-backdrop):not(.swal2-toast-shown){overflow-y:scroll!important}body.swal2-shown:not(.swal2-no-backdrop):not(.swal2-toast-shown)>[aria-hidden=true]{display:none}body.swal2-shown:not(.swal2-no-backdrop):not(.swal2-toast-shown) .swal2-container{position:initial!important}}")},function(module,exports,__webpack_require__){"use strict";var invariant=function(condition,format,a,b,c,d,e,f){if(false){}if(!condition){var error;if(format===undefined){error=new Error("Minified exception occurred; use the non-minified dev environment "+"for the full error message and additional helpful warnings.")}else{var args=[a,b,c,d,e,f];var argIndex=0;error=new Error(format.replace(/%s/g,function(){return args[argIndex++]}));error.name="Invariant Violation"}error.framesToPop=1;throw error}};module.exports=invariant},function(module,exports,__webpack_require__){"use strict";var _typeof=typeof Symbol==="function"&&typeof Symbol.iterator==="symbol"?function(obj){return typeof obj}:function(obj){return obj&&typeof Symbol==="function"&&obj.constructor===Symbol&&obj!==Symbol.prototype?"symbol":typeof obj};Object.defineProperty(exports,"__esModule",{value:true});var _createClass=function(){function defineProperties(target,props){for(var i=0;i1&&arguments[1]!==undefined?arguments[1]:"";var toParts=to&&to.split("/")||[];var fromParts=from&&from.split("/")||[];var isToAbs=to&&isAbsolute(to);var isFromAbs=from&&isAbsolute(from);var mustEndAbs=isToAbs||isFromAbs;if(to&&isAbsolute(to)){fromParts=toParts}else if(toParts.length){fromParts.pop();fromParts=fromParts.concat(toParts)}if(!fromParts.length)return"/";var hasTrailingSlash=void 0;if(fromParts.length){var last=fromParts[fromParts.length-1];hasTrailingSlash=last==="."||last===".."||last===""}else{hasTrailingSlash=false}var up=0;for(var i=fromParts.length;i>=0;i--){var part=fromParts[i];if(part==="."){spliceOne(fromParts,i)}else if(part===".."){spliceOne(fromParts,i);up++}else if(up){spliceOne(fromParts,i);up--}}if(!mustEndAbs)for(;up--;up){fromParts.unshift("..")}if(mustEndAbs&&fromParts[0]!==""&&(!fromParts[0]||!isAbsolute(fromParts[0])))fromParts.unshift("");var result=fromParts.join("/");if(hasTrailingSlash&&result.substr(-1)!=="/")result+="/";return result}var resolve_pathname=resolvePathname;var _typeof=typeof Symbol==="function"&&typeof Symbol.iterator==="symbol"?function(obj){return typeof obj}:function(obj){return obj&&typeof Symbol==="function"&&obj.constructor===Symbol&&obj!==Symbol.prototype?"symbol":typeof obj};function valueEqual(a,b){if(a===b)return true;if(a==null||b==null)return false;if(Array.isArray(a)){return Array.isArray(b)&&a.length===b.length&&a.every(function(item,index){return valueEqual(item,b[index])})}var aType=typeof a==="undefined"?"undefined":_typeof(a);var bType=typeof b==="undefined"?"undefined":_typeof(b);if(aType!==bType)return false;if(aType==="object"){var aValue=a.valueOf();var bValue=b.valueOf();if(aValue!==a||bValue!==b)return valueEqual(aValue,bValue);var aKeys=Object.keys(a);var bKeys=Object.keys(b);if(aKeys.length!==bKeys.length)return false;return aKeys.every(function(key){return valueEqual(a[key],b[key])})}return false}var value_equal=valueEqual;var addLeadingSlash=function addLeadingSlash(path){return path.charAt(0)==="/"?path:"/"+path};var stripLeadingSlash=function stripLeadingSlash(path){return path.charAt(0)==="/"?path.substr(1):path};var hasBasename=function hasBasename(path,prefix){return new RegExp("^"+prefix+"(\\/|\\?|#|$)","i").test(path)};var stripBasename=function stripBasename(path,prefix){return hasBasename(path,prefix)?path.substr(prefix.length):path};var stripTrailingSlash=function stripTrailingSlash(path){return path.charAt(path.length-1)==="/"?path.slice(0,-1):path};var parsePath=function parsePath(path){var pathname=path||"/";var search="";var hash="";var hashIndex=pathname.indexOf("#");if(hashIndex!==-1){hash=pathname.substr(hashIndex);pathname=pathname.substr(0,hashIndex)}var searchIndex=pathname.indexOf("?");if(searchIndex!==-1){search=pathname.substr(searchIndex);pathname=pathname.substr(0,searchIndex)}return{pathname,search:search==="?"?"":search,hash:hash==="#"?"":hash}};var createPath=function createPath(location){var pathname=location.pathname,search=location.search,hash=location.hash;var path=pathname||"/";if(search&&search!=="?")path+=search.charAt(0)==="?"?search:"?"+search;if(hash&&hash!=="#")path+=hash.charAt(0)==="#"?hash:"#"+hash;return path};var _extends=Object.assign||function(target){for(var i=1;i0&&arguments[0]!==undefined?arguments[0]:{};invariant_browser_default()(canUseDOM,"Browser history needs a DOM");var globalHistory=window.history;var canUseHistory=supportsHistory();var needsHashChangeListener=!supportsPopStateOnHashChange();var _props$forceRefresh=props.forceRefresh,forceRefresh=_props$forceRefresh===undefined?false:_props$forceRefresh,_props$getUserConfirm=props.getUserConfirmation,getUserConfirmation=_props$getUserConfirm===undefined?getConfirmation:_props$getUserConfirm,_props$keyLength=props.keyLength,keyLength=_props$keyLength===undefined?6:_props$keyLength;var basename=props.basename?stripTrailingSlash(addLeadingSlash(props.basename)):"";var getDOMLocation=function getDOMLocation(historyState){var _ref=historyState||{},key=_ref.key,state=_ref.state;var _window$location=window.location,pathname=_window$location.pathname,search=_window$location.search,hash=_window$location.hash;var path=pathname+search+hash;browser_default()(!basename||hasBasename(path,basename),"You are attempting to use a basename on a page whose URL path does not begin "+'with the basename. Expected path "'+path+'" to begin with "'+basename+'".');if(basename)path=stripBasename(path,basename);return LocationUtils_createLocation(path,state,key)};var createKey=function createKey(){return Math.random().toString(36).substr(2,keyLength)};var transitionManager=es_createTransitionManager();var setState=function setState(nextState){createBrowserHistory_extends(history,nextState);history.length=globalHistory.length;transitionManager.notifyListeners(history.location,history.action)};var handlePopState=function handlePopState(event){if(isExtraneousPopstateEvent(event))return;handlePop(getDOMLocation(event.state))};var handleHashChange=function handleHashChange(){handlePop(getDOMLocation(getHistoryState()))};var forceNextPop=false;var handlePop=function handlePop(location){if(forceNextPop){forceNextPop=false;setState()}else{var action="POP";transitionManager.confirmTransitionTo(location,action,getUserConfirmation,function(ok){if(ok){setState({action,location})}else{revertPop(location)}})}};var revertPop=function revertPop(fromLocation){var toLocation=history.location;var toIndex=allKeys.indexOf(toLocation.key);if(toIndex===-1)toIndex=0;var fromIndex=allKeys.indexOf(fromLocation.key);if(fromIndex===-1)fromIndex=0;var delta=toIndex-fromIndex;if(delta){forceNextPop=true;go(delta)}};var initialLocation=getDOMLocation(getHistoryState());var allKeys=[initialLocation.key];var createHref=function createHref(location){return basename+createPath(location)};var push=function push(path,state){browser_default()(!((typeof path==="undefined"?"undefined":createBrowserHistory_typeof(path))==="object"&&path.state!==undefined&&state!==undefined),"You should avoid providing a 2nd state argument to push when the 1st "+"argument is a location-like object that already has state; it is ignored");var action="PUSH";var location=LocationUtils_createLocation(path,state,createKey(),history.location);transitionManager.confirmTransitionTo(location,action,getUserConfirmation,function(ok){if(!ok)return;var href=createHref(location);var key=location.key,state=location.state;if(canUseHistory){globalHistory.pushState({key,state},null,href);if(forceRefresh){window.location.href=href}else{var prevIndex=allKeys.indexOf(history.location.key);var nextKeys=allKeys.slice(0,prevIndex===-1?0:prevIndex+1);nextKeys.push(location.key);allKeys=nextKeys;setState({action,location})}}else{browser_default()(state===undefined,"Browser history cannot push state in browsers that do not support HTML5 history");window.location.href=href}})};var replace=function replace(path,state){browser_default()(!((typeof path==="undefined"?"undefined":createBrowserHistory_typeof(path))==="object"&&path.state!==undefined&&state!==undefined),"You should avoid providing a 2nd state argument to replace when the 1st "+"argument is a location-like object that already has state; it is ignored");var action="REPLACE";var location=LocationUtils_createLocation(path,state,createKey(),history.location);transitionManager.confirmTransitionTo(location,action,getUserConfirmation,function(ok){if(!ok)return;var href=createHref(location);var key=location.key,state=location.state;if(canUseHistory){globalHistory.replaceState({key,state},null,href);if(forceRefresh){window.location.replace(href)}else{var prevIndex=allKeys.indexOf(history.location.key);if(prevIndex!==-1)allKeys[prevIndex]=location.key;setState({action,location})}}else{browser_default()(state===undefined,"Browser history cannot replace state in browsers that do not support HTML5 history");window.location.replace(href)}})};var go=function go(n){globalHistory.go(n)};var goBack=function goBack(){return go(-1)};var goForward=function goForward(){return go(1)};var listenerCount=0;var checkDOMListeners=function checkDOMListeners(delta){listenerCount+=delta;if(listenerCount===1){addEventListener(window,PopStateEvent,handlePopState);if(needsHashChangeListener)addEventListener(window,HashChangeEvent,handleHashChange)}else if(listenerCount===0){removeEventListener(window,PopStateEvent,handlePopState);if(needsHashChangeListener)removeEventListener(window,HashChangeEvent,handleHashChange)}};var isBlocked=false;var block=function block(){var prompt=arguments.length>0&&arguments[0]!==undefined?arguments[0]:false;var unblock=transitionManager.setPrompt(prompt);if(!isBlocked){checkDOMListeners(1);isBlocked=true}return function(){if(isBlocked){isBlocked=false;checkDOMListeners(-1)}return unblock()}};var listen=function listen(listener){var unlisten=transitionManager.appendListener(listener);checkDOMListeners(1);return function(){checkDOMListeners(-1);unlisten()}};var history={length:globalHistory.length,action:"POP",location:initialLocation,createHref,push,replace,go,goBack,goForward,block,listen};return history};var es_createBrowserHistory=createBrowserHistory_createBrowserHistory;var createHashHistory_extends=Object.assign||function(target){for(var i=1;i=0?hashIndex:0)+"#"+path)};var createHashHistory_createHashHistory=function createHashHistory(){var props=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};invariant_browser_default()(canUseDOM,"Hash history needs a DOM");var globalHistory=window.history;var canGoWithoutReload=supportsGoWithoutReloadUsingHash();var _props$getUserConfirm=props.getUserConfirmation,getUserConfirmation=_props$getUserConfirm===undefined?getConfirmation:_props$getUserConfirm,_props$hashType=props.hashType,hashType=_props$hashType===undefined?"slash":_props$hashType;var basename=props.basename?stripTrailingSlash(addLeadingSlash(props.basename)):"";var _HashPathCoders$hashT=HashPathCoders[hashType],encodePath=_HashPathCoders$hashT.encodePath,decodePath=_HashPathCoders$hashT.decodePath;var getDOMLocation=function getDOMLocation(){var path=decodePath(getHashPath());browser_default()(!basename||hasBasename(path,basename),"You are attempting to use a basename on a page whose URL path does not begin "+'with the basename. Expected path "'+path+'" to begin with "'+basename+'".');if(basename)path=stripBasename(path,basename);return LocationUtils_createLocation(path)};var transitionManager=es_createTransitionManager();var setState=function setState(nextState){createHashHistory_extends(history,nextState);history.length=globalHistory.length;transitionManager.notifyListeners(history.location,history.action)};var forceNextPop=false;var ignorePath=null;var handleHashChange=function handleHashChange(){var path=getHashPath();var encodedPath=encodePath(path);if(path!==encodedPath){replaceHashPath(encodedPath)}else{var location=getDOMLocation();var prevLocation=history.location;if(!forceNextPop&&LocationUtils_locationsAreEqual(prevLocation,location))return;if(ignorePath===createPath(location))return;ignorePath=null;handlePop(location)}};var handlePop=function handlePop(location){if(forceNextPop){forceNextPop=false;setState()}else{var action="POP";transitionManager.confirmTransitionTo(location,action,getUserConfirmation,function(ok){if(ok){setState({action,location})}else{revertPop(location)}})}};var revertPop=function revertPop(fromLocation){var toLocation=history.location;var toIndex=allPaths.lastIndexOf(createPath(toLocation));if(toIndex===-1)toIndex=0;var fromIndex=allPaths.lastIndexOf(createPath(fromLocation));if(fromIndex===-1)fromIndex=0;var delta=toIndex-fromIndex;if(delta){forceNextPop=true;go(delta)}};var path=getHashPath();var encodedPath=encodePath(path);if(path!==encodedPath)replaceHashPath(encodedPath);var initialLocation=getDOMLocation();var allPaths=[createPath(initialLocation)];var createHref=function createHref(location){return"#"+encodePath(basename+createPath(location))};var push=function push(path,state){browser_default()(state===undefined,"Hash history cannot push state; it is ignored");var action="PUSH";var location=LocationUtils_createLocation(path,undefined,undefined,history.location);transitionManager.confirmTransitionTo(location,action,getUserConfirmation,function(ok){if(!ok)return;var path=createPath(location);var encodedPath=encodePath(basename+path);var hashChanged=getHashPath()!==encodedPath;if(hashChanged){ignorePath=path;pushHashPath(encodedPath);var prevIndex=allPaths.lastIndexOf(createPath(history.location));var nextPaths=allPaths.slice(0,prevIndex===-1?0:prevIndex+1);nextPaths.push(path);allPaths=nextPaths;setState({action,location})}else{browser_default()(false,"Hash history cannot PUSH the same path; a new entry will not be added to the history stack");setState()}})};var replace=function replace(path,state){browser_default()(state===undefined,"Hash history cannot replace state; it is ignored");var action="REPLACE";var location=LocationUtils_createLocation(path,undefined,undefined,history.location);transitionManager.confirmTransitionTo(location,action,getUserConfirmation,function(ok){if(!ok)return;var path=createPath(location);var encodedPath=encodePath(basename+path);var hashChanged=getHashPath()!==encodedPath;if(hashChanged){ignorePath=path;replaceHashPath(encodedPath)}var prevIndex=allPaths.indexOf(createPath(history.location));if(prevIndex!==-1)allPaths[prevIndex]=path;setState({action,location})})};var go=function go(n){browser_default()(canGoWithoutReload,"Hash history go(n) causes a full page reload in this browser");globalHistory.go(n)};var goBack=function goBack(){return go(-1)};var goForward=function goForward(){return go(1)};var listenerCount=0;var checkDOMListeners=function checkDOMListeners(delta){listenerCount+=delta;if(listenerCount===1){addEventListener(window,createHashHistory_HashChangeEvent,handleHashChange)}else if(listenerCount===0){removeEventListener(window,createHashHistory_HashChangeEvent,handleHashChange)}};var isBlocked=false;var block=function block(){var prompt=arguments.length>0&&arguments[0]!==undefined?arguments[0]:false;var unblock=transitionManager.setPrompt(prompt);if(!isBlocked){checkDOMListeners(1);isBlocked=true}return function(){if(isBlocked){isBlocked=false;checkDOMListeners(-1)}return unblock()}};var listen=function listen(listener){var unlisten=transitionManager.appendListener(listener);checkDOMListeners(1);return function(){checkDOMListeners(-1);unlisten()}};var history={length:globalHistory.length,action:"POP",location:initialLocation,createHref,push,replace,go,goBack,goForward,block,listen};return history};var es_createHashHistory=createHashHistory_createHashHistory;var createMemoryHistory_typeof=typeof Symbol==="function"&&typeof Symbol.iterator==="symbol"?function(obj){return typeof obj}:function(obj){return obj&&typeof Symbol==="function"&&obj.constructor===Symbol&&obj!==Symbol.prototype?"symbol":typeof obj};var createMemoryHistory_extends=Object.assign||function(target){for(var i=1;i0&&arguments[0]!==undefined?arguments[0]:{};var getUserConfirmation=props.getUserConfirmation,_props$initialEntries=props.initialEntries,initialEntries=_props$initialEntries===undefined?["/"]:_props$initialEntries,_props$initialIndex=props.initialIndex,initialIndex=_props$initialIndex===undefined?0:_props$initialIndex,_props$keyLength=props.keyLength,keyLength=_props$keyLength===undefined?6:_props$keyLength;var transitionManager=es_createTransitionManager();var setState=function setState(nextState){createMemoryHistory_extends(history,nextState);history.length=history.entries.length;transitionManager.notifyListeners(history.location,history.action)};var createKey=function createKey(){return Math.random().toString(36).substr(2,keyLength)};var index=clamp(initialIndex,0,initialEntries.length-1);var entries=initialEntries.map(function(entry){return typeof entry==="string"?LocationUtils_createLocation(entry,undefined,createKey()):LocationUtils_createLocation(entry,undefined,entry.key||createKey())});var createHref=createPath;var push=function push(path,state){browser_default()(!((typeof path==="undefined"?"undefined":createMemoryHistory_typeof(path))==="object"&&path.state!==undefined&&state!==undefined),"You should avoid providing a 2nd state argument to push when the 1st "+"argument is a location-like object that already has state; it is ignored");var action="PUSH";var location=LocationUtils_createLocation(path,state,createKey(),history.location);transitionManager.confirmTransitionTo(location,action,getUserConfirmation,function(ok){if(!ok)return;var prevIndex=history.index;var nextIndex=prevIndex+1;var nextEntries=history.entries.slice(0);if(nextEntries.length>nextIndex){nextEntries.splice(nextIndex,nextEntries.length-nextIndex,location)}else{nextEntries.push(location)}setState({action,location,index:nextIndex,entries:nextEntries})})};var replace=function replace(path,state){browser_default()(!((typeof path==="undefined"?"undefined":createMemoryHistory_typeof(path))==="object"&&path.state!==undefined&&state!==undefined),"You should avoid providing a 2nd state argument to replace when the 1st "+"argument is a location-like object that already has state; it is ignored");var action="REPLACE";var location=LocationUtils_createLocation(path,state,createKey(),history.location);transitionManager.confirmTransitionTo(location,action,getUserConfirmation,function(ok){if(!ok)return;history.entries[history.index]=location;setState({action,location})})};var go=function go(n){var nextIndex=clamp(history.index+n,0,history.entries.length-1);var action="POP";var location=history.entries[nextIndex];transitionManager.confirmTransitionTo(location,action,getUserConfirmation,function(ok){if(ok){setState({action,location,index:nextIndex})}else{setState()}})};var goBack=function goBack(){return go(-1)};var goForward=function goForward(){return go(1)};var canGo=function canGo(n){var nextIndex=history.index+n;return nextIndex>=0&&nextIndex0&&arguments[0]!==undefined?arguments[0]:false;return transitionManager.setPrompt(prompt)};var listen=function listen(listener){return transitionManager.appendListener(listener)};var history={length:entries.length,action:"POP",location:entries[index],index,entries,createHref,push,replace,go,goBack,goForward,canGo,block,listen};return history};var es_createMemoryHistory=createMemoryHistory_createMemoryHistory;var node_modules_invariant_browser=__webpack_require__(18);var node_modules_invariant_browser_default=__webpack_require__.n(node_modules_invariant_browser);var Router_extends=Object.assign||function(target){for(var i=1;i may have only one child element");this.unlisten=history.listen(function(){_this2.setState({match:_this2.computeMatch(history.location.pathname)})})};Router.prototype.componentWillReceiveProps=function componentWillReceiveProps(nextProps){warning_default()(this.props.history===nextProps.history,"You cannot change ")};Router.prototype.componentWillUnmount=function componentWillUnmount(){this.unlisten()};Router.prototype.render=function render(){var children=this.props.children;return children?external_React_default.a.Children.only(children):null};return Router}(external_React_default.a.Component);Router_Router.propTypes={history:prop_types_default.a.object.isRequired,children:prop_types_default.a.node};Router_Router.contextTypes={router:prop_types_default.a.object};Router_Router.childContextTypes={router:prop_types_default.a.object.isRequired};var es_Router=Router_Router;var react_router_dom_es_Router=es_Router;function BrowserRouter_classCallCheck(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function")}}function BrowserRouter_possibleConstructorReturn(self,call){if(!self){throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}return call&&(typeof call==="object"||typeof call==="function")?call:self}function BrowserRouter_inherits(subClass,superClass){if(typeof superClass!=="function"&&superClass!==null){throw new TypeError("Super expression must either be null or a function, not "+typeof superClass)}subClass.prototype=Object.create(superClass&&superClass.prototype,{constructor:{value:subClass,enumerable:false,writable:true,configurable:true}});if(superClass)Object.setPrototypeOf?Object.setPrototypeOf(subClass,superClass):subClass.__proto__=superClass}var BrowserRouter_BrowserRouter=function(_React$Component){BrowserRouter_inherits(BrowserRouter,_React$Component);function BrowserRouter(){var _temp,_this,_ret;BrowserRouter_classCallCheck(this,BrowserRouter);for(var _len=arguments.length,args=Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key]}return _ret=(_temp=(_this=BrowserRouter_possibleConstructorReturn(this,_React$Component.call.apply(_React$Component,[this].concat(args))),_this),_this.history=es_createBrowserHistory(_this.props),_temp),BrowserRouter_possibleConstructorReturn(_this,_ret)}BrowserRouter.prototype.componentWillMount=function componentWillMount(){warning_default()(!this.props.history," ignores the history prop. To use a custom history, "+"use `import { Router }` instead of `import { BrowserRouter as Router }`.")};BrowserRouter.prototype.render=function render(){return external_React_default.a.createElement(react_router_dom_es_Router,{history:this.history,children:this.props.children})};return BrowserRouter}(external_React_default.a.Component);BrowserRouter_BrowserRouter.propTypes={basename:prop_types_default.a.string,forceRefresh:prop_types_default.a.bool,getUserConfirmation:prop_types_default.a.func,keyLength:prop_types_default.a.number,children:prop_types_default.a.node};var es_BrowserRouter=BrowserRouter_BrowserRouter;function HashRouter_classCallCheck(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function")}}function HashRouter_possibleConstructorReturn(self,call){if(!self){throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}return call&&(typeof call==="object"||typeof call==="function")?call:self}function HashRouter_inherits(subClass,superClass){if(typeof superClass!=="function"&&superClass!==null){throw new TypeError("Super expression must either be null or a function, not "+typeof superClass)}subClass.prototype=Object.create(superClass&&superClass.prototype,{constructor:{value:subClass,enumerable:false,writable:true,configurable:true}});if(superClass)Object.setPrototypeOf?Object.setPrototypeOf(subClass,superClass):subClass.__proto__=superClass}var HashRouter_HashRouter=function(_React$Component){HashRouter_inherits(HashRouter,_React$Component);function HashRouter(){var _temp,_this,_ret;HashRouter_classCallCheck(this,HashRouter);for(var _len=arguments.length,args=Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key]}return _ret=(_temp=(_this=HashRouter_possibleConstructorReturn(this,_React$Component.call.apply(_React$Component,[this].concat(args))),_this),_this.history=es_createHashHistory(_this.props),_temp),HashRouter_possibleConstructorReturn(_this,_ret)}HashRouter.prototype.componentWillMount=function componentWillMount(){warning_default()(!this.props.history," ignores the history prop. To use a custom history, "+"use `import { Router }` instead of `import { HashRouter as Router }`.")};HashRouter.prototype.render=function render(){return external_React_default.a.createElement(react_router_dom_es_Router,{history:this.history,children:this.props.children})};return HashRouter}(external_React_default.a.Component);HashRouter_HashRouter.propTypes={basename:prop_types_default.a.string,getUserConfirmation:prop_types_default.a.func,hashType:prop_types_default.a.oneOf(["hashbang","noslash","slash"]),children:prop_types_default.a.node};var es_HashRouter=HashRouter_HashRouter;var react_router_dom_node_modules_invariant_browser=__webpack_require__(30);var react_router_dom_node_modules_invariant_browser_default=__webpack_require__.n(react_router_dom_node_modules_invariant_browser);var Link_extends=Object.assign||function(target){for(var i=1;i=0)continue;if(!Object.prototype.hasOwnProperty.call(obj,i))continue;target[i]=obj[i]}return target}function Link_classCallCheck(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function")}}function Link_possibleConstructorReturn(self,call){if(!self){throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}return call&&(typeof call==="object"||typeof call==="function")?call:self}function Link_inherits(subClass,superClass){if(typeof superClass!=="function"&&superClass!==null){throw new TypeError("Super expression must either be null or a function, not "+typeof superClass)}subClass.prototype=Object.create(superClass&&superClass.prototype,{constructor:{value:subClass,enumerable:false,writable:true,configurable:true}});if(superClass)Object.setPrototypeOf?Object.setPrototypeOf(subClass,superClass):subClass.__proto__=superClass}var isModifiedEvent=function isModifiedEvent(event){return!!(event.metaKey||event.altKey||event.ctrlKey||event.shiftKey)};var Link_Link=function(_React$Component){Link_inherits(Link,_React$Component);function Link(){var _temp,_this,_ret;Link_classCallCheck(this,Link);for(var _len=arguments.length,args=Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key]}return _ret=(_temp=(_this=Link_possibleConstructorReturn(this,_React$Component.call.apply(_React$Component,[this].concat(args))),_this),_this.handleClick=function(event){if(_this.props.onClick)_this.props.onClick(event);if(!event.defaultPrevented&&event.button===0&&!_this.props.target&&!isModifiedEvent(event)){event.preventDefault();var history=_this.context.router.history;var _this$props=_this.props,replace=_this$props.replace,to=_this$props.to;if(replace){history.replace(to)}else{history.push(to)}}},_temp),Link_possibleConstructorReturn(_this,_ret)}Link.prototype.render=function render(){var _props=this.props,replace=_props.replace,to=_props.to,innerRef=_props.innerRef,props=_objectWithoutProperties(_props,["replace","to","innerRef"]);react_router_dom_node_modules_invariant_browser_default()(this.context.router,"You should not use outside a ");react_router_dom_node_modules_invariant_browser_default()(to!==undefined,'You must specify the "to" property');var history=this.context.router.history;var location=typeof to==="string"?LocationUtils_createLocation(to,null,null,history.location):to;var href=history.createHref(location);return external_React_default.a.createElement("a",Link_extends({},props,{onClick:this.handleClick,href,ref:innerRef}))};return Link}(external_React_default.a.Component);Link_Link.propTypes={onClick:prop_types_default.a.func,target:prop_types_default.a.string,replace:prop_types_default.a.bool,to:prop_types_default.a.oneOfType([prop_types_default.a.string,prop_types_default.a.object]).isRequired,innerRef:prop_types_default.a.oneOfType([prop_types_default.a.string,prop_types_default.a.func])};Link_Link.defaultProps={replace:false};Link_Link.contextTypes={router:prop_types_default.a.shape({history:prop_types_default.a.shape({push:prop_types_default.a.func.isRequired,replace:prop_types_default.a.func.isRequired,createHref:prop_types_default.a.func.isRequired}).isRequired}).isRequired};var es_Link=Link_Link;function MemoryRouter_classCallCheck(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function")}}function MemoryRouter_possibleConstructorReturn(self,call){if(!self){throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}return call&&(typeof call==="object"||typeof call==="function")?call:self}function MemoryRouter_inherits(subClass,superClass){if(typeof superClass!=="function"&&superClass!==null){throw new TypeError("Super expression must either be null or a function, not "+typeof superClass)}subClass.prototype=Object.create(superClass&&superClass.prototype,{constructor:{value:subClass,enumerable:false,writable:true,configurable:true}});if(superClass)Object.setPrototypeOf?Object.setPrototypeOf(subClass,superClass):subClass.__proto__=superClass}var MemoryRouter_MemoryRouter=function(_React$Component){MemoryRouter_inherits(MemoryRouter,_React$Component);function MemoryRouter(){var _temp,_this,_ret;MemoryRouter_classCallCheck(this,MemoryRouter);for(var _len=arguments.length,args=Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key]}return _ret=(_temp=(_this=MemoryRouter_possibleConstructorReturn(this,_React$Component.call.apply(_React$Component,[this].concat(args))),_this),_this.history=es_createMemoryHistory(_this.props),_temp),MemoryRouter_possibleConstructorReturn(_this,_ret)}MemoryRouter.prototype.componentWillMount=function componentWillMount(){warning_default()(!this.props.history," ignores the history prop. To use a custom history, "+"use `import { Router }` instead of `import { MemoryRouter as Router }`.")};MemoryRouter.prototype.render=function render(){return external_React_default.a.createElement(es_Router,{history:this.history,children:this.props.children})};return MemoryRouter}(external_React_default.a.Component);MemoryRouter_MemoryRouter.propTypes={initialEntries:prop_types_default.a.array,initialIndex:prop_types_default.a.number,getUserConfirmation:prop_types_default.a.func,keyLength:prop_types_default.a.number,children:prop_types_default.a.node};var es_MemoryRouter=MemoryRouter_MemoryRouter;var react_router_dom_es_MemoryRouter=es_MemoryRouter;var path_to_regexp=__webpack_require__(25);var path_to_regexp_default=__webpack_require__.n(path_to_regexp);var patternCache={};var cacheLimit=1e4;var cacheCount=0;var matchPath_compilePath=function compilePath(pattern,options){var cacheKey=""+options.end+options.strict+options.sensitive;var cache=patternCache[cacheKey]||(patternCache[cacheKey]={});if(cache[pattern])return cache[pattern];var keys=[];var re=path_to_regexp_default()(pattern,keys,options);var compiledPattern={re,keys};if(cacheCount1&&arguments[1]!==undefined?arguments[1]:{};var parent=arguments[2];if(typeof options==="string")options={path:options};var _options=options,path=_options.path,_options$exact=_options.exact,exact=_options$exact===undefined?false:_options$exact,_options$strict=_options.strict,strict=_options$strict===undefined?false:_options$strict,_options$sensitive=_options.sensitive,sensitive=_options$sensitive===undefined?false:_options$sensitive;if(path==null)return parent;var _compilePath=matchPath_compilePath(path,{end:exact,strict,sensitive}),re=_compilePath.re,keys=_compilePath.keys;var match=re.exec(pathname);if(!match)return null;var url=match[0],values=match.slice(1);var isExact=pathname===url;if(exact&&!isExact)return null;return{path,url:path==="/"&&url===""?"/":url,isExact,params:keys.reduce(function(memo,key,index){memo[key.name]=values[index];return memo},{})}};var es_matchPath=matchPath;var Route_extends=Object.assign||function(target){for(var i=1;i or withRouter() outside a ");var route=router.route;var pathname=(location||route.location).pathname;return es_matchPath(pathname,{path,strict,exact,sensitive},route.match)};Route.prototype.componentWillMount=function componentWillMount(){warning_default()(!(this.props.component&&this.props.render),"You should not use and in the same route; will be ignored");warning_default()(!(this.props.component&&this.props.children&&!Route_isEmptyChildren(this.props.children)),"You should not use and in the same route; will be ignored");warning_default()(!(this.props.render&&this.props.children&&!Route_isEmptyChildren(this.props.children)),"You should not use and in the same route; will be ignored")};Route.prototype.componentWillReceiveProps=function componentWillReceiveProps(nextProps,nextContext){warning_default()(!(nextProps.location&&!this.props.location),' elements should not change from uncontrolled to controlled (or vice versa). You initially used no "location" prop and then provided one on a subsequent render.');warning_default()(!(!nextProps.location&&this.props.location),' elements should not change from controlled to uncontrolled (or vice versa). You provided a "location" prop initially but omitted it on a subsequent render.');this.setState({match:this.computeMatch(nextProps,nextContext.router)})};Route.prototype.render=function render(){var match=this.state.match;var _props=this.props,children=_props.children,component=_props.component,render=_props.render;var _context$router=this.context.router,history=_context$router.history,route=_context$router.route,staticContext=_context$router.staticContext;var location=this.props.location||route.location;var props={match,location,history,staticContext};if(component)return match?external_React_default.a.createElement(component,props):null;if(render)return match?render(props):null;if(typeof children==="function")return children(props);if(children&&!Route_isEmptyChildren(children))return external_React_default.a.Children.only(children);return null};return Route}(external_React_default.a.Component);Route_Route.propTypes={computedMatch:prop_types_default.a.object,path:prop_types_default.a.string,exact:prop_types_default.a.bool,strict:prop_types_default.a.bool,sensitive:prop_types_default.a.bool,component:prop_types_default.a.func,render:prop_types_default.a.func,children:prop_types_default.a.oneOfType([prop_types_default.a.func,prop_types_default.a.node]),location:prop_types_default.a.object};Route_Route.contextTypes={router:prop_types_default.a.shape({history:prop_types_default.a.object.isRequired,route:prop_types_default.a.object.isRequired,staticContext:prop_types_default.a.object})};Route_Route.childContextTypes={router:prop_types_default.a.object.isRequired};var es_Route=Route_Route;var react_router_dom_es_Route=es_Route;var NavLink_extends=Object.assign||function(target){for(var i=1;i=0)continue;if(!Object.prototype.hasOwnProperty.call(obj,i))continue;target[i]=obj[i]}return target}var NavLink_NavLink=function NavLink(_ref){var to=_ref.to,exact=_ref.exact,strict=_ref.strict,location=_ref.location,activeClassName=_ref.activeClassName,className=_ref.className,activeStyle=_ref.activeStyle,style=_ref.style,getIsActive=_ref.isActive,ariaCurrent=_ref["aria-current"],rest=NavLink_objectWithoutProperties(_ref,["to","exact","strict","location","activeClassName","className","activeStyle","style","isActive","aria-current"]);var path=(typeof to==="undefined"?"undefined":NavLink_typeof(to))==="object"?to.pathname:to;var escapedPath=path&&path.replace(/([.+*?=^!:${}()[\]|/\\])/g,"\\$1");return external_React_default.a.createElement(react_router_dom_es_Route,{path:escapedPath,exact,strict,location,children:function children(_ref2){var location=_ref2.location,match=_ref2.match;var isActive=!!(getIsActive?getIsActive(match,location):match);return external_React_default.a.createElement(es_Link,NavLink_extends({to,className:isActive?[className,activeClassName].filter(function(i){return i}).join(" "):className,style:isActive?NavLink_extends({},style,activeStyle):style,"aria-current":isActive&&ariaCurrent||null},rest))}})};NavLink_NavLink.propTypes={to:es_Link.propTypes.to,exact:prop_types_default.a.bool,strict:prop_types_default.a.bool,location:prop_types_default.a.object,activeClassName:prop_types_default.a.string,className:prop_types_default.a.string,activeStyle:prop_types_default.a.object,style:prop_types_default.a.object,isActive:prop_types_default.a.func,"aria-current":prop_types_default.a.oneOf(["page","step","location","date","time","true"])};NavLink_NavLink.defaultProps={activeClassName:"active","aria-current":"page"};var es_NavLink=NavLink_NavLink;function Prompt_classCallCheck(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function")}}function Prompt_possibleConstructorReturn(self,call){if(!self){throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}return call&&(typeof call==="object"||typeof call==="function")?call:self}function Prompt_inherits(subClass,superClass){if(typeof superClass!=="function"&&superClass!==null){throw new TypeError("Super expression must either be null or a function, not "+typeof superClass)}subClass.prototype=Object.create(superClass&&superClass.prototype,{constructor:{value:subClass,enumerable:false,writable:true,configurable:true}});if(superClass)Object.setPrototypeOf?Object.setPrototypeOf(subClass,superClass):subClass.__proto__=superClass}var Prompt_Prompt=function(_React$Component){Prompt_inherits(Prompt,_React$Component);function Prompt(){Prompt_classCallCheck(this,Prompt);return Prompt_possibleConstructorReturn(this,_React$Component.apply(this,arguments))}Prompt.prototype.enable=function enable(message){if(this.unblock)this.unblock();this.unblock=this.context.router.history.block(message)};Prompt.prototype.disable=function disable(){if(this.unblock){this.unblock();this.unblock=null}};Prompt.prototype.componentWillMount=function componentWillMount(){node_modules_invariant_browser_default()(this.context.router,"You should not use outside a ");if(this.props.when)this.enable(this.props.message)};Prompt.prototype.componentWillReceiveProps=function componentWillReceiveProps(nextProps){if(nextProps.when){if(!this.props.when||this.props.message!==nextProps.message)this.enable(nextProps.message)}else{this.disable()}};Prompt.prototype.componentWillUnmount=function componentWillUnmount(){this.disable()};Prompt.prototype.render=function render(){return null};return Prompt}(external_React_default.a.Component);Prompt_Prompt.propTypes={when:prop_types_default.a.bool,message:prop_types_default.a.oneOfType([prop_types_default.a.func,prop_types_default.a.string]).isRequired};Prompt_Prompt.defaultProps={when:true};Prompt_Prompt.contextTypes={router:prop_types_default.a.shape({history:prop_types_default.a.shape({block:prop_types_default.a.func.isRequired}).isRequired}).isRequired};var es_Prompt=Prompt_Prompt;var react_router_dom_es_Prompt=es_Prompt;var generatePath_patternCache={};var generatePath_cacheLimit=1e4;var generatePath_cacheCount=0;var generatePath_compileGenerator=function compileGenerator(pattern){var cacheKey=pattern;var cache=generatePath_patternCache[cacheKey]||(generatePath_patternCache[cacheKey]={});if(cache[pattern])return cache[pattern];var compiledGenerator=path_to_regexp_default.a.compile(pattern);if(generatePath_cacheCount0&&arguments[0]!==undefined?arguments[0]:"/";var params=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};if(pattern==="/"){return pattern}var generator=generatePath_compileGenerator(pattern);return generator(params,{pretty:true})};var es_generatePath=generatePath;var Redirect_extends=Object.assign||function(target){for(var i=1;i outside a ");if(this.isStatic())this.perform()};Redirect.prototype.componentDidMount=function componentDidMount(){if(!this.isStatic())this.perform()};Redirect.prototype.componentDidUpdate=function componentDidUpdate(prevProps){var prevTo=LocationUtils_createLocation(prevProps.to);var nextTo=LocationUtils_createLocation(this.props.to);if(LocationUtils_locationsAreEqual(prevTo,nextTo)){warning_default()(false,"You tried to redirect to the same route you're currently on: "+('"'+nextTo.pathname+nextTo.search+'"'));return}this.perform()};Redirect.prototype.computeTo=function computeTo(_ref){var computedMatch=_ref.computedMatch,to=_ref.to;if(computedMatch){if(typeof to==="string"){return es_generatePath(to,computedMatch.params)}else{return Redirect_extends({},to,{pathname:es_generatePath(to.pathname,computedMatch.params)})}}return to};Redirect.prototype.perform=function perform(){var history=this.context.router.history;var push=this.props.push;var to=this.computeTo(this.props);if(push){history.push(to)}else{history.replace(to)}};Redirect.prototype.render=function render(){return null};return Redirect}(external_React_default.a.Component);Redirect_Redirect.propTypes={computedMatch:prop_types_default.a.object,push:prop_types_default.a.bool,from:prop_types_default.a.string,to:prop_types_default.a.oneOfType([prop_types_default.a.string,prop_types_default.a.object]).isRequired};Redirect_Redirect.defaultProps={push:false};Redirect_Redirect.contextTypes={router:prop_types_default.a.shape({history:prop_types_default.a.shape({push:prop_types_default.a.func.isRequired,replace:prop_types_default.a.func.isRequired}).isRequired,staticContext:prop_types_default.a.object}).isRequired};var es_Redirect=Redirect_Redirect;var react_router_dom_es_Redirect=es_Redirect;var StaticRouter_extends=Object.assign||function(target){for(var i=1;i=0)continue;if(!Object.prototype.hasOwnProperty.call(obj,i))continue;target[i]=obj[i]}return target}function StaticRouter_classCallCheck(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function")}}function StaticRouter_possibleConstructorReturn(self,call){if(!self){throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}return call&&(typeof call==="object"||typeof call==="function")?call:self}function StaticRouter_inherits(subClass,superClass){if(typeof superClass!=="function"&&superClass!==null){throw new TypeError("Super expression must either be null or a function, not "+typeof superClass)}subClass.prototype=Object.create(superClass&&superClass.prototype,{constructor:{value:subClass,enumerable:false,writable:true,configurable:true}});if(superClass)Object.setPrototypeOf?Object.setPrototypeOf(subClass,superClass):subClass.__proto__=superClass}var StaticRouter_addLeadingSlash=function addLeadingSlash(path){return path.charAt(0)==="/"?path:"/"+path};var addBasename=function addBasename(basename,location){if(!basename)return location;return StaticRouter_extends({},location,{pathname:StaticRouter_addLeadingSlash(basename)+location.pathname})};var StaticRouter_stripBasename=function stripBasename(basename,location){if(!basename)return location;var base=StaticRouter_addLeadingSlash(basename);if(location.pathname.indexOf(base)!==0)return location;return StaticRouter_extends({},location,{pathname:location.pathname.substr(base.length)})};var StaticRouter_createURL=function createURL(location){return typeof location==="string"?location:createPath(location)};var StaticRouter_staticHandler=function staticHandler(methodName){return function(){node_modules_invariant_browser_default()(false,"You cannot %s with ",methodName)}};var noop=function noop(){};var StaticRouter_StaticRouter=function(_React$Component){StaticRouter_inherits(StaticRouter,_React$Component);function StaticRouter(){var _temp,_this,_ret;StaticRouter_classCallCheck(this,StaticRouter);for(var _len=arguments.length,args=Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key]}return _ret=(_temp=(_this=StaticRouter_possibleConstructorReturn(this,_React$Component.call.apply(_React$Component,[this].concat(args))),_this),_this.createHref=function(path){return StaticRouter_addLeadingSlash(_this.props.basename+StaticRouter_createURL(path))},_this.handlePush=function(location){var _this$props=_this.props,basename=_this$props.basename,context=_this$props.context;context.action="PUSH";context.location=addBasename(basename,LocationUtils_createLocation(location));context.url=StaticRouter_createURL(context.location)},_this.handleReplace=function(location){var _this$props2=_this.props,basename=_this$props2.basename,context=_this$props2.context;context.action="REPLACE";context.location=addBasename(basename,LocationUtils_createLocation(location));context.url=StaticRouter_createURL(context.location)},_this.handleListen=function(){return noop},_this.handleBlock=function(){return noop},_temp),StaticRouter_possibleConstructorReturn(_this,_ret)}StaticRouter.prototype.getChildContext=function getChildContext(){return{router:{staticContext:this.props.context}}};StaticRouter.prototype.componentWillMount=function componentWillMount(){warning_default()(!this.props.history," ignores the history prop. To use a custom history, "+"use `import { Router }` instead of `import { StaticRouter as Router }`.")};StaticRouter.prototype.render=function render(){var _props=this.props,basename=_props.basename,context=_props.context,location=_props.location,props=StaticRouter_objectWithoutProperties(_props,["basename","context","location"]);var history={createHref:this.createHref,action:"POP",location:StaticRouter_stripBasename(basename,LocationUtils_createLocation(location)),push:this.handlePush,replace:this.handleReplace,go:StaticRouter_staticHandler("go"),goBack:StaticRouter_staticHandler("goBack"),goForward:StaticRouter_staticHandler("goForward"),listen:this.handleListen,block:this.handleBlock};return external_React_default.a.createElement(es_Router,StaticRouter_extends({},props,{history}))};return StaticRouter}(external_React_default.a.Component);StaticRouter_StaticRouter.propTypes={basename:prop_types_default.a.string,context:prop_types_default.a.object.isRequired,location:prop_types_default.a.oneOfType([prop_types_default.a.string,prop_types_default.a.object])};StaticRouter_StaticRouter.defaultProps={basename:"",location:"/"};StaticRouter_StaticRouter.childContextTypes={router:prop_types_default.a.object.isRequired};var es_StaticRouter=StaticRouter_StaticRouter;var react_router_dom_es_StaticRouter=es_StaticRouter;function Switch_classCallCheck(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function")}}function Switch_possibleConstructorReturn(self,call){if(!self){throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}return call&&(typeof call==="object"||typeof call==="function")?call:self}function Switch_inherits(subClass,superClass){if(typeof superClass!=="function"&&superClass!==null){throw new TypeError("Super expression must either be null or a function, not "+typeof superClass)}subClass.prototype=Object.create(superClass&&superClass.prototype,{constructor:{value:subClass,enumerable:false,writable:true,configurable:true}});if(superClass)Object.setPrototypeOf?Object.setPrototypeOf(subClass,superClass):subClass.__proto__=superClass}var Switch_Switch=function(_React$Component){Switch_inherits(Switch,_React$Component);function Switch(){Switch_classCallCheck(this,Switch);return Switch_possibleConstructorReturn(this,_React$Component.apply(this,arguments))}Switch.prototype.componentWillMount=function componentWillMount(){node_modules_invariant_browser_default()(this.context.router,"You should not use outside a ")};Switch.prototype.componentWillReceiveProps=function componentWillReceiveProps(nextProps){warning_default()(!(nextProps.location&&!this.props.location),' elements should not change from uncontrolled to controlled (or vice versa). You initially used no "location" prop and then provided one on a subsequent render.');warning_default()(!(!nextProps.location&&this.props.location),' elements should not change from controlled to uncontrolled (or vice versa). You provided a "location" prop initially but omitted it on a subsequent render.')};Switch.prototype.render=function render(){var route=this.context.router.route;var children=this.props.children;var location=this.props.location||route.location;var match=void 0,child=void 0;external_React_default.a.Children.forEach(children,function(element){if(match==null&&external_React_default.a.isValidElement(element)){var _element$props=element.props,pathProp=_element$props.path,exact=_element$props.exact,strict=_element$props.strict,sensitive=_element$props.sensitive,from=_element$props.from;var path=pathProp||from;child=element;match=es_matchPath(location.pathname,{path,exact,strict,sensitive},route.match)}});return match?external_React_default.a.cloneElement(child,{location,computedMatch:match}):null};return Switch}(external_React_default.a.Component);Switch_Switch.contextTypes={router:prop_types_default.a.shape({route:prop_types_default.a.object.isRequired}).isRequired};Switch_Switch.propTypes={children:prop_types_default.a.node,location:prop_types_default.a.object};var es_Switch=Switch_Switch;var react_router_dom_es_Switch=es_Switch;var react_router_dom_es_generatePath=es_generatePath;var react_router_dom_es_matchPath=es_matchPath;var hoist_non_react_statics_cjs=__webpack_require__(36);var hoist_non_react_statics_cjs_default=__webpack_require__.n(hoist_non_react_statics_cjs);var withRouter_extends=Object.assign||function(target){for(var i=1;i=0)continue;if(!Object.prototype.hasOwnProperty.call(obj,i))continue;target[i]=obj[i]}return target}var withRouter_withRouter=function withRouter(Component){var C=function C(props){var wrappedComponentRef=props.wrappedComponentRef,remainingProps=withRouter_objectWithoutProperties(props,["wrappedComponentRef"]);return external_React_default.a.createElement(es_Route,{children:function children(routeComponentProps){return external_React_default.a.createElement(Component,withRouter_extends({},remainingProps,routeComponentProps,{ref:wrappedComponentRef}))}})};C.displayName="withRouter("+(Component.displayName||Component.name)+")";C.WrappedComponent=Component;C.propTypes={wrappedComponentRef:prop_types_default.a.func};return hoist_non_react_statics_cjs_default()(C,Component)};var es_withRouter=withRouter_withRouter;var react_router_dom_es_withRouter=es_withRouter;__webpack_require__.d(__webpack_exports__,"BrowserRouter",function(){return es_BrowserRouter});__webpack_require__.d(__webpack_exports__,"HashRouter",function(){return es_HashRouter});__webpack_require__.d(__webpack_exports__,"Link",function(){return es_Link});__webpack_require__.d(__webpack_exports__,"MemoryRouter",function(){return react_router_dom_es_MemoryRouter});__webpack_require__.d(__webpack_exports__,"NavLink",function(){return es_NavLink});__webpack_require__.d(__webpack_exports__,"Prompt",function(){return react_router_dom_es_Prompt});__webpack_require__.d(__webpack_exports__,"Redirect",function(){return react_router_dom_es_Redirect});__webpack_require__.d(__webpack_exports__,"Route",function(){return react_router_dom_es_Route});__webpack_require__.d(__webpack_exports__,"Router",function(){return react_router_dom_es_Router});__webpack_require__.d(__webpack_exports__,"StaticRouter",function(){return react_router_dom_es_StaticRouter});__webpack_require__.d(__webpack_exports__,"Switch",function(){return react_router_dom_es_Switch});__webpack_require__.d(__webpack_exports__,"generatePath",function(){return react_router_dom_es_generatePath});__webpack_require__.d(__webpack_exports__,"matchPath",function(){return react_router_dom_es_matchPath});__webpack_require__.d(__webpack_exports__,"withRouter",function(){return react_router_dom_es_withRouter})},function(module,exports,__webpack_require__){"use strict";var invariant=function(condition,format,a,b,c,d,e,f){if(false){}if(!condition){var error;if(format===undefined){error=new Error("Minified exception occurred; use the non-minified dev environment "+"for the full error message and additional helpful warnings.")}else{var args=[a,b,c,d,e,f];var argIndex=0;error=new Error(format.replace(/%s/g,function(){return args[argIndex++]}));error.name="Invariant Violation"}error.framesToPop=1;throw error}};module.exports=invariant},function(module,exports,__webpack_require__){var isarray=__webpack_require__(47);module.exports=pathToRegexp;module.exports.parse=parse;module.exports.compile=compile;module.exports.tokensToFunction=tokensToFunction;module.exports.tokensToRegExp=tokensToRegExp;var PATH_REGEXP=new RegExp(["(\\\\.)","([\\/.])?(?:(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?|(\\*))"].join("|"),"g");function parse(str,options){var tokens=[];var key=0;var index=0;var path="";var defaultDelimiter=options&&options.delimiter||"/";var res;while((res=PATH_REGEXP.exec(str))!=null){var m=res[0];var escaped=res[1];var offset=res.index;path+=str.slice(index,offset);index=offset+m.length;if(escaped){path+=escaped[1];continue}var next=str[index];var prefix=res[2];var name=res[3];var capture=res[4];var group=res[5];var modifier=res[6];var asterisk=res[7];if(path){tokens.push(path);path=""}var partial=prefix!=null&&next!=null&&next!==prefix;var repeat=modifier==="+"||modifier==="*";var optional=modifier==="?"||modifier==="*";var delimiter=res[2]||defaultDelimiter;var pattern=capture||group;tokens.push({name:name||key++,prefix:prefix||"",delimiter,optional,repeat,partial,asterisk:!!asterisk,pattern:pattern?escapeGroup(pattern):asterisk?".*":"[^"+escapeString(delimiter)+"]+?"})}if(index1){setCurrent("quantity",0)}}}},{key:"setSession",value:function setSession(session,sessionId){var centerId=this.props.options.sessionCenters[sessionId].centerId;this.props.setCurrent(session,sessionId);this.props.setCurrent("centerId",centerId);this.props.setCurrent("originId",centerId)}},{key:"render",value:function render(){var _this2=this;var _props=this.props,current=_props.current,errors=_props.errors,options=_props.options,data=_props.data,parent=_props.parent;var _props2=this.props,mapFormOptions=_props2.mapFormOptions,addListItem=_props2.addListItem,toggleCollapse=_props2.toggleCollapse,setCurrent=_props2.setCurrent;var barcodes=Object.entries(current.list).map(function(_ref,i,list){var _ref2=_slicedToArray(_ref,2),key=_ref2[0],specimen=_ref2[1];return React.createElement(SpecimenBarcodeForm,{current,key,barcodeKey:key,id:i+1,collapsed:current.collapsed[key],toggleCollapse,mapFormOptions,setCurrent,specimen:specimen||null,errors:errors.list[key]||{},removeSpecimen:list.length>1?function(){_this2.props.removeListItem(key)}:null,addSpecimen:i+1==list.length?function(){addListItem("specimen")}:null,multiplier:current.multiplier,copySpecimen:i+1==list.length&&specimen?_this2.props.copyListItem:null,setListItem:_this2.props.setListItem,options,data})});var renderNote=function renderNote(){if(parent){return React.createElement(StaticElement,{label:"Note",text:'To create new aliquots, enter a Barcode, fill out the coresponding sub-form and press Submit. Press "New Entry" button to add another barcode field, or press for the "Copy" button to duplicate the previous entry.'})}else{return React.createElement(StaticElement,{label:"Note",text:'To create new specimens, first select a PSCID and Visit Label. Then, enter a Barcode, fill out the coresponding sub-form and press submit. Press "New Entry" button to add another barcode field, or press for the "Copy" button to duplicate the previous entry.'})}};var renderGlobalFields=function renderGlobalFields(){if(parent){var parentBarcodes=Object.values(parent).map(function(item){return item.container.barcode});var parentBarcodesString=parentBarcodes.join(", ");return React.createElement("div",null,React.createElement(StaticElement,{label:"Parent Specimen(s)",text:parentBarcodesString}),React.createElement(StaticElement,{label:"PSCID",text:options.candidates[current.candidateId].pscid}),React.createElement(StaticElement,{label:"Visit Label",text:options.sessions[current.sessionId].label}))}else{var sessions=current.candidateId?mapFormOptions(options.candidateSessions[current.candidateId],"label"):{};var candidates=mapFormOptions(options.candidates,"pscid");return React.createElement("div",null,React.createElement(SearchableDropdown,{name:"candidateId",label:"PSCID",options:candidates,onUserInput:setCurrent,required:true,value:current.candidateId,placeHolder:"Search for a PSCID",errorMessage:errors.specimen.candidateId}),React.createElement(SelectElement,{name:"sessionId",label:"Visit Label",options:sessions,onUserInput:_this2.setSession,required:true,value:current.sessionId,disabled:current.candidateId?false:true,errorMessage:errors.specimen.sessionId}))}};var renderRemainingQuantityFields=function renderRemainingQuantityFields(){if(parent){if(loris.userHasPermission("biobank_specimen_update")&&parent.length===1){var specimenUnits=mapFormOptions(options.specimen.units,"label");return React.createElement("div",null,React.createElement(TextboxElement,{name:"quantity",label:"Remaining Quantity",onUserInput:_this2.props.setSpecimen,required:true,value:current.specimen.quantity}),React.createElement(SelectElement,{name:"unitId",label:"Unit",options:specimenUnits,onUserInput:_this2.props.setSpecimen,emptyOption:false,required:true,value:current.specimen.unitId}))}}};return React.createElement("div",null,React.createElement("div",{className:"row"},React.createElement("div",{className:"col-xs-11"},renderNote(),renderGlobalFields(),React.createElement(SelectElement,{name:"projectIds",label:"Project",options:this.props.options.projects,onUserInput:function onUserInput(name,value){return setCurrent(name,[value])},required:true,value:current.projectIds,disabled:current.candidateId?false:true,errorMessage:errors.container.projectIds}),renderRemainingQuantityFields())),barcodes)}}]);return BiobankSpecimenForm}(React.Component);BiobankSpecimenForm.propTypes={};BiobankSpecimenForm.defaultProps={specimenList:{}};var SpecimenBarcodeForm=function(_React$Component2){_inherits(SpecimenBarcodeForm,_React$Component2);function SpecimenBarcodeForm(){_classCallCheck(this,SpecimenBarcodeForm);var _this3=_possibleConstructorReturn(this,(SpecimenBarcodeForm.__proto__||Object.getPrototypeOf(SpecimenBarcodeForm)).call(this));_this3.setContainer=_this3.setContainer.bind(_this3);_this3.setSpecimen=_this3.setSpecimen.bind(_this3);_this3.copy=_this3.copy.bind(_this3);return _this3}_createClass(SpecimenBarcodeForm,[{key:"setContainer",value:function setContainer(name,value){var container=this.props.specimen.container;container[name]=value;this.props.setListItem("container",container,this.props.barcodeKey)}},{key:"setSpecimen",value:function setSpecimen(name,value){this.props.setListItem(name,value,this.props.barcodeKey)}},{key:"copy",value:function copy(){this.props.copySpecimen(this.props.barcodeKey)}},{key:"render",value:function render(){var _this4=this;var _props3=this.props,mapFormOptions=_props3.mapFormOptions,setCurrent=_props3.setCurrent;var _props4=this.props,addSpecimen=_props4.addSpecimen,copySpecimen=_props4.copySpecimen,removeSpecimen=_props4.removeSpecimen;var _props5=this.props,options=_props5.options,current=_props5.current,errors=_props5.errors,specimen=_props5.specimen,data=_props5.data;var renderAddSpecimenButton=function renderAddSpecimenButton(){if(addSpecimen){return React.createElement("div",null,React.createElement("span",{className:"action"},React.createElement("div",{className:"action-button add",onClick:addSpecimen},"+")),React.createElement("span",{className:"action-title"},"New Entry"))}};var renderCopySpecimenButton=function renderCopySpecimenButton(){if(copySpecimen){return React.createElement("div",null,React.createElement("span",{className:"action"},React.createElement("div",{className:"action-button add",onClick:_this4.copy},React.createElement("span",{className:"glyphicon glyphicon-duplicate"}))),React.createElement("span",{className:"action-title"},React.createElement("input",{className:"form-control input-sm",type:"number",min:"1",max:"50",style:{width:50,display:"inline"},onChange:function onChange(e){setCurrent("multiplier",e.target.value)},value:_this4.props.multiplier}),"Copies"))}};var renderRemoveSpecimenButton=function renderRemoveSpecimenButton(){if(removeSpecimen){var glyphStyle={color:"#DDDDDD",marginLeft:10,cursor:"pointer",fontSize:15};return React.createElement("span",{className:"glyphicon glyphicon-remove",onClick:removeSpecimen,style:glyphStyle})}};var renderSpecimenTypes=function renderSpecimenTypes(){var specimenTypes=void 0;if(current.typeId){specimenTypes=Object.entries(options.specimen.types).reduce(function(result,_ref3){var _ref4=_slicedToArray(_ref3,2),id=_ref4[0],type=_ref4[1];if(id==current.typeId){result[id]=type}if(type.parentTypeIds){type.parentTypeIds.forEach(function(i){if(i==current.typeId){result[id]=type}})}return result},{})}else{specimenTypes=options.specimen.types}return mapFormOptions(specimenTypes,"label")};var containerTypesPrimary=mapFormOptions(options.container.typesPrimary,"label");var validContainers={};if(specimen.typeId&&options.specimen.typeContainerTypes[specimen.typeId]){Object.keys(containerTypesPrimary).forEach(function(id){options.specimen.typeContainerTypes[specimen.typeId].forEach(function(i){if(id==i){validContainers[id]=containerTypesPrimary[id]}})})}return React.createElement("div",null,React.createElement("div",{className:"row"},React.createElement("div",{className:"col-xs-11"},React.createElement("div",null,React.createElement(TextboxElement,{name:"barcode",label:"Barcode "+this.props.id,onUserInput:this.setContainer,required:true,value:specimen.container.barcode,errorMessage:(errors.container||{}).barcode}))),React.createElement("div",{className:"col-xs-1",style:{paddingLeft:0,marginTop:10}},React.createElement("span",{className:this.props.collapsed?"glyphicon glyphicon-chevron-down":"glyphicon glyphicon-chevron-up",style:{cursor:"pointer",fontSize:15,position:"relative",right:40},"data-toggle":"collapse","data-target":"#item-"+this.props.barcodeKey,onClick:function onClick(){_this4.props.toggleCollapse(_this4.props.barcodeKey)}}),renderRemoveSpecimenButton())),React.createElement("div",{className:"row"},React.createElement("div",{className:"col-xs-9 col-xs-offset-2"},React.createElement("div",{id:"item-"+this.props.barcodeKey,className:"collapse"},React.createElement(SelectElement,{name:"typeId",label:"Specimen Type",options:renderSpecimenTypes(),onUserInput:this.setSpecimen,required:true,value:(specimen||{}).typeId,errorMessage:(errors.specimen||{}).typeId}),React.createElement(SelectElement,{name:"typeId",label:"Container Type",options:specimen.typeId?validContainers:containerTypesPrimary,onUserInput:this.setContainer,required:true,value:specimen.container.typeId,errorMessage:(errors.container||{}).typeId}),React.createElement(TextboxElement,{name:"lotNumber",label:"Lot Number",onUserInput:this.setContainer,value:specimen.container.lotNumber,errorMessage:(errors.container||{}).lotNumber}),React.createElement(DateElement,{name:"expirationDate",label:"Expiration Date",onUserInput:this.setContainer,value:specimen.container.expirationDate,errorMessage:(errors.container||{}).expirationDate}),React.createElement(_processForm2.default,{edit:true,errors:(errors.specimen||{}).process,mapFormOptions,options,process:specimen.collection,processStage:"collection",setParent:this.props.setCurrent,setSpecimen:this.setSpecimen,typeId:specimen.typeId}),React.createElement(_containerParentForm2.default,{display:false,data,setContainer:this.setContainer,mapFormOptions,container:specimen.container,options})))),React.createElement("div",{className:"row"},React.createElement("div",{className:"col-xs-12"},React.createElement("div",{className:"col-xs-3"}),React.createElement("div",{className:"col-xs-4 action"},renderAddSpecimenButton()),React.createElement("div",{className:"col-xs-5 action"},renderCopySpecimenButton()))))}}]);return SpecimenBarcodeForm}(React.Component);SpecimenBarcodeForm.propTypes={};SpecimenBarcodeForm.defaultProps={specimen:{}};exports.default=BiobankSpecimenForm},function(module,exports,__webpack_require__){"use strict";var _typeof=typeof Symbol==="function"&&typeof Symbol.iterator==="symbol"?function(obj){return typeof obj}:function(obj){return obj&&typeof Symbol==="function"&&obj.constructor===Symbol&&obj!==Symbol.prototype?"symbol":typeof obj};Object.defineProperty(exports,"__esModule",{value:true});var _createClass=function(){function defineProperties(target,props){for(var i=0;icapacity){this.props.clearAll()}}this.props.setCurrent("coordinate",coordinate)}},{key:"loadContainer",value:function loadContainer(name,value){var _this2=this;if(!value){return}var containerId=value;var container=JSON.parse(JSON.stringify(this.props.data.containers.all[containerId]));container.parentContainerId=this.props.container.id;container.coordinate=this.props.current.coordinate;this.props.updateContainer(container,false).then(function(){if(_this2.props.current.sequential){var coordinate=_this2.props.current.coordinate;_this2.increaseCoordinate(coordinate);_this2.props.setCurrent("containerId",1).then(function(){return _this2.props.setCurrent("containerId",null)})}else{_this2.props.clearAll()}_this2.props.setCurrent("prevCoordinate",container.coordinate)})}},{key:"checkoutContainers",value:function checkoutContainers(){var _this3=this;var checkoutList=JSON.parse(JSON.stringify(this.props.current.list));var checkoutPromises=Object.values(checkoutList).map(function(container){container.parentContainerId=null;container.coordinate=null;return _this3.props.updateContainer(container,false)});Promise.all(checkoutPromises).then(function(){return _this3.props.clearAll()}).then(function(){return(0,_sweetalert2.default)("Containers Successfully Checked Out!","","success")})}},{key:"render",value:function render(){var _this4=this;var _props=this.props,barcodes=_props.barcodes,coordinates=_props.coordinates,current=_props.current,data=_props.data,dimensions=_props.dimensions,editable=_props.editable,options=_props.options;var _props2=this.props,select=_props2.select,target=_props2.target;var _props3=this.props,clearAll=_props3.clearAll,editContainer=_props3.editContainer,setContainer=_props3.setContainer,setCurrent=_props3.setCurrent;var barcodeField=void 0;if((editable||{}).loadContainer){barcodeField=React.createElement(SearchableDropdown,{name:"barcode",label:"Barcode",options:barcodes,onUserInput:this.loadContainer,value:current.containerId,placeHolder:"Please Scan or Select Barcode",autoFocus:true})}var load=React.createElement("div",{className:(editable||{}).loadContainer?"open":"closed"},React.createElement(FormElement,null,React.createElement(StaticElement,{label:"Note",text:"Select or Scan Containers to be Loaded. If Sequential is Checked, the Coordinate will Auto-Increment after each Load."}),React.createElement(CheckboxElement,{name:"sequential",label:"Sequential",value:current.sequential,onUserInput:setCurrent}),barcodeField,React.createElement(ButtonElement,{label:"Done",onUserInput:clearAll})));var children={};if(((target||{}).container||{}).childContainerIds.length!==0){Object.values(data.containers.all).map(function(c){target.container.childContainerIds.forEach(function(id){if(c.id==id){children[id]=c}})})}if((editable||{}).containerCheckout){var _barcodes=this.props.mapFormOptions(children,"barcode");barcodeField=React.createElement(SearchableDropdown,{name:"barcode",label:"Barcode",options:_barcodes,onUserInput:function onUserInput(name,value){value&&_this4.props.setCheckoutList(children[value])},value:current.containerId,placeHolder:"Please Scan or Select Barcode",autoFocus:true})}var checkout=React.createElement("div",{className:(editable||{}).containerCheckout?"open":"closed"},React.createElement(FormElement,null,React.createElement(StaticElement,{label:"Note",text:"Click, Select or Scan Containers to be Unloaded and Press 'Confirm'"}),barcodeField,React.createElement(ButtonElement,{label:"Confirm",onUserInput:this.checkoutContainers}),React.createElement(StaticElement,{text:React.createElement("a",{onClick:clearAll,style:{cursor:"pointer"}},"Cancel")})));var display=void 0;var column=[];var row=[];var coordinate=1;if(dimensions){for(var y=1;y<=dimensions.y;y++){column=[];for(var x=1;x<=dimensions.x;x++){var nodeWidth=500/dimensions.x-500/dimensions.x*.08;var nodeStyle={width:nodeWidth};var nodeClass="node";var tooltipTitle=null;var title=null;var dataHtml="false";var dataToggle=null;var dataPlacement=null;var draggable="false";var onDragStart=null;var onDragOver=this.allowDrop;var onDrop=this.drop;var onClick=this.redirectURL;if(!select){if((coordinates||{})[coordinate]){if(!loris.userHasPermission("biobank_specimen_view")&&children[coordinates[coordinate]]===undefined){nodeClass="node forbidden";onClick=null}else{if(coordinate in current.list){nodeClass="node checkout"}else if(coordinate==current.prevCoordinate){nodeClass="node new"}else{nodeClass="node occupied"}dataHtml="true";dataToggle="tooltip";dataPlacement="top";if(children[coordinates[coordinate]]){tooltipTitle="
"+children[coordinates[coordinate]].barcode+"
"+"
"+options.container.types[children[coordinates[coordinate]].typeId].label+"
"+"
"+options.container.stati[children[coordinates[coordinate]].statusId].label+"
"}draggable=!loris.userHasPermission("biobank_container_update")||editable.loadContainer||editable.containerCheckout?"false":"true";onDragStart=this.drag;if(editable.containerCheckout){onClick=function onClick(e){var container=data.containers.all[coordinates[e.target.id]];_this4.props.setCheckoutList(container)}}if(editable.loadContainer){onClick=null}}onDragOver=null;onDrop=null}else if(loris.userHasPermission("biobank_container_update")&&!editable.containerCheckout){nodeClass=coordinate==current.coordinate?"node selected":"node load";title="Load...";onClick=function onClick(e){var containerId=e.target.id;_this4.props.edit("loadContainer").then(function(){return editContainer(target.container)}).then(function(){return setCurrent("coordinate",containerId)})}}}if(select){if(coordinate==this.props.selectedCoordinate){nodeClass="node occupied"}else if(!coordinates){nodeClass="node available";onClick=function onClick(e){return setContainer("coordinate",e.target.id)}}else if(coordinates){if(!coordinates[coordinate]){nodeClass="node available";onClick=function onClick(e){return setContainer("coordinate",e.target.id)}}else if(coordinates[coordinate]){(function(){var childContainer=data.containers.all[coordinates[coordinate]];var specimen=Object.values(data.specimens).find(function(specimen){return specimen.containerId==childContainer.id});var quantity="";if(specimen){quantity="
"+(specimen.quantity+" "+options.specimen.units[specimen.unitId].label)+"
"}dataHtml="true";dataToggle="tooltip";dataPlacement="top";tooltipTitle="
"+childContainer.barcode+"
"+("
"+options.container.types[childContainer.typeId].label+"
")+quantity+("
"+options.container.stati[childContainer.statusId].label+"
")})()}}}var coordinateDisplay=void 0;if(dimensions.xNum==1&&dimensions.yNum==1){coordinateDisplay=x+dimensions.x*(y-1)}else{var xVal=dimensions.xNum==1?x:String.fromCharCode(64+x);var yVal=dimensions.yNum==1?y:String.fromCharCode(64+y);coordinateDisplay=yVal+""+xVal}column.push(React.createElement("div",{id:coordinate,title,className:nodeClass,"data-html":dataHtml,"data-toggle":dataToggle,"data-placement":dataPlacement,"data-original-title":tooltipTitle,style:nodeStyle,onClick,draggable,onDragStart,onDragOver,onDrop},coordinateDisplay));coordinate++}var rowHeight=500/dimensions.y-500/dimensions.y*.08;var rowStyle={height:rowHeight};row.push(React.createElement("div",{className:"row",style:rowStyle},column))}display=row}return React.createElement("div",null,React.createElement("div",{style:{width:500}},checkout,load),React.createElement("div",{className:"display"},display))}}]);return ContainerDisplay}(React.Component);ContainerDisplay.propTypes={};ContainerDisplay.defaultProps={current:{}};exports.default=ContainerDisplay},function(module,exports,__webpack_require__){"use strict";var _typeof=typeof Symbol==="function"&&typeof Symbol.iterator==="symbol"?function(obj){return typeof obj}:function(obj){return obj&&typeof Symbol==="function"&&obj.constructor===Symbol&&obj!==Symbol.prototype?"symbol":typeof obj};Object.defineProperty(exports,"__esModule",{value:true});var _createClass=function(){function defineProperties(target,props){for(var i=0;i0){return _react2.default.createElement("div",{className:"action",title:"Remove Cycle"},_react2.default.createElement("span",{className:"action-button update",onClick:_this4.decreaseCycle},_react2.default.createElement("span",{className:"glyphicon glyphicon-minus"})))}};var increaseCycle=function increaseCycle(){return _react2.default.createElement("div",{className:"action",title:"Add Cycle"},_react2.default.createElement("span",{className:"action-button update",onClick:_this4.increaseCycle},_react2.default.createElement("span",{className:"glyphicon glyphicon-plus"})))};var updateFTCycle=function updateFTCycle(){if(loris.userHasPermission("biobank_specimen_update")){return _react2.default.createElement("div",null,decreaseCycle()," ",increaseCycle())}};return _react2.default.createElement("div",{className:"item"},_react2.default.createElement("div",{className:"field"},"Freeze-Thaw Cycle",_react2.default.createElement("div",{className:"value"},target.specimen.fTCycle)),updateFTCycle())}};var updateTemperature=function updateTemperature(){if(loris.userHasPermission("biobank_container_update")){return _react2.default.createElement("div",{className:"action",title:"Update Temperature"},_react2.default.createElement("span",{className:"action-button update",onClick:function onClick(){_this4.props.edit("temperature").then(function(){return _this4.props.editContainer(target.container)})}},_react2.default.createElement("span",{className:"glyphicon glyphicon-chevron-right"})))}};var temperatureField=function temperatureField(){if(!editable.temperature){return _react2.default.createElement("div",{className:"item"},_react2.default.createElement("div",{className:"field"},"Temperature",_react2.default.createElement("div",{className:"value"},target.container.temperature+"°C")),updateTemperature())}else{return _react2.default.createElement("div",{className:"item"},_react2.default.createElement("div",{className:"field"},"Temperature",_react2.default.createElement(TemperatureField,{container,errors:_this4.props.errors.container,clearAll:_this4.props.clearAll,setContainer:_this4.props.setContainer,updateContainer:_this4.props.updateContainer})))}};var updateStatus=function updateStatus(){if(loris.userHasPermission("biobank_container_update")){return _react2.default.createElement("div",{className:"action",title:"Update Status"},_react2.default.createElement("span",{className:"action-button update",onClick:function onClick(){_this4.props.edit("status");_this4.props.editContainer(target.container)}},_react2.default.createElement("span",{className:"glyphicon glyphicon-chevron-right"})))}};var statusField=function statusField(){if(!editable.status){return _react2.default.createElement("div",{className:"item"},_react2.default.createElement("div",{className:"field"},"Status",_react2.default.createElement("div",{className:"value"},options.container.stati[target.container.statusId].label)),updateStatus())}else{var stati=_this4.props.mapFormOptions(options.container.stati,"label");return _react2.default.createElement("div",{className:"item"},_react2.default.createElement("div",{className:"field"},"Status",_react2.default.createElement(StatusField,{container,errors:_this4.props.errors.container,stati,clearAll:_this4.props.clearAll,setContainer:_this4.props.setContainer,updateContainer:_this4.props.updateContainer})))}};var updateProject=function updateProject(){if(loris.userHasPermission("biobank_container_update")){return _react2.default.createElement("div",{className:"action",title:"Update Project"},_react2.default.createElement("span",{className:"action-button update",onClick:function onClick(){_this4.props.edit("project");_this4.props.editContainer(target.container)}},_react2.default.createElement("span",{className:"glyphicon glyphicon-chevron-right"})))}};var projectField=function projectField(){if(!editable.project){return _react2.default.createElement("div",{className:"item"},_react2.default.createElement("div",{className:"field"},"Projects",_react2.default.createElement("div",{className:"value"},target.container.projectIds.length!=0?target.container.projectIds.map(function(id){return options.projects[id]}).join(", "):"None")),updateProject())}else{return _react2.default.createElement("div",{className:"item"},_react2.default.createElement("div",{className:"field"},"Projects",_react2.default.createElement(ProjectField,{container,errors:_this4.props.errors.container,projects:_this4.props.options.projects,clearAll:_this4.props.clearAll,multiple:true,emptyOption:false,setContainer:_this4.props.setContainer,updateContainer:_this4.props.updateContainer})))}};var updateCenter=function updateCenter(){if(loris.userHasPermission("biobank_container_update")){return _react2.default.createElement("div",{className:"action",title:"Update Status"},_react2.default.createElement("span",{className:"action-button update",onClick:function onClick(){_this4.props.edit("center");_this4.props.editContainer(target.container)}},_react2.default.createElement("span",{className:"glyphicon glyphicon-chevron-right"})))}};var centerField=function centerField(){if(!editable.center){return _react2.default.createElement("div",{className:"item"},_react2.default.createElement("div",{className:"field"},"Current Site",_react2.default.createElement("div",{className:"value"},options.centers[target.container.centerId])),updateCenter())}else{return _react2.default.createElement("div",{className:"item"},_react2.default.createElement("div",{className:"field"},"Current Site",_react2.default.createElement(CenterField,{container,errors:_this4.props.errors.container,centers:options.centers,clearAll:_this4.props.clearAll,setContainer:_this4.props.setContainer,updateContainer:_this4.props.updateContainer})))}};var originField=function originField(){return _react2.default.createElement("div",{className:"item"},_react2.default.createElement("div",{className:"field"},"Origin Site",_react2.default.createElement("div",{className:"value"},options.centers[target.container.originId])))};var parentSpecimenField=function parentSpecimenField(){if((target.specimen||{}).parentSpecimenIds){var parentSpecimenBarcodes=Object.values(target.specimen.parentSpecimenIds).map(function(id){var barcode=data.containers.primary[data.specimens[id].containerId].barcode;return _react2.default.createElement(_reactRouterDom.Link,{to:"/barcode="+barcode},barcode)}).reduce(function(prev,curr){return[prev,", ",curr]});return _react2.default.createElement("div",{className:"item"},_react2.default.createElement("div",{className:"field"},"Parent Specimen",_react2.default.createElement("div",{className:"value"},parentSpecimenBarcodes||"None")))}};var parentContainerField=function parentContainerField(){if(loris.userHasPermission("biobank_container_view")){var parentContainerBarcodeValue=function parentContainerBarcodeValue(){if(target.container.parentContainerId){var barcode=data.containers.nonPrimary[target.container.parentContainerId].barcode;return _react2.default.createElement(_reactRouterDom.Link,{to:"/barcode="+barcode},barcode)}};var updateParentContainer=function updateParentContainer(){if(loris.userHasPermission("biobank_container_update")){return _react2.default.createElement("div",null,_react2.default.createElement("div",{className:"action",title:"Move Container"},_react2.default.createElement("span",{className:"action-button update",onClick:function onClick(){_this4.props.edit("containerParentForm");_this4.props.editContainer(target.container)}},_react2.default.createElement("span",{className:"glyphicon glyphicon-chevron-right"}))),_react2.default.createElement("div",null,_react2.default.createElement(_Modal2.default,{title:"Update Parent Container",onClose:_this4.props.clearAll,show:editable.containerParentForm,onSubmit:function onSubmit(){return _this4.props.updateContainer(container)}},_react2.default.createElement(_containerParentForm2.default,{display:true,target,container:_this4.props.container,options,data,mapFormOptions:_this4.props.mapFormOptions,setContainer:_this4.props.setContainer,updateContainer:_this4.props.updateContainer}))))}};var coordinate=void 0;if(target.container.coordinate){coordinate=_this4.props.getCoordinateLabel(target.container)}return _react2.default.createElement("div",{className:"item"},_react2.default.createElement("div",{className:"field"},"Parent Container",_react2.default.createElement("div",{className:"value"},parentContainerBarcodeValue()||"None"),parentContainerBarcodeValue&&target.container.coordinate?"Coordinate "+coordinate:null),updateParentContainer())}};var candidateSessionField=function candidateSessionField(){if(target.specimen){return _react2.default.createElement("div",{className:"item"},_react2.default.createElement("div",{className:"field"},"PSCID",_react2.default.createElement("div",{className:"value"},_react2.default.createElement("a",{href:loris.BaseURL+"/"+target.specimen.candidateId},options.candidates[target.specimen.candidateId].pscid))),_react2.default.createElement("div",{className:"field"},"Visit Label",_react2.default.createElement("div",{className:"value"},_react2.default.createElement("a",{href:loris.BaseURL+"/instrument_list/?candID="+target.specimen.candidateId+"&sessionID="+target.specimen.sessionId},options.sessions[target.specimen.sessionId].label))))}};var fieldList=_react2.default.createElement("div",{className:"list"},specimenTypeField(),containerTypeField(),poolField(),quantityField(),fTCycleField(),temperatureField(),statusField(),projectField(),centerField(),originField(),parentSpecimenField(),parentContainerField(),candidateSessionField());return _react2.default.createElement("div",{className:"globals"},fieldList)}}]);return Globals}(_react.Component);Globals.propTypes={};var StatusField=function(_Component2){_inherits(StatusField,_Component2);function StatusField(){_classCallCheck(this,StatusField);return _possibleConstructorReturn(this,(StatusField.__proto__||Object.getPrototypeOf(StatusField)).apply(this,arguments))}_createClass(StatusField,[{key:"render",value:function render(){var _this6=this;return _react2.default.createElement("div",{className:"inline-field"},_react2.default.createElement("div",{style:{flex:"1 0 25%",minWidth:"90px"}},_react2.default.createElement(SelectElement,{name:"statusId",options:this.props.stati,inputClass:"col-lg-11",onUserInput:this.props.setContainer,value:this.props.container.statusId,errorMessage:this.props.errors.statusId})),_react2.default.createElement("div",{style:{flex:"0 1 15%",margin:"0 1%"}},_react2.default.createElement(ButtonElement,{label:"Update",onUserInput:function onUserInput(){return _this6.props.updateContainer(_this6.props.container)},columnSize:"col-lg-11"})),_react2.default.createElement("div",{style:{flex:"0 1 15%",margin:"0 1%"}},_react2.default.createElement("a",{onClick:this.props.clearAll,style:{cursor:"pointer"}},"Cancel")))}}]);return StatusField}(_react.Component);StatusField.propTypes={setContainer:_propTypes2.default.func.isRequired,clearAll:_propTypes2.default.func,stati:_propTypes2.default.object.isRequired,container:_propTypes2.default.object.isRequired,updateContainer:_propTypes2.default.func.isRequired,className:_propTypes2.default.string};var ProjectField=function(_Component3){_inherits(ProjectField,_Component3);function ProjectField(){_classCallCheck(this,ProjectField);return _possibleConstructorReturn(this,(ProjectField.__proto__||Object.getPrototypeOf(ProjectField)).apply(this,arguments))}_createClass(ProjectField,[{key:"render",value:function render(){var _this8=this;return _react2.default.createElement("div",{className:"inline-field"},_react2.default.createElement("div",{style:{flex:"1 0 25%",minWidth:"90px"}},_react2.default.createElement(SelectElement,{name:"projectIds",options:this.props.projects,inputClass:"col-lg-11",onUserInput:this.props.setContainer,multiple:this.props.multiple,emptyOption:this.props.emptyOption,value:this.props.container.projectIds,errorMessage:this.props.errors.projectIds})),_react2.default.createElement("div",{style:{flex:"0 1 15%",margin:"0 1%"}},_react2.default.createElement(ButtonElement,{label:"Update",onUserInput:function onUserInput(){return _this8.props.updateContainer(_this8.props.container)},columnSize:"col-lg-11"})),_react2.default.createElement("div",{style:{flex:"0 1 15%",margin:"0 1%"}},_react2.default.createElement("a",{onClick:this.props.clearAll,style:{cursor:"pointer"}},"Cancel")))}}]);return ProjectField}(_react.Component);ProjectField.propTypes={setContainer:_propTypes2.default.func.isRequired,clearAll:_propTypes2.default.func,projects:_propTypes2.default.object.isRequired,container:_propTypes2.default.object.isRequired,updateContainer:_propTypes2.default.func.isRequired,className:_propTypes2.default.string};var TemperatureField=function(_Component4){_inherits(TemperatureField,_Component4);function TemperatureField(){_classCallCheck(this,TemperatureField);return _possibleConstructorReturn(this,(TemperatureField.__proto__||Object.getPrototypeOf(TemperatureField)).apply(this,arguments))}_createClass(TemperatureField,[{key:"render",value:function render(){var _this10=this;return _react2.default.createElement("div",{className:"inline-field"},_react2.default.createElement("div",{style:{flex:"1 0 25%",minWidth:"90px"}},_react2.default.createElement(TextboxElement,{name:"temperature",inputClass:"col-lg-11",onUserInput:this.props.setContainer,value:this.props.container.temperature,errorMessage:this.props.errors.temperature})),_react2.default.createElement("div",{style:{flex:"0 1 15%",margin:"0 1%"}},_react2.default.createElement(ButtonElement,{label:"Update",onUserInput:function onUserInput(){return _this10.props.updateContainer(_this10.props.container)},columnSize:"col-lg-11"})),_react2.default.createElement("div",{style:{flex:"0 1 15%",margin:"0 1%"}},_react2.default.createElement("a",{onClick:this.props.clearAll,style:{cursor:"pointer"}},"Cancel")))}}]);return TemperatureField}(_react.Component);TemperatureField.propTypes={setContainer:_propTypes2.default.func.isRequired,clearAll:_propTypes2.default.func,container:_propTypes2.default.object.isRequired,updateContainer:_propTypes2.default.func.isRequired,className:_propTypes2.default.string};var CenterField=function(_Component5){_inherits(CenterField,_Component5);function CenterField(){_classCallCheck(this,CenterField);return _possibleConstructorReturn(this,(CenterField.__proto__||Object.getPrototypeOf(CenterField)).apply(this,arguments))}_createClass(CenterField,[{key:"render",value:function render(){var _this12=this;return _react2.default.createElement("div",{className:"inline-field"},_react2.default.createElement("div",{style:{flex:"1 0 25%",minWidth:"90px"}},_react2.default.createElement(SelectElement,{name:"centerId",options:this.props.centers,inputClass:"col-lg-11",onUserInput:this.props.setContainer,value:this.props.container.centerId,errorMessage:this.props.errors.centerId})),_react2.default.createElement("div",{style:{flex:"0 1 15%",margin:"0 1%"}},_react2.default.createElement(ButtonElement,{label:"Update",onUserInput:function onUserInput(){return _this12.props.updateContainer(_this12.props.container)},columnSize:"col-lg-11"})),_react2.default.createElement("div",{style:{flex:"0 1 15%",margin:"0 1%"}},_react2.default.createElement("a",{onClick:this.props.clearAll,style:{cursor:"pointer"}},"Cancel")))}}]);return CenterField}(_react.Component);CenterField.propTypes={setContainer:_propTypes2.default.func.isRequired,clearAll:_propTypes2.default.func.isRequired,centerIds:_propTypes2.default.object.isRequired,container:_propTypes2.default.object.isRequired,updateContainer:_propTypes2.default.func.isRequired,className:_propTypes2.default.string};var QuantityField=function(_Component6){_inherits(QuantityField,_Component6);function QuantityField(){_classCallCheck(this,QuantityField);return _possibleConstructorReturn(this,(QuantityField.__proto__||Object.getPrototypeOf(QuantityField)).apply(this,arguments))}_createClass(QuantityField,[{key:"render",value:function render(){return _react2.default.createElement("div",{className:"inline-field"},_react2.default.createElement("div",{style:{flex:"1 0 25%",minWidth:"90px"}},_react2.default.createElement(TextboxElement,{name:"quantity",inputClass:"col-xs-11",onUserInput:this.props.setSpecimen,value:this.props.specimen.quantity,errorMessage:this.props.errors.quantity})),_react2.default.createElement("div",{style:{flex:"1 0 25%",minWidth:"90px"}},_react2.default.createElement(SelectElement,{name:"unitId",inputClass:"col-xs-11",options:this.props.units,onUserInput:this.props.setSpecimen,value:this.props.specimen.unitId,errorMessage:this.props.errors.unitId})),_react2.default.createElement("div",{style:{flex:"0 1 15%",margin:"0 1%"}},_react2.default.createElement(ButtonElement,{label:"Update",onUserInput:this.props.updateSpecimen,columnSize:"col-xs-11"})),_react2.default.createElement("div",{style:{flex:"0 1 15%",margin:"0 1%"}},_react2.default.createElement("a",{onClick:this.props.clearAll,style:{cursor:"pointer"}},"Cancel")))}}]);return QuantityField}(_react.Component);QuantityField.propTypes={setSpecimen:_propTypes2.default.func,clearAll:_propTypes2.default.func,specimen:_propTypes2.default.object,updateSpecimen:_propTypes2.default.func,className:_propTypes2.default.string};exports.default=Globals},function(module,exports,__webpack_require__){"use strict";var _typeof=typeof Symbol==="function"&&typeof Symbol.iterator==="symbol"?function(obj){return typeof obj}:function(obj){return obj&&typeof Symbol==="function"&&obj.constructor===Symbol&&obj!==Symbol.prototype?"symbol":typeof obj};Object.defineProperty(exports,"__esModule",{value:true});var _createClass=function(){function defineProperties(target,props){for(var i=0;i1&&arguments[1]!==undefined?arguments[1]:[];barcodes.push(container.barcode);var parent=Object.values(this.state.data.containers.nonPrimary).find(function(c){return container.parentContainerId==c.id});parent&&this.getParentContainerBarcodes(parent,barcodes);return barcodes.slice(0).reverse()}},{key:"getBarcodePathDisplay",value:function getBarcodePathDisplay(parentBarcodes){var _this14=this;return Object.keys(parentBarcodes).map(function(i){var container=Object.values(_this14.state.data.containers.all).find(function(container){return container.barcode==parentBarcodes[parseInt(i)+1]});var coordinateDisplay=void 0;if(container){var coordinate=_this14.getCoordinateLabel(container);coordinateDisplay=React.createElement("b",null,"-"+(coordinate||"UAS"))}return React.createElement("span",{className:"barcodePath"},i!=0&&": ",React.createElement(_reactRouterDom.Link,{key:i,to:"/barcode="+parentBarcodes[i]},parentBarcodes[i]),coordinateDisplay)})}},{key:"setSpecimen",value:function setSpecimen(name,value){var _this15=this;return new Promise(function(resolve){var specimen=_this15.state.current.specimen;specimen[name]=value;_this15.setCurrent("specimen",specimen).then(function(){return resolve()})})}},{key:"setContainer",value:function setContainer(name,value){var _this16=this;return new Promise(function(resolve){var container=_this16.state.current.container;value?container[name]=value:delete container[name];_this16.setCurrent("container",container).then(function(){return resolve()})})}},{key:"setPool",value:function setPool(name,value){var _this17=this;return new Promise(function(resolve){var pool=_this17.state.current.pool;pool[name]=value;_this17.setCurrent("pool",pool).then(function(){return resolve()})})}},{key:"setContainerData",value:function setContainerData(containers){var _this18=this;return new Promise(function(resolve){var data=_this18.state.data;Object.values(containers).forEach(function(container){data.containers.all[container.id]=container;data.containers.nonPrimary[container.id]=container});_this18.setState({data},resolve())})}},{key:"setSpecimenData",value:function setSpecimenData(specimenList){var _this19=this;return new Promise(function(resolve){var data=_this19.state.data;specimenList.forEach(function(specimen){return data.specimens[specimen.id]=specimen});_this19.setState({data},resolve())})}},{key:"updateSpecimen",value:function updateSpecimen(specimen){var _this20=this;var closeOnSuccess=arguments.length>1&&arguments[1]!==undefined?arguments[1]:true;var onSuccess=function onSuccess(){closeOnSuccess&&_this20.clearAll().then(function(){return(0,_sweetalert2.default)("Specimen Save Successful","","success")})};this.validateSpecimen(specimen).then(function(){return _this20.post(specimen,_this20.props.specimenAPI,"PUT",onSuccess)}).then(function(updatedSpecimens){return _this20.setSpecimenData(updatedSpecimens)})}},{key:"updateContainer",value:function updateContainer(container){var _this21=this;var closeOnSuccess=arguments.length>1&&arguments[1]!==undefined?arguments[1]:true;var onSuccess=function onSuccess(){closeOnSuccess&&_this21.clearAll().then(function(){return(0,_sweetalert2.default)("Container Save Successful","","success")})};return new Promise(function(resolve){_this21.validateContainer(container).then(function(){return _this21.post(container,_this21.props.containerAPI,"PUT",onSuccess)}).then(function(containers){return _this21.setContainerData(containers)}).then(function(){return _this21.loadData(_this21.props.containerAPI,"containers")}).then(function(){return resolve()})})}},{key:"createSpecimens",value:function createSpecimens(){var _this22=this;return new Promise(function(resolve){var listValidation=[];var list=_this22.clone(_this22.state.current.list);var projectIds=_this22.state.current.projectIds;var centerId=_this22.state.current.centerId;var availableId=Object.keys(_this22.state.options.container.stati).find(function(key){return _this22.state.options.container.stati[key].label==="Available"});Object.keys(list).forEach(function(key){var specimen=list[key];specimen.candidateId=_this22.state.current.candidateId;specimen.sessionId=_this22.state.current.sessionId;specimen.quantity=specimen.collection.quantity;specimen.unitId=specimen.collection.unitId;specimen.collection.centerId=centerId;if((_this22.state.options.specimen.types[specimen.typeId]||{}).freezeThaw==1){specimen.fTCycle=0}specimen.parentSpecimenIds=_this22.state.current.parentSpecimenIds||null;var container=specimen.container;container.statusId=availableId;container.temperature=20;container.projectIds=projectIds;container.centerId=centerId;container.originId=centerId;specimen.container=container;list[key]=specimen;listValidation.push(_this22.validateContainer(container,key));listValidation.push(_this22.validateSpecimen(specimen,key))});var onSuccess=function onSuccess(){return(0,_sweetalert2.default)("Save Successful","","success")};Promise.all(listValidation).then(function(){return _this22.post(list,_this22.props.specimenAPI,"POST",onSuccess)}).then(function(){return _this22.clearAll()}).then(function(){return _this22.loadAllData()}).then(function(){return resolve()}).catch(function(e){return console.error(e)})})}},{key:"createContainers",value:function createContainers(){var _this23=this;return new Promise(function(resolve,reject){var listValidation=[];var list=_this23.state.current.list;var availableId=Object.keys(_this23.state.options.container.stati).find(function(key){return _this23.state.options.container.stati[key].label==="Available"});Object.entries(list).forEach(function(_ref){var _ref2=_slicedToArray(_ref,2),key=_ref2[0],container=_ref2[1];container.statusId=availableId;container.temperature=20;container.projectIds=_this23.state.current.projectIds;container.originId=_this23.state.current.centerId;container.centerId=_this23.state.current.centerId;listValidation.push(_this23.validateContainer(container,key))});var onSuccess=function onSuccess(){return(0,_sweetalert2.default)("Container Creation Successful","","success")};Promise.all(listValidation).then(function(){return _this23.post(list,_this23.props.containerAPI,"POST",onSuccess)}).then(function(containers){console.log(containers);_this23.setContainerData(containers)}).then(function(){return _this23.clearAll()}).then(function(){return resolve()}).catch(function(){return reject()})})}},{key:"createPool",value:function createPool(){var _this24=this;var dispensedId=Object.keys(this.state.options.container.stati).find(function(key){return _this24.state.options.container.stati[key].label==="Dispensed"});var update=Object.values(this.state.current.list).reduce(function(result,item){item.container.statusId=dispensedId;item.specimen.quantity="0";return[].concat(_toConsumableArray(result),[function(){return _this24.updateContainer(item.container,false)},function(){return _this24.updateSpecimen(item.specimen,false)}])},[]);var pool=this.clone(this.state.current.pool);var onSuccess=function onSuccess(){return(0,_sweetalert2.default)("Pooling Successful!","","success")};return new Promise(function(resolve,reject){_this24.validatePool(pool).then(function(){return _this24.post(pool,_this24.props.poolAPI,"POST",onSuccess)}).then(function(){return Promise.all(update.map(function(update){return update()}))}).then(function(){return _this24.clearAll()}).then(function(){return _this24.loadAllData()}).then(function(){return resolve()}).catch(function(e){return reject()})})}},{key:"saveBatchPreparation",value:function saveBatchPreparation(){var _this25=this;return new Promise(function(resolve){var list=_this25.clone(_this25.state.current.list);var preparation=_this25.clone(_this25.state.current.preparation);preparation.centerId=_this25.state.current.centerId;var saveList=Object.values(list).map(function(item){var specimen=_this25.clone(item.specimen);specimen.preparation=preparation;return function(){return _this25.post(specimen,_this25.props.specimenAPI,"PUT").then(function(spec){return _this25.setSpecimenData(spec)})}});var attributes=_this25.state.options.specimen.protocolAttributes[preparation.protocolId];var validateParams=[preparation,attributes,["protocolId","centerId","date","time"]];_this25.validateProcess.apply(_this25,validateParams).then(function(){return _this25.validateBatchPreparation(list)}).then(function(){return Promise.all(saveList.map(function(item){return item()}))}).then(function(){return _this25.clearAll()}).then(function(){return(0,_sweetalert2.default)("Batch Preparation Successful!","","success")}).then(function(){return resolve()}).catch(function(e){return _this25.setErrors("preparation",e)})})}},{key:"post",value:function post(data,url,method,onSuccess){var _this26=this;return new Promise(function(resolve,reject){return fetch(url,{credentials:"same-origin",method,body:JSON.stringify(_this26.clone(data))}).then(function(response){if(response.ok){onSuccess instanceof Function&&onSuccess();resolve(response.json())}else{response.json().then(function(data){return(0,_sweetalert2.default)(data.error,"","error")}).then(function(){return reject()})}}).catch(function(error){return console.error(error)})})}},{key:"validateSpecimen",value:function validateSpecimen(specimen,key){var _this27=this;return new Promise(function(resolve,reject){var errors=_this27.clone(_this27.state.errors);errors.specimen={};var required=["typeId","quantity","unitId","candidateId","sessionId","collection"];var float=["quantity"];required.map(function(field){if(specimen[field]==null){errors.specimen[field]="This field is required! "}});float.map(function(field){if(isNaN(specimen[field])){errors.specimen[field]="This field must be a number! "}});if(specimen.quantity<0){errors.specimen.quantity="This field must be greater than 0"}var validateProcess=[_this27.validateProcess(specimen.collection,_this27.state.options.specimen.protocolAttributes[specimen.collection.protocolId],["protocolId","examinerId","quantity","unitId","centerId","date","time"],["quantity"])];if(specimen.preparation){validateProcess.push(_this27.validateProcess(specimen.preparation,_this27.state.options.specimen.protocolAttributes[specimen.preparation.protocolId],["protocolId","examinerId","centerId","date","time"]))}if(specimen.analysis){validateProcess.push(_this27.validateProcess(specimen.analysis,_this27.state.options.specimen.protocolAttributes[specimen.analysis.protocolId],["protocolId","examinerId","centerId","date","time"]))}Promise.all(validateProcess).catch(function(e){return errors.specimen.process=e}).then(function(){if(key){errors.list[key]=errors.list[key]||{};errors.list[key].specimen=errors.specimen}if(_this27.isEmpty(errors.specimen)){_this27.setState({errors},resolve())}else{_this27.setState({errors},reject(errors))}})})}},{key:"isEmpty",value:function isEmpty(obj){for(var key in obj){if(obj.hasOwnProperty(key)){return false}}return true}},{key:"validateProcess",value:function validateProcess(process,attributes,required,number){var _this28=this;return new Promise(function(resolve,reject){var errors={};var regex=void 0;required&&required.map(function(field){if(process[field]==null){errors[field]="This field is required! "}});number&&number.map(function(field){if(isNaN(process[field])){errors[field]="This field must be a number! "}});regex=/^[12]\d{3}\-(0[1-9]|1[012])\-(0[1-9]|[12][0-9]|3[01])$/;if(regex.test(process.date)===false){errors.date="This field must be a valid date! "}regex=/^([01]\d|2[0-3]):([0-5]\d)$/;if(regex.test(process.time)===false){errors.time="This field must be a valid time! "}if(process.data){errors.data={};var datatypes=_this28.state.options.specimen.attributeDatatypes;Object.keys(process.data).forEach(function(attributeId){if(_this28.state.options.specimen.protocolAttributes[process.protocolId][attributeId].required==1&&!process.data[attributeId]){errors.data[attributeId]="This field is required!"}if(datatypes[attributes[attributeId].datatypeId].datatype==="number"){if(isNaN(process.data[attributeId])){errors.data[attributeId]="This field must be a number!"}}if(datatypes[attributes[attributeId].datatypeId].datatype==="date"){regex=/^[12]\d{3}\-(0[1-9]|1[012])\-(0[1-9]|[12][0-9]|3[01])$/;if(regex.test(process.data[attributeId])===false){errors.data[attributeId]="This field must be a valid date! "}}if(datatypes[attributes[attributeId].datatypeId].datatype==="time"){regex=/^([01]\d|2[0-3]):([0-5]\d)$/;if(regex.test(process.data[attributeId])===false){errors.data[attributeId]="This field must be a valid time! "}}});if(Object.keys(errors.data).length==0){delete errors.data}}if(Object.keys(errors).length!=0){reject(errors)}else{resolve()}})}},{key:"validateContainer",value:function validateContainer(container,key){var _this29=this;return new Promise(function(resolve,reject){var errors=_this29.state.errors;errors.container={};var required=["barcode","typeId","temperature","statusId","projectIds","centerId"];var float=["temperature"];required.map(function(field){if(!container[field]){errors.container[field]="This field is required! "}});float.map(function(field){if(isNaN(container[field])){errors.container[field]="This field must be a number! "}});Object.values(_this29.state.data.containers.all).map(function(c){if(container.barcode===c.barcode&&container.id!==c.id){errors.container.barcode="Barcode must be unique."}});if(key){errors.list[key]=errors.list[key]||{};errors.list[key].container=errors.container}if(Object.keys(errors.container).length==0){_this29.setState({errors},resolve())}else{_this29.setState({errors},reject())}})}},{key:"validatePool",value:function validatePool(pool){var _this30=this;return new Promise(function(resolve,reject){var regex=void 0;var errors=_this30.state.errors;errors.pool={};var required=["label","quantity","unitId","date","time"];required.forEach(function(field){if(!pool[field]){errors.pool[field]="This field is required! "}});if(isNaN(pool.quantity)){errors.pool.quantity="This field must be a number! "}regex=/^[12]\d{3}\-(0[1-9]|1[012])\-(0[1-9]|[12][0-9]|3[01])$/;if(regex.test(pool.date)===false){errors.pool.date="This field must be a valid date! "}regex=/^([01]\d|2[0-3]):([0-5]\d)$/;if(regex.test(pool.time)===false){errors.pool.time="This field must be a valid time! "}if(pool.specimenIds==null||pool.specimenIds.length<2){errors.pool.total="Pooling requires at least 2 specimens"}if(Object.keys(errors.pool).length==0){_this30.setState({errors},resolve())}else{_this30.setState({errors},reject())}})}},{key:"validateBatchPreparation",value:function validateBatchPreparation(list){return new Promise(function(resolve,reject){var barcodes=Object.values(list).filter(function(item){return!!item.specimen.preparation}).map(function(item){return item.container.barcode});if(barcodes.length>0){return(0,_sweetalert2.default)({title:"Warning!",html:"Preparation for specimen(s) "+barcodes.join(", ")+" "+"already exists. By completing this form, the previous preparation "+"will be overwritten.",type:"warning",showCancelButton:true,confirmButtonText:"Proceed"}).then(function(result){return result.value?resolve():reject()})}else{return resolve()}})}},{key:"render",value:function render(){var _this31=this;if(!this.state.isLoaded){return React.createElement("div",{style:{height:500}},React.createElement(_Loader2.default,null))}var barcode=function barcode(props){var target=_this31.routeBarcode(props.match.params.barcode);if(target.specimen){return React.createElement(_specimen2.default,{data:_this31.state.data,target,options:_this31.state.options,errors:_this31.state.errors,current:_this31.state.current,editable:_this31.state.editable,mapFormOptions:_this31.mapFormOptions,setContainer:_this31.setContainer,updateContainer:_this31.updateContainer,setSpecimen:_this31.setSpecimen,updateSpecimen:_this31.updateSpecimen,setCurrent:_this31.setCurrent,toggleCollapse:_this31.toggleCollapse,setListItem:_this31.setListItem,addListItem:_this31.addListItem,copyListItem:_this31.copyListItem,removeListItem:_this31.removeListItem,edit:_this31.edit,clearAll:_this31.clearAll,createSpecimens:_this31.createSpecimens,editSpecimen:_this31.editSpecimen,editContainer:_this31.editContainer,getCoordinateLabel:_this31.getCoordinateLabel,getParentContainerBarcodes:_this31.getParentContainerBarcodes,getBarcodePathDisplay:_this31.getBarcodePathDisplay})}else{return React.createElement(_container2.default,{history:props.history,data:_this31.state.data,target,options:_this31.state.options,errors:_this31.state.errors,current:_this31.state.current,editable:_this31.state.editable,mapFormOptions:_this31.mapFormOptions,editContainer:_this31.editContainer,setContainer:_this31.setContainer,updateContainer:_this31.updateContainer,setCurrent:_this31.setCurrent,setCheckoutList:_this31.setCheckoutList,edit:_this31.edit,clearAll:_this31.clearAll,getCoordinateLabel:_this31.getCoordinateLabel,getParentContainerBarcodes:_this31.getParentContainerBarcodes,getBarcodePathDisplay:_this31.getBarcodePathDisplay})}};var filter=function filter(props){return React.createElement(_filter2.default,{isLoaded:_this31.state.isLoaded,history:props.history,data:_this31.state.data,options:_this31.state.options,current:_this31.state.current,errors:_this31.state.errors,editable:_this31.state.editable,setSpecimenHeader:_this31.setSpecimenHeader,updateFilter:_this31.updateFilter,resetFilter:_this31.resetFilter,mapFormOptions:_this31.mapFormOptions,edit:_this31.edit,clearAll:_this31.clearAll,toggleCollapse:_this31.toggleCollapse,setCurrent:_this31.setCurrent,setErrors:_this31.setErrors,setListItem:_this31.setListItem,setPool:_this31.setPool,setPoolList:_this31.setPoolList,addListItem:_this31.addListItem,copyListItem:_this31.copyListItem,removeListItem:_this31.removeListItem,createPool:_this31.createPool,createContainers:_this31.createContainers,createSpecimens:_this31.createSpecimens,saveBatchPreparation:_this31.saveBatchPreparation})};return React.createElement(_reactRouterDom.BrowserRouter,{basename:"/biobank"},React.createElement(_reactRouterDom.Switch,null,React.createElement(_reactRouterDom.Route,{exact:true,path:"/",render:filter}),React.createElement(_reactRouterDom.Route,{exact:true,path:"/barcode=:barcode",render:barcode})))}}]);return BiobankIndex}(React.Component);window.addEventListener("load",function(){var biobank=loris.BaseURL+"/biobank/";ReactDOM.render(React.createElement(BiobankIndex,{specimenAPI:biobank+"specimenendpoint/",containerAPI:biobank+"containerendpoint/",poolAPI:biobank+"poolendpoint/",optionsAPI:biobank+"optionsendpoint/"}),document.getElementById("lorisworkspace"))})},function(module,exports){module.exports=Array.isArray||function(arr){return Object.prototype.toString.call(arr)=="[object Array]"}},function(module,exports,__webpack_require__){"use strict";var _typeof=typeof Symbol==="function"&&typeof Symbol.iterator==="symbol"?function(obj){return typeof obj}:function(obj){return obj&&typeof Symbol==="function"&&obj.constructor===Symbol&&obj!==Symbol.prototype?"symbol":typeof obj};Object.defineProperty(exports,"__esModule",{value:true});var _createClass=function(){function defineProperties(target,props){for(var i=0;i0&&!target.specimen.poolId){return _react2.default.createElement("div",{className:"action-button add",onClick:_this6.openAliquotForm},"+")}else{return _react2.default.createElement("div",{className:"action-button disabled"},"+")}};var addAliquotForm=function addAliquotForm(){if(loris.userHasPermission("biobank_specimen_create")){return _react2.default.createElement("div",null,_react2.default.createElement("div",{className:"action",title:"Make Aliquots"},renderActionButton()),_react2.default.createElement("div",null,_react2.default.createElement(_Modal2.default,{title:"Add Aliquots",onClose:_this6.props.clearAll,show:editable.aliquotForm,onSubmit:_this6.submitAliquotForm},_react2.default.createElement(FormElement,null,_react2.default.createElement(_specimenForm2.default,{parent:[target],options,data,current,errors,mapFormOptions:_this6.props.mapFormOptions,toggleCollapse:_this6.props.toggleCollapse,setCurrent:_this6.props.setCurrent,setSpecimen:_this6.props.setSpecimen,setListItem:_this6.props.setListItem,addListItem:_this6.props.addListItem,copyListItem:_this6.props.copyListItem,removeListItem:_this6.props.removeListItem})))))}};var alterCollection=function alterCollection(){if(loris.userHasPermission("biobank_specimen_alter")){return _react2.default.createElement("span",{className:editable.collection?null:"glyphicon glyphicon-pencil",onClick:editable.collection?null:_this6.alterCollection})}};var cancelAlterCollection=function cancelAlterCollection(){if(editable.collection){return _react2.default.createElement("a",{className:"pull-right",style:{cursor:"pointer"},onClick:_this6.props.clearAll},"Cancel")}};var collectionPanel=_react2.default.createElement("div",{className:"panel specimen-panel panel-default"},_react2.default.createElement("div",{className:"panel-heading"},_react2.default.createElement("div",{className:"lifecycle-node collection"},_react2.default.createElement("div",{className:"letter"},"C")),_react2.default.createElement("div",{className:"title"},"Collection"),alterCollection()),_react2.default.createElement("div",{className:"panel-body"},_react2.default.createElement(FormElement,null,_react2.default.createElement(_processForm2.default,{current,errors:errors.specimen.process,edit:editable.collection,specimen:current.specimen,mapFormOptions:this.props.mapFormOptions,options,process:editable.collection?current.specimen.collection:target.specimen.collection,processStage:"collection",setCurrent:this.props.setCurrent,setParent:this.props.setSpecimen,typeId:editable.collection?current.specimen.typeId:target.specimen.typeId,updateSpecimen:this.props.updateSpecimen})),cancelAlterCollection()));var alterPreparation=function alterPreparation(){if(loris.userHasPermission("biobank_specimen_alter")){return _react2.default.createElement("span",{className:editable.preparation?null:"glyphicon glyphicon-pencil",onClick:editable.preparation?null:_this6.alterPreparation})}};var cancelAlterPreparation=function cancelAlterPreparation(){if(editable.preparation){return _react2.default.createElement("a",{className:"pull-right",style:{cursor:"pointer"},onClick:_this6.props.clearAll},"Cancel")}};var preparationPanel=function preparationPanel(){var protocolExists=Object.values(options.specimen.protocols).find(function(protocol){return protocol.typeId==target.specimen.typeId&&options.specimen.processes[protocol.processId].label=="Preparation"});if(protocolExists&&!target.specimen.preparation&&!editable.preparation&&loris.userHasPermission("biobank_specimen_update")){return _react2.default.createElement("div",{className:"panel specimen-panel inactive"},_react2.default.createElement("div",{className:"add-process",onClick:_this6.addPreparation},_react2.default.createElement("span",{className:"glyphicon glyphicon-plus"})),_react2.default.createElement("div",null,"ADD PREPARATION"))}else if(target.specimen.preparation||editable.preparation){return _react2.default.createElement("div",{className:"panel specimen-panel panel-default"},_react2.default.createElement("div",{className:"panel-heading"},_react2.default.createElement("div",{className:"lifecycle-node collection"},_react2.default.createElement("div",{className:"letter"},"P")),_react2.default.createElement("div",{className:"title"},"Preparation"),alterPreparation()),_react2.default.createElement("div",{className:"panel-body"},_react2.default.createElement(FormElement,null,_react2.default.createElement(_processForm2.default,{current,errors:errors.specimen.process,edit:editable.preparation,specimen:current.specimen,mapFormOptions:_this6.props.mapFormOptions,options,process:editable.preparation?current.specimen.preparation:target.specimen.preparation,processStage:"preparation",setCurrent:_this6.props.setCurrent,setParent:_this6.props.setSpecimen,typeId:editable.preparation?current.specimen.typeId:target.specimen.typeId,updateSpecimen:_this6.props.updateSpecimen})),cancelAlterPreparation()))}};var alterAnalysis=function alterAnalysis(){if(loris.userHasPermission("biobank_specimen_alter")){return _react2.default.createElement("span",{className:editable.analysis?null:"glyphicon glyphicon-pencil",onClick:editable.analysis?null:_this6.alterAnalysis})}};var cancelAlterAnalysis=function cancelAlterAnalysis(){if(editable.analysis){return _react2.default.createElement("a",{className:"pull-right",style:{cursor:"pointer"},onClick:_this6.props.clearAll},"Cancel")}};var analysisPanel=function analysisPanel(){var protocolExists=Object.values(options.specimen.protocols).find(function(protocol){return protocol.typeId==target.specimen.typeId&&options.specimen.processes[protocol.processId].label=="Analysis"});if(protocolExists&&!target.specimen.preparation&&!editable.analysis&&loris.userHasPermission("biobank_specimen_update")){return _react2.default.createElement("div",{className:"panel specimen-panel inactive"},_react2.default.createElement("div",{className:"add-process",onClick:_this6.addAnalysis},_react2.default.createElement("span",{className:"glyphicon glyphicon-plus"})),_react2.default.createElement("div",null,"ADD ANALYSIS"))}else if(target.specimen.analysis||editable.analysis){return _react2.default.createElement("div",{className:"panel specimen-panel panel-default"},_react2.default.createElement("div",{className:"panel-heading"},_react2.default.createElement("div",{className:"lifecycle-node collection"},_react2.default.createElement("div",{className:"letter"},"A")),_react2.default.createElement("div",{className:"title"},"Analysis"),alterAnalysis()),_react2.default.createElement("div",{className:"panel-body"},_react2.default.createElement(FormElement,null,_react2.default.createElement(_processForm2.default,{current,errors:errors.specimen.process,edit:editable.analysis,specimen:current.specimen,mapFormOptions:_this6.props.mapFormOptions,options,process:editable.analysis?current.specimen.analysis:target.specimen.analysis,processStage:"analysis",setCurrent:_this6.props.setCurrent,setParent:_this6.props.setSpecimen,typeId:editable.analysis?current.specimen.typeId:target.specimen.typeId,updateSpecimen:_this6.props.updateSpecimen})),cancelAlterAnalysis()))}};var globals=_react2.default.createElement(_globals2.default,{specimen:current.specimen,container:current.container,data,target,options,errors,editable,edit:this.props.edit,clearAll:this.props.clearAll,mapFormOptions:this.props.mapFormOptions,setSpecimen:this.props.setSpecimen,editSpecimen:this.props.editSpecimen,updateSpecimen:this.props.updateSpecimen,setContainer:this.props.setContainer,editContainer:this.props.editContainer,updateContainer:this.props.updateContainer,getCoordinateLabel:this.props.getCoordinateLabel});var parentBarcodes=this.props.getParentContainerBarcodes(target.container);var barcodePathDisplay=this.props.getBarcodePathDisplay(parentBarcodes);return _react2.default.createElement("div",{id:"specimen-page"},_react2.default.createElement("div",{className:"specimen-header"},_react2.default.createElement("div",{className:"specimen-title"},_react2.default.createElement("div",{className:"barcode"},"Barcode",_react2.default.createElement("div",{className:"value"},_react2.default.createElement("strong",null,target.container.barcode)),_react2.default.createElement("span",{className:"barcodePath"},"Address: ",barcodePathDisplay," ",_react2.default.createElement("br",null),"Lot Number: ",target.container.lotNumber," ",_react2.default.createElement("br",null),"Expiration Date: ",target.container.expirationDate)),addAliquotForm(),_react2.default.createElement(_containerCheckout2.default,{container:target.container,current,editContainer:this.props.editContainer,setContainer:this.props.setContainer,updateContainer:this.props.updateContainer})),_react2.default.createElement(_lifeCycle2.default,{specimen:target.specimen,centers:options.centers})),_react2.default.createElement("div",{className:"summary"},globals,_react2.default.createElement("div",{className:"processing"},collectionPanel,preparationPanel(),analysisPanel())))}}]);return BiobankSpecimen}(_react.Component);BiobankSpecimen.propTypes={specimenPageDataURL:_propTypes2.default.string.isRequired};exports.default=BiobankSpecimen},function(module,exports,__webpack_require__){"use strict";var _typeof=typeof Symbol==="function"&&typeof Symbol.iterator==="symbol"?function(obj){return typeof obj}:function(obj){return obj&&typeof Symbol==="function"&&obj.constructor===Symbol&&obj!==Symbol.prototype?"symbol":typeof obj};Object.defineProperty(exports,"__esModule",{value:true});var _createClass=function(){function defineProperties(target,props){for(var i=0;i1?60/(nodes-1):0;var lineStyle={width:lineWidth+"%"};line=React.createElement("div",{className:"lifecycle-line",style:lineStyle});return React.createElement("div",{className:"lifecycle"},React.createElement("div",{className:"lifecycle-graphic"},collectionNode,preparationNode?line:null,preparationNode,analysisNode?line:null,analysisNode))}}]);return LifeCycle}(React.Component);LifeCycle.propTypes={};exports.default=LifeCycle},function(module,exports,__webpack_require__){"use strict";var _typeof=typeof Symbol==="function"&&typeof Symbol.iterator==="symbol"?function(obj){return typeof obj}:function(obj){return obj&&typeof Symbol==="function"&&obj.constructor===Symbol&&obj!==Symbol.prototype?"symbol":typeof obj};Object.defineProperty(exports,"__esModule",{value:true});var _createClass=function(){function defineProperties(target,props){for(var i=0;i0&&(decreaseCycle=React.createElement("div",{className:"action",title:"Remove Cycle"},React.createElement("span",{className:"action-button update",onClick:this.decreaseCycle},React.createElement("span",{className:"glyphicon glyphicon-minus"})))),fTCycleField=React.createElement("div",{className:"item"},React.createElement("div",{className:"field"},"Freeze-Thaw Cycle",React.createElement("div",{className:"value"},this.props.data.specimen.fTCycle)),decreaseCycle,React.createElement("div",{className:"action",title:"Add Cycle"},React.createElement("span",{className:"action-button update",onClick:this.increaseCycle},React.createElement("span",{className:"glyphicon glyphicon-plus"}))))}var temperatureField=void 0;temperatureField=this.props.editable.temperature?React.createElement("div",{className:"item"},React.createElement("div",{className:"field"},"Temperature",React.createElement(_temperatureField2.default,{container:this.props.container,close:this.props.close,setContainer:this.props.setContainer,saveContainer:this.props.saveContainer}))):React.createElement("div",{className:"item"},React.createElement("div",{className:"field"},"Temperature",React.createElement("div",{className:"value"},this.props.data.container.temperature+"°C")),React.createElement("div",{className:"action",title:"Update Temperature"},React.createElement("span",{className:"action-button update",onClick:function(){_this2.props.edit("temperature")}},React.createElement("span",{className:"glyphicon glyphicon-chevron-right"}))));var statusField=void 0;if(this.props.editable.status){var stati=this.props.mapFormOptions(this.props.options.containerStati,"status");statusField=React.createElement("div",{className:"item"},React.createElement("div",{className:"field"},"Status",React.createElement(_statusField2.default,{container:this.props.container,stati:stati,close:this.props.close,setContainer:this.props.setContainer,saveContainer:this.props.saveContainer})))}else statusField=React.createElement("div",{className:"item"},React.createElement("div",{className:"field"},"Status",React.createElement("div",{className:"value"},this.props.options.containerStati[this.props.data.container.statusId].status)),React.createElement("div",{className:"action",title:"Update Status"},React.createElement("span",{className:"action-button update",onClick:function(){return _this2.props.edit("status")}},React.createElement("span",{className:"glyphicon glyphicon-chevron-right"}))));var locationField=void 0;locationField=this.props.editable.location?React.createElement("div",{className:"item"},React.createElement("div",{className:"field"},"Location",React.createElement(_locationField2.default,{container:this.props.container,centers:this.props.options.centers,close:this.props.close,setContainer:this.props.setContainer,saveContainer:this.props.saveContainer}))):React.createElement("div",{className:"item"},React.createElement("div",{className:"field"},"Location",React.createElement("div",{className:"value"},this.props.options.centers[this.props.data.container.locationId])),React.createElement("div",{className:"action",title:"Update Status"},React.createElement("span",{className:"action-button update",onClick:function(){return _this2.props.edit("location")}},React.createElement("span",{className:"glyphicon glyphicon-chevron-right"}))));var originField=React.createElement("div",{className:"item"},React.createElement("div",{className:"field"},"Origin",React.createElement("div",{className:"value"},this.props.options.centers[this.props.data.container.originId]))),parentSpecimenField=(React.createElement("div",{className:"item"},React.createElement("div",{className:"field"},"Creation Date",React.createElement("div",{className:"value"},this.props.data.container.dateTimeCreate))),void 0);if((this.props.data.specimen||{}).parentSpecimenId){var barcode=this.props.data.parentSpecimenContainer.barcode,parentSpecimenFieldValue=React.createElement("a",{onClick:function(){return _this2.props.loadSpecimen(barcode)}},barcode);parentSpecimenField=React.createElement("div",{className:"item"},React.createElement("div",{className:"field"},"Parent Specimen",React.createElement("div",{className:"value"},parentSpecimenFieldValue||"None")))}var parentContainerBarcodeValue=void 0;if(this.props.data.container.parentContainerId){var _barcode=this.props.options.containersNonPrimary[this.props.data.container.parentContainerId].barcode;parentContainerBarcodeValue=React.createElement("div",null,React.createElement("a",{onClick:function(){return _this2.props.loadContainer(_barcode)}},_barcode))}var parentContainerField=React.createElement("div",{className:"item"},React.createElement("div",{className:"field"},"Parent Container",React.createElement("div",{className:"value"},parentContainerBarcodeValue||"None"),parentContainerBarcodeValue&&this.props.data.container.coordinate?"Coordinate "+this.props.data.container.coordinate:null),React.createElement("div",{className:"action",title:"Move Container"},React.createElement("span",{className:"action-button update",onClick:function(){_this2.props.edit("containerParentForm")}},React.createElement("span",{className:"glyphicon glyphicon-chevron-right"})),React.createElement(_Modal2.default,{title:"Update Parent Container",closeModal:this.props.close,show:this.props.editable.containerParentForm},React.createElement(_containerParentForm2.default,{data:this.props.data,container:this.props.container,containersNonPrimary:this.props.options.containersNonPrimary,containerDimensions:this.props.options.containerDimensions, -containerCoordinates:this.props.options.containerCoordinates,containerTypes:this.props.options.containerTypes,containerStati:this.props.options.containerStati,mapFormOptions:this.props.mapFormOptions,setContainer:this.props.setContainer,saveContainer:this.props.saveContainer})))),candidateSessionField=void 0;this.props.data.specimen&&(candidateSessionField=React.createElement("div",{className:"item"},React.createElement("div",{className:"field"},"PSCID",React.createElement("div",{className:"value"},React.createElement("a",{href:loris.BaseURL+"/"+this.props.data.specimen.candidateId},this.props.data.candidate.PSCID))),React.createElement("div",{className:"field"},"Visit Label",React.createElement("div",{className:"value"},React.createElement("a",{href:loris.BaseURL+"/instrument_list/?candID="+this.props.data.specimen.candidateId+"&sessionID="+this.props.data.specimen.sessionId},this.props.data.session.Visit_label)))));var fieldList=React.createElement("div",{className:"list"},specimenTypeField,containerTypeField,quantityField,fTCycleField,temperatureField,statusField,locationField,originField,parentSpecimenField,parentContainerField,candidateSessionField);return React.createElement("div",{className:"globals"},fieldList)}}]),Globals}(React.Component);Globals.propTypes={},exports.default=Globals},function(module,exports){"use strict";function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(self,call){if(!self)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!call||"object"!=typeof call&&"function"!=typeof call?self:call}function _inherits(subClass,superClass){if("function"!=typeof superClass&&null!==superClass)throw new TypeError("Super expression must either be null or a function, not "+typeof superClass);subClass.prototype=Object.create(superClass&&superClass.prototype,{constructor:{value:subClass,enumerable:!1,writable:!0,configurable:!0}}),superClass&&(Object.setPrototypeOf?Object.setPrototypeOf(subClass,superClass):subClass.__proto__=superClass)}Object.defineProperty(exports,"__esModule",{value:!0});var _createClass=function(){function defineProperties(target,props){for(var i=0;i
"+this.props.containerTypes[this.props.children[this.props.coordinates[coordinate]].typeId].label+"
"+this.props.containerStati[this.props.children[this.props.coordinates[coordinate]].statusId].status+"
",draggable="true",onDragStart=this.drag,onDragOver=null,onDrop=null,onClick=this.redirectURL),this.props.select&&(coordinate==this.props.selectedCoordinate?nodeClass="node occupied":this.props.coordinates?this.props.coordinates&&(this.props.coordinates[coordinate]?this.props.coordinates[coordinate]:(nodeClass="node available",onClick=function(e){return _this2.props.setContainer("coordinate",e.target.id)})):(nodeClass="node available",onClick=function(e){return _this2.props.setContainer("coordinate",e.target.id)}));var coordinateDisplay=void 0;coordinateDisplay=x+this.props.dimensions.x*y,column.push(React.createElement("div",{id:coordinate,className:nodeClass,"data-html":dataHtml,"data-toggle":dataToggle,"data-placement":dataPlacement,"data-original-title":tooltipTitle,style:nodeStyle,onClick:onClick,draggable:draggable,onDragStart:onDragStart,onDragOver:onDragOver,onDrop:onDrop},coordinateDisplay)),coordinate++}var rowHeight=500/this.props.dimensions.y-500/this.props.dimensions.y*.08,rowStyle=(500/this.props.dimensions.y*.04,{height:rowHeight});row.push(React.createElement("div",{className:"row",style:rowStyle},column))}display=row}return React.createElement("div",{className:"display"},display)}}]),ContainerDisplay}(React.Component);ContainerDisplay.propTypes={},exports.default=ContainerDisplay},function(module,exports,__webpack_require__){"use strict";function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(self,call){if(!self)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!call||"object"!=typeof call&&"function"!=typeof call?self:call}function _inherits(subClass,superClass){if("function"!=typeof superClass&&null!==superClass)throw new TypeError("Super expression must either be null or a function, not "+typeof superClass);subClass.prototype=Object.create(superClass&&superClass.prototype,{constructor:{value:subClass,enumerable:!1,writable:!0,configurable:!0}}),superClass&&(Object.setPrototypeOf?Object.setPrototypeOf(subClass,superClass):subClass.__proto__=superClass)}Object.defineProperty(exports,"__esModule",{value:!0});var _createClass=function(){function defineProperties(target,props){for(var i=0;i1?60/(nodes-1):0,lineStyle={width:lineWidth+"%"};return line=React.createElement("div",{className:"lifecycle-line",style:lineStyle}),React.createElement("div",{className:"lifecycle"},React.createElement("div",{className:"lifecycle-graphic"},collectionNode,preparationNode?line:null,preparationNode,analysisNode?line:null,analysisNode))}}]),LifeCycle}(React.Component);LifeCycle.propTypes={},exports.default=LifeCycle},function(module,exports){"use strict";function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(self,call){if(!self)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!call||"object"!=typeof call&&"function"!=typeof call?self:call}function _inherits(subClass,superClass){if("function"!=typeof superClass&&null!==superClass)throw new TypeError("Super expression must either be null or a function, not "+typeof superClass);subClass.prototype=Object.create(superClass&&superClass.prototype,{constructor:{value:subClass,enumerable:!1,writable:!0,configurable:!0}}),superClass&&(Object.setPrototypeOf?Object.setPrototypeOf(subClass,superClass):subClass.__proto__=superClass)}Object.defineProperty(exports,"__esModule",{value:!0});var _createClass=function(){function defineProperties(target,props){for(var i=0;i=0;i--)_loop(i);return path.push(React.createElement("span",{className:"barcodePath"},"/",React.createElement("a",{onClick:function(){return _this2.props.loadContainer(_this2.props.container.barcode)}},this.props.container.barcode))),React.createElement("div",null,path)}}]),BarcodePath}(React.Component);BarcodePath.propTypes={},exports.default=BarcodePath}]); -//# sourceMappingURL=specimenIndex.js.map \ No newline at end of file diff --git "a/modules/biobank_nottracked/jsx/\\" "b/modules/biobank_nottracked/jsx/\\" deleted file mode 100644 index 8325f34fb6d..00000000000 --- "a/modules/biobank_nottracked/jsx/\\" +++ /dev/null @@ -1,211 +0,0 @@ - -/** - * Biobank Barcode Form - * - * Acts a subform for BiobankSpecimenForm - * - * @author Henri Rabalais - * @version 1.0.0 - * - **/ - -class BiobankBarcodeForm extends React.Component { - constructor(props) { - super(props); - - this.state = { - formData: {}, - currentSpecimenType: null, - currentContainerType: null, - formErrors: {}, - }; - - this.setFormData = this.setFormData.bind(this); - this.getSpecimenTypeFields = this.getSpecimenTypeFields.bind(this); - } - - render() { - - var specimenTypeFields = this.getSpecimenTypeFields(); - - return ( - -
-
-
- -
-
- - {specimenTypeFields} - - - - -
-
-
-
- ); - } - - /** - * Set the form data based on state values of child elements/componenets - * - * @param {string} formElement - name of the selected element - * @param {string} value - selected value for corresponding form element - */ - setFormData(formElement, value) { - - if (formElement === "specimenType" && value !== "") { - this.setState({ - currentSpecimenType: value - }); - } - - if (formElement === "containerType" && value !== "") { - this.setState({ - currentContainerType: value - }); - } - - var formData = this.state.formData; - formData[formElement] = value; - - this.setState({ - formData: formData - }); - } - - // This generates all the form fields for a given specimen type - getSpecimenTypeFields() { - if (this.state.currentSpecimenType) { - var specimenTypeFieldsObject = this.props.specimenTypeAttributes[this.state.currentSpecimenType]; - if (specimenTypeFieldsObject) { - var specimenTypeFields = Object.keys(specimenTypeFieldsObject).map((attribute) => { - let datatype = this.props.attributeDatatypes[specimenTypeFieldsObject[attribute]['datatypeId']].datatype; - if (datatype === "text" || datatype === "number") { - if (specimenTypeFieldsObject[attribute]['refTableId'] == null) { - return ( - - ); - } - - // OPTIONS FOR SELECT ELEMENT WILL MOST LIKELY BE PASSED VIA AJAX CALL - // BUT IT CAN ALSO BE PRELOADED -- - // ASK RIDA HOW THIS SHOULD BE DONE - if (specimenTypeFieldsObject[attribute]['refTableId'] !== null) { - return ( - - ); - } - } - - if (datatype === "datetime") { - return ( - - ); - } - }) - - return specimenTypeFields; - } - } - } -} - -BiobankBarcodeForm.defaultProps = { - Data: {}, - id: 'barcode' -} -BiobankBarcodeForm.propTypes = { - id: React.PropTypes.string, - specimenTypes: React.PropTypes.object.isRequired, - containerTypesPrimary: React.PropTypes.object.isRequired, - specimenTypeAttributes: React.PropTypes.object.isRequired, - attributeDatatypes: React.PropTypes.object.isRequired, - capacities: React.PropTypes.object.isRequired, - units: React.PropTypes.object.isRequired, -} - -export default BiobankBarcodeForm; diff --git a/modules/biobank_nottracked/jsx/batchPreparationForm.js b/modules/biobank_nottracked/jsx/batchPreparationForm.js deleted file mode 100644 index 52779914275..00000000000 --- a/modules/biobank_nottracked/jsx/batchPreparationForm.js +++ /dev/null @@ -1,203 +0,0 @@ -import SpecimenProcessForm from './processForm'; - -/** - * Biobank BatchPreparation Specimen Form - * - * TODO: DESCRIPTION - * - * @author Henri Rabalais - * @version 1.0.0 - * - **/ -class BatchPreparationForm extends React.Component { - constructor() { - super(); - - this.setPreparationList = this.setPreparationList.bind(this); - this.setPool = this.setPool.bind(this); - }; - - setPreparationList(containerId) { - this.props.setCurrent('containerId', 1) - .then(()=>this.props.setCurrent('containerId', null)); - - const list = this.props.current.list; - const container = this.props.data.containers.primary[containerId]; - const specimen = Object.values(this.props.data.specimens).find( - (specimen) => specimen.containerId == containerId - ); - - let count = this.props.current.count; - if (count == null) { - count = 0; - } else { - count++; - } - - // Use setListItem here instead. - list[count] = {specimen, container}; - - this.props.setCurrent('list', list); - this.props.setCurrent('count', count); - this.props.setCurrent('typeId', specimen.typeId); - this.props.setCurrent('centerId', container.centerId); - } - - setPool(name, poolId) { - const specimens = Object.values(this.props.data.specimens) - .filter((specimen) => specimen.poolId == poolId); - - this.props.setCurrent(name, poolId) - .then(() => Promise.all(specimens - .map((specimen) => Object.values(this.props.current.list) - .find((item) => item.specimen.id === specimen.id) - || this.setPreparationList(specimen.containerId)) - .map((p) => p instanceof Promise ? p : Promise.resolve(p)))) - .then(() => this.props.setCurrent(name, null)); - } - - render() { - const {current, data, errors, options, setCurrent} = this.props; - const list = current.list; - - // Create options for barcodes based on match typeId - const containersPrimary = Object.values(data.containers.primary) - .reduce((result, container) => { - const specimen = Object.values(data.specimens).find( - (specimen) => specimen.containerId == container.id - ); - const availableId = Object.keys(options.container.stati).find( - (key) => options.container.stati[key].label == 'Available' - ); - const protocolExists = Object.values(options.specimen.protocols).find( - (protocol) => protocol.typeId == specimen.typeId - ); - - if (specimen.quantity != 0 && container.statusId == availableId - && protocolExists) { - if (current.typeId) { - if ( - specimen.typeId == current.typeId - && container.centerId == current.centerId - ) { - result[container.id] = container; - } - } else { - result[container.id] = container; - } - } - return result; - }, {} - ); - - const validContainers = Object.keys(containersPrimary).reduce((result, id) => { - const inList = Object.values(list).find((i) => i.container.id == id); - if (!inList) { - result[id] = containersPrimary[id]; - } - return result; - }, {}); - - const barcodesPrimary = this.props.mapFormOptions(validContainers, 'barcode'); - - const specimenInput = ( - { - containerId && this.setPreparationList(containerId); - }} - options={barcodesPrimary} - value={current.containerId} - /> - ); - - const preparationForm = ( - - ); - - const pools = this.props.mapFormOptions(data.pools, 'label'); - const glyphStyle = { - color: '#DDDDDD', - marginLeft: 10, - cursor: 'pointer', - }; - - const barcodeList = Object.entries(current.list) - .map(([key, item]) => { - return ( -
-
{item.container.barcode}
-
this.props.removeListItem(key)} - /> -
- ); - }); - - return ( - -
-
- - - -
-
-

Barcode Input

-
- {specimenInput} - -
-
-

Barcode List

-
-
- {barcodeList} -
-
-
-
- {preparationForm} -
-
- - ); - } -} - -BatchPreparationForm.propTypes = { -}; - -export default BatchPreparationForm; diff --git a/modules/biobank_nottracked/jsx/biobankIndex.js b/modules/biobank_nottracked/jsx/biobankIndex.js deleted file mode 100644 index 483cd0803a7..00000000000 --- a/modules/biobank_nottracked/jsx/biobankIndex.js +++ /dev/null @@ -1,1044 +0,0 @@ -import {BrowserRouter, Route, Switch} from 'react-router-dom'; -import {Link} from 'react-router-dom'; -import swal from 'sweetalert2'; - -import Loader from 'Loader'; - -import BiobankFilter from './filter'; -import BiobankSpecimen from './specimen'; -import BiobankContainer from './container'; - -const defaultState = () => ({ - current: { - files: {}, - list: {}, - collapsed: {}, - coordinate: null, - sequential: false, - candidateId: null, - centerId: null, - originId: null, - sessionId: null, - typeId: null, - count: null, - multiplier: 1, - specimen: {}, - container: {}, - pool: {}, - poolId: null, - preparation: {}, - }, - errors: { - container: {}, - specimen: {}, - pool: {}, - list: {}, - preparation: {}, - }, - editable: { - specimenForm: false, - containerForm: false, - aliquotForm: false, - containerParentForm: false, - loadContainer: false, - containerCheckout: false, - temperature: false, - quantity: false, - status: false, - center: false, - collection: false, - preparation: false, - analysis: false, - batchPreparationForm: false, - poolSpecimenForm: false, - searchSpecimen: false, - searchContainer: false, - }, -}); - -class BiobankIndex extends React.Component { - constructor() { - super(); - - this.state = { - isLoaded: false, - options: { - specimen: {}, - container: {}, - }, - data: { - specimens: {}, - containers: {}, - pools: {}, - }, - ...defaultState(), - }; - - this.fetch = this.fetch.bind(this); - this.loadAllData = this.loadAllData.bind(this); - this.loadData = this.loadData.bind(this); - this.groupContainers = this.groupContainers.bind(this); - this.loadOptions = this.loadOptions.bind(this); - this.routeBarcode = this.routeBarcode.bind(this); - this.clone = this.clone.bind(this); - this.mapFormOptions = this.mapFormOptions.bind(this); - this.toggleCollapse = this.toggleCollapse.bind(this); - this.edit = this.edit.bind(this); - this.editSpecimen = this.editSpecimen.bind(this); - this.editContainer = this.editContainer.bind(this); - this.clearAll = this.clearAll.bind(this); - this.setContainerData = this.setContainerData.bind(this); - this.setSpecimenData = this.setSpecimenData.bind(this); - this.setCurrent = this.setCurrent.bind(this); - this.setErrors = this.setErrors.bind(this); - this.setListItem = this.setListItem.bind(this); - this.setPoolList = this.setPoolList.bind(this); - this.setCheckoutList = this.setCheckoutList.bind(this); - this.addListItem = this.addListItem.bind(this); - this.copyListItem = this.copyListItem.bind(this); - this.removeListItem = this.removeListItem.bind(this); - this.getCoordinateLabel = this.getCoordinateLabel.bind(this); - this.getParentContainerBarcodes = this.getParentContainerBarcodes.bind(this); - this.getBarcodePathDisplay = this.getBarcodePathDisplay.bind(this); - this.createSpecimens = this.createSpecimens.bind(this); - this.setSpecimen = this.setSpecimen.bind(this); - this.setContainer = this.setContainer.bind(this); - this.setPool = this.setPool.bind(this); - this.updateSpecimen = this.updateSpecimen.bind(this); - this.updateContainer = this.updateContainer.bind(this); - this.createPool = this.createPool.bind(this); - this.saveBatchPreparation = this.saveBatchPreparation.bind(this); - this.createContainers = this.createContainers.bind(this); - this.validateSpecimen = this.validateSpecimen.bind(this); - this.validateProcess = this.validateProcess.bind(this); - this.validateContainer = this.validateContainer.bind(this); - this.post = this.post.bind(this); - } - - componentDidMount() { - this.loadAllData(); - } - - loadAllData() { - this.loadOptions() - .then(() => this.loadData(this.props.containerAPI, 'containers')) - .then(() => this.loadData(this.props.poolAPI, 'pools')) - .then(() => this.loadData(this.props.specimenAPI, 'specimens')) - .then(() => this.setState({isLoaded: true})); - } - - loadData(url, state) { - return new Promise((resolve) => { - this.fetch(url, 'GET') - .then((dataList) => { - const data = this.state.data; - data[state] = state === 'containers' ? this.groupContainers(dataList) : dataList; - this.setState({data}, resolve()); - }); - }); - } - - // This function groups containers into three categories: all, primary and nonPrimary - groupContainers(dataList) { - const data = Object.keys(dataList).reduce((result, id) => { - if (this.state.options.container.types[dataList[id].typeId].primary === '1') { - result.primary[id] = dataList[id]; - } else { - result.nonPrimary[id] = dataList[id]; - } - return result; - }, {primary: {}, nonPrimary: {}}); - data.all = dataList; - return data; - } - - loadOptions() { - return new Promise((resolve) => { - this.fetch(this.props.optionsAPI, 'GET') - .then((options) => this.setState({options}, resolve())); - }); - } - - fetch(url, method) { - return fetch(url, {credentials: 'same-origin', method: method}) - .then((resp) => resp.json()) - .catch((error, errorCode, errorMsg) => console.error(error, errorCode, errorMsg)); - } - - clone(object) { - return JSON.parse(JSON.stringify(object)); - } - - routeBarcode(barcode) { - const container = Object.values(this.state.data.containers.all) - .find((container) => container.barcode == barcode); - - const specimen = Object.values(this.state.data.specimens) - .find((specimen) => specimen.containerId == container.id); - - return {container, specimen}; - } - - mapFormOptions(object, attribute) { - return Object.keys(object).reduce((result, id) => { - result[id] = object[id][attribute]; - return result; - }, {}); - } - - edit(stateKey) { - return new Promise((resolve) => { - this.clearEditable() - .then(() => { - const editable = this.clone(this.state.editable); - editable[stateKey] = true; - this.setState({editable}, resolve()); - }); - }); - } - - clearEditable() { - const state = this.clone(this.state); - state.editable = defaultState().editable; - return new Promise((res) => this.setState(state, res())); - } - - clearAll() { - const state = Object.assign(this.clone(this.state), defaultState()); - return new Promise((res) => this.setState(state, res())); - } - - toggleCollapse(key) { - const collapsed = this.state.current.collapsed; - collapsed[key] = !collapsed[key]; - this.setCurrent('collapsed', collapsed); - } - - setListItem(name, value, key) { - const list = this.state.current.list; - list[key][name] = value; - this.setCurrent('list', list); - } - - setCheckoutList(container) { - // Clear current container field. - this.setCurrent('containerId', 1) - .then(()=>this.setCurrent('containerId', null)); - const list = this.state.current.list; - list[container.coordinate] = container; - this.setCurrent('list', list); - } - - // TODO: revisit if this should be here, or in specimenPoolForm.js - // I am now thinking that it might be best to put it in specimenPoolForm.js - setPoolList(containerId) { - this.setCurrent('containerId', containerId) - .then(() => this.setCurrent('containerId', null)); - - const list = this.clone(this.state.current.list); - const specimenIds = this.state.current.pool.specimenIds || []; - const container = this.clone(this.state.data.containers.primary[containerId]); - const specimen = Object.values(this.state.data.specimens) - .find((specimen) => specimen.containerId == containerId); - - let count = this.state.current.count; - if (count == null) { - count = 0; - } else { - count++; - } - - list[count] = {container, specimen}; - specimenIds.push(specimen.id); - - this.setCurrent('count', count); - this.setCurrent('list', list); - this.setCurrent('candidateId', specimen.candidateId); - this.setCurrent('sessionId', specimen.sessionId); - this.setCurrent('typeId', specimen.typeId); - this.setCurrent('centerId', container.centerId); - this.setPool('centerId', container.centerId); - this.setPool('specimenIds', specimenIds); - } - - editSpecimen(specimen) { - return new Promise((resolve) => { - specimen = this.clone(specimen); - this.setCurrent('specimen', specimen) - .then(() => resolve()); - }); - } - - editContainer(container) { - return new Promise((resolve) => { - container = this.clone(container); - this.setCurrent('container', container) - .then(() => resolve()); - }); - } - - setCurrent(name, value) { - return new Promise((resolve) => { - const current = this.state.current; - current[name] = value; - this.setState({current}, resolve()); - }); - } - - setErrors(name, value) { - const errors = this.state.errors; - errors[name] = value; - this.setState({errors}); - } - - addListItem(item) { - const current = this.state.current; - current.count++; - current.collapsed[current.count] = true; - switch (item) { - case 'specimen': - current.list[current.count] = {collection: {}, container: {}}; - break; - case 'container': - current.list[current.count] = {}; - break; - } - - this.setState({current}); - } - - copyListItem(key) { - const current = this.clone(this.state.current); - for (let i=1; i<=current.multiplier; i++) { - current.count++; - current.list[current.count] = this.clone(current.list[key]); - (current.list[current.count].container||{}).barcode && - delete current.list[current.count].container.barcode; - current.list[current.count].barcode && - delete current.list[current.count].barcode; - current.collapsed[current.count] = true; - } - - this.setState({current}); - } - - removeListItem(key) { - const current = this.state.current; - delete current.list[key]; - if (Object.keys(current.list).length === 0) { - // TODO: this might need to be replaced by a clearCurrent() function later. - this.setState({current: defaultState().current}); - } else { - this.setState({current}); - } - } - - getCoordinateLabel(container) { - const parentContainer = this.state.data.containers.all[container.parentContainerId]; - const dimensions = this.state.options.container.dimensions[parentContainer.dimensionId]; - let coordinate; - let j = 1; - outerloop: - for (let y=1; y<=dimensions.y; y++) { - innerloop: - for (let x=1; x<=dimensions.x; x++) { - if (j == container.coordinate) { - if (dimensions.xNum == 1 && dimensions.yNum == 1) { - coordinate = x + (dimensions.x * (y-1)); - } else { - const xVal = dimensions.xNum == 1 ? x : String.fromCharCode(64+x); - const yVal = dimensions.yNum == 1 ? y : String.fromCharCode(64+y); - coordinate = yVal+''+xVal; - } - break outerloop; - } - j++; - } - } - return coordinate; - } - - getParentContainerBarcodes(container, barcodes=[]) { - barcodes.push(container.barcode); - - const parent = Object.values(this.state.data.containers.nonPrimary) - .find((c) => container.parentContainerId == c.id); - - parent && this.getParentContainerBarcodes(parent, barcodes); - - return barcodes.slice(0).reverse(); - } - - getBarcodePathDisplay(parentBarcodes) { - return Object.keys(parentBarcodes).map((i) => { - const container = Object.values(this.state.data.containers.all) - .find((container) => container.barcode == parentBarcodes[parseInt(i)+1]); - let coordinateDisplay; - if (container) { - const coordinate = this.getCoordinateLabel(container); - coordinateDisplay = {'-'+(coordinate || 'UAS')}; - } - return ( - - {i != 0 && ': '} - {parentBarcodes[i]} - {coordinateDisplay} - - ); - }); - } - - setSpecimen(name, value) { - return new Promise((resolve) => { - const specimen = this.state.current.specimen; - specimen[name] = value; - this.setCurrent('specimen', specimen) - .then(() => resolve()); - }); - } - - setContainer(name, value) { - return new Promise((resolve) => { - const container = this.state.current.container; - value ? container[name] = value : delete container[name]; - this.setCurrent('container', container) - .then(() => resolve()); - }); - } - - setPool(name, value) { - return new Promise((resolve) => { - const pool = this.state.current.pool; - pool[name] = value; - this.setCurrent('pool', pool) - .then(() => resolve()); - }); - } - - setContainerData(containers) { - return new Promise((resolve) => { - const data = this.state.data; - Object.values(containers).forEach((container) => { - data.containers.all[container.id] = container; - data.containers.nonPrimary[container.id] = container; - }); - - this.setState({data}, resolve()); - }); - } - - setSpecimenData(specimenList) { - return new Promise((resolve) => { - const data = this.state.data; - specimenList - .forEach((specimen) => data.specimens[specimen.id] = specimen); - this.setState({data}, resolve()); - }); - } - - updateSpecimen(specimen, closeOnSuccess = true) { - const onSuccess = () => { - closeOnSuccess && this.clearAll() - .then(() => swal('Specimen Save Successful', '', 'success')); - }; - - this.validateSpecimen(specimen) - .then(() => this.post(specimen, this.props.specimenAPI, 'PUT', onSuccess)) - .then((updatedSpecimens) => this.setSpecimenData(updatedSpecimens)); - } - - updateContainer(container, closeOnSuccess = true) { - const onSuccess = () => { - closeOnSuccess && this.clearAll() - .then(() => swal('Container Save Successful', '', 'success')); - }; - - // FIXME: These lines of code are really messy and I would like to find a - // better way to do this. - // const containers = this.clone(this.state.data.containers.all); - // const oldContainer = containers[container.id]; - // const oldParent = containers[oldContainer.parentContainerId]; - // const newParent = containers[container.parentContainerId]; - - // if (oldContainer.parentContainerId || container.parentContainerId) { - // if (oldContainer.parentContainerId == container.parentContainerId && oldContainer.parentContainerId != null) { - // newParent.childContainerIds.splice(newParent.childContainerIds.indexOf(container.id), 1); - // newParent.childContainerIds = [...newParent.childContainerIds, container.id]; - // } else if (oldContainer.parentContainerId == null && container.parentContainerId) { - // newParent.childContainerIds = [...newParent.childContainerIds, container.id]; - // } else if (oldContainer.parentContainerId && container.parentContainerId == null) { - // oldParent.childContainerIds.splice(oldParent.childContainerIds.indexOf(container.id), 1); - // } else if (oldContainer.parentContainerId != container.parentContainerId) { - // oldParent.childContainerIds.splice(oldParent.childContainerIds.indexOf(container.id), 1); - // newParent.childContainerIds = [...newParent.childContainerIds, container.id]; - // } - // } - - return new Promise((resolve) => { - this.validateContainer(container) - .then(() => this.post(container, this.props.containerAPI, 'PUT', onSuccess)) - .then((containers) => this.setContainerData(containers)) - .then(() => this.loadData(this.props.containerAPI, 'containers')) - .then(() => resolve()); - }); - } - - createSpecimens() { - return new Promise((resolve) => { - const listValidation = []; - const list = this.clone(this.state.current.list); - const projectIds = this.state.current.projectIds; - const centerId = this.state.current.centerId; - // TODO: consider making a getAvailableId() function; - const availableId = Object.keys(this.state.options.container.stati).find( - (key) => this.state.options.container.stati[key].label === 'Available' - ); - - Object.keys(list).forEach((key) => { - // set specimen values - const specimen = list[key]; - specimen.candidateId = this.state.current.candidateId; - specimen.sessionId = this.state.current.sessionId; - specimen.quantity = specimen.collection.quantity; - specimen.unitId = specimen.collection.unitId; - specimen.collection.centerId = centerId; - if ((this.state.options.specimen.types[specimen.typeId]||{}).freezeThaw == 1) { - specimen.fTCycle = 0; - } - specimen.parentSpecimenIds = this.state.current.parentSpecimenIds || null; - - // set container values - const container = specimen.container; - container.statusId = availableId; - container.temperature = 20; - container.projectIds = projectIds; - container.centerId = centerId; - container.originId = centerId; - - specimen.container = container; - list[key] = specimen; - - listValidation.push(this.validateContainer(container, key)); - listValidation.push(this.validateSpecimen(specimen, key)); - }); - - const onSuccess = () => swal('Save Successful', '', 'success'); - Promise.all(listValidation) - .then(() => this.post(list, this.props.specimenAPI, 'POST', onSuccess)) - .then(() => this.clearAll()) - .then(() => this.loadAllData()) - .then(() => resolve()) - .catch((e) => console.error(e)); - }); - } - - createContainers() { - return new Promise((resolve, reject) => { - const listValidation = []; - const list = this.state.current.list; - const availableId = Object.keys(this.state.options.container.stati).find( - (key) => this.state.options.container.stati[key].label === 'Available' - ); - - Object.entries(list).forEach(([key, container]) => { - container.statusId = availableId; - container.temperature = 20; - container.projectIds = this.state.current.projectIds; - container.originId = this.state.current.centerId; - container.centerId = this.state.current.centerId; - - listValidation.push(this.validateContainer(container, key)); - }); - - const onSuccess = () => swal('Container Creation Successful', '', 'success'); - Promise.all(listValidation) - .then(() => this.post(list, this.props.containerAPI, 'POST', onSuccess)) - .then((containers) => { - console.log(containers); - this.setContainerData(containers); - }) - .then(() => this.clearAll()) - .then(() => resolve()) - .catch(() => reject()); - }); - } - - createPool() { - const dispensedId = Object.keys(this.state.options.container.stati) - .find((key) => this.state.options.container.stati[key].label === 'Dispensed'); - const update = Object.values(this.state.current.list) - .reduce((result, item) => { - item.container.statusId = dispensedId; - item.specimen.quantity = '0'; - return [...result, - () => this.updateContainer(item.container, false), - () => this.updateSpecimen(item.specimen, false), - ]; - }, []); - - const pool = this.clone(this.state.current.pool); - const onSuccess = () => swal('Pooling Successful!', '', 'success'); - return new Promise((resolve, reject) => { - this.validatePool(pool) - .then(() => this.post(pool, this.props.poolAPI, 'POST', onSuccess)) - .then(() => Promise.all(update.map((update) => update()))) - .then(() => this.clearAll()) - .then(() => this.loadAllData()) - .then(() => resolve()) - .catch((e) => reject()); - }); - } - - saveBatchPreparation() { - return new Promise((resolve) => { - const list = this.clone(this.state.current.list); - const preparation = this.clone(this.state.current.preparation); - preparation.centerId = this.state.current.centerId; - const saveList = Object.values(list) - .map((item) => { - const specimen = this.clone(item.specimen); - specimen.preparation = preparation; - return (() => this.post(specimen, this.props.specimenAPI, 'PUT').then((spec) => this.setSpecimenData(spec))); - }); - - const attributes = this.state.options.specimen.protocolAttributes[preparation.protocolId]; - const validateParams = [ - preparation, - attributes, - ['protocolId', 'centerId', 'date', 'time'], - ]; - - this.validateProcess(...validateParams) - .then(() => this.validateBatchPreparation(list)) - .then(() => Promise.all(saveList.map((item) => item()))) - .then(() => this.clearAll()) - .then(() => swal('Batch Preparation Successful!', '', 'success')) - .then(() => resolve()) - .catch((e) => this.setErrors('preparation', e)); - }); - } - - post(data, url, method, onSuccess) { - return new Promise((resolve, reject) => { - return fetch(url, { - credentials: 'same-origin', - method: method, - body: JSON.stringify(this.clone(data)), - }) - .then((response) => { - if (response.ok) { - // this.loadAllData(); - onSuccess instanceof Function && onSuccess(); - resolve(response.json()); - } else { - response.json() - .then((data) => swal(data.error, '', 'error')) - .then(() => reject()); - } - }) - .catch((error) => console.error(error)); - }); - } - - validateSpecimen(specimen, key) { - return new Promise((resolve, reject) => { - const errors = this.clone(this.state.errors); - errors.specimen = {}; - - const required = ['typeId', 'quantity', 'unitId', 'candidateId', 'sessionId', 'collection']; - const float = ['quantity']; - - required.map((field) => { - if (specimen[field] == null) { - errors.specimen[field] = 'This field is required! '; - } - }); - - float.map((field) => { - if (isNaN(specimen[field])) { - errors.specimen[field] = 'This field must be a number! '; - } - }); - - if (specimen.quantity < 0) { - errors.specimen.quantity = 'This field must be greater than 0'; - } - - const validateProcess = [ - this.validateProcess( - specimen.collection, - this.state.options.specimen.protocolAttributes[specimen.collection.protocolId], - ['protocolId', 'examinerId', 'quantity', 'unitId', 'centerId', 'date', 'time'], - ['quantity'] - ), - ]; - - if (specimen.preparation) { - validateProcess.push( - this.validateProcess( - specimen.preparation, - this.state.options.specimen.protocolAttributes[specimen.preparation.protocolId], - ['protocolId', 'examinerId', 'centerId', 'date', 'time'] - ) - ); - } - - if (specimen.analysis) { - validateProcess.push( - this.validateProcess( - specimen.analysis, - this.state.options.specimen.protocolAttributes[specimen.analysis.protocolId], - ['protocolId', 'examinerId', 'centerId', 'date', 'time'] - ) - ); - } - - Promise.all(validateProcess) - .catch((e) => errors.specimen.process = e) - .then(() => { - // TODO: try to use setErrors function here - if (key) { - errors.list[key] = errors.list[key] || {}; - errors.list[key].specimen = errors.specimen; - } - - if (this.isEmpty(errors.specimen)) { - this.setState({errors}, resolve()); - } else { - this.setState({errors}, reject(errors)); - } - }); - }); - } - - // TODO: make use of this function elsewhere in the code - isEmpty(obj) { - for (let key in obj) { - if (obj.hasOwnProperty(key)) { - return false; - } - } - return true; - } - - validateProcess(process, attributes, required, number) { - return new Promise((resolve, reject) => { - let errors = {}; - let regex; - - // validate required fields - required && required.map((field) => { - if (process[field] == null) { - errors[field] = 'This field is required! '; - } - }); - - // validate floats - number && number.map((field) => { - if (isNaN(process[field])) { - errors[field] = 'This field must be a number! '; - } - }); - - // validate date - regex = /^[12]\d{3}\-(0[1-9]|1[012])\-(0[1-9]|[12][0-9]|3[01])$/; - if (regex.test(process.date) === false ) { - errors.date = 'This field must be a valid date! '; - } - - // validate time - regex = /^([01]\d|2[0-3]):([0-5]\d)$/; - if (regex.test(process.time) === false) { - errors.time = 'This field must be a valid time! '; - } - - // validate custom attributes - if (process.data) { - errors.data = {}; - const datatypes = this.state.options.specimen.attributeDatatypes; - - Object.keys(process.data).forEach((attributeId) => { - // validate required - if (this.state.options.specimen.protocolAttributes[process.protocolId][attributeId].required == 1 - && !process.data[attributeId]) { - errors.data[attributeId] = 'This field is required!'; - } - - // validate number - if (datatypes[attributes[attributeId].datatypeId].datatype === 'number') { - if (isNaN(process.data[attributeId])) { - errors.data[attributeId] = 'This field must be a number!'; - } - } - - // validate date - if (datatypes[attributes[attributeId].datatypeId].datatype === 'date') { - regex = /^[12]\d{3}\-(0[1-9]|1[012])\-(0[1-9]|[12][0-9]|3[01])$/; - if (regex.test(process.data[attributeId]) === false ) { - errors.data[attributeId] = 'This field must be a valid date! '; - } - } - - // validate time - if (datatypes[attributes[attributeId].datatypeId].datatype === 'time') { - regex = /^([01]\d|2[0-3]):([0-5]\d)$/; - if (regex.test(process.data[attributeId]) === false) { - errors.data[attributeId] = 'This field must be a valid time! '; - } - } - - // TODO: Eventually introduce file validation. - }); - - if (Object.keys(errors.data).length == 0) { - delete errors.data; - } - } - - // return errors if they exist - if (Object.keys(errors).length != 0) { - reject(errors); - } else { - resolve(); - } - }); - } - - validateContainer(container, key) { - return new Promise((resolve, reject) => { - const errors = this.state.errors; - errors.container = {}; - - const required = [ - 'barcode', - 'typeId', - 'temperature', - 'statusId', - 'projectIds', - 'centerId', - ]; - - const float = [ - 'temperature', - ]; - - required.map((field) => { - if (!container[field]) { - errors.container[field] = 'This field is required! '; - } - }); - - float.map((field) => { - if (isNaN(container[field])) { - errors.container[field] = 'This field must be a number! '; - } - }); - - Object.values(this.state.data.containers.all).map((c) => { - if (container.barcode === c.barcode && container.id !== c.id) { - errors.container.barcode = 'Barcode must be unique.'; - } - }); - - // TODO: Regex barcode check will eventually go here. - // The regex is not currently in the schema and should be implemented here - // when it is. - - // TODO: try to use setErrors function here - if (key) { - errors.list[key] = errors.list[key] || {}; - errors.list[key].container = errors.container; - } - - if (Object.keys(errors.container).length == 0) { - this.setState({errors}, resolve()); - } else { - this.setState({errors}, reject()); - } - }); - } - - validatePool(pool) { - return new Promise((resolve, reject) => { - let regex; - const errors = this.state.errors; - errors.pool = {}; - - const required = ['label', 'quantity', 'unitId', 'date', 'time']; - - required.forEach((field) => { - if (!pool[field]) { - errors.pool[field] = 'This field is required! '; - } - }); - - if (isNaN(pool.quantity)) { - errors.pool.quantity = 'This field must be a number! '; - } - - // validate date - regex = /^[12]\d{3}\-(0[1-9]|1[012])\-(0[1-9]|[12][0-9]|3[01])$/; - if (regex.test(pool.date) === false ) { - errors.pool.date = 'This field must be a valid date! '; - } - - // validate time - regex = /^([01]\d|2[0-3]):([0-5]\d)$/; - if (regex.test(pool.time) === false) { - errors.pool.time = 'This field must be a valid time! '; - } - - if (pool.specimenIds == null || pool.specimenIds.length < 2) { - errors.pool.total = 'Pooling requires at least 2 specimens'; - }; - - if (Object.keys(errors.pool).length == 0) { - this.setState({errors}, resolve()); - } else { - this.setState({errors}, reject()); - } - }); - } - - validateBatchPreparation(list) { - return new Promise((resolve, reject) => { - const barcodes = Object.values(list) - .filter((item) => !!item.specimen.preparation) - .map((item) => item.container.barcode); - - if (barcodes.length > 0) { - return swal({ - title: 'Warning!', - html: `Preparation for specimen(s) ${barcodes.join(', ')} ` + - `already exists. By completing this form, the previous preparation ` + - `will be overwritten.`, - type: 'warning', - showCancelButton: true, - confirmButtonText: 'Proceed'}) - .then((result) => result.value ? resolve() : reject()); - } else { - return resolve(); - } - }); - } - - render() { - if (!this.state.isLoaded) { - return ( -
- ); - } - - const barcode = (props) => { - // TODO: Refactor 'target'. The idea is good, but it should be more clear - // what is happening throughout the code. - const target = this.routeBarcode(props.match.params.barcode); - if (target.specimen) { - return ( - - ); - } else { - return ( - - ); - } - }; - - const filter = (props) => ( - - ); - - return ( - - - - - - - ); - } -} - -window.addEventListener('load', () => { - const biobank = `${loris.BaseURL}/biobank/`; - ReactDOM.render( - , - document.getElementById('lorisworkspace')); -}); diff --git a/modules/biobank_nottracked/jsx/container.js b/modules/biobank_nottracked/jsx/container.js deleted file mode 100644 index bcbb4b27367..00000000000 --- a/modules/biobank_nottracked/jsx/container.js +++ /dev/null @@ -1,209 +0,0 @@ -import React, {Component} from 'react'; -import PropTypes from 'prop-types'; -import {Link} from 'react-router-dom'; - -import Globals from './globals'; -import ContainerDisplay from './containerDisplay'; -import ContainerCheckout from './containerCheckout'; - -/** - * Biobank Container - * - * Fetches data corresponding to a given Container from Loris backend and - * displays a page allowing viewing of meta information of the container - * - * @author Henri Rabalais - * @version 1.0.0 - * - * */ -class BiobankContainer extends Component { - constructor() { - super(); - this.drag = this.drag.bind(this); - } - - drag(e) { - const container = JSON.stringify(this.props.data.containers.all[e.target.id]); - e.dataTransfer.setData('text/plain', container); - } - - render() { - const {current, data, editable, errors, options, target} = this.props; - - const checkoutButton = () => { - if (!(loris.userHasPermission('biobank_container_update') && - data.containers.nonPrimary[target.container.id].childContainerIds.length !== 0)) { - return; - } - - return ( -
-
{ - this.props.edit('containerCheckout'); - }} - > - -
-
- ); - }; - - const parentBarcodes = this.props.getParentContainerBarcodes(target.container); - const barcodes = this.props.mapFormOptions(data.containers.all, 'barcode'); - // delete values that are parents of the container - Object.keys(parentBarcodes) - .forEach((key) => Object.keys(barcodes) - .forEach((i) => (parentBarcodes[key] == barcodes[i]) && delete barcodes[i]) - ); - - const barcodePathDisplay = this.props.getBarcodePathDisplay(parentBarcodes); - const coordinates = data.containers.nonPrimary[target.container.id].childContainerIds - .reduce((result, id) => { - const container = data.containers.all[id]; - if (container.coordinate) { - result[container.coordinate] = id; - } - return result; - }, {}); - - const containerDisplay = ( -
- {checkoutButton()} - -
- {barcodePathDisplay} -
-
- ); - - const containerList = () => { - if (Object.keys(target.container.childContainerIds).length === 0) { - return
This Container is Empty!
; - } - const childIds = target.container.childContainerIds; - let listAssigned = []; - let coordinateList = []; - let listUnassigned = []; - Object.values(childIds).forEach((childId) => { - if (!loris.userHasPermission('biobank_specimen_view')) { - return; - } - - const child = data.containers.all[childId]; - if (child.coordinate) { - listAssigned.push( -
{child.barcode}
- ); - const coordinate = this.props.getCoordinateLabel(child); - coordinateList.push(
at {coordinate}
); - } else { - listUnassigned.push( -
- - {child.barcode} - -
-
- ); - } - }); - - return ( -
-
- {listAssigned.length !== 0 ? 'Assigned Containers' : null} -
-
-
{listAssigned}
-
{coordinateList}
-
- {listAssigned.length !==0 ?
: null} -
- {listUnassigned.length !== 0 ? 'Unassigned Containers' : null} -
- {listUnassigned} -
- ); - }; - - return ( -
-
-
-
- Barcode -
- {target.container.barcode} -
- Address: {barcodePathDisplay}
- Lot Number: {target.container.lotNumber}
- Expiration Date: {target.container.expirationDate} -
- -
-
-
- - {containerDisplay} -
- {containerList()} -
-
-
- ); - } -} - -BiobankContainer.propTypes = { - containerPageDataURL: PropTypes.string.isRequired, -}; - -export default BiobankContainer; diff --git a/modules/biobank_nottracked/jsx/containerCheckout.js b/modules/biobank_nottracked/jsx/containerCheckout.js deleted file mode 100644 index cec2c7a184f..00000000000 --- a/modules/biobank_nottracked/jsx/containerCheckout.js +++ /dev/null @@ -1,48 +0,0 @@ -import React, {Component} from 'react'; -import PropTypes from 'prop-types'; - -/** - * Biobank Container Checkout - * - * @author Henri Rabalais - * @version 1.0.0 - * - * */ -class ContainerCheckout extends Component { - constructor() { - super(); - this.checkoutContainer = this.checkoutContainer.bind(this); - } - - checkoutContainer() { - this.props.editContainer(this.props.container) - .then(() => this.props.setContainer('parentContainerId', null)) - .then(() => this.props.setContainer('coordinate', null)) - .then(() => this.props.updateContainer(this.props.current.container)); - } - - render() { - let checkoutButton; - if (loris.userHasPermission('biobank_container_update') && - this.props.container.parentContainerId) { - checkoutButton = ( -
- -
- ); - } - - return
{checkoutButton}
; - } -} - -ContainerCheckout.propTypes = { - setContainer: PropTypes.func.isRequired, - updateContainer: PropTypes.func.isRequired, -}; - -export default ContainerCheckout; diff --git a/modules/biobank_nottracked/jsx/containerDisplay.js b/modules/biobank_nottracked/jsx/containerDisplay.js deleted file mode 100644 index feaff54c7a6..00000000000 --- a/modules/biobank_nottracked/jsx/containerDisplay.js +++ /dev/null @@ -1,379 +0,0 @@ -import swal from 'sweetalert2'; - -/** - * ContainerDisplay - * - * @author Henri Rabalais - * @version 1.0.0 - * - **/ - -class ContainerDisplay extends React.Component { - constructor() { - super(); - - this.redirectURL = this.redirectURL.bind(this); - this.drag = this.drag.bind(this); - this.drop = this.drop.bind(this); - this.loadContainer = this.loadContainer.bind(this); - this.checkoutContainers = this.checkoutContainers.bind(this); - } - - componentDidMount() { - $('[data-toggle="tooltip"]').tooltip(); - } - - // This is to ensure that the tool-tip remounts - componentDidUpdate() { - $('[data-toggle="tooltip"]').tooltip(); - } - - redirectURL(e) { - let coordinate = e.target.id; - if (this.props.coordinates[coordinate]) { - let barcode = this.props.data.containers.all[this.props.coordinates[coordinate]].barcode; - this.props.history.push(`/barcode=${barcode}`); - } - } - - allowDrop(e) { - e.preventDefault(); - } - - drag(e) { - $('[data-toggle="tooltip"]').tooltip('hide'); - let container = JSON.stringify( - this.props.data.containers.all[this.props.coordinates[e.target.id]] - ); - e.dataTransfer.setData('text/plain', container); - } - - drop(e) { - e.preventDefault(); - const container = JSON.parse(e.dataTransfer.getData('text/plain')); - const newCoordinate = parseInt(e.target.id); - container.coordinate = newCoordinate; - this.props.updateContainer(container); - } - - increaseCoordinate(coordinate) { - const capacity = this.props.dimensions.x * this.props.dimensions.y * this.props.dimensions.z; - coordinate++; - for (let c in this.props.coordinates) { - if (c == coordinate || coordinate > capacity) { - this.props.clearAll(); - } - } - this.props.setCurrent('coordinate', coordinate); - } - - loadContainer(name, value) { - if (!value) { - return; - } - - const containerId = value; - const container = JSON.parse(JSON.stringify(this.props.data.containers.all[containerId])); - container.parentContainerId = this.props.container.id; - container.coordinate = this.props.current.coordinate; - - this.props.updateContainer(container, false) - .then(() => { - if (this.props.current.sequential) { - let coordinate = this.props.current.coordinate; - this.increaseCoordinate(coordinate); - // FIXME: This is a hack, but it works! There must be a better way to - // clear this field. - this.props.setCurrent('containerId', 1) - .then(() => this.props.setCurrent('containerId', null)); - } else { - this.props.clearAll(); - } - - this.props.setCurrent('prevCoordinate', container.coordinate); - }); - } - - checkoutContainers() { - const checkoutList = JSON.parse(JSON.stringify(this.props.current.list)); - const checkoutPromises = Object.values(checkoutList).map((container) => { - container.parentContainerId = null; - container.coordinate = null; - return this.props.updateContainer(container, false); - }); - - Promise.all(checkoutPromises) - .then(() => this.props.clearAll()) - .then(() => swal('Containers Successfully Checked Out!', '', 'success')); - } - - render() { - const {barcodes, coordinates, current, data, dimensions, editable, options} = this.props; - const {select, target} = this.props; - const {clearAll, editContainer, setContainer, setCurrent} = this.props; - - let barcodeField; - if ((editable||{}).loadContainer) { - barcodeField = ( - - ); - } - - let load = ( -
- - - - {barcodeField} - - -
- ); - - // place container children in an object - let children = {}; - if (((target||{}).container||{}).childContainerIds.length !== 0) { - Object.values(data.containers.all).map((c) => { - target.container.childContainerIds.forEach((id) => { - if (c.id == id) { - children[id] = c; - } - }); - }); - } - - if ((editable||{}).containerCheckout) { - // Only children of the current container can be checked out. - let barcodes = this.props.mapFormOptions(children, 'barcode'); - - barcodeField = ( - { - value && this.props.setCheckoutList(children[value]); - }} - value={current.containerId} - placeHolder='Please Scan or Select Barcode' - autoFocus={true} - /> - ); - } - - let checkout = ( -
- - - {barcodeField} - - Cancel} - /> - -
- - ); - - // TODO: This will eventually need to be reworked and cleaned up - let display; - let column = []; - let row = []; - let coordinate = 1; - if (dimensions) { - for (let y=1; y <= dimensions.y; y++) { - column = []; - for (let x=1; x <= dimensions.x; x++) { - let nodeWidth = (500/dimensions.x) - (500/dimensions.x * 0.08); - let nodeStyle = {width: nodeWidth}; - let nodeClass = 'node'; - let tooltipTitle = null; - let title = null; - let dataHtml = 'false'; - let dataToggle = null; - let dataPlacement = null; - let draggable = 'false'; - let onDragStart = null; - let onDragOver = this.allowDrop; - let onDrop = this.drop; - let onClick = this.redirectURL; - - if (!select) { - if ((coordinates||{})[coordinate]) { - if (!loris.userHasPermission('biobank_specimen_view') && - children[coordinates[coordinate]] === undefined) { - nodeClass = 'node forbidden'; - onClick = null; - } else { - if (coordinate in current.list) { - nodeClass = 'node checkout'; - } else if (coordinate == current.prevCoordinate) { - nodeClass = 'node new'; - } else { - nodeClass = 'node occupied'; - } - - dataHtml = 'true'; - dataToggle = 'tooltip'; - dataPlacement = 'top'; - // This is to avoid a console error - if (children[coordinates[coordinate]]) { - tooltipTitle = - '
'+children[coordinates[coordinate]].barcode+'
' + - '
'+options.container.types[children[coordinates[coordinate]].typeId].label+'
' + - '
'+options.container.stati[children[coordinates[coordinate]].statusId].label+'
'; - } - draggable = !loris.userHasPermission('biobank_container_update') || - editable.loadContainer || - editable.containerCheckout - ? 'false' : 'true'; - onDragStart = this.drag; - - if (editable.containerCheckout) { - onClick = (e) => { - let container = data.containers.all[coordinates[e.target.id]]; - this.props.setCheckoutList(container); - }; - } - if (editable.loadContainer) { - onClick = null; - } - } - onDragOver = null; - onDrop = null; - } else if (loris.userHasPermission('biobank_container_update') && - !editable.containerCheckout) { - nodeClass = coordinate == current.coordinate ? - 'node selected' : 'node load'; - title = 'Load...'; - onClick = (e) => { - let containerId = e.target.id; - this.props.edit('loadContainer') - .then(() => editContainer(target.container)) - .then(() => setCurrent('coordinate', containerId)); - }; - } - } - - if (select) { - if (coordinate == this.props.selectedCoordinate) { - nodeClass = 'node occupied'; - } else if (!coordinates) { - nodeClass = 'node available'; - onClick = (e) => setContainer('coordinate', e.target.id); - } else if (coordinates) { - if (!coordinates[coordinate]) { - nodeClass = 'node available'; - onClick = (e) => setContainer('coordinate', e.target.id); - } else if (coordinates[coordinate]) { - const childContainer = data.containers.all[coordinates[coordinate]]; - const specimen = Object.values(data.specimens) - .find((specimen) => specimen.containerId == childContainer.id); - let quantity = ''; - if (specimen) { - quantity = `
${specimen.quantity + ' '+options.specimen.units[specimen.unitId].label}
`; - } - dataHtml = 'true'; - dataToggle = 'tooltip'; - dataPlacement = 'top'; - tooltipTitle = - `
${childContainer.barcode}
` + - `
${options.container.types[childContainer.typeId].label}
` + - quantity + - `
${options.container.stati[childContainer.statusId].label}
`; - } - } - } - - let coordinateDisplay; - if (dimensions.xNum == 1 && dimensions.yNum == 1) { - coordinateDisplay = x + (dimensions.x * (y-1)); - } else { - const xVal = dimensions.xNum == 1 ? x : String.fromCharCode(64+x); - const yVal = dimensions.yNum == 1 ? y : String.fromCharCode(64+y); - coordinateDisplay = yVal+''+xVal; - } - - column.push( -
- {coordinateDisplay} -
- ); - - coordinate++; - } - - let rowHeight = (500/dimensions.y) - (500/dimensions.y * 0.08); - // let rowMargin = (500/dimensions.y * 0.04); - let rowStyle = {height: rowHeight}; - - row.push( -
{column}
- ); - } - - display = row; - } - - return ( -
-
- {checkout} - {load} -
-
- {display} -
-
- ); - } -} - -ContainerDisplay.propTypes = { -}; - -ContainerDisplay.defaultProps = { - current: {}, -}; - -export default ContainerDisplay; diff --git a/modules/biobank_nottracked/jsx/containerForm.js b/modules/biobank_nottracked/jsx/containerForm.js deleted file mode 100644 index c5c191bcc7e..00000000000 --- a/modules/biobank_nottracked/jsx/containerForm.js +++ /dev/null @@ -1,256 +0,0 @@ -import React, {Component} from 'react'; -import PropTypes from 'prop-types'; - -/** - * Biobank Collection Form - * - * Fetches data from Loris backend and displays a form allowing - * to specimen a biobank file attached to a specific instrument - * - * @author Henri Rabalais - * @version 1.0.0 - * - * */ -class BiobankContainerForm extends Component { - render() { - // Generates new Barcode Form everytime the addContainer button is pressed - const barcodes = Object.keys(this.props.current.list).map(([key, container], i, list) => { - return ( - { - this.props.removeListItem(key); - } : null} - addContainer={i+1 == list.length ? () => { - this.props.addListItem('container'); - } : null} - multiplier={this.props.current.multiplier} - copyContainer={i+1 == list.length && this.props.current.list[key] ? this.props.copyListItem : null} - setListItem={this.props.setListItem} - setCurrent={this.props.setCurrent} - toggleCollapse={this.props.toggleCollapse} - /> - ); - }); - - return ( -
-
-
- - -
-
- {barcodes} -
- ); - } -} - -BiobankContainerForm.propTypes = { - DataURL: PropTypes.string.isRequired, - barcode: PropTypes.string, - refreshTable: PropTypes.func, -}; - -/** - * Container Barcode Form - * - * Acts a subform for ContainerForm - * - * @author Henri Rabalais - * @version 1.0.0 - * - **/ -class ContainerBarcodeForm extends Component { - constructor() { - super(); - - this.setContainer = this.setContainer.bind(this); - this.copy = this.copy.bind(this); - } - - copy() { - this.props.copyContainer(this.props.containerKey); - } - - // TODO: change form.js so this isn't necessary ? - setContainer(name, value) { - this.props.setListItem(name, value, this.props.containerKey); - } - - render() { - const renderAddContainerButton = () => { - if (this.props.addContainer) { - return ( -
- -
- + -
-
- - New Entry - -
- ); - } - }; - - const renderCopyContainerButton = () => { - if (this.props.copyContainer) { - return ( -
- -
- -
-
- - { -this.props.setCurrent('multiplier', e.target.value); -}} - value={this.props.multiplier} - /> - Copies - -
- ); - } - }; - - const renderRemoveContainerButton = () => { - if (this.props.removeContainer) { - const glyphStyle = { - color: '#DDDDDD', - marginLeft: 10, - cursor: 'pointer', - fontSize: 15, - }; - - return ( - - ); - } - }; - - return ( -
-
-
-
- -
-
-
- this.props.toggleCollapse(this.props.containerKey)} - /> - {renderRemoveContainerButton()} -
-
-
-
-
-
- - - -
-
-
-
-
-
-
- {renderAddContainerButton()} -
-
- {renderCopyContainerButton()} -
-
-
-
- ); - } -} - -ContainerBarcodeForm.propTypes = { - -}; - -ContainerBarcodeForm.defaultProps = { - errors: {}, - multiplier: 1, -}; - -export default BiobankContainerForm; diff --git a/modules/biobank_nottracked/jsx/containerParentForm.js b/modules/biobank_nottracked/jsx/containerParentForm.js deleted file mode 100644 index 024f752940c..00000000000 --- a/modules/biobank_nottracked/jsx/containerParentForm.js +++ /dev/null @@ -1,114 +0,0 @@ -import React, {Component} from 'react'; -import PropTypes from 'prop-types'; - -import ContainerDisplay from './containerDisplay.js'; - -/** - * Biobank Container Parent Form - * - * Fetches data from Loris backend and displays a form allowing - * to specimen a biobank file attached to a specific instrument - * - * @author Henri Rabalais - * @version 1.0.0 - * - * */ - -class ContainerParentForm extends Component { - constructor() { - super(); - this.setInheritedProperties = this.setInheritedProperties.bind(this); - } - - // TODO: there might be a better way to do this. - setInheritedProperties(name, value) { - const {data, setContainer} = this.props; - const container = data.containers.nonPrimary[value]; - - setContainer(name, value); - setContainer('coordinate', null); - setContainer('temperature', container.temperature); - setContainer('centerId', container.centerId); - setContainer('statusId', container.statusId); - } - - removeChildContainers(object, id) { - const {data} = this.props; - delete object[id]; - for (let key in data.containers.nonPrimary) { - if (id == data.containers.nonPrimary[key].parentContainerId) { - object = this.removeChildContainers(object, key); - } - } - return object; - } - - render() { - const {container, data, target, options, display} = this.props; - const {mapFormOptions, setContainer} = this.props; - let containerBarcodesNonPrimary = mapFormOptions( - data.containers.nonPrimary, 'barcode' - ); - - // Delete child containers from options - if (target) { - containerBarcodesNonPrimary = this.removeChildContainers(containerBarcodesNonPrimary, target.container.id); - } - - const renderContainerDisplay = () => { - if (!(container.parentContainerId && display)) { - return; - } - - const coordinates = data.containers.nonPrimary[container.parentContainerId].childContainerIds - .reduce((result, id) => { - const container = data.containers.all[id]; - if (container.coordinate) { - result[container.coordinate] = id; - } - return result; - }, {}); - - return ( - - ); - }; - - return ( - - - {renderContainerDisplay()} - - ); - } -} - -ContainerParentForm.propTypes = { - mapFormOptions: PropTypes.func.isRequired, - setContainer: PropTypes.func.isRequired, - data: PropTypes.object, - target: PropTypes.object, - container: PropTypes.object.isRequired, - options: PropTypes.object.isRequired, -}; - -export default ContainerParentForm; diff --git a/modules/biobank_nottracked/jsx/customFields.js b/modules/biobank_nottracked/jsx/customFields.js deleted file mode 100644 index fa5a9346779..00000000000 --- a/modules/biobank_nottracked/jsx/customFields.js +++ /dev/null @@ -1,123 +0,0 @@ -import React, {Component} from 'react'; -import PropTypes from 'prop-types'; - -/** - * Biobank Custom Attribute Fields - * - * @author Henri Rabalais - * @version 1.0.0 - * - */ - -class CustomFields extends Component { - render() { - const {attributeDatatypes, attributeOptions, errors, fields, object} = this.props; - const attributeFields = Object.keys(fields).map((attribute) => { - const datatype = attributeDatatypes[fields[attribute]['datatypeId']].datatype; - if (datatype === 'text' || datatype === 'number') { - if (fields[attribute]['refTableId'] === null) { - return ( - - ); - } - - if (fields[attribute]['refTableId'] !== null) { - return ( - - ); - } - } - - if (datatype === 'date') { - return ( - - ); - } - - if (datatype === 'time') { - return ( - - ); - } - - if (datatype === 'boolean') { - object[attribute] == null && this.props.setData(attribute, false); - return ( - - ); - } - - // Do not present the possibility of uploading if file is already set - // File must instead be deleted or overwritten. - if (datatype === 'file' && !(this.props.data||{})[attribute]) { - return ( - - ); - } - }); - - return ( -
- {attributeFields} -
- ); - } -} - -CustomFields.propTypes = { - fields: PropTypes.object.isRequired, - attributeDatatypes: PropTypes.object.isRequired, - attributeOptions: PropTypes.object.isRequired, - object: PropTypes.object.isRequired, - setData: PropTypes.func.isRequired, - errors: PropTypes.object, -}; - -CustomFields.defaultProps = { - errors: {}, -}; - -export default CustomFields; diff --git a/modules/biobank_nottracked/jsx/filter.js b/modules/biobank_nottracked/jsx/filter.js deleted file mode 100644 index 064bfe2fc92..00000000000 --- a/modules/biobank_nottracked/jsx/filter.js +++ /dev/null @@ -1,731 +0,0 @@ -import React, {Component} from 'react'; -import PropTypes from 'prop-types'; -import {Link} from 'react-router-dom'; - -import FilterableDataTable from 'FilterableDataTable'; -import {Tabs, TabPane} from 'Tabs'; -import Modal from 'Modal'; - -import BiobankSpecimenForm from './specimenForm'; -import PoolSpecimenForm from './poolSpecimenForm'; -import BatchPreparationForm from './batchPreparationForm'; -import BiobankContainerForm from './containerForm'; - -class BiobankFilter extends Component { - constructor() { - super(); - - this.mapSpecimenColumns = this.mapSpecimenColumns.bind(this); - this.formatSpecimenColumns = this.formatSpecimenColumns.bind(this); - this.mapContainerColumns = this.mapContainerColumns.bind(this); - this.formatContainerColumns = this.formatContainerColumns.bind(this); - this.mapPoolColumns = this.mapPoolColumns.bind(this); - this.formatPoolColumns = this.formatPoolColumns.bind(this); - this.openSearchSpecimen = this.openSearchSpecimen.bind(this); - this.openSpecimenForm = this.openSpecimenForm.bind(this); - this.openPoolForm = this.openPoolForm.bind(this); - this.openBatchPreparationForm = this.openBatchPreparationForm.bind(this); - this.openSearchContainer = this.openSearchContainer.bind(this); - this.openContainerForm = this.openContainerForm.bind(this); - this.specimenTab = this.specimenTab.bind(this); - this.containerTab = this.containerTab.bind(this); - this.poolTab = this.poolTab.bind(this); - this.renderSpecimenForm = this.renderSpecimenForm.bind(this); - this.renderPoolForm = this.renderPoolForm.bind(this); - this.renderBatchPreparationForm = this.renderBatchPreparationForm.bind(this); - this.renderContainerForm = this.renderContainerForm.bind(this); - this.renderAliquotForm = this.renderAliquotForm.bind(this); - } - - openSearchSpecimen() { - this.props.edit('searchSpecimen'); - } - - openSpecimenForm() { - this.props.edit('specimenForm') - .then(() => this.props.addListItem('specimen')); - } - - openPoolForm() { - this.props.edit('poolSpecimenForm'); - } - - openBatchPreparationForm() { - this.props.edit('batchPreparationForm'); - } - - openSearchContainer() { - this.props.edit('searchContainer'); - } - - openContainerForm() { - this.props.edit('containerForm') - .then(() => this.props.addListItem('container')); - } - - // TODO: Not a huge fan of this set up, but it seems necessary for the moment - // to be able to set up the pool aliquot form properly - openAliquotForm(poolId) { - this.props.setCurrent('poolId', poolId) - .then(() => this.props.edit('aliquotForm')) - .then(() => this.props.addListItem('specimen')); - } - - mapSpecimenColumns(column, value) { - switch (column) { - case 'Type': - return this.props.options.specimen.types[value].label; - case 'Parent Specimens': - return value.map((id) => { - return this.props.data.containers.primary[this.props.data.specimens[id].containerId].barcode; - }); - case 'PSCID': - return this.props.options.candidates[value].pscid; - case 'Visit Label': - return this.props.options.sessions[value].label; - case 'Status': - return this.props.options.container.stati[value].label; - case 'Projects': - return value.map((id) => this.props.options.projects[id]); - case 'Site': - return this.props.options.centers[value]; - default: - return value; - } - } - - formatSpecimenColumns(column, value, row) { - value = this.mapSpecimenColumns(column, value); - switch (column) { - case 'Barcode': - return
; - case 'Parent Specimens': - const barcodes = value && value.map((id) => { - return {value}; - }).reduce((prev, curr) => [prev, ', ', curr]); - return ; - case 'PSCID': - const pscidURL = loris.BaseURL + '/' - + Object.values(this.props.options.candidates).find((cand) => cand.pscid == value).id; - return ; - case 'Visit Label': - const visitLabelURL = loris.BaseURL+'/instrument_list/?candID='+row['PSCID']+ - '&sessionID='+Object.values(this.props.options.sessions).find((sess) => sess.label == value).id; - return ; - case 'Status': - switch (value) { - case 'Available': - return ; - case 'Reserved': - return ; - case 'Dispensed': - return ; - case 'Discarded': - return ; - default: - return ; - } - case 'Projects': - return ; - case 'Container Barcode': - return ; - default: - return ; - } - } - - mapContainerColumns(column, value) { - switch (column) { - case 'Type': - return this.props.options.container.types[value].label; - case 'Status': - return this.props.options.container.stati[value].label; - case 'Projects': - return value.map((id) => this.props.options.projects[id]); - case 'Site': - return this.props.options.centers[value]; - case 'Parent Barcode': - return (value && this.props.data.containers.nonPrimary[value].barcode); - default: - return value; - } - } - - formatContainerColumns(column, value, row) { - value = this.mapContainerColumns(column, value); - switch (column) { - case 'Barcode': - return ; - case 'Status': - switch (value) { - case 'Available': - return ; - case 'Reserved': - return ; - case 'Dispensed': - return ; - case 'Discarded': - return ; - default: - return ; - } - case 'Projects': - return ; - case 'Parent Barcode': - return ; - default: - return ; - } - } - - mapPoolColumns(column, value) { - switch (column) { - case 'Pooled Specimens': - return value.map((id) => { - return (this.props.data.containers.primary[this.props.data.specimens[id].containerId]||{}).barcode; - }); - case 'PSCID': - return this.props.options.candidates[value].pscid; - case 'Visit Label': - return this.props.options.sessions[value].label; - case 'Type': - return this.props.options.specimen.types[value].label; - default: - return value; - } - } - - formatPoolColumns(column, value, row) { - value = this.mapPoolColumns(column, value); - switch (column) { - case 'Pooled Specimens': - const barcodes = value - .map((barcode) => { - if (loris.userHasPermission('biobank_specimen_view')) { - return {barcode}; - } - }) - .reduce((prev, curr) => [prev, ', ', curr]); - return ; - case 'PSCID': - const pscidURL = loris.BaseURL + '/' - + Object.values(this.props.options.candidates).find((cand) => cand.pscid == value).id; - return ; - case 'Visit Label': - const visitLabelURL = loris.BaseURL+'/instrument_list/?candID='+row['PSCID']+ - '&sessionID='+Object.values(this.props.options.sessions).find((sess) => sess.label == value).id; - return ; - case 'Aliquot': - return ; - default: - return ; - } - } - - renderSpecimenForm() { - if (!loris.userHasPermission('biobank_specimen_create')) { - return; - }; - return ( - - - - - - ); - } - - renderPoolForm() { - if (!loris.userHasPermission('biobank_pool_create')) { - return; - } - return ( - - - - ); - } - - renderBatchPreparationForm() { - if (!loris.userHasPermission('biobank_specimen_create')) { - return; - } - return ( - - - - ); - } - - specimenTab() { - const barcodesPrimary = this.props.mapFormOptions( - this.props.data.containers.primary, 'barcode' - ); - const specimenTypes = this.props.mapFormOptions( - this.props.options.specimen.types, 'label' - ); - const stati = this.props.mapFormOptions( - this.props.options.container.stati, 'label' - ); - const pscids = this.props.mapFormOptions( - this.props.options.candidates, 'pscid' - ); - - const data = Object.values(this.props.data.specimens).map((specimen) => { - const container = this.props.data.containers.primary[specimen.containerId]; - const parentContainer = this.props.data.containers.nonPrimary[container.parentContainerId] || {}; - - return [ - container.barcode, - specimen.typeId, - specimen.quantity+' '+this.props.options.specimen.units[specimen.unitId].label, - specimen.fTCycle || null, - specimen.parentSpecimenIds, - specimen.candidateId, - specimen.sessionId, - specimen.poolId ? this.props.data.pools[specimen.poolId].label : null, - container.statusId, - container.projectIds, - container.centerId, - specimen.collection.date, - parentContainer.barcode, - ]; - }); - - const fields = [ - {label: 'Barcode', show: true, filter: { - name: 'barcode', - type: 'text', - }}, - {label: 'Type', show: true, filter: { - name: 'type', - type: 'select', - options: specimenTypes, - }}, - {label: 'Quantity', show: true}, - {label: 'F/T Cycle', show: false, filter: { - name: 'fTCycle', - type: 'text', - hide: true, - }}, - {label: 'Parent Specimen(s)', show: false, filter: { - name: 'parentSpecimens', - type: 'text', - hide: true, - }}, - {label: 'PSCID', show: true, filter: { - name: 'pscid', - type: 'text', - options: pscids, - }}, - {label: 'Visit Label', show: true, filter: { - name: 'visitLabel', - type: 'text', - }}, - {label: 'Pool', show: false, filter: { - name: 'pool', - type: 'text', - hide: true, - }}, - {label: 'Status', show: true, filter: { - name: 'status', - type: 'select', - options: stati, - }}, - {label: 'Projects', show: true}, - {label: 'Site', show: true, filter: { - name: 'site', - type: 'select', - options: this.props.options.centers, - }}, - {label: 'Date Collected', show: true}, - {label: 'Container Barcode', show: true, filter: { - name: 'containerBarcode', - type: 'text', - }}, - ]; - - const actions = [ - {name: 'goToSpecimen', label: 'Go To Specimen', action: this.openSearchSpecimen}, - {name: 'addSpecimen', label: 'Add Specimen', action: this.openSpecimenForm}, - {name: 'poolSpecimen', label: 'Pool Specimens', action: this.openPoolForm}, - {name: 'batchPreparation', label: 'Batch Preparation', action: this.openBatchPreparationForm}, - ]; - - return ( -
- - - {this.renderSpecimenForm()} - {this.renderPoolForm()} - {this.renderBatchPreparationForm()} -
- ); - } - - renderContainerForm() { - if (!loris.userHasPermission('biobank_container_create')) { - return; - } - const containerTypesNonPrimary = this.props.mapFormOptions( - this.props.options.container.typesNonPrimary, 'label' - ); - return ( - - - - - - ); - } - - containerTab() { - const stati = this.props.mapFormOptions( - this.props.options.container.stati, 'label' - ); - const containerTypesNonPrimary = this.props.mapFormOptions( - this.props.options.container.typesNonPrimary, 'label' - ); - const barcodesNonPrimary = this.props.mapFormOptions( - this.props.data.containers.nonPrimary, 'barcode' - ); - - const data = Object.values(this.props.data.containers.nonPrimary).map( - (container) => { - return [ - container.barcode, - container.typeId, - container.statusId, - container.projectIds, - container.centerId, - container.parentContainerId, - ]; - } - ); - - const fields = [ - {label: 'Barcode', show: true, filter: { - name: 'barcode', - type: 'text', - }}, - {label: 'Type', show: true, filter: { - name: 'type', - type: 'select', - options: containerTypesNonPrimary, - }}, - {label: 'Status', show: true, filter: { - name: 'status', - type: 'select', - options: stati, - }}, - {label: 'Projects', show: true}, - {label: 'Site', show: true, filter: { - name: 'site', - type: 'select', - options: this.props.options.centers, - }}, - {label: 'Parent Barcode', show: true, filter: { - name: 'parentBarcode', - type: 'text', - }}, - ]; - - const actions = [ - {name: 'goToContainer', label: 'Go To Container', action: this.openSearchContainer}, - {name: 'addContainer', label: 'Add Container', action: this.openContainerForm}, - ]; - - return ( -
- - - {this.renderContainerForm()} -
- ); - } - - // TODO: This should be fixed. A lot of hacks are being used to initialize - // this form and there's definitely better ways to be doing it. - renderAliquotForm() { - if (!(loris.userHasPermission('biobank_specimen_create') && this.props.current.poolId)) { - return; - } - const specimens = Object.values(this.props.data.specimens).filter( - (specimen) => specimen.poolId == this.props.current.poolId - ); - const parents = specimens.map( - (specimen) => { - return {specimen: specimen, container: this.props.data.containers.primary[specimen.containerId]}; - } - ); - - return ( - - - - - - ); - } - - poolTab() { - const pscids = this.props.mapFormOptions( - this.props.options.candidates, 'pscid' - ); - const specimenTypes = this.props.mapFormOptions( - this.props.options.specimen.types, 'label' - ); - const data = Object.values(this.props.data.pools).map((pool) => { - return [ - pool.id, - pool.label, - pool.quantity+' '+this.props.options.specimen.units[pool.unitId].label, - pool.specimenIds, - pool.candidateId, - pool.sessionId, - pool.typeId, - this.props.options.centers[pool.centerId], - pool.date, - pool.time, - ]; - }); - - const fields = [ - {label: 'ID', show: false}, - {label: 'Label', show: true, filter: { - name: 'barcode', - type: 'text', - }}, - {label: 'Quantity', show: true}, - {label: 'Pooled Specimens', show: true}, - {label: 'PSCID', show: true, filter: { - name: 'pscid', - type: 'select', - options: pscids, - }}, - {label: 'Visit Label', show: true, filter: { - name: 'visit', - type: 'text', - }}, - {label: 'Type', show: true, filter: { - name: 'type', - type: 'select', - options: specimenTypes, - }}, - {label: 'Site', show: true, filter: { - name: 'site', - type: 'select', - options: this.props.options.centers, - }}, - {label: 'Date', show: true}, - {label: 'Time', show: true}, - {label: 'Aliquot', show: true}, - ]; - - return ( -
- - {this.renderAliquotForm()} -
- ); - } - - render() { - const tabs = () => { - const tabInfo = []; - const tabList = []; - if (loris.userHasPermission('biobank_specimen_view')) { - tabInfo.push({id: 'specimens', content: this.specimenTab}); - tabList.push({id: 'specimens', label: 'Specimens'}); - } - if (loris.userHasPermission('biobank_container_view')) { - tabInfo.push({id: 'containers', content: this.containerTab}); - tabList.push({id: 'containers', label: 'Containers'}); - } - if (loris.userHasPermission('biobank_pool_view')) { - tabInfo.push({id: 'pools', content: this.poolTab}); - tabList.push({id: 'pools', label: 'Pools'}); - } - - const tabContent = Object.keys(tabInfo).map((key) => { - return {tabInfo[key].content()}; - }); - - return ( - - {tabContent} - - ); - }; - - return ( -
- {tabs()} -
- ); - } -} - -BiobankFilter.propTypes = { - filter: PropTypes.object.isRequired, - data: PropTypes.object.isRequired, - options: PropTypes.object.isRequired, - editable: PropTypes.object.isRequired, - loadContainer: PropTypes.func.isRequired, - loadTransfer: PropTypes.func.isRequired, - updateSpecimenFilter: PropTypes.func.isRequired, - updateContainerFilter: PropTypes.func.isRequired, - mapFormOptions: PropTypes.func.isRequired, - edit: PropTypes.func.isRequired, - clearAll: PropTypes.func.isRequired, -}; - -BiobankFilter.defaultProps = { -}; - -class Search extends Component { - render() { - return ( - - - { - if (this.props.barcodes[value]) { - this.props.history.push(`/barcode=${this.props.barcodes[value]}`); - this.props.clearAll(); - } - }} - placeHolder='Please Scan or Select Barcode' - autoFocus={true} - /> - - - ); - } -} - -Search.propTypes = { - -}; - -Search.defaultProps = { - -}; - -export default BiobankFilter; diff --git a/modules/biobank_nottracked/jsx/globals.js b/modules/biobank_nottracked/jsx/globals.js deleted file mode 100644 index 05cbd6691cf..00000000000 --- a/modules/biobank_nottracked/jsx/globals.js +++ /dev/null @@ -1,809 +0,0 @@ -import React, {Component} from 'react'; -import PropTypes from 'prop-types'; -import {Link} from 'react-router-dom'; - -import Modal from 'Modal'; -import ContainerParentForm from './containerParentForm'; - -/** - * Biobank Globals Component - * - * @author Henri Rabalais - * @version 1.0.0 - * - **/ - -class Globals extends Component { - constructor() { - super(); - this.increaseCycle = this.increaseCycle.bind(this); - this.decreaseCycle = this.decreaseCycle.bind(this); - } - - increaseCycle() { - this.props.editSpecimen(this.props.target.specimen) - .then(() => { - let cycle = this.props.specimen.fTCycle; - cycle++; - this.props.setSpecimen('fTCycle', cycle); - }) - .then(()=>this.props.updateSpecimen(this.props.specimen)); - } - - decreaseCycle() { - this.props.editSpecimen(this.props.target.specimen) - .then(() => { - let cycle = this.props.specimen.fTCycle; - cycle--; - this.props.setSpecimen('fTCycle', cycle); - }) - .then(()=>this.props.updateSpecimen(this.props.specimen)); - } - - render() { - const {container, data, editable, options, specimen, target} = this.props; - - const specimenTypeField = () => { - if (target.specimen) { - return ( -
-
- Specimen Type -
- {options.specimen.types[target.specimen.typeId].label} -
-
-
- ); - } - }; - - const containerTypeField = () => { - return ( -
-
- Container Type -
- {options.container.types[target.container.typeId].label} -
-
-
- ); - }; - - const poolField = () => { - if ((target.specimen||{}).poolId) { - return ( -
-
- Pool -
- {data.pools[target.specimen.poolId].label} -
-
-
- ); - } - }; - - const updateQuantity = () => { - if (loris.userHasPermission('biobank_specimen_update')) { - return ( -
-
{ - this.props.edit('quantity'); - this.props.editSpecimen(target.specimen); - }} - > - -
-
- ); - } - }; - - const quantityField = () => { - if (target.specimen) { - if (!editable.quantity) { - return ( -
-
- Quantity -
- {target.specimen.quantity} - {' '+options.specimen.units[target.specimen.unitId].label} -
-
- {updateQuantity()} -
- ); - } else { - const units = this.props.mapFormOptions( - options.specimen.typeUnits[target.specimen.typeId], 'label' - ); - - return ( -
-
- Quantity - this.props.updateSpecimen(specimen)} - /> -
-
- ); - } - } - }; - - const fTCycleField = () => { - if (target.specimen - && options.specimen.types[ - target.specimen.typeId - ].freezeThaw == 1) { - const decreaseCycle = () => { - if (target.specimen.fTCycle > 0) { - return ( -
- - - -
- ); - } - }; - - const increaseCycle = () => { - return ( -
- - - -
- ); - }; - - const updateFTCycle = () => { - if (loris.userHasPermission('biobank_specimen_update')) { - return
{decreaseCycle()} {increaseCycle()}
; - } - }; - - return ( -
-
- Freeze-Thaw Cycle -
- {target.specimen.fTCycle} -
-
- {updateFTCycle()} -
- ); - } - }; - - const updateTemperature = () => { - if (loris.userHasPermission('biobank_container_update')) { - return ( -
- { - this.props.edit('temperature') - .then(() => this.props.editContainer(target.container)); - }} - > - - -
- ); - } - }; - - const temperatureField = () => { - if (!editable.temperature) { - return ( -
-
- Temperature -
- {target.container.temperature + '°C'} -
-
- {updateTemperature()} -
- ); - } else { - return ( -
-
- Temperature - -
-
- ); - } - }; - - const updateStatus = () => { - if (loris.userHasPermission('biobank_container_update')) { - return ( -
- { - this.props.edit('status'); - this.props.editContainer(target.container); - }} - > - - -
- ); - } - }; - - const statusField = () => { - if (!editable.status) { - return ( -
-
- Status -
- {options.container.stati[target.container.statusId].label} -
-
- {updateStatus()} -
- ); - } else { - const stati = this.props.mapFormOptions(options.container.stati, 'label'); - return ( -
-
- Status - -
-
- ); - } - }; - - const updateProject = () => { - if (loris.userHasPermission('biobank_container_update')) { - return ( -
- { - this.props.edit('project'); - this.props.editContainer(target.container); - }} - > - - -
- ); - } - }; - - const projectField = () => { - if (!editable.project) { - return ( -
-
- Projects -
- {target.container.projectIds.length != 0 ? - target.container.projectIds - .map((id) => options.projects[id]) - .join(', ') : 'None'} -
-
- {updateProject()} -
- ); - } else { - return ( -
-
- Projects - -
-
- ); - } - }; - - const updateCenter = () => { - if (loris.userHasPermission('biobank_container_update')) { - return ( -
- { - this.props.edit('center'); - this.props.editContainer(target.container); - }} - > - - -
- ); - } - }; - - const centerField = () => { - if (!editable.center) { - return ( -
-
- Current Site -
- {options.centers[target.container.centerId]} -
-
- {updateCenter()} -
- ); - } else { - return ( -
-
- Current Site - -
-
- ); - } - }; - - const originField = () => { - return ( -
-
- Origin Site -
- {options.centers[target.container.originId]} -
-
-
- ); - }; - - const parentSpecimenField = () => { - if ((target.specimen||{}).parentSpecimenIds) { - const parentSpecimenBarcodes = Object.values(target.specimen.parentSpecimenIds) - .map((id) => { - const barcode = data.containers.primary[ - data.specimens[id].containerId - ].barcode; - return {barcode}; - }) - .reduce((prev, curr) => [prev, ', ', curr]); - - return ( -
-
- Parent Specimen -
- {parentSpecimenBarcodes || 'None'} -
-
-
- ); - } - }; - - const parentContainerField = () => { - if (loris.userHasPermission('biobank_container_view')) { - // Set Parent Container Barcode Value if it exists - const parentContainerBarcodeValue = () => { - if (target.container.parentContainerId) { - const barcode = data.containers.nonPrimary[ - target.container.parentContainerId - ].barcode; - return {barcode}; - } - }; - - const updateParentContainer = () => { - if (loris.userHasPermission('biobank_container_update')) { - return ( -
-
- { - this.props.edit('containerParentForm'); - this.props.editContainer(target.container); - }} - > - - -
-
- this.props.updateContainer(container)} - > - - -
-
- ); - } - }; - - let coordinate; - if (target.container.coordinate) { - coordinate = this.props.getCoordinateLabel(target.container); - } - - return ( -
-
- Parent Container -
- {parentContainerBarcodeValue() || 'None'} -
- {(parentContainerBarcodeValue && target.container.coordinate) ? - 'Coordinate '+ coordinate : null} -
- {updateParentContainer()} -
- ); - } - }; - - const candidateSessionField = () => { - if (target.specimen) { - return ( -
- -
- Visit Label - - ); - - return ( -
- {fieldList} -
- ); - } -} - -Globals.propTypes = { -}; - -// TODO: The following fields should be condensed into a single component. - -/** - * Biobank Container Status Field - * - * @author Henri Rabalais - * @version 1.0.0 - * - * */ - -class StatusField extends Component { - render() { - return ( -
- ); - } -} - -StatusField.propTypes = { - setContainer: PropTypes.func.isRequired, - clearAll: PropTypes.func, - stati: PropTypes.object.isRequired, - container: PropTypes.object.isRequired, - updateContainer: PropTypes.func.isRequired, - className: PropTypes.string, -}; - -class ProjectField extends Component { - render() { - return ( -
-
- -
-
- this.props.updateContainer(this.props.container)} - columnSize= 'col-lg-11' - /> -
- -
- ); - } -} - -ProjectField.propTypes = { - setContainer: PropTypes.func.isRequired, - clearAll: PropTypes.func, - projects: PropTypes.object.isRequired, - container: PropTypes.object.isRequired, - updateContainer: PropTypes.func.isRequired, - className: PropTypes.string, -}; - -/** - * Biobank Container Temperature Form - * - * @author Henri Rabalais - * @version 1.0.0 - * - * */ - -class TemperatureField extends Component { - render() { - return ( -
-
- -
-
- this.props.updateContainer(this.props.container)} - columnSize= 'col-lg-11' - /> -
- -
- ); - } -} - -TemperatureField.propTypes = { - setContainer: PropTypes.func.isRequired, - clearAll: PropTypes.func, - container: PropTypes.object.isRequired, - updateContainer: PropTypes.func.isRequired, - className: PropTypes.string, -}; - -/** - * Biobank Container Center Field - * - * @author Henri Rabalais - * @version 1.0.0 - * - * */ - -class CenterField extends Component { - render() { - return ( -
-
- -
-
- this.props.updateContainer(this.props.container)} - columnSize= 'col-lg-11' - /> -
- -
- ); - } -} - -CenterField.propTypes = { - setContainer: PropTypes.func.isRequired, - clearAll: PropTypes.func.isRequired, - centerIds: PropTypes.object.isRequired, - container: PropTypes.object.isRequired, - updateContainer: PropTypes.func.isRequired, - className: PropTypes.string, -}; - -/** - * Biobank Specimen Quantity Field - * - * @author Henri Rabalais - * @version 1.0.0 - * - * */ -class QuantityField extends Component { - render() { - return ( -
-
- -
-
- -
-
- -
- -
- ); - } -} - -QuantityField.propTypes = { - setSpecimen: PropTypes.func, - clearAll: PropTypes.func, - specimen: PropTypes.object, - updateSpecimen: PropTypes.func, - className: PropTypes.string, -}; - -export default Globals; diff --git a/modules/biobank_nottracked/jsx/lifeCycle.js b/modules/biobank_nottracked/jsx/lifeCycle.js deleted file mode 100644 index d5264c633ce..00000000000 --- a/modules/biobank_nottracked/jsx/lifeCycle.js +++ /dev/null @@ -1,113 +0,0 @@ -/** - * LifeCycle - * - * @author Henri Rabalais - * @version 1.0.0 - * - **/ - -// TODO: revise this component once Shipments are enabled. -class LifeCycle extends React.Component { - mouseOver(e) { - // this isn't a very 'react' way of doing things, so consider revision - $('.collection').css({ - 'border': '2px solid #093782', - 'box-shadow': '0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19)', - }); - } - - mouseLeave(e) { - // this isn't a very 'react' way of doing things, so consider revision - $('.collection').css({ - 'border': '2px solid #A6D3F5', 'box-shadow': 'none', - }); - } - - mouseOverPreparation(e) { - // this isn't a very 'react' way of doing things, so consider revision - $('.preparation').css({ - 'border': '2px solid #093782', - 'box-shadow': '0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19)', - }); - } - - mouseLeavePreparation(e) { - // this isn't a very 'react' way of doing things, so consider revision - $('.preparation').css({'border': '2px solid #A6D3F5', 'box-shadow': 'none'}); - } - - render() { - // Create Collection Node - let collectionNode; - if ((this.props.specimen||{}).collection || this.props.container) { - collectionNode = ( -
this.mouseOver(e)} - onMouseLeave={(e) => this.mouseLeave(e)} - className='lifecycle-node collection' - > -
- C -
-
- ); - } - - // Create Preparation Node - let preparationNode; - if ((this.props.specimen||{}).preparation) { - preparationNode = ( -
-
- P -
-
- ); - } - - // Create Analysis Node - let analysisNode; - if ((this.props.specimen||{}).analysis) { - analysisNode = ( -
-
-
A
-
-
- ); - } - - // Create Lines - let line; - let nodes = 0; - for (let i in this.props.specimen) { - if (i === 'collection' || i === 'preparation' || i === 'analysis') { - nodes++; - } - } - let lineWidth = nodes > 1 ? 60/(nodes-1) : 0; - let lineStyle = {width: lineWidth+'%'}; - line = (
); - - return ( -
-
- {collectionNode} - {preparationNode ? line : null} - {preparationNode} - {analysisNode ? line : null} - {analysisNode} -
-
- ); - } -} - -LifeCycle.propTypes = { -}; - -export default LifeCycle; diff --git a/modules/biobank_nottracked/jsx/poolSpecimenForm.js b/modules/biobank_nottracked/jsx/poolSpecimenForm.js deleted file mode 100644 index 45473c57619..00000000000 --- a/modules/biobank_nottracked/jsx/poolSpecimenForm.js +++ /dev/null @@ -1,176 +0,0 @@ -/** - * Biobank Pool Specimen Form - * - * TODO: DESCRIPTION - * - * @author Henri Rabalais - * @version 1.0.0 - * - **/ -class PoolSpecimenForm extends React.Component { - render() { - const {current, data, errors, options, setPool, setPoolList} = this.props; - const list = current.list; - - // Create options for barcodes based on match candidateId, sessionId and - // typeId and don't already belong to a pool. - const barcodesPrimary = Object.values(data.containers.primary) - .filter((container) => { - const specimen = Object.values(data.specimens).find( - (specimen) => specimen.containerId == container.id - ); - const availableId = Object.keys(options.container.stati).find( - (key) => options.container.stati[key].label === 'Available' - ); - - if (specimen.quantity != 0 && - container.statusId == availableId && - specimen.poolId == null) { - if (current.candidateId) { - if ( - specimen.candidateId == current.candidateId && - specimen.sessionId == current.sessionId && - specimen.typeId == current.typeId && - container.centerId == current.centerId - ) { - return true; - } - } else { - return true; - } - } - return false; - }) - .filter((container) => !Object.values(list).find((i) => i.container.id == container.id)) - .reduce((result, container) => { - result[container.id] = container.barcode; - return result; - }, {}); - - const barcodeInput = ( - { - containerId && setPoolList(containerId); - }} - options={barcodesPrimary} - value={current.containerId} - errorMessage={errors.pool.total} - /> - ); - - const specimenUnits = this.props.mapFormOptions(options.specimen.units, 'label'); - - const glyphStyle = { - color: '#DDDDDD', - marginLeft: 10, - cursor: 'pointer', - }; - const barcodeList = Object.entries(current.list) - .map(([key, item]) => { - return ( -
-
{item.container.barcode}
-
this.props.removeListItem(key)} - /> -
- ); - }); - - return ( - -
-
- - - - -
-
-

Barcode Input

-
- {barcodeInput} -
-
-

Barcode List

-
-
- {barcodeList} -
-
-
-
- - - - - -
-
- - ); - } -} - -PoolSpecimenForm.propTypes = { -}; - -export default PoolSpecimenForm; diff --git a/modules/biobank_nottracked/jsx/processForm.js b/modules/biobank_nottracked/jsx/processForm.js deleted file mode 100644 index 8a3b8d7386f..00000000000 --- a/modules/biobank_nottracked/jsx/processForm.js +++ /dev/null @@ -1,302 +0,0 @@ -import React, {Component} from 'react'; -import PropTypes from 'prop-types'; - -import CustomFields from './customFields'; - -/** - * Biobank Specimen Process Form - * - * @author Henri Rabalais - * @version 1.0.0 - * - **/ - -class SpecimenProcessForm extends Component { - constructor() { - super(); - - this.setProcess = this.setProcess.bind(this); - this.addData = this.addData.bind(this); - this.setData = this.setData.bind(this); - this.setProtocol = this.setProtocol.bind(this); - } - - setProcess(name, value) { - let process = this.props.process; - process[name] = value; - this.props.setParent(this.props.processStage, process); - } - - // TODO: this function may not be necessary - addData() { - let process = this.props.process; - process.data = {}; - this.props.setParent(this.props.processStage, process); - } - - setData(name, value) { - const data = this.props.process.data; - if (value instanceof File) { - data[name] = value.name; - const files = this.props.current.files; - files[value.name] = value; - this.props.setCurrent('files', files); - } else { - data[name] = value; - } - this.setProcess('data', data); - } - - setProtocol(name, value) { - // Clear data first. - this.setProcess('data', {}); - this.setProcess(name, value); - } - - render() { - const {specimen, process, processStage, typeId, options, errors, edit} = this.props; - const {mapFormOptions} = this.props; - - const renderUpdateButton = () => { - if (!this.props.specimen) { - return; - }; - return ( - this.props.updateSpecimen(specimen)} - /> - ); - }; - - let specimenProtocols = {}; - let specimenProtocolAttributes = {}; - Object.entries(options.specimen.protocols).forEach(([id, protocol]) => { - // FIXME: I really don't like this 'toLowerCase()' function, but it's the - // only way I can get it to work at the moment. - if (typeId == protocol.typeId && options.specimen.processes[protocol.processId].label.toLowerCase() == processStage) { - specimenProtocols[id] = protocol.label; - specimenProtocolAttributes[id] = options.specimen.protocolAttributes[id]; - } - }); - - const renderProtocolFields = () => { - if (specimenProtocolAttributes[process.protocolId]) { - if (process.data) { - return ( - - ); - } else { - this.addData(); - } - } - }; - - const renderCollectionFields = () => { - if (processStage === 'collection') { - const specimenTypeUnits = Object.keys(options.specimen.typeUnits[typeId]||{}).reduce((result, id) => { - result[id] = options.specimen.typeUnits[typeId][id].label; - return result; - }, {}); - return ( -
- - -
- ); - } - }; - - // const renderContainerFields = () => { - // if (process.protocolId) { - // if (process.data) { - // return options.specimen.protocolContainers[process.protocolId].map((typeId) => { - // return ( - //
- // - // - //
- // ); - // }); - // } - // } - // }; - - const examiners = mapFormOptions(options.examiners, 'label'); - const renderProcessFields = () => { - if (typeId && edit === true) { - return ( -
- - - {renderCollectionFields()} - {renderProtocolFields()} - - - - {renderUpdateButton()} -
- ); - } else if (edit === false) { - const renderProtocolStaticFields = () => { - if (process.data) { - const protocolAttributes = process.data; - return Object.keys(protocolAttributes).map((key) => { - const renderValue = () => { - if (protocolAttributes[key] === true) { - return '✔️'; - } else if (protocolAttributes[key] === false) { - return '❌'; - } else { - return protocolAttributes[key]; - } - }; - if (options.specimen.protocolAttributes[process.protocolId]) { - if (options.specimen.protocolAttributes[process.protocolId][key]) { - return ( - - ); - } - } - }); - } - }; - const renderCollectionStaticFields = () => { - if (processStage === 'collection') { - return ( - - ); - } - }; - - return ( -
- - - - {renderCollectionStaticFields()} - {renderProtocolStaticFields()} - - - -
- ); - } - }; - - return ( -
- {renderProcessFields()} -
- ); - } -} - - -SpecimenProcessForm.propTypes = { - setParent: PropTypes.func.isRequired, - updateSpecimen: PropTypes.func, - specimen: PropTypes.object.isRequired, - attributeDatatypes: PropTypes.object.isRequired, - attributeOptions: PropTypes.object.isRequired, - specimenTypeUnits: PropTypes.object.isRequired, - specimenTypeAttributes: PropTypes.object.isRequired, -}; - -SpecimenProcessForm.defaultProps = { - errors: {}, -}; - -export default SpecimenProcessForm; diff --git a/modules/biobank_nottracked/jsx/specimen.js b/modules/biobank_nottracked/jsx/specimen.js deleted file mode 100644 index 19c4b74c114..00000000000 --- a/modules/biobank_nottracked/jsx/specimen.js +++ /dev/null @@ -1,418 +0,0 @@ -import React, {Component} from 'react'; -import PropTypes from 'prop-types'; - -import Modal from 'Modal'; -import Globals from './globals.js'; -import SpecimenProcessForm from './processForm'; -import BiobankSpecimenForm from './specimenForm.js'; -import LifeCycle from './lifeCycle.js'; -import ContainerCheckout from './containerCheckout.js'; - -/** - * Biobank Specimen - * - * @author Henri Rabalais - * @version 1.0.0 - * - */ -class BiobankSpecimen extends Component { - constructor() { - super(); - this.openAliquotForm = this.openAliquotForm.bind(this); - this.addPreparation = this.addPreparation.bind(this); - this.addAnalysis = this.addAnalysis.bind(this); - this.alterCollection = this.alterCollection.bind(this); - this.alterPreparation = this.alterPreparation.bind(this); - this.alterAnalysis = this.alterAnalysis.bind(this); - this.submitAliquotForm = this.submitAliquotForm.bind(this); - } - - addPreparation() { - this.addProcess('preparation'); - } - - addAnalysis() { - this.addProcess('analysis'); - } - - addProcess(process) { - this.props.editSpecimen(this.props.target.specimen) - .then(() => { - const specimen = this.props.current.specimen; - specimen[process] = {centerId: this.props.target.container.centerId}; - this.props.setCurrent('specimen', specimen); - }) - .then(() => this.props.edit(process)); - } - - alterCollection() { - this.alterProcess('collection'); - } - - alterPreparation() { - this.alterProcess('preparation'); - } - - alterAnalysis() { - this.alterProcess('preparation'); - } - - alterProcess(process) { - this.props.editSpecimen(this.props.target.specimen) - .then(() => this.props.edit(process)); - } - - openAliquotForm() { - this.props.edit('aliquotForm') - .then(() => this.props.editSpecimen(this.props.target.specimen)) - .then(() => this.props.addListItem('specimen')); - } - - submitAliquotForm() { - this.props.createSpecimens() - .then(() => this.props.updateSpecimen(this.props.current.specimen)) - .then(() => this.props.clearAll()); - } - - render() { - const {current, data, editable, errors, options, target} = this.props; - - const status = options.container.stati[target.container.statusId].label; - const renderActionButton = () => { - if (status == 'Available' && target.specimen.quantity > 0 && !target.specimen.poolId) { - return ( -
- + -
- ); - } else { - return
+
; - } - }; - const addAliquotForm = () => { - if (loris.userHasPermission('biobank_specimen_create')) { - return ( -
-
- {renderActionButton()} -
-
- - - - - -
-
- ); - } - }; - - /** - * Collection Form - */ - - const alterCollection = () => { - if (loris.userHasPermission('biobank_specimen_alter')) { - return ( - - ); - } - }; - - const cancelAlterCollection = () => { - if (editable.collection) { - return ( - - Cancel - - ); - } - }; - - const collectionPanel = ( -
-
-
-
C
-
-
- Collection -
- {alterCollection()} -
-
- - - - {cancelAlterCollection()} -
-
- ); - - /** - * Preparation Form - */ - - const alterPreparation = () => { - if (loris.userHasPermission('biobank_specimen_alter')) { - return ( - - ); - } - }; - - const cancelAlterPreparation = () => { - if (editable.preparation) { - return ( - - Cancel - - ); - } - }; - - const preparationPanel = () => { - const protocolExists = Object.values(options.specimen.protocols).find( - (protocol) => { - return protocol.typeId == target.specimen.typeId && - options.specimen.processes[protocol.processId].label == 'Preparation'; - } - ); - if (protocolExists && - !target.specimen.preparation && - !editable.preparation && - loris.userHasPermission('biobank_specimen_update')) { - return ( -
-
- -
-
ADD PREPARATION
-
- ); - } else if (target.specimen.preparation || editable.preparation) { - return ( -
-
-
-
P
-
-
- Preparation -
- {alterPreparation()} -
-
- - - - {cancelAlterPreparation()} -
-
- ); - } - }; - - /** - * Analysis Form - */ - - const alterAnalysis = () => { - if (loris.userHasPermission('biobank_specimen_alter')) { - return ( - - ); - } - }; - - const cancelAlterAnalysis = () => { - if (editable.analysis) { - return ( - - Cancel - - ); - } - }; - - const analysisPanel = () => { - const protocolExists = Object.values(options.specimen.protocols).find( - (protocol) => { - return protocol.typeId == target.specimen.typeId && - options.specimen.processes[protocol.processId].label == 'Analysis'; - } - ); - if (protocolExists && - !target.specimen.preparation && - !editable.analysis && - loris.userHasPermission('biobank_specimen_update')) { - return ( -
-
- -
-
ADD ANALYSIS
-
- ); - } else if (target.specimen.analysis || editable.analysis) { - return ( -
-
-
-
A
-
-
- Analysis -
- {alterAnalysis()} -
-
- - - - {cancelAlterAnalysis()} -
-
- ); - } - }; - - let globals = ( - - ); - - const parentBarcodes = this.props.getParentContainerBarcodes(target.container); - const barcodePathDisplay = this.props.getBarcodePathDisplay(parentBarcodes); - return ( -
-
-
-
- Barcode -
- {target.container.barcode} -
- - Address: {barcodePathDisplay}
- Lot Number: {target.container.lotNumber}
- Expiration Date: {target.container.expirationDate} -
-
- {addAliquotForm()} - -
- -
-
- {globals} -
- {collectionPanel} - {preparationPanel()} - {analysisPanel()} -
-
-
- ); - } -} - -BiobankSpecimen.propTypes = { - specimenPageDataURL: PropTypes.string.isRequired, -}; - -export default BiobankSpecimen; diff --git a/modules/biobank_nottracked/jsx/specimenForm.js b/modules/biobank_nottracked/jsx/specimenForm.js deleted file mode 100644 index 43f50895113..00000000000 --- a/modules/biobank_nottracked/jsx/specimenForm.js +++ /dev/null @@ -1,466 +0,0 @@ -import SpecimenProcessForm from './processForm'; -import ContainerParentForm from './containerParentForm'; - -/** - * Biobank Collection Form - * - * Fetches data from Loris backend and displays a form allowing - * to specimen a biobank file attached to a specific instrument - * - * @author Henri Rabalais - * @version 1.0.0 - * - * */ -class BiobankSpecimenForm extends React.Component { - constructor() { - super(); - this.setSession = this.setSession.bind(this); - } - - componentWillMount() { - // TODO: This is a band-aid solution, fix it! - if (this.props.parent) { - const parentSpecimenIds = Object.values(this.props.parent).map( - (item) => item.specimen.id - ); - const {setCurrent} = this.props; - setCurrent('candidateId', this.props.parent[0].specimen.candidateId); - setCurrent('sessionId', this.props.parent[0].specimen.sessionId); - setCurrent('typeId', this.props.parent[0].specimen.typeId); - setCurrent('originId', this.props.parent[0].container.originId); - setCurrent('centerId', this.props.parent[0].container.centerId); - setCurrent('parentSpecimenIds', parentSpecimenIds); - - if (this.props.parent > 1) { - setCurrent('quantity', 0); - } - } - } - - setSession(session, sessionId) { - let centerId = this.props.options.sessionCenters[sessionId].centerId; - this.props.setCurrent(session, sessionId); - this.props.setCurrent('centerId', centerId); - this.props.setCurrent('originId', centerId); - } - - render() { - const {current, errors, options, data, parent} = this.props; - const {mapFormOptions, addListItem, toggleCollapse, setCurrent} = this.props; - - // Generates new Barcode Form everytime the addBarcodeForm button is pressed - const barcodes = Object.entries(current.list).map(([key, specimen], i, list) => { - return ( - 1 ? - () => { - this.props.removeListItem(key); - } : null - } - addSpecimen={i+1 == list.length ? - () => { - addListItem('specimen'); - } : null - } - multiplier={current.multiplier} - copySpecimen={i+1 == list.length && specimen ? this.props.copyListItem : null} - setListItem={this.props.setListItem} - options={options} - data={data} - /> - ); - }); - - const renderNote = () => { - if (parent) { - return ( - - ); - } else { - return ( - - ); - } - }; - - const renderGlobalFields = () => { - if (parent) { - const parentBarcodes = Object.values(parent).map((item) => item.container.barcode); - const parentBarcodesString = parentBarcodes.join(', '); - return ( -
- - - -
- ); - } else { - const sessions = current.candidateId ? - mapFormOptions(options.candidateSessions[current.candidateId], 'label') - : {}; - const candidates = mapFormOptions(options.candidates, 'pscid'); - return ( -
- - -
- ); - } - }; - - const renderRemainingQuantityFields = () => { - if (parent) { - if (loris.userHasPermission('biobank_specimen_update') && parent.length === 1) { - const specimenUnits = mapFormOptions(options.specimen.units, 'label'); - return ( -
- - -
- ); - } - } - }; - - return ( -
-
-
- {renderNote()} - {renderGlobalFields()} - setCurrent(name, [value])} - required={true} - value={current.projectIds} - disabled={current.candidateId ? false : true} - errorMessage={errors.container.projectIds} - /> - {renderRemainingQuantityFields()} -
-
- {barcodes} -
- ); - } -} - -BiobankSpecimenForm.propTypes = { -}; - -BiobankSpecimenForm.defaultProps = { - specimenList: {}, -}; - -/** - * Biobank Barcode Form - * - * Acts a subform for BiobankSpecimenForm - * - * @author Henri Rabalais - * @version 1.0.0 - * - **/ -class SpecimenBarcodeForm extends React.Component { - constructor() { - super(); - this.setContainer = this.setContainer.bind(this); - this.setSpecimen = this.setSpecimen.bind(this); - this.copy = this.copy.bind(this); - } - - setContainer(name, value) { - let container = this.props.specimen.container; - container[name] = value; - this.props.setListItem('container', container, this.props.barcodeKey); - } - - setSpecimen(name, value) { - this.props.setListItem(name, value, this.props.barcodeKey); - } - - copy() { - this.props.copySpecimen(this.props.barcodeKey); - } - - render() { - const {mapFormOptions, setCurrent} = this.props; - const {addSpecimen, copySpecimen, removeSpecimen} = this.props; - const {options, current, errors, specimen, data} = this.props; - - const renderAddSpecimenButton = () => { - if (addSpecimen) { - return ( -
- -
+
-
- - New Entry - -
- ); - } - }; - - const renderCopySpecimenButton = () => { - if (copySpecimen) { - return ( -
- -
- -
-
- - { - setCurrent('multiplier', e.target.value); - }} - value={this.props.multiplier} - /> - Copies - -
- ); - } - }; - - const renderRemoveSpecimenButton = () => { - if (removeSpecimen) { - const glyphStyle = { - color: '#DDDDDD', - marginLeft: 10, - cursor: 'pointer', - fontSize: 15, - }; - return ( - - ); - } - }; - - // FIXME: This was made in a rush and can likely be done better. - // XXX: Only allow the selection of child types - const renderSpecimenTypes = () => { - let specimenTypes; - if (current.typeId) { - specimenTypes = Object.entries(options.specimen.types).reduce( - (result, [id, type]) => { - if (id == current.typeId) { - result[id] = type; - } - - if (type.parentTypeIds) { - type.parentTypeIds.forEach((i) => { - if (i == current.typeId) { - result[id] = type; - } - }); - } - - return result; - }, {} - ); - } else { - specimenTypes = options.specimen.types; - } - - return mapFormOptions(specimenTypes, 'label'); - }; - const containerTypesPrimary = mapFormOptions(options.container.typesPrimary, 'label'); - - // FIXME: This logic was made in a rush and is a bit of a mess. - const validContainers = {}; - if (specimen.typeId && options.specimen.typeContainerTypes[specimen.typeId]) { - Object.keys(containerTypesPrimary).forEach((id) => { - options.specimen.typeContainerTypes[specimen.typeId].forEach((i) => { - if (id == i) { - validContainers[id] = containerTypesPrimary[id]; - } - }); - }); - } - return ( -
-
-
-
- -
-
-
- { - this.props.toggleCollapse(this.props.barcodeKey); - }} - /> - {renderRemoveSpecimenButton()} -
-
-
-
-
- - - - - - -
-
-
-
-
-
-
- {renderAddSpecimenButton()} -
-
- {renderCopySpecimenButton()} -
-
-
-
- ); - } -} - -SpecimenBarcodeForm.propTypes = { -}; - -SpecimenBarcodeForm.defaultProps = { - specimen: {}, -}; - -export default BiobankSpecimenForm; diff --git a/modules/biobank_nottracked/php/analysis.class.inc b/modules/biobank_nottracked/php/analysis.class.inc deleted file mode 100644 index 8be88a8762e..00000000000 --- a/modules/biobank_nottracked/php/analysis.class.inc +++ /dev/null @@ -1,75 +0,0 @@ - - * @license http://www.gnu.org/licenses/gpl-3.0.txt GPLv3 - * @link https://www.github.com/aces/Loris/ - */ - -namespace LORIS\biobank; - -/** - * Specimen Analysis Class - * This class contains an instance of a database handling that is needed to - * permanently store and retrieve Specimen Analysis instances. - * - * PHP Version 7.2 - * - * @category Entity - * @package Loris - * @subpackage Biobank - * @author Henri Rabalais - * @license http://www.gnu.org/licenses/gpl-3.0.txt GPLv3 - * @link https://www.github.com/aces/Loris/ - */ - -class Analysis extends Process -{ - /** - * Instatiates a Analysis Object using the values sent from the client-side. - * - * @param array $data Data to be used to instantiate the Analysis Object. - * - * @return Process - */ - public function fromArray(array $data) : Process - { - parent::fromArray($data); - - return $this; - } - - /** - * A wrapper function for the jsonSerialize method of the Analysis Instance - * Class. This converts this Specimen Analysis into an array - * - * @return array Specimen Array - */ - public function toArray() - { - return $this->jsonSerialize(); - } - - /** - * Returns an array representing the state of the Specimen. - * - * @return array - */ - public function jsonSerialize() : array - { - $parent = parent::jsonSerialize(); - return array_merge( - $parent, - array() - ); - } -} - diff --git a/modules/biobank_nottracked/php/biobank.class.inc b/modules/biobank_nottracked/php/biobank.class.inc deleted file mode 100644 index 99b9f800899..00000000000 --- a/modules/biobank_nottracked/php/biobank.class.inc +++ /dev/null @@ -1,89 +0,0 @@ - - * @license http://www.gnu.org/licenses/gpl-3.0.text GPLv3 - * @link http://www.github.com/aces/Loris/ - */ -namespace LORIS\biobank; -use \Psr\Http\Message\ServerRequestInterface; -use \Psr\Http\Message\ResponseInterface; - -/** - * This class features the code that enables access to the LORIS Biobank Module. - * - * PHP Version 7.2 - * - * @category Page - * @package Loris - * @subpackage Biobank - * @author Henri Rabalais - * @license http://www.gnu.org/licenses/gpl-3.0.text GPLv3 - * @link http://www.github.com/aces/Loris/ - */ -class Biobank extends \NDB_Menu_Filter -{ - /** - * Determine whether the user has permission to view this page. - * - * @param User $user to be checked. - * - * @return bool whether the user has access. - */ - function _hasAccess(\User $user) : bool - { - return $user->hasPermission('biobank_specimen_view') - || $user->hasPermission('biobank_container_view') - || $user->hasPermission('biobank_pool_view'); - } - - /** - * Set up the variables required by for construction of page - * - * @return void - */ - function _setupVariables() - { - $this->skipTemplate = true; - $this->AjaxModule = true; - } - - /** - * Include additional CSS files: - * - * @return array of javascript to be inserted - */ - function getCSSDependencies(): array - { - $factory = \NDB_Factory::singleton(); - $baseURL = $factory->settings()->getBaseURL(); - $deps = parent::getCSSDependencies(); - return array_merge( - $deps, - [$baseURL . "/biobank/css/biobank.css"] - ); - } - - /** - * Include additional JS files - * - * @return array of javascript to be inserted - */ - function getJSDependencies() - { - $factory = \NDB_Factory::singleton(); - $baseURL = $factory->settings()->getBaseURL(); - $deps = parent::getJSDependencies(); - return array_merge( - $deps, - [$baseURL . "/biobank/js/biobankIndex.js"] - ); - } -} - diff --git a/modules/biobank_nottracked/php/collection.class.inc b/modules/biobank_nottracked/php/collection.class.inc deleted file mode 100644 index cd2e2122804..00000000000 --- a/modules/biobank_nottracked/php/collection.class.inc +++ /dev/null @@ -1,134 +0,0 @@ - - * @license http://www.gnu.org/licenses/gpl-3.0.txt GPLv3 - * @link https://www.github.com/aces/Loris/ - */ -namespace LORIS\biobank; - -/** - * Collection Object Class - * This class contains an instance of a database handling that is needed to - * permanently store and retrieve Collection Object instances. - * - * PHP Version 7.2 - * - * @category Entity - * @package Loris - * @subpackage Biobank - * @author Henri Rabalais - * @license http://www.gnu.org/licenses/gpl-3.0.txt GPLv3 - * @link https://www.github.com/aces/Loris/ - */ -class Collection extends Process -{ - /** - * Persistent Instance variables. - * - * These variables describe a collection instance. - * - * @var string $quantity - * @var int $unitId - */ - private $quantity; - private $unitId; - - /** - * Sets the current quantity of specimen available. This associated unit - * can be found in the `biobank_unit` using the unit ID. - * - * @param string $quantity the current amount of specimen available - * - * @return void - */ - public function setQuantity(string $quantity) : void - { - $this->quantity = $quantity; - } - - /** - * Gets the current amount of specimen available - * - * @return ?string - */ - public function getQuantity() : ?string - { - return $this->quantity; - } - - /** - * Sets the ID of the specimen's unit of quantity - * - * @param int $unitId the ID of the quantity's unit - * - * @return void - */ - public function setUnitId(int $unitId) : void - { - $this->unitId = $unitId; - } - - /** - * Gets the ID of the specimen's unit of quantity - * - * @return ?int - */ - public function getUnitId() : ?int - { - return $this->unitId; - } - - /** - * Instatiates a Collection Object using the values sent from the client-side. - * - * @param array $data Data to be used to instantiate the Collection Object. - * - * @return Process - */ - public function fromArray(array $data) : Process - { - parent::fromArray($data); - isset($data['quantity']) && $this->setQuantity((string) $data['quantity']); - isset($data['unitId']) && $this->setUnitId((int) $data['unitId']); - - return $this; - } - - /** - * A wrapper function for the jsonSerialize method of the Collection Instance - * Class. This converts this Specimen Collection into an array - * - * @return array Collection Array - */ - public function toArray() - { - return $this->jsonSerialize(); - } - - /** - * Returns an array representing the state of the Collection. - * - * @return array - */ - public function jsonSerialize() : array - { - $parent = parent::jsonSerialize(); - return array_merge( - $parent, - array( - 'quantity' => $this->quantity, - 'unitId' => $this->unitId, - ) - ); - } -} - diff --git a/modules/biobank_nottracked/php/container.class.inc b/modules/biobank_nottracked/php/container.class.inc deleted file mode 100644 index 85863e2897a..00000000000 --- a/modules/biobank_nottracked/php/container.class.inc +++ /dev/null @@ -1,481 +0,0 @@ - - * @license http://www.gnu.org/licenses/gpl-3.0.txt GPLv3 - * @link https://www.github.com/aces/Loris/ - */ - -namespace LORIS\biobank; - -/** - * Container Object Class - * This class contains an instance of a database handling that is needed to - * permanently store and retrieve Container Object instances. - * - * PHP Version 7.2 - * - * @category Loris - * @package Biobank - * @author Henri Rabalais - * @license http://www.gnu.org/licenses/gpl-3.0.txt GPLv3 - * @link https://www.github.com/aces/Loris/ - */ - -class Container implements \JsonSerializable, \LORIS\Data\DataInstance -{ - /** - * Persistent Instance variables. - * - * These properties describe a container entity. - * - * @var int $id - * @var string $barcode - * @var int $typeId - * @var int $dimensionId - * @var float $temperature - * @var int $statusId - * @var array $projectIds - * @var int $originId - * @var int $centerId - * @var int $parentContainerId - * @var array $childContainerIds - * @var int $coordinate - * @var string $lotNumber - * @var \DateTime $expirationDate - * - * @access private - */ - private $id; - private $barcode; - private $typeId; - private $dimensionId; - private $temperature; - private $statusId; - private $projectIds; - private $originId; - private $centerId; - private $parentContainerId; - private $childContainerIds; - private $coordinate; - private $lotNumber; - private $expirationDate; - - /** - * Initiliazes a new instance of the Container Class - */ - function __construct() - { - } - - /** - * Sets the container's ID - * - * @param int $id the container's ID - * - * @return void - */ - public function setId(int $id) : void - { - if ($id > 0) { - $this->id = $id; - } - } - - /** - * Gets the container's ID - * - * @return ?int - */ - public function getId() : ?int - { - return $this->id; - } - - /** - * Sets the container's barcode - * - * @param string $barcode the container's barcode - * - * @return void - */ - public function setBarcode(string $barcode) : void - { - $this->barcode = $barcode; - } - - /** - * Gets the container's barcode - * - * @return ?string - */ - public function getBarcode() : ?string - { - return $this->barcode; - } - - /** - * Sets the ID of the container type - * - * @param int $typeId ID of the container type - * - * @return void - */ - public function setTypeId(int $typeId) : void - { - if ($typeId > 0) { - $this->typeId = $typeId; - } - } - - /** - * Gets the ID of the container type - * - * @return ?int - */ - public function getTypeId() : ?int - { - return $this->typeId; - } - - /** - * Sets the ID of the container's dimensions - * - * @param int $dimensionId ID of the container's dimensions - * - * @return void - */ - public function setDimensionId(int $dimensionId) : void - { - if ($dimensionId > 0) { - $this->dimensionId = $dimensionId; - } - } - - /** - * Gets the ID of the container's dimensions - * - * @return ?int - */ - public function getDimensionId() : ?int - { - return $this->dimensionId; - } - - /** - * Sets the container's temperature in Celsius. - * - * @param float $temperature the container's temperature. - * - * @return void - */ - public function setTemperature(float $temperature) : void - { - $this->temperature = $temperature; - } - - /** - * Gets the container's temperature in Celsius. - * - * @return ?float - */ - public function getTemperature() : ?float - { - return $this->temperature; - } - - /** - * Sets the ID of the container's current projects - * - * @param int $projectIds the IDs of the container's current projects - * - * @return void - */ - public function setProjectIds(array $projectIds) : void - { - $this->projectIds = $projectIds; - } - - /** - * Gets the ID of the container's current projects - * - * @return ?array - */ - public function getProjectIds() : ?array - { - return $this->projectIds; - } - - /** - * Sets the ID of the container's current status - * - * @param int $statusId the ID of the container's current status - * - * @return void - */ - public function setStatusId(int $statusId) : void - { - if ($statusId > 0) { - $this->statusId = $statusId; - } - } - - /** - * Gets the ID of the container's current status - * - * @return ?int - */ - public function getStatusId() : ?int - { - return $this->statusId; - } - - /** - * Sets the ID of the container's origin - * - * @param int $originId the ID of the container's origin - * - * @return void - */ - public function setOriginId(int $originId) : void - { - if ($originId > 0) { - $this->originId = $originId; - } - } - - /** - * Gets the ID of the container's origin - * - * @return ?int - */ - public function getOriginId() : ?int - { - return $this->originId; - } - - /** - * Sets the ID of the container's current centerId - * - * @param int $centerId the ID of the container's current centerId - * - * @return none - */ - public function setCenterId(int $centerId) : void - { - if ($centerId > 0) { - $this->centerId = $centerId; - } - } - - /** - * Gets the ID of the container's current centerId - * - * @return ?int - */ - public function getCenterId() : ?int - { - return $this->centerId; - } - - /** - * Sets the parent container's ID - * - * @param int $parentContainerId the parent container's ID - * - * @return void - */ - public function setParentContainerId(int $parentContainerId) : void - { - if ($parentContainerId > 0) { - $this->parentContainerId = $parentContainerId; - } - } - - /** - * Gets the parent container's ID - * - * @return ?int - */ - public function getParentContainerId() : ?int - { - return $this->parentContainerId; - } - - /** - * Sets the IDs of the children containers - * - * @param array $childContainerIds array of IDs of children container - * - * @return void - */ - public function setChildContainerIds(array $childContainerIds) : void - { - $this->childContainerIds = $childContainerIds; - } - - /** - * Gets the IDs of the children containers - * - * @return ?array - */ - public function getChildContainerIds() : ?array - { - return $this->childContainerIds; - } - - /** - * Sets the container's current coordinate in storage - * - * @param int $coordinate the container's current coordinate - * - * @return void - */ - public function setCoordinate(int $coordinate = null) : void - { - if ($coordinate > 0) { - $this->coordinate = intval($coordinate); - } - } - - /** - * Gets the container's current coordinate in storage - * - * @return ?int - */ - public function getCoordinate() : ?int - { - return $this->coordinate; - } - - /** - * Sets the container's lot number - * - * @param string $lotNumber the container's lot number. - * - * @return void - */ - public function setLotNumber(string $lotNumber = null) : void - { - $this->lotNumber = $lotNumber; - } - - /** - * Gets the container's lot number in storage - * - * @return ?string - */ - public function getLotNumber() : ?string - { - return $this->lotNumber; - } - - /** - * Sets the expiration date - * - * @param \DateTime $date the expiration date - * - * @return void - */ - public function setExpirationDate(\DateTime $date = null) : void - { - $this->expirationDate = $date; - } - - /** - * Gets the expiration date - * - * @return \DateTime - */ - public function getExpirationDate() : ?\DateTime - { - return $this->expirationDate; - } - - /** - * Instatiates a Container Object using the information from the client-side - * - * @param array $data Data to be used to instantiate the Container Object - * - * @return Container $container Instantiated Container Object - */ - public function fromArray(array $data) : Container - { - isset($data['id']) && $this->setId((int) $data['id']); - isset($data['barcode']) && $this->setBarcode((string) $data['barcode']); - isset($data['typeId']) && $this->setTypeId((int) $data['typeId']); - isset($data['dimensionId']) && $this->setDimensionId((int) $data['dimensionId']); - isset($data['temperature']) && $this->setTemperature((float) ($data['temperature'])); - isset($data['statusId']) && $this->setStatusId((int) $data['statusId']); - isset($data['projectIds']) && $this->setProjectIds($data['projectIds']); - isset($data['originId']) && $this->setOriginId((int) $data['originId']); - isset($data['centerId']) && $this->setCenterId((int) $data['centerId']); - isset($data['parentContainerId']) && $this->setParentContainerId((int) $data['parentContainerId']); - isset($data['childContainerIds']) && $this->setChildContainerIds($data['childContainerIds']); - isset($data['coordinate']) && $this->setCoordinate((int) $data['coordinate']); - isset($data['lotNumber']) && $this->setLotNumber((string) $data['lotNumber']); - isset($data['expirationDate']) && $this->setExpirationDate(new \DateTime($data['expirationDate'])); - - return $this; - } - - /** - * A wrapper function for the jsonSerialize method of the Container Instance - * Class. This converts the Container Instance into an array. - * - * @return array - */ - public function toArray() : array - { - return $this->jsonSerialize(); - } - - /** - * Gets an array representing the state of the Container - * - * @return array - */ - public function jsonSerialize() : array - { - $expirationDate = $this->expirationDate; - if ($expirationDate) { - $expirationDate = $this->expirationDate->format('Y-m-d'); - } - - return array( - 'id' => $this->id, - 'barcode' => $this->barcode, - 'typeId' => $this->typeId, - 'dimensionId' => $this->dimensionId, - 'temperature' => $this->temperature, - 'statusId' => $this->statusId, - 'projectIds' => $this->projectIds, - 'originId' => $this->originId, - 'centerId' => $this->centerId, - 'parentContainerId' => $this->parentContainerId, - 'childContainerIds' => $this->childContainerIds, - 'coordinate' => $this->coordinate, - 'lotNumber' => $this->lotNumber, - 'expirationDate' => $expirationDate, - ); - } - - /** - * Returns a JSON encoded string of the state of the Container - * - * @return string JSON encoded string of Container data - */ - public function toJSON() : string - { - return json_encode($this); - } -} - diff --git a/modules/biobank_nottracked/php/containercontroller.class.inc b/modules/biobank_nottracked/php/containercontroller.class.inc deleted file mode 100644 index 0fd15158faa..00000000000 --- a/modules/biobank_nottracked/php/containercontroller.class.inc +++ /dev/null @@ -1,545 +0,0 @@ - - * @license http://www.gnu.org/licenses/gpl-3.0.text GPLv3 - * @link http://www.github.com/aces/Loris/ - */ -namespace LORIS\biobank; - -/** - * This class features the code that enables access to the containers of the - * LORIS Biobank Module. - * - * PHP Version 7.2 - * - * @category Controller - * @package Loris - * @subpackage Biobank - * @author Henri Rabalais - * @license http://www.gnu.org/licenses/gpl-3.0.text GPLv3 - * @link http://www.github.com/aces/Loris/ - */ -class ContainerController -{ - - // TODO: These values were decided based on the realm of possible values. - // These value should instead be queried from the back end so that they - // are Project configurable. - const MINTEMP = -273.15; - const MAXTEMP = 100; - - /** - * Private instances of the Database, User and ContainerDAO classes. - * - * @var \Database $db - * @var \User $user - * @var ContainerDAO $dao - */ - private $db; - private $user; - private $dao; - - /** - * Class Constructor - * - * @param Database $db Database Instance. - * @param User $user User Instance. - */ - function __construct(\Database $db, \User $user) - { - $this->db = $db; - $this->user = $user; - $this->dao = $this->getDataProvisioner(); - } - - /** - * Get all Container Objects permitted by the Container Data Provisioner (DAO). - * - * @return array $specimens All permissable Container Objects - */ - public function getInstances() : array - { - $this->validatePermission('view'); - $containers = array(); - $containerIt = $this->dao->execute($this->user); - foreach ($containerIt as $id => $container) { - $containers[$id] = $container; - } - - return $containers; - } - - /** - * This method takes in a list of container arrays from the front-end, - * validates them, instantiates them and then sends them to the DAO to be - * saved to the database. - * - * @param array $list A list of container arrays to be created. - * - * @return array $containerIds A list of IDs from the containers that were - * created. - */ - public function createInstances(array $list) : array - { - $this->validatePermission('create'); - $containerList = array(); - foreach ($list as $i => $item) { - $container = (new Container)->fromArray($item); - $this->validateInstance($container); - $containerList[$i] = $container; - } - - $this->validateInstances($containerList); - - // Save Containers - $newContainers = array(); - foreach ($containerList as $i => $container) { - $containerId = $this->dao->saveInstance($container); - $newContainers[$i] = $this->dao->getInstanceFromId($containerId); - } - - return $newContainers; - } - - /** - * This method takes in a container array from the front-end, - * validates them, instantiates them and then sends them to the DAO to be - * saved to the database. - * - * @param array $containerArray container array to be created - * - * @return array - */ - public function updateInstance(array $containerArray) : array - { - $this->validatePermission('update'); - $container = (new Container)->fromArray($containerArray); - $containerId = $container->getId(); - $oldContainer = $this->dao->getInstanceFromId($containerId); - - $this->validateInstance($container); - $this->dao->saveInstance($container); - - $updatedContainers = []; - $oldContainerParentId = $oldContainer->getParentContainerId(); - if ($oldContainerParentId) { - $updatedContainers[] = $this->dao->getInstanceFromId($oldContainerParentId); - } - $newContainerParentId = $container->getParentContainerId(); - if ($newContainerParentId) { - $updatedContainers[] = $this->dao->getInstanceFromId($newContainerParentId); - } - $updatedContainers[] = $this->dao->getInstanceFromId($containerId); - - return $updateContainers; - } - - /** - * Get all data associated with the Container Entity. This will be used - * for front-end mapping and populating form options. - * - * @return array Associative array of option data. - */ - public function getOptions() : array - { - $this->validatePermission('view'); - return array( - 'types' => $this->dao->getTypes(), - 'typesPrimary' => $this->dao->getTypes(['Primary' => 1]), - 'typesNonPrimary' => $this->dao->getTypes(['Primary' => 0]), - 'dimensions' => $this->dao->getDimensions(), - 'stati' => $this->dao->getStati(), - ); - } - - /** - * Treats the Container DAO as a Provisioner that can be iterated through - * to provide the permissable Container Objects for the current User. - * - * @return \LORIS\Data\Provisioner - */ - private function getDataProvisioner() : \LORIS\Data\Provisioner - { - $dao = new ContainerDAO($this->db); - if ($this->user->hasPermission('access_all_profiles') === false) { - $dao = $dao->filter(new \LORIS\Data\Filters\UserSiteMatch()); - } - if ($this->user->hasPermission('biobank_container_view') === false) { - $dao = $dao->filter(new PrimaryContainerFilter(0)); - } - if ($this->user->hasPermission('biobank_specimen_view') === false) { - $dao = $dao->filter(new PrimaryContainerFilter(1)); - } - return $dao; - } - - /** - * Checks User Permissions for creating or updating Container Objects. - * - * @param string $method User requested method. - * - * @return void - */ - private function validatePermission(string $method) : void - { - switch($method) { - case 'view': - if (!$this->user->hasPermission('biobank_container_view')) { - throw new \Forbidden('Container: View Permission Denied'); - } - case 'update': - if (!$this->user->hasPermission('biobank_container_update')) { - throw new \Forbidden('Container: Update Permission Denied'); - } - case 'create': - if (!$this->user->hasPermission('biobank_container_create')) { - throw new \Forbidden('Container: Create Permission Denied'); - } - } - } - - /** - * Validates Container Object before being saved - * - * @param Container $container Container to be validated - * - * @return void - */ - public function validateInstance(Container $container) : void - { - // TODO: Check whether the value changed before validating it. - $this->validateBarcode($container); - $this->validateTypeId($container); - $this->validateTemperature($container); - $this->validateStatusId($container); - $this->validateProjectIds($container); - $this->validateCenterId($container); - $this->validateParentContainerId($container); - $this->validateCoordinate($container); - $this->validateLotNumber($container); - $this->validateExpirationDate($container); - } - - /** - * Validates the container list to ensure that no barcodes are identical - * - * @param array $containers List of Containers to be validated - * - * @return void - */ - public function validateInstances(array $containers) : void - { - $barcode = null; - foreach ($containers as $container) { - if ($container->getBarcode() === $barcode) { - throw new \BadRequest('Barcode must be unique for each entry.'); - } - $barcode = $container->getBarcode(); - } - } - - /** - * Validates Container Object Barcode - * - * @param Container $container Container to be checked. - * - * @throws BadRequest if the provided Container does not meet validation requirements - * - * @return void - */ - private function validateBarcode(Container $container) : void - { - if (is_null($container->getBarcode())) { - throw new \BadRequest('Barcode value must be set.'); - } - - $id = $container->getId(); - $barcode = $container->getBarcode(); - $containerList = $this->dao->selectInstances(['barcode' => $barcode]); - if (!empty($containerList)) { - foreach ($containerList as $c) { - $b = $c->getBarcode(); - $i = $c->getId(); - // If the barcodes are identical but the ids are not - if ($b === $barcode && $i !== $id) { - throw new \BadRequest('Barcode must be unique.'); - } - } - } - - if ($id) { - $prevContainer = $this->dao->getInstanceFromId($id); - if ($container->getBarcode() !== $prevContainer->getBarcode()) { - throw new \BadRequest('Barcode can not be changed.'); - } - } - - // TODO: Regex check on Barcode. Currently, regex has been removed from - // the schema. Once it's reintroduced, this can be implemented. - //$specimenTypes = $this->dao->getSpecimenTypes(); - //$regex = $specimenTypes[$specimen['typeId']]['regex']; - //if (isset($regex)) { - // if (preg_match($regex, $container['barcode']) !== 1) { - // throw new \BadRequest('Barcode is not of proper format for the - // selected specimen type'); - // } - //} - } - - /** - * Validates Container Object Type ID. - * - * @param Container $container Container to be checked. - * - * @throws BadRequest if the provided Container does not meet validation requirements - * - * @return void - */ - private function validateTypeId(Container $container) : void - { - if (is_null($container->getTypeId())) { - throw new \BadRequest('Type value must be set'); - } - } - - /** - * Validates Container Object Temperature. - * - * @param Container $container Container to be checked. - * - * @throws BadRequest if the provided Container does not meet validation requirements - * - * @return void - */ - private function validateTemperature(Container $container) : void - { - $temperature = $container->getTemperature(); - if (is_null($temperature)) { - throw new \BadRequest('Temperature value must be set.'); - } - if (!(is_numeric($temperature) && is_float(floatval($temperature)))) { - throw new \BadRequest('Temperature must be a number.'); - } - if ($temperature <= self::MINTEMP || $temperature > self::MAXTEMP) { - throw new \BadRequest('Temperature must be between '.self::MINTEMP.'°C and '.self::MAXTEMP.'°C.'); - } - } - - /** - * Validates Container Object Status ID. - * - * @param Container $container Container to be checked. - * - * @throws BadRequest if the provided Container does not meet validation requirements - * - * @return void - */ - private function validateStatusId(Container $container) : void - { - if ($container->getId()) { - $prevContainer = $this->dao->getInstanceFromId($container->getId()); - $statusLabel = $this->dao->getStati()[$prevContainer->getStatusId()]['label']; - if ($statusLabel == 'Dispensed') { - // TODO: figure out what else should not be changed if the container - // is dispensed. This should eventually be blocked in the front-end - // as well. These validations can wait until more testing has - // been done on the module. - - if ($prevContainer->getTemperature() != $container->getTemperature()) { - throw new \BadRequest("Temperature cannot be changed if Container - is Dispensed."); - } - } - } - - if (is_null($container->getStatusId())) { - throw new \BadRequest("Status value must be set."); - } - } - - /** - * Validates Container Object Project ID. - * - * @param Container $container Container to be checked. - * - * @throws BadRequest if the provided Container does not meet validation requirements - * - * @return void - */ - private function validateProjectIds(Container $container) : void - { - $projectIds = $container->getProjectIds(); - - // Check that current container's projects are a subset of the parent - // Container's projects. - $parentContainerId = $container->getParentContainerId(); - if ($parentContainerId) { - $parentContainer = $this->dao->getInstanceFromId($parentContainerId); - $parentProjectIds = $parentContainer->getProjectIds(); - if (array_intersect($projectIds, $parentProjectIds) != $projectIds) { - $barcode = $container->getBarcode(); - $parentBarcode = $parentContainer->getBarcode(); - throw new \BadRequest("The Projects to which $barcode - belongs must be a subset of the Projects to - which $parentBarcode - belongs."); - } - } - - // Check the current container's projects are a superset of the child - // Containers' projects. - $childContainerIds = $container->getChildContainerIds(); - if ($childContainerIds) { - forEach ($childContainerIds as $id) { - $childContainer = $this->dao->getInstanceFromId((int) $id); - $childProjectIds = $childContainer->getProjectIds(); - if (array_intersect($childProjectIds, $projectIds) != $childProjectIds) { - $barcode = $container->getBarcode(); - throw new \BadRequest("The projects to which $barcode - belongs must be a superset - of it's child Containers' Projects"); - } - } - } - } - - /** - * Validates Container Object Center ID. - * - * @param Container $container Container to be checked. - * - * @throws BadRequest if the provided Container does not meet validation requirements - * - * @return void - */ - private function validateCenterId(Container $container) : void - { - if (is_null($container->getCenterId())) { - throw new \BadRequest("Center value must be set."); - } - - $parentContainerId = $container->getParentContainerId(); - if (isset($parentContainerId)) { - $parentContainer = $this->dao->getInstanceFromId($parentContainerId); - if ($container->getCenterID() !== $parentContainer->getCenterID()) { - $barcode = $container->getBarcode(); - throw new \BadRequest( - $container->getBarcode()." must be at the same location - as ".$parentContainer->getBarcode()." to execute this - action" - ); - } - } - } - - /** - * Validates Container Object Parent Container ID. - * - * @param Container $container Container to be checked. - * - * @return void - */ - private function validateParentContainerId(Container $container) : void - { - $this->validateParentContainers($container); - } - - /** - * Recursive function that checks if the Parent Container is a child of the - * Container Object - * - * @param Container $container Container to be validated - * - * @throws BadRequest if the provided Container does not meet validation requirements - * - * @return void - */ - private function validateParentContainers(Container $container) : void - { - $parentContainerId = $container->getParentContainerId(); - if (isset($parentContainerId)) { - if ($container->getId() == $parentContainerId) { - throw new \BadRequest( - 'A container can not be placed within itself or - within one of its descendant containers.' - ); - } - $childContainers = $this->dao->getChildContainers($container); - if (isset($childContainers)) { - foreach ($childContainers as $child) { - $this->validateParentContainerId($child); - } - } - } - } - - /** - * Validates Container Object Coordinate. - * - * @param Container $container Container to be checked. - * - * @throws BadRequest if the provided Container does not meet validation requirements - * - * @return void - */ - private function validateCoordinate(Container $container) - { - $coordinate = $container->getCoordinate(); - if (!is_null($coordinate)) { - if (!((is_int($coordinate) || ctype_digit($coordinate)) && (int)$coordinate > 0)) { - throw new \BadRequest('Coordinate must be a positive integer.'); - } - - $parentContainerId = $container->getParentContainerId(); - if (!isset($parentContainerId)) { - throw new \BadRequest( - 'Coordinate can not be set without a Parent - Container.' - ); - } - - $parentContainer = $this->dao->getInstanceFromId($parentContainerId); - $dimensions = $this->dao->getDimensions()[$parentContainer->getDimensionId()]; - $capacity = $dimensions['x'] * $dimensions['y'] * $dimensions['z']; - if ($container->getCoordinate() > $capacity) { - throw new \BadRequest( - 'Coordinate value exceeds the capacity of the Parent Container' - ); - } - } - } - - /** - * Validates Container Lot Number. - * - * @param Container $container Container to be checked. - * - * @throws BadRequest if the provided Container does not meet validation requirements - * - * @return void - */ - private function validateLotNumber(Container $container) - { - } - - /** - * Validates Container Expiration Date. - * - * @param Container $container Container to be checked. - * - * @throws BadRequest if the provided Container does not meet validation requirements - * - * @return void - */ - private function validateExpirationDate(Container $container) - { - } -} diff --git a/modules/biobank_nottracked/php/containerdao.class.inc b/modules/biobank_nottracked/php/containerdao.class.inc deleted file mode 100644 index 7bb8daaa6a8..00000000000 --- a/modules/biobank_nottracked/php/containerdao.class.inc +++ /dev/null @@ -1,529 +0,0 @@ - - * @license http://www.gnu.org/licenses/gpl-3.0.txt GPLv3 - * @link https://www.github.com/aces/Loris/ - */ -namespace LORIS\biobank; - -/** - * Container Data Access Object (DAO) Class - * This class contains all database handling that is needed to - * permanently store and retrieve Container Object instances - * - * PHP Version 7.2 - * - * @category Data - * @package Loris - * @subpackage Biobank - * @author Henri Rabalais - * @license http://www.gnu.org/licenses/gpl-3.0.txt GPLv3 - * @link https://www.github.com/aces/Loris/ - */ -class ContainerDAO extends \LORIS\Data\ProvisionerInstance -{ - /** - * Private instance of the Database class. - * - * @var \Database $dao - */ - private $db; - - /** - * Initializes a new instance of the ContainerDAO Class - * - * @param Database $db Instance of the LORIS Database class - */ - function __construct(\Database $db) - { - $this->db = $db; - } - - // XXX: I'm not sure if this function is really necessary since it is only - // being used once, and should likely not be accessed outside this class. - /** - * This method is used when the DAO class needs to create a new Container - * instance. - * - * @return Container - */ - public function getInstance() : Container - { - return new Container(); - } - - /** - * This will load all container persistence variables from the database - * for a given $id into a Container object, and return the object. - * - * @param int $id Value of the $id for the Container that will be - * instantiated. - * - * @return Container $container Container Instance. - */ - public function getInstanceFromId(int $id) : Container - { - $containerData = $this->getInstanceDataFromId($id); - $childContainerIds = $this->getChildContainerIds($id); - $projectIds = $this->getProjectIds($id); - $container = $this->getInstanceFromSQL($containerData, $childContainerIds, $projectIds); - - return $container; - } - - /** - * Queries data from the database for the Container at the requested ID. - * - * @param int $id Value of the $id for the Container whose data is being - * queried. - * - * @return array $container Container Data at that ID. - */ - private function getInstanceDataFromId(int $id) - { - $query = 'SELECT bc.ContainerID, - bc.Barcode, - bc.ContainerTypeID, - bct.ContainerCapacityID, - bct.ContainerDimensionID, - bc.ContainerStatusID, - bc.Temperature, - bc.OriginCenterID, - bc.CurrentCenterID, - bcp.ParentContainerID, - bcp.Coordinate, - bc.LotNumber, - bc.ExpirationDate, - bc.DateTimeUpdate, - bc.DateTimeCreate - FROM biobank_container bc - LEFT JOIN biobank_container_parent bcp - USING (ContainerID) - JOIN biobank_container_type bct - USING (ContainerTypeID) - WHERE bc.ContainerID=:i'; - $container = $this->db->pselectrow($query, array('i' => $id)); - - return $container; - } - - /** - * Returns an array of all the Child Container IDs associated with - * the given Container ID from the biobank_container_parent table. - * - * @param ?int $id of Container - * - * @return array $childContainerIds List of Container IDs that are - * children of the Container ID - */ - private function getChildContainerIds(?int $id) : array - { - $query = 'SELECT ContainerID - FROM biobank_container_parent - WHERE ParentContainerID=:i'; - $childContainerIds = $this->db->pselectcol($query, array('i' => $id)); - - return $childContainerIds; - } - - /** - * Returns an array of all the Project IDs associated with the given - * Container ID from the biobank_container_project_rel table. - * - * @param ?int $id of Container - * - * @return $projectIds List of Project Ids that are associated with the - * Container ID. - */ - private function getProjectIds(?int $id) : array - { - $query = 'SELECT ProjectID - FROM biobank_container_project_rel - WHERE ContainerID=:i'; - $projectIds = $this->db->pselectCol($query, array('i' => $id)); - - return $projectIds; - } - - // XXX: Currently this function is never used with any conditions passed as - // parameters. Decide if this is a necessary feature. It is likely useful, - // but I need to figure out how to integrate it wit the dataprovisioner. - /** - * This will select all containers from the database that match the - * attribute values passed by $conditions and will return an array - * of container objects. - * - * @param array $conditions Conditions to be met by the query - * - * @return array $containers List of Container Objects that match the query - */ - public function selectInstances(array $conditions = null) : array - { - $query = 'SELECT ContainerID - FROM biobank_container - LEFT JOIN biobank_container_parent - USING (ContainerID) - JOIN biobank_container_type - USING (ContainerTypeID)'; - $query .= $conditions ? ' WHERE '.$this->db->_implodeWithKeys(' AND ', $conditions) : ''; - - $result = $this->db->pselect($query, array()); - $containers = array(); - if (!empty($result)) { - foreach ($result as $row) { - $id = (int) $row['ContainerID']; - $container = $this->getInstanceFromId($id); - $containers[$id] = $container; - } - } - - return $containers; - } - - /** - * Instantiates an ArrayIterator class that is composed of all the Container - * Objects. - * - * @return traversable Iterator of Container Objects - */ - protected function getAllInstances() : \Traversable - { - return new \ArrayIterator($this->selectInstances()); - } - - // XXX: The conditions parameter is only used to differentiate primary types - // from non primary types. Decide if this is a front-end concern. - /** - * Queries all rows of the biobank_container_type table and returns a nested - * array with the ID field as the index. Conditions may be passed to filter - * the results - * - * @param array $conditions Conditions to be met by the query - * - * @return array $containerTypes All data concerning each container type - */ - public function getTypes(array $conditions = null) : array - { - $query = 'SELECT ContainerTypeID as id, - Brand as brand, - ProductNumber as productNumber, - Label as label, - `Primary` as `primary`, - ContainerCapacityID as capacityId, - ContainerDimensionID as dimensionId - FROM biobank_container_type'; - $query .= $conditions ? ' WHERE '.$this->db->_implodeWithKeys(' AND ', $conditions) : null; - $types = $this->db->pselectWithIndexKey($query, array(), 'id'); - - return $types; - } - - // XXX: Althought container capacities were at first thought to be important - // in the design of this entity, they are not being used in any way - // throughout the module. Decide if container capacities are still - // important, or if they should be deprecated. - /** - * Queries all rows of the biobank_container_capacity table and returns a - * nested array with the ID field as the index. - * - * @return array $containerCapacities All data concerning each container - * capacity - */ - public function getCapacities() : array - { - $query = 'SELECT ContainerCapacityID as id, - Quantity as quantity, - UnitID as unitId - FROM biobank_container_capacity'; - $capacities = $this->db->pselectWithIndexKey($query, array(), 'id'); - - return $capacities; - } - - // XXX: Although container units were at first thought to be important - // in the design of this entity, they are only being used by Specimen Objects - // in this module. Decide if container units are still important, or if they - // should be deprecated. - /** - * Queries all rows of the biobank_unit table and returns a - * nested array with the ID field as the index. - * - * @return array $containerUnits All data concerning each unit - */ - public function getUnits() : array - { - $query = "SELECT UnitID as id, - Label as unit - FROM biobank_unit"; - $units = $this->db->pselectWithIndexKey($query, array(), 'id'); - - return $units; - } - - /** - * Queries all rows of the biobank_container_dimension table and returns a - * nested array with the ID field as the index. - * - * @return array $containerDimensions All data concerning each container dimension - */ - public function getDimensions() : array - { - $query = "SELECT ContainerDimensionID as id, - X as x, - XNumerical as xNum, - Y as y, - YNumerical as yNum, - Z as z, - ZNumerical as zNum - FROM biobank_container_dimension"; - $dimensions = $this->db->pselectWithIndexKey($query, array(), 'id'); - - return $dimensions; - } - - /** - * Queries all rows of the biobank_container_status table and returns a - * nested array with the ID field as the index. - * - * @return array $containerStati All data concerning each container status - */ - public function getStati() : array - { - $query = "SELECT ContainerStatusID as id, - Label as label - FROM biobank_container_status"; - $stati = $this->db->pselectWithIndexKey($query, array(), 'id'); - - return $stati; - } - - /** - * This function receives a Container Object, converts it into a SQL format - * and inserts it into all relevant tables in the database. Certain - * information is then cascaded to the children of the Container. - * - * @param Container $container The Container Object to be saved into the - * database. - * - * @return int $containerId The ID of the Container that was saved. - */ - public function saveInstance(Container $container) : int - { - // Converts Container Object into SQL format. - $data = $this->getSQLFromInstance($container); - - // Inserts or Updates the biobank_container table with given data. - $this->db->insertOnDuplicateUpdate( - 'biobank_container', - $data['biobank_container'] - ); - - if ($container->getId() !== null) { - // If update: - $oldContainer = $this->getInstanceFromId($container->getId()); - $oldParentContainerId = $oldContainer->getParentContainerId(); - // If there is no longer an associated Parent Container ID, delete - // it from the entry from the biobank_container_parent table. - if (isset($oldParentContainerId) && !isset($parentContainerId)) { - $this->db->delete( - 'biobank_container_parent', - array('ContainerID' => $container->getId()) - ); - } - } else { - // If insert: - $container->setId((int) $this->db->getLastInsertId()); - // set the respective data array index to the value of the new - // container ID. - $data['biobank_container_parent']['ContainerID'] = $container->getId(); - foreach ($data['biobank_container_project_rel'] as $id => $insert) { - $data['biobank_container_project_rel'][$id]['ContainerID'] = $container->getId(); - } - } - - $parentContainerId = $container->getParentContainerId(); - // If parent container ID exists, create an association in the - // biobank_container_parent rel table - if (isset($parentContainerId)) { - $this->db->insertOnDuplicateUpdate( - 'biobank_container_parent', - $data['biobank_container_parent'] - ); - } - - // insert on update biobank_container_project_rel with relevant data. - $this->db->delete( - 'biobank_container_project_rel', - array('ContainerID' => $container->getId()) - ); - foreach ($data['biobank_container_project_rel'] as $insert) { - $this->db->insert( - 'biobank_container_project_rel', - $insert - ); - } - - //Cascade changes in temperature, status, and center to all child Containers - $temperature = $container->getTemperature(); - $this->cascadeToChildren($container, 'Temperature', $temperature); - $statusId = $container->getStatusId(); - $this->cascadeToChildren($container, 'ContainerStatusID', $statusId); - $centerId = $container->getCenterID(); - $this->cascadeToChildren($container, 'CurrentCenterID', $centerId); - - return $container->getId(); - } - - /** - * This recursive function cascades the $value to the specified $field of - * all the children of the $container Object. - * - * @param object $container Container Object from which to retrieve children - * @param string $field The field at which to associate the $value - * @param mixed $value The value to assigned to the $field in question. - * It is mixed since it may receive multiple types - * of data. - * - * @return void - */ - private function cascadeToChildren( - Container $container, - string $field, - $value - ) : void { - $childContainers = $this->getChildContainers($container); - - if (!empty($childContainers)) { - foreach ($childContainers as $id=>$childContainer) { - $data = $this->getSQLFromInstance($childContainer); - $data['biobank_container'][$field] = $value; - $this->db->insertOnDuplicateUpdate( - 'biobank_container', - $data['biobank_container'] - ); - - $this->cascadeToChildren($childContainer, $field, $value); - } - } - } - - /** - * This function takes a Container Object and retrieves an array of objects - * representing the children of the $container. - * - * @param object $container Container Object from which to retrieve - * children - * - * @return array $childContainers Array of child container instances - */ - public function getChildContainers(Container $container) : array - { - $childContainers = array(); - $childContainerIds = $this->getChildContainerIds($container->getId()); - if (!empty($childContainerIds)) { - foreach ($childContainerIds as $id) { - $childContainers[$id] = $this->getInstanceFromId((int) $id); - } - } - return $childContainers; - } - - public function getAllChildContainers(Container $container, $containerList = []) : array - { - if ($container) { - $childContainers = $this->getChildContainers($container); - foreach($childContainers as $childContainer) { - $containerList[] = $childContainer; - $this->getAllChildContainers($childContainer, $containerList); - } - } - return $containerList; - } - - /** - * This function takes a Container Object and prepares the data to be - * inserted into the database by converting it to a data array. This mapping - * is done to enable the update or insertion of data into the database - * directly from the resulting arrays. - * - * @param Container $container Container Object to be converted - * - * @return array $data Array containing the data to be inserted - */ - private function getSQLFromInstance(Container $container) : array - { - $expirationDate = $container->getExpirationDate(); - if ($expirationDate) { - $expirationDate = $expirationDate->format('Y-m-d'); - } - $containerData = array( - 'ContainerID' => $container->getId(), - 'Barcode' => $container->getBarcode(), - 'ContainerTypeID' => $container->getTypeId(), - 'Temperature' => $container->getTemperature(), - 'ContainerStatusID' => $container->getStatusId(), - 'OriginCenterID' => $container->getOriginId(), - 'CurrentCenterID' => $container->getCenterId(), - 'LotNumber' => $container->getLotNumber(), - 'ExpirationDate' => $expirationDate, - ); - - $parentData = array( - 'ContainerID' => $container->getId(), - 'ParentContainerID' => $container->getParentContainerId(), - 'Coordinate' => $container->getCoordinate(), - ); - - foreach ($container->getProjectIds() as $id) { - $containerProjectData[$id] = array( - 'ContainerID' => $container->getId(), - 'ProjectID' => $id, - ); - } - - return $data = array( - 'biobank_container' => $containerData, - 'biobank_container_parent' => $parentData, - 'biobank_container_project_rel' => $containerProjectData, - ); - } - - /** - * This function takes an array that resulted from an SQL query and - * instantiates it as a Container Object - * - * @param array $data Values to be instantiated. - * @param ?array $childContainerIds List of child container ids. - * - * @return Container - */ - private function getInstanceFromSQL(array $data, ?array $childContainerIds, ?array $projectIds) : Container - { - $container = $this->getInstance(); - isset($data['ContainerID']) && $container->setId((int) $data['ContainerID']); - isset($data['Barcode']) && $container->setBarcode((string) $data['Barcode']); - isset($data['ContainerTypeID']) && $container->setTypeId((int) $data['ContainerTypeID']); - isset($data['ContainerDimensionID']) && $container->setDimensionId((int) $data['ContainerDimensionID']); - isset($data['Temperature']) && $container->setTemperature((float) $data['Temperature']); - isset($data['ContainerStatusID']) && $container->setStatusId((int) $data['ContainerStatusID']); - isset($projectIds) && $container->setProjectIds($projectIds); - isset($data['OriginCenterID']) && $container->setOriginId((int) $data['OriginCenterID']); - isset($data['CurrentCenterID']) && $container->setCenterId((int) $data['CurrentCenterID']); - isset($data['ParentContainerID']) && $container->setParentContainerId((int) $data['ParentContainerID']); - isset($childContainerIds) && $container->setChildContainerIds($childContainerIds); - isset($data['Coordinate']) && $container->setCoordinate((int) $data['Coordinate']); - isset($data['LotNumber']) && $container->setLotNumber((string) $data['LotNumber']); - isset($data['ExpirationDate']) && $container->setExpirationDate(new \DateTime($data['ExpirationDate'])); - - return $container; - } -} diff --git a/modules/biobank_nottracked/php/containerendpoint.class.inc b/modules/biobank_nottracked/php/containerendpoint.class.inc deleted file mode 100644 index 918c4aedf07..00000000000 --- a/modules/biobank_nottracked/php/containerendpoint.class.inc +++ /dev/null @@ -1,127 +0,0 @@ - - * @license http://www.gnu.org/licenses/gpl-3.0.text GPLv3 - * @link http://www.github.com/aces/Loris/ - */ -namespace LORIS\biobank; -use \Psr\Http\Message\ServerRequestInterface; -use \Psr\Http\Server\RequestHandlerInterface; -use \Psr\Http\Message\ResponseInterface; - -/** - * A class for handling the /biobank/containers/ endpoint. - * - * PHP Version 7.2 - * - * @category API - * @package Loris - * @subpackage Biobank - * @author Henri Rabalais - * @license http://www.gnu.org/licenses/gpl-3.0.text GPLv3 - * @link http://www.github.com/aces/Loris/ - */ -class ContainerEndpoint implements RequestHandlerInterface -{ - /** - * Returns true if user has access to this endpoint. - * - * @param \User $user The user whose access is being checked - * - * @return bool - */ - function _hasAccess(\User $user) : bool - { - return true; - } - - /** - * Return which methods are supported by this endpoint. - * - * @return array supported HTTP methods - */ - protected function allowedMethods() : array - { - return array( - 'GET', - 'PUT', - 'POST', - 'OPTIONS', - ); - } - - /** - * This function passes the request to the handler. This is necessary since - * the Endpoint bypass the Module class. - * - * XXX: This function should be extracted to a parent class. - * - * @param ServerRequestInterface $request The PSR7 request. - * @param RequestHandlerInterface $handler The request handler. - * - * @return ResponseInterface The outgoing PSR7 response. - */ - public function process( - ServerRequestInterface $request, - RequestHandlerInterface $handler - ) : ResponseInterface { - return $handler->handle($request); - } - - /** - * Handles Endpoint requests. - * - * @param ServerRequestInterface $request The incoming PSR7 request - * - * @return ResponseInterface The outgoing PSR7 response - */ - public function handle(ServerRequestInterface $request) : ResponseInterface - { - $db = \Database::singleton(); - $user = $request->getAttribute('user'); - $contCont = new ContainerController($db, $user); - - try { - $db->beginTransaction(); - switch($request->getMethod()) { - case 'GET': - $containers = $contCont->getInstances(); - return new \LORIS\Http\Response\OK($containers); - case 'POST': - $containers = json_decode($request->getBody()->getContents(), true); - $createdContainers = $contCont->createInstances($containers); - return new \LORIS\Http\Response\OK($createdContainers); - case 'PUT': - $containerArray = json_decode($request->getBody()->getContents(), true); - $updatedContainers = $contCont->updateInstance($containerArray); - return new \LORIS\Http\Response\OK($updatedContainers); - case 'OPTIONS': - return (new \LORIS\Http\Response()) - ->withHeader('Allow', $this->allowedMethods()); - } - } catch (\BadRequest $e) { - $db->rollBack(); - return new \LORIS\Http\Response\BadRequest($e->getMessage()); - } catch (\Forbidden $e) { - $db->rollBack(); - return new \LORIS\Http\Response\Forbidden($e->getMessage()); - } catch (\TypeError $e) { - $db->rollBack(); - return new \LORIS\Http\Response\InternalServerError($e->getMessage()); - } catch (\DatabaseException $e) { - $db->rollBack(); - return new \LORIS\Http\Response\InternalServerError($e->getMessage()); - } finally { - if ($db->inTransaction()) { - $db->commit(); - } - } - } -} diff --git a/modules/biobank_nottracked/php/labelendpoint.class.inc b/modules/biobank_nottracked/php/labelendpoint.class.inc deleted file mode 100644 index f62f892fcd1..00000000000 --- a/modules/biobank_nottracked/php/labelendpoint.class.inc +++ /dev/null @@ -1,97 +0,0 @@ - - * @license http://www.gnu.org/licenses/gpl-3.0.text GPLv3 - * @link http://www.github.com/aces/Loris/ - */ -namespace LORIS\biobank; -use \Psr\Http\Message\ServerRequestInterface; -use \Psr\Http\Server\RequestHandlerInterface; -use \Psr\Http\Message\ResponseInterface; - -/** - * A class for handling the /biobank/containers/ endpoint. - * - * PHP Version 7.2 - * - * @category API - * @package Loris - * @subpackage Biobank - * @author Henri Rabalais - * @license http://www.gnu.org/licenses/gpl-3.0.text GPLv3 - * @link http://www.github.com/aces/Loris/ - */ -class LabelEndpoint implements RequestHandlerInterface -{ - /** - * Returns true if user has access to this endpoint. - * - * @param \User $user The user whose access is being checked - * - * @return bool - */ - function _hasAccess(\User $user) : bool - { - return true; - } - - /** - * Return which methods are supported by this endpoint. - * - * @return array supported HTTP methods - */ - protected function allowedMethods() : array - { - return array( - 'GET', - ); - } - - /** - * This function passes the request to the handler. This is necessary since - * the Endpoint bypass the Module class. - * - * XXX: This function should be extracted to a parent class. - * - * @param ServerRequestInterface $request The PSR7 request. - * @param RequestHandlerInterface $handler The request handler. - * - * @return ResponseInterface The outgoing PSR7 response. - */ - public function process( - ServerRequestInterface $request, - RequestHandlerInterface $handler - ) : ResponseInterface { - return $handler->handle($request); - } - - /** - * Handles Endpoint requests. - * - * @param ServerRequestInterface $request The incoming PSR7 request - * - * @return ResponseInterface The outgoing PSR7 response - */ - public function handle(ServerRequestInterface $request) : ResponseInterface - { - $db = \Database::singleton(); - $user = $request->getAttribute('user'); - $contCont = new ContainerController($db, $user); - - switch($request->getMethod()) { - case 'GET': - $barcode = $request->getBody()->getContents(); - return new \LORIS\Http\Response\OK($barcode); - case 'OPTIONS': - return (new \LORIS\Http\Response()) - ->withHeader('Allow', $this->allowedMethods()); - } - } -} diff --git a/modules/biobank_nottracked/php/module.class.inc b/modules/biobank_nottracked/php/module.class.inc deleted file mode 100644 index 9b00c75f8ce..00000000000 --- a/modules/biobank_nottracked/php/module.class.inc +++ /dev/null @@ -1,149 +0,0 @@ - - * @license http://www.gnu.org/licenses/gpl-3.0.txt GPLv3 - * @link https://www.github.com/aces/Loris-Trunk/ - */ -namespace LORIS\biobank; -use \Psr\Http\Message\ServerRequestInterface; -use \Psr\Http\Message\ResponseInterface; - -/** - * Class module implements the basic LORIS module functionality - * - * @category Module - * @package Main - * @subpackage Biobank - * @author Henri Rabalais - * @license http://www.gnu.org/licenses/gpl-3.0.txt GPLv3 - * @link https://www.github.com/aces/Loris-Trunk/ - */ -class Module extends \Module -{ - /** - * The default handler for a module routes to a page of the first component of - * the URL's name, or the same name as the module if serving the root of the - * module. - * - * Modules extend PrefixRouter, so that the parent handler knows that the - * css, static, and js routes should be routed through the file system to - * retrieve the files before trying to load any specific pages. - * - * @param ServerRequestInterface $request The incoming PSR7 request - * - * @return ResponseInterface the outgoing PSR7 response - */ - public function handle(ServerRequestInterface $request) : ResponseInterface - { - $resp = parent::handle($request); - if ($resp->getStatusCode() != 404) { - $path = $request->getURI()->getPath(); - if (preg_match('/(\.css)$/', $path) == 1) { - $resp = $resp->withHeader( - "Content-Type", - "text/css" - ); - } - if (preg_match('/(\.js)$/', $path) == 1) { - $resp = $resp->withHeader( - "Content-Type", - "application/javascript" - ); - } - return $resp; - } - - $pagename = $this->getName(); - $path = trim($request->getURI()->getPath(), "/"); - if ($path == 'optionsendpoint' || - $path == 'poolendpoint' || - $path == 'containerendpoint' || - $path == 'specimenendpoint') { - // There is a subpage - $pagename = explode("/", $path)[0]; - } - - try { - $user = $request->getAttribute("user") ?? new \LORIS\AnonymousUser(); - $page = $this->loadPage($pagename); - // FIXME: Hack required for breadcrumbs. This should be removed, - // but some tests depend on it. - if ($this->getName() === $pagename) { - $_REQUEST['test_name'] = $pagename; - } else { - $_REQUEST['subtest'] = $pagename; - } - - $user = $request->getAttribute("user") ?? new \LORIS\AnonymousUser(); - if ($page->_hasAccess($user) !== true) { - return (new \LORIS\Middleware\PageDecorationMiddleware( - $user - ))->process( - $request, - new \LORIS\Router\NoopResponder( - new \LORIS\Http\Error( - $request, - 403, - "You do not have access to this page." - ) - ) - ); - } - } catch (\NotFound $e) { - return (new \LORIS\Middleware\PageDecorationMiddleware( - $user - ))->process( - $request, - new \LORIS\Router\NoopResponder( - new \LORIS\Http\Error( - $request, - 404, - "File not found: " . $request->getURI()->__toString() - ) - ) - ); - /* The order of these catch statements matter and should go from - * most to least specific. Otherwise all Exceptions will be caught - * as their more generic parent class which reduces precision. - */ - } catch (\DatabaseException $e) { - error_log($e); - return $this->responseStatus500( - $request, - $user, - self::GENERIC_500_ERROR - ); - } catch (\ConfigurationException $e) { - error_log($e); - return $this->responseStatus500( - $request, - $user, - self::CONFIGURATION_ERROR - ); - } catch (\LorisException $e) { - error_log($e); - return $this->responseStatus500( - $request, - $user, - self::GENERIC_500_ERROR - ); - } catch (\Exception $e) { - error_log($e); - return $this->responseStatus500( - $request, - $user, - self::GENERIC_500_ERROR - ); - } - - return $page->process($request, $page); - } -} diff --git a/modules/biobank_nottracked/php/optionsendpoint.class.inc b/modules/biobank_nottracked/php/optionsendpoint.class.inc deleted file mode 100644 index 0faad7a0c7b..00000000000 --- a/modules/biobank_nottracked/php/optionsendpoint.class.inc +++ /dev/null @@ -1,177 +0,0 @@ - - * @license http://www.gnu.org/licenses/gpl-3.0.text GPLv3 - * @link http://www.github.com/aces/Loris - */ -namespace LORIS\biobank; -use \Psr\Http\Message\ServerRequestInterface; -use \Psr\Http\Server\RequestHandlerInterface; -use \Psr\Http\Message\ResponseInterface; - -/** - * A class for handling the /biobank/options/ endpoint. - * - * PHP Version 7.2 - * - * @category API - * @package Loris - * @subpackage Biobank - * @author Henri Rabalais - * @license http://www.gnu.org/licenses/gpl-3.0.text GPLv3 - * @link http://www.github.com/aces/Loris/ - */ -class OptionsEndpoint implements RequestHandlerInterface -{ - /** - * Returns true if user has access to this endpoint. - * - * @param \User $user The user whose access is being checked. - * - * @return bool - */ - function _hasAccess(\User $user) : bool - { - return true; - } - - /** - * Return which methods are supported by this endpoint. - * - * @return array supported HTTP methods - */ - protected function allowedMethods() : array - { - return array( - 'GET', - 'OPTIONS', - ); - } - - /** - * This function passes the request to the handler. This is necessary since - * the Endpoint bypass the Module class. - * - * XXX: This function should be extracted to a parent class. - * - * @param ServerRequestInterface $request The PSR7 request. - * @param RequestHandlerInterface $handler The request handler. - * - * @return ResponseInterface The outgoing PSR7 response. - */ - public function process( - ServerRequestInterface $request, - RequestHandlerInterface $handler - ) : ResponseInterface { - return $handler->handle($request); - } - - /** - * Handles endpoint requests. - * - * @param ServerRequestInterface $request The incoming PSR7 request - * - * @return ResponseInterface The outgoing PSR7 response - */ - public function handle(ServerRequestInterface $request) : ResponseInterface - { - $db = \Database::singleton(); - $user = $request->getAttribute('user'); - - try { - switch($request->getMethod()) { - case 'GET': - $options = $this->getOptions($db, $user); - return new \LORIS\Http\Response\OK($options); - case 'OPTIONS': - return (new \LORIS\Http\Response()) - ->withHeader('Allow', $this->allowedMethods()); - } - } catch (\Invalid $e) { - return \LORIS\Http\Response\BadRequest($e->getMessage()); - } catch (\Forbidden $e) { - return \LORIS\Http\Response\Forbidden($e->getMessage()); - } - } - - /** - * Retrieves all options for populating forms and mapping front-end data. - * - * @param Database $db Database instance - * @param User $user User instance - * - * @return array All options required by the Biobank Module - */ - function getOptions(\Database $db, \User $user) - { - $contCont = new ContainerController($db, $user); - $specCont = new SpecimenController($db, $user); - - // XXX: This should eventually be replaced by a call directly to a - // Candidate endpoint or Candidate controller that will be able to - // provide Candidate Objects. - $query = 'SELECT CandID as id, PSCID as pscid FROM candidate'; - $candidates = $db->pselectWithIndexKey($query, array(), 'id'); - - // XXX: This should eventually be replaced by a call directly to a - // Session endpoint or Session controller that will be able to provide - // Session Objects. - $query = 'SELECT ID as id, Visit_label as label FROM session'; - $sessions = $db->pselectWithIndexKey($query, array(), 'id'); - - // XXX: This should eventually be replaced by a call directly to a - // Examiner endpoint or Examiner controller that will be able to provide - // Examiner Objects. - $query = 'SELECT examinerID as id, full_name as label FROM examiners'; - $examiners = $db->pselectWithIndexKey($query, array(), 'id'); - - // XXX: This should eventually be replaced by a call directly to a - // Center Endpoint or Center Controller that will be able to provide - // Center Objects. - $centers = \Utility::getSiteList(); - foreach ($centers as $id => $center) { - if ($user->hasCenter($id) === false) { - unset($centers[$id]); - } - } - - // XXX: This should eventually be replaced by a call directly to a - // Session Controller or Session Options endpoint that will be able to - // provide these options. - $query = 'SELECT c.CandID as candidateId, - s.ID sessionId, - s.Visit_label as label, - s.CenterID as centerId - FROM candidate c - LEFT JOIN session s - USING(CandID)'; - $result = $db->pselect($query, array()); - $candidateSessions = array(); - $sessionCenters = array(); - foreach ($result as $row) { - foreach ($row as $column=>$value) { - $candidateSessions[$row['candidateId']][$row['sessionId']]['label'] = $row['label']; - $sessionCenters[$row['sessionId']]['centerId'] = $row['centerId']; - } - } - - return array( - 'candidates' => $candidates, - 'sessions' => $sessions, - 'projects' => \Utility::getProjectList(), - 'centers' => $centers, - 'examiners' => $examiners, - 'candidateSessions' => $candidateSessions, - 'sessionCenters' => $sessionCenters, - 'container' => $contCont->getOptions(), - 'specimen' => $specCont->getOptions(), - ); - } -} diff --git a/modules/biobank_nottracked/php/pool.class.inc b/modules/biobank_nottracked/php/pool.class.inc deleted file mode 100644 index d685033ea34..00000000000 --- a/modules/biobank_nottracked/php/pool.class.inc +++ /dev/null @@ -1,393 +0,0 @@ - - * @license http://www.gnu.org/licenses/gpl-3.0.txt GPLv3 - * @link https://www.github.com/aces/Loris/ - */ -namespace LORIS\biobank; - -/** - * Pool Class - * This class contains an instance of a database handling that is needed to - * permanently store and retrieve Pool Object instances. - * - * PHP Version 7.2 - * - * @category Entity - * @package Loris - * @subpackage Biobank - * @author Henri Rabalais - * @license http://www.gnu.org/licenses/gpl-3.0.txt GPLv3 - * @link https://www.github.com/aces/Loris/ - */ -class Pool implements \JsonSerializable, \LORIS\Data\DataInstance -{ - /** - * Persistent Instance variables. - * - * These properties describe a pool entity. - * - * @var string $id - * @var string $label - * @var float $quantity - * @var int $unitId - * @var array $specimenIds - * @var int $candidateId - * @var int $sessionId - * @var int $typeId - * @var int $centerId - * @var \DateTime $date - * @var \DateTime $time - */ - private $id; - private $label; - private $quantity; - private $unitId; - private $specimenIds; - private $candidateId; - private $sessionId; - private $typeId; - private $centerId; - private $date; - private $time; - - /** - * Initiliazes a new instance of the Pool Class - */ - function __construct() - { - } - - /** - * Sets the pool's ID - * - * @param int $id the pool's ID - * - * @return void - */ - public function setId(int $id) : void - { - if ($id > 0) { - $this->id = $id; - } - } - - /** - * Gets the pool's ID - * - * @return ?int - */ - public function getId() : ?int - { - return $this->id; - } - - /** - * Sets the label of the pool - * - * @param string $label the pool's label - * - * @return void - */ - public function setLabel(string $label) : void - { - $this->label = $label; - } - - /** - * Gets the label of the pool - * - * @return string - */ - public function getLabel() : string - { - return $this->label; - } - - /** - * Sets the quantity of the pool - * - * @param float $quantity the pool's quantity - * - * @return void - */ - public function setQuantity(float $quantity) : void - { - $this->quantity = $quantity; - } - - /** - * Gets the quantity of the pool - * - * @return float - */ - public function getQuantity() : float - { - return $this->quantity; - } - - /** - * Sets the Unit ID of the pool - * - * @param int $unitId Unit ID of the pool - * - * @return void - */ - public function setUnitId(int $unitId) : void - { - if ($unitId > 0) { - $this->unitId = $unitId; - } - } - - /** - * Gets the Unit ID of the pool - * - * @return ?int - */ - public function getUnitId() : ?int - { - return $this->unitId; - } - - /** - * Sets the Specimen IDs of the pool - * - * @param array $specimenIds Specimen IDs of the pool - * - * @return void - */ - public function setSpecimenIds(array $specimenIds) : void - { - $this->specimenIds = $specimenIds; - } - - /** - * Gets the Specimen IDs of the pool - * - * @return array - */ - public function getSpecimenIds() : array - { - return $this->specimenIds; - } - - /** - * Sets the Candidate ID of the pool - * - * @param int $candidateId Candidate ID of the pool - * - * @return void - */ - public function setCandidateId(int $candidateId) : void - { - if ($candidateId > 0) { - $this->candidateId = $candidateId; - } - } - - /** - * Gets the Candidate ID of the pool - * - * @return ?int - */ - public function getCandidateId() : ?int - { - return $this->candidateId; - } - - /** - * Sets the Session ID of the pool - * - * @param ?int $sessionId Session ID of the pool - * - * @return void - */ - public function setSessionId(?int $sessionId) : void - { - if ($sessionId > 0) { - $this->sessionId = $sessionId; - } - } - - /** - * Gets the Session ID of the pool - * - * @return ?int - */ - public function getSessionId() : ?int - { - return $this->sessionId; - } - - /** - * Sets the Type ID of the pool - * - * @param ?int $typeId Type ID of the pool - * - * @return void - */ - public function setTypeId(?int $typeId) : void - { - if ($typeId > 0) { - $this->typeId = $typeId; - } - } - - /** - * Gets the Type ID of the pool - * - * @return ?int - */ - public function getTypeId() : ?int - { - return $this->typeId; - } - - /** - * Sets the Center ID of the pool - * - * @param array $centerId Center ID of the pool - * - * @return void - */ - public function setCenterId(int $centerId) : void - { - if ($centerId > 0) { - $this->centerId = $centerId; - } - } - - /** - * Gets the Center ID of the pool - * - * @return int - */ - public function getCenterId() : int - { - return $this->centerId; - } - - /** - * Sets the date at which the pool was created. - * - * @param \DateTime $date the date of the pool - * - * @return void - */ - public function setDate(\DateTime $date) : void - { - $this->date = $date; - } - - /** - * Gets the date that the pool was created. - * - * @return \DateTime - */ - public function getDate() : \DateTime - { - return $this->date; - } - - /** - * Sets the time at which the pool was created. - * - * @param \DateTime $time the time of the pool - * - * @return void - */ - public function setTime(\DateTime $time) : void - { - $this->time = $time; - } - - /** - * Gets the time of pool at which the pool was created. - * - * @return \DateTime - */ - public function getTime() : \DateTime - { - return $this->time; - } - - /** - * Loads a Pool Object from an array. - * - * @param array $data Data to be used to load the Pool Object. - * - * @return Pool - */ - public function fromArray(array $data) : Pool - { - isset($data['id']) && $this->setId((int) ($data['id'])); - isset($data['label']) && $this->setLabel((string) $data['label']); - isset($data['quantity']) && $this->setQuantity((float) $data['quantity']); - isset($data['unitId']) && $this->setUnitId((int) $data['unitId']); - isset($data['specimenIds']) && $this->setSpecimenIds($data['specimenIds']); - isset($data['candidateId']) && $this->setCandidateId((int) $data['candidateId']); - isset($data['sessionId']) && $this->setSessionId((int) $data['sessionId']); - isset($data['typeId']) && $this->setTypeId((int) $data['typeId']); - isset($data['centerId']) && $this->setCenterId((int) $data['centerId']); - isset($data['date']) && $this->setDate(new \DateTime($data['date'])); - isset($data['time']) && $this->setTime(new \DateTime($data['time'])); - - return $this; - } - - /** - * A wrapper function for the jsonSerialize method of the Pool Instance - * Class. This converts the Pool Instance into an array. - * - * @return array Pool Array. - */ - public function toArray() : array - { - return $this->jsonSerialize(); - } - - /** - * Returns an array representing the state of the Pool. - * - * @return array - */ - public function jsonSerialize() : array - { - // TODO: Date and Time formats should be gotten from some sort of - // config setting. - return array( - 'id' => $this->id, - 'label' => $this->label, - 'quantity' => $this->quantity, - 'unitId' => $this->unitId, - 'specimenIds' => $this->specimenIds, - 'candidateId' => $this->candidateId, - 'sessionId' => $this->sessionId, - 'typeId' => $this->typeId, - 'centerId' => $this->centerId, - 'date' => $this->date->format('d-m-Y'), - 'time' => $this->time->format('H:i'), - ); - } - - /** - * Returns a JSON encoded string of the state of the Pool - * - * @return string JSON encoded string of Pool data - */ - public function toJSON() : string - { - return json_encode($this); - } -} - diff --git a/modules/biobank_nottracked/php/poolcontroller.class.inc b/modules/biobank_nottracked/php/poolcontroller.class.inc deleted file mode 100644 index 9045141a20b..00000000000 --- a/modules/biobank_nottracked/php/poolcontroller.class.inc +++ /dev/null @@ -1,298 +0,0 @@ - - * @license http://www.gnu.org/licenses/gpl-3.0.text GPLv3 - * @link http://www.github.com/aces/Loris/ - */ -namespace LORIS\biobank; - -/** - * This class features the code that enables access to the Pools of the - * LORIS Biobank Module. - * - * PHP Version 7.2 - * - * @category Controller - * @package Loris - * @subpackage Biobank - * @author Henri Rabalais - * @license http://www.gnu.org/licenses/gpl-3.0.text GPLv3 - * @link http://www.github.com/aces/Loris/ - */ -class PoolController -{ - /** - * Private instances of the Database, User and PoolDAO classes. - * - * @var \Database $db - * @var \User $user - * @var PoolDAO $dao - */ - private $db, $user, $dao; - - /** - * Pool Controller Class constructor. - * - * @param Database $db Database Instance. - * @param User $user User Instance. - */ - function __construct(\Database $db, \User $user) - { - $this->db = $db; - $this->user = $user; - $this->dao = $this->getDataProvisioner(); - } - - /** - * Get all Pool Objects permitted by the Pool Data Provisioner. - * - * @return array of all permissable Pool Objects - */ - public function getInstances() : array - { - $this->validatePermission('view'); - $pools = array(); - $poolIt = $this->dao->execute($this->user); - foreach ($poolIt as $id => $pool) { - $pools[$id] = $pool; - } - - return $pools; - } - - // TODO: Decide if this should be able to handle a list of pools rather - // than a singular pool array. - /** - * Takes a list of pool arrays from the client-side, validates them, - * instantiates them and sends them to the DAO to be saved to the database. - * - * @param array $poolArray pool array to be created. - * - * @return string a json encoded string of all permissable Pool Objects. - */ - public function createInstance(array $poolArray) - { - $this->validatePermission('create'); - $pool = (new Pool())->fromArray($poolArray); - $this->validateInstance($pool); - $this->dao->saveInstance($pool); - } - - /** - * Treats the Pool DAO as a Provisioner that can be iterated through to - * provide the permissible Pool Objects for the current User - * - * @return \LORIS\Data\Provisioner - */ - private function getDataProvisioner() : \LORIS\Data\Provisioner - { - $dao = new PoolDAO($this->db); - if ($this->user->hasPermission('access_all_profiles') == false) { - $dao = $dao->filter(new \LORIS\Data\Filters\UserSiteMatch()); - } - return $dao; - } - - /** - * Checks user Permissions for given requested action. - * - * @param string $method to be executed. - * - * @return void - */ - private function validatePermission(string $method) : void - { - switch ($method) { - case 'view': - if (!$this->user->hasPermission('biobank_pool_view')) { - throw new \Forbidden('Pool: View Permission Denied'); - } - case 'create': - if (!$this->user->hasPermission('biobank_pool_create')) { - throw new \Forbidden('Pool: Create Permission Denied'); - } - } - } - - /** - * Validates Pool Object before being saved - * - * @param Pool $pool Pool to be validated - * - * @return void - */ - function validateInstance(Pool $pool) : void - { - $this->validateLabel($pool); - $this->validateQuantity($pool); - $this->validateUnitId($pool); - $this->validateSpecimenIds($pool); - $this->validateCenterId($pool); - $this->validateDate($pool); - $this->validateTime($pool); - } - - /** - * Validates Pool Object Label - * - * @param Pool $pool Pool to be checked. - * - * @throws BadRequest if the provided Pool does not meet validation requirements - * - * @return void - */ - private function validateLabel(Pool $pool) : void - { - //TODO: Validate Label with Regex and required - } - - /** - * Validates Pool Object Quantity - * - * @param Pool $pool Pool to be checked. - * - * @throws BadRequest if the provided Pool does not meet validation requirements - * - * @return void - */ - private function validateQuantity(Pool $pool) : void - { - //TODO: Validate Quantity - } - - /** - * Validates Pool Object UnitId - * - * @param Pool $pool Pool to be checked. - * - * @throws BadRequest if the provided Pool does not meet validation requirements - * - * @return void - */ - private function validateUnitId(Pool $pool) : void - { - //TODO: Validate UnitId - } - - /** - * Validates Pool Object Specimen IDs - * - * @param Pool $pool Pool to be checked. - * - * @throws BadRequest if the provided Pool does not meet validation requirements - * - * @return void - */ - private function validateSpecimenIds(Pool $pool) : void - { - $specimenIds = $pool->getSpecimenIds(); - if (count($specimenIds) < 2) { - throw new \BadRequest( - 'At least 2 specimens must be provided to create a Pool' - ); - } - - $specimenDAO = new SpecimenDAO($this->db); - $containerDAO = new ContainerDAO($this->db); - $baseSpecimen = $specimenDAO->getInstanceFromId($specimenIds[0]); - $baseContainer = $containerDAO->getInstanceFromId($baseSpecimen->getContainerId()); - - foreach ($specimenIds as $specimenId) { - $specimen = $specimenDAO->getInstanceFromId($specimenId); - $container = $containerDAO->getInstanceFromId($specimen->getContainerId()); - $barcode = $container->getBarcode(); - - if ($baseSpecimen->getCandidateId() !== $specimen->getCandidateId()) { - throw new \BadRequest( - 'Pooled specimens must belong to the same Candidate' - ); - } - - if ($baseSpecimen->getSessionId() !== $specimen->getSessionId()) { - throw new \BadRequest('Pooled specimens must belong to the same Session'); - } - - if ($baseSpecimen->getTypeId() !== $specimen->getTypeId()) { - throw new \BadRequest('Pooled specimens must be of the same Type'); - } - - if ($baseContainer->getCenterID() !== $container->getCenterID()) { - throw new \BadRequest('Pooled specimens must be at the same Site'); - } - - if ($specimen->getQuantity() === 0 ) { - throw new \BadRequest("Quantity of '$barcode' must be greater than '0'"); - } - - if ($specimen->getPoolId() !== null) { - throw new \BadRequest("Specimen '$barcode' already belongs to a Pool"); - } - - if ($containerDAO->getStati()[$container->getStatusId()]['label'] !== 'Available') { - throw new \BadRequest("Specimen '$barcode' is not 'Available'"); - } - } - } - - /** - * Validates Pool Object Center ID - * - * @param Pool $pool Pool to be checked. - * - * @throws BadRequest if the provided Pool does not meet validation requirements - * - * @return void - */ - private function validateCenterId(Pool $pool) : void - { - if (is_null($pool->getCenterId())) { - throw new \BadRequest('Pool Center must be set'); - } - } - - /** - * Validates Pool Object Date - * - * @param Pool $pool Pool to be checked. - * - * @throws BadRequest if the provided Pool does not meet validation requirements - * - * @return void - */ - private function validateDate(Pool $pool) : void - { - // TODO: query date format from backend configuration. - // $format = 'd-m-Y'; - // $date = \DateTime::createFromFormat($format, $pool->getDate()); - // if ($date && $date->format($format) !== $pool->getDate()) { - // throw new \BadRequest("Pooling date must be of the format: $format"); - // } - } - - /** - * Validates Pool Object Time - * - * @param Pool $pool Pool to be checked. - * - * @throws BadRequest if the provided Pool does not meet validation requirements - * - * @return void - */ - private function validateTime(Pool $pool) : void - { - // TODO: query time format from backend configuration. - // $format = 'H:i'; - // $time = \DateTime::createFromFormat($format, $pool->getTime()); - // if ($time && $time->format($format) !== $pool->getTime()) { - // throw new \BadRequest("Pooling time must be of the format: $format"); - // } - } -} diff --git a/modules/biobank_nottracked/php/pooldao.class.inc b/modules/biobank_nottracked/php/pooldao.class.inc deleted file mode 100644 index f71ee3abb44..00000000000 --- a/modules/biobank_nottracked/php/pooldao.class.inc +++ /dev/null @@ -1,283 +0,0 @@ - - * @license http://www.gnu.org/licenses/gpl-3.0.txt GPLv3 - * @link https://www.github.com/aces/Loris/ - */ - -namespace LORIS\biobank; - -/** - * Pool Data Access Object (DAO) Class - * This class contains all database handling that is needed to - * permanently store and retrieve Pool Object instances - * - * PHP Version 7.2 - * - * @category DAO - * @package Loris - * @subpackage Biobank - * @author Henri Rabalais - * @license http://www.gnu.org/licenses/gpl-3.0.txt GPLv3 - * @link https://www.github.com/aces/Loris/ - */ - -class PoolDAO extends \LORIS\Data\ProvisionerInstance -{ - /** - * Private instance of the Database class. - * - * @var \Dabatase $dao - */ - private $db; - - /** - * Initializes a new instance of the PoolDAO Class - * - * @param Database $db Instance of the LORIS Database class - */ - function __construct(\Database $db) - { - $this->db = $db; - } - - // XXX: I'm not sure if this function is really necessary since it is only - // being used once, and should likely not be accessed outside this class. - /** - * This method is used when the DAO class needs to create new Pool - * instance. - * - * @return Pool - */ - private function getInstance() : Pool - { - return new Pool(); - } - - /** - * This will load all pool persistence variables from the database for a - * given $id into a Pool object, and return the object. - * - * @param int $id Value of the $id for the Pool that will be - * instantiated. - * - * @return Pool $pool Pool Instance. - */ - public function getInstanceFromId(int $id) : Pool - { - $specimenDAO = new SpecimenDAO($this->db); - $specimenIds = $this->getSpecimenIdsFromId($id); - $specimen = $specimenDAO->getInstanceFromId(intval($specimenIds[0])); - - $poolArray = $this->getInstanceDataFromId($id); - $poolArray['CandidateID'] = $specimen->getCandidateId(); - $poolArray['SessionID'] = $specimen->getSessionId(); - $poolArray['TypeID'] = $specimen->getTypeId(); - - $pool = $this->getInstanceFromSQL($poolArray, $specimenIds); - - return $pool; - } - - /** - * Queries data from the databse for the Pool at the requested ID. - * - * @param int $id Value of the $id for the Pool whose data is being queried. - * - * @return array Pool Data at that ID. - */ - private function getInstanceDataFromId(int $id) - { - // TODO: query date and time format from backend to know how to query - // them from the database. - $query = "SELECT bp.PoolID, - bp.Label, - bp.Quantity, - bp.UnitID, - bp.CenterID, - bp.Date, - DATE_FORMAT(bp.Time, '%H:%i') as Time - FROM biobank_pool bp - WHERE bp.PoolID=:i"; - return $this->db->pselectRow($query, array('i' => $id)); - } - - /** - * This function returns an array of all the Specimen Ids that are - * associated with the given Pool Instance's ID in the - * biobank_specimen_pool_rel table. - * - * @param int $id Pool id from which to query Specimen IDs - * - * @return array $specimenIds array of associated Specimen IDs - */ - private function getSpecimenIdsFromId(int $id) : array - { - $query = 'SELECT SpecimenID - FROM biobank_specimen_pool_rel - WHERE PoolID=:i'; - return $this->db->pselectcol($query, array('i' => $id)); - } - - // XXX: Currently this function is never used with any conditions passed as - // paramters. Decide if this is a necessary feature. - /** - * This will select all pools from the database that match the - * attribute values passed through $poolData and will return an array - * of pool objects. - * - * @param array $conditions Conditions to be met by the query - * - * @return array $pools List of Pool Objects that match the query - */ - public function selectInstances(array $conditions = null) : array - { - $query = 'SELECT PoolID - FROM biobank_pool'; - $query .= $conditions ? ' WHERE '.$this->db->implodeWithKeys(' AND ', $conditions) : ''; - - $result = $this->db->pselect($query, array()); - $pools = array(); - if (!empty($result)) { - foreach ($result as $row) { - $id = (int) $row['PoolID']; - $pool = $this->getInstanceFromId($id); - $pools[$id] = $pool; - } - } - - return $pools; - } - - /** - * Instantiates an ArrayIterator class that is composed of all the Pool - * Objects - * - * @return traversable Iterator of Pool Objects - */ - protected function getAllInstances() : \Traversable - { - return new \ArrayIterator($this->selectInstances()); - } - - /** - * This function recieves a Pool Object, converts it into an SQL format - * and inserts it into all relevant tables in the database. Certain - * information is then cascaded to the children of the Pool. - * - * @param Pool $pool The Pool to be inserted into the database. - * - * @return void - */ - public function saveInstance(Pool $pool) : void - { - //Convert Pool to SQL format. - $data = $this->getSQLFromInstance($pool); - - // TODO: Introduce a SQL Transaction here with a try catch. - // Insert or Update the biobank_pool table with respective data. - $this->db->insertOnDuplicateUpdate( - 'biobank_pool', - $data['biobank_pool'] - ); - - $poolId = $pool->getId(); - if (isset($poolId)) { - // If update: - // Do nothing. - } else { - // If insert: - $poolId = $this->db->getLastInsertId(); - // set the respective data array index to the value of the new - // pool ID - $specimenIds = $pool->getSpecimenIds(); - foreach ($specimenIds as $id) { - $data['biobank_specimen_pool_rel'][$id]['PoolID'] = $poolId; - } - } - - // insert or update biobank_specimen_pool_rel with relevant data. - foreach ($data['biobank_specimen_pool_rel'] as $insert) { - $this->db->insertOnDuplicateUpdate( - 'biobank_specimen_pool_rel', - $insert - ); - } - - // XXX: decide if quantity of all pooled specimens should go to 0. - // XXX: logic for adding preparations to pools will likely go here as well. - } - - /** - * This function takes a Pool array and prepares the data to be inserted - * into the database by converting it to a data array. This mapping is done - * to enable the update or insertion of data into the database directly from - * the resuling array. - * - * @param Pool $pool Pool array to be converted - * - * @return array $data Array containing the data to be inserted - */ - private function getSQLFromInstance(Pool $pool) : array - { - $poolData = array( - 'PoolID' => $pool->getId(), - 'Label' => $pool->getLabel(), - 'Quantity' => $pool->getQuantity(), - 'UnitID' => $pool->getUnitId(), - 'CenterID' => $pool->getCenterId(), - 'Date' => $pool->getDate()->format('Y-m-d'), - 'Time' => $pool->getTime()->format('H:i'), - ); - - $specimenIds = $pool->getSpecimenIds(); - foreach ($specimenIds as $id) { - $specimenPoolData[$id] = array( - 'PoolID' => $pool->getId(), - 'SpecimenID' => $id, - ); - } - - return array( - 'biobank_pool' => $poolData, - 'biobank_specimen_pool_rel' => $specimenPoolData, - ); - } - - /** - * This function takes an array that resulted from an SQL query and - * instantiates it as a Pool Object - * - * @param array $data Values to be reassigned. - * @param array $specimenIds List of specimen IDs associated with the given - * Pool. - * - * @return Pool - */ - private function getInstanceFromSQL(array $data, array $specimenIds) : Pool - { - $pool = new Pool(); - isset($data['PoolID']) && $pool->setId((int) $data['PoolID']); - isset($data['Label']) && $pool->setLabel((string) $data['Label']); - isset($data['Quantity']) && $pool->setQuantity((float) $data['Quantity']); - isset($data['UnitID']) && $pool->setUnitId((int) $data['UnitID']); - !empty($specimenIds) && $pool->setSpecimenIds($specimenIds); - isset($data['CandidateID']) && $pool->setCandidateId((int) $data['CandidateID']); - isset($data['SessionID']) && $pool->setSessionId((int) $data['SessionID']); - isset($data['TypeID']) && $pool->setTypeId((int) $data['TypeID']); - isset($data['CenterID']) && $pool->setCenterId((int) $data['CenterID']); - isset($data['Date']) && $pool->setDate(new \DateTime($data['Date'])); - isset($data['Time']) && $pool->setTime(new \DateTime($data['Time'])); - - return $pool; - } -} diff --git a/modules/biobank_nottracked/php/poolendpoint.class.inc b/modules/biobank_nottracked/php/poolendpoint.class.inc deleted file mode 100644 index 901b5466935..00000000000 --- a/modules/biobank_nottracked/php/poolendpoint.class.inc +++ /dev/null @@ -1,122 +0,0 @@ - - * @license http://www.gnu.org/licenses/gpl-3.0.text GPLv3 - * @link http://www.github.com/aces/Loris - */ -namespace LORIS\biobank; -use \Psr\Http\Message\ServerRequestInterface; -use \Psr\Http\Server\RequestHandlerInterface; -use \Psr\Http\Message\ResponseInterface; - -/** - * A class for handling the /biobank/pool/ endpoint. - * - * PHP Version 7.2 - * - * @category API - * @package Loris - * @subpackage Biobank - * @author Henri Rabalais - * @license http://www.gnu.org/licenses/gpl-3.0.text GPLv3 - * @link http://www.github.com/aces/Loris/ - */ -class PoolEndpoint implements RequestHandlerInterface -{ - /** - * Returns true if user has access to this endpoint. - * - * @param \User $user The user whose access is being checked. - * - * @return bool - */ - function _hasAccess(\User $user) : bool - { - return true; - } - - /** - * Return which methods are supported by this endpoint. - * - * @return array supported HTTP methods - */ - protected function allowedMethods() : array - { - return array( - 'GET', - 'POST', - 'OPTIONS', - ); - } - - /** - * This function passes the request to the handler. This is necessary since - * the Endpoint bypass the Module class. - * - * XXX: This function should be extracted to a parent class. - * - * @param ServerRequestInterface $request The PSR7 request. - * @param RequestHandlerInterface $handler The request handler. - * - * @return ResponseInterface The outgoing PSR7 response. - */ - public function process( - ServerRequestInterface $request, - RequestHandlerInterface $handler - ) : ResponseInterface { - return $handler->handle($request); - } - - /** - * Handles endpoint requests. - * - * @param ServerRequestInterface $request The incoming PSR7 request - * - * @return ResponseInterface The outgoing PSR7 response - */ - public function handle(ServerRequestInterface $request) : ResponseInterface - { - $db = \Database::singleton(); - $user = $request->getAttribute('user'); - $poolCont = new PoolController($db, $user); - - try { - $db->beginTransaction(); - switch($request->getMethod()) { - case 'GET': - $pools = $poolCont->getInstances(); - return new \LORIS\Http\Response\OK($pools); - case 'POST': - $pool = json_decode($request->getBody()->getContents(), true); - $poolCont->createInstance($pool); - return new \LORIS\Http\Response\OK(); - case 'OPTIONS': - return (new \LORIS\Http\Response()) - ->withHeader('Allow', $this->allowedMethods()); - } - } catch (\BadRequest $e) { - $db->rollBack(); - return new \LORIS\Http\Response\BadRequest($e->getMessage()); - } catch (\Forbidden $e) { - $db->rollBack(); - return new \LORIS\Http\Response\Forbidden($e->getMessage()); - } catch (\TypeError $e) { - $db->rollback(); - return new \LORIS\Http\Response\InternalServerError($e->getMessage()); - } catch (\DatabaseException $e) { - $db->rollBack(); - return new \LORIS\Http\Response\InternalServerError($e->getMessage()); - } finally { - if ($db->inTransaction()) { - $db->commit(); - } - } - } -} diff --git a/modules/biobank_nottracked/php/preparation.class.inc b/modules/biobank_nottracked/php/preparation.class.inc deleted file mode 100644 index 0971c505260..00000000000 --- a/modules/biobank_nottracked/php/preparation.class.inc +++ /dev/null @@ -1,73 +0,0 @@ - - * @license http://www.gnu.org/licenses/gpl-3.0.txt GPLv3 - * @link https://www.github.com/aces/Loris/ - */ - -namespace LORIS\biobank; - -/** - * Preparation Object Class - * This class contains an instance of a database handling that is needed to - * permanently store and retrieve Preparation Object instances. - * - * PHP Version 7.2 - * - * @category Entity - * @package Loris - * @subpackage Biobank - * @author Henri Rabalais - * @license http://www.gnu.org/licenses/gpl-3.0.txt GPLv3 - * @link https://www.github.com/aces/Loris/ - */ -class Preparation extends Process -{ - /** - * Instatiates a Preparation Object using the values sent from the client-side. - * - * @param array $data Data to be used to instantiate the Preparation Object. - * - * @return Process - */ - public function fromArray(array $data) : Process - { - parent::fromArray($data); - - return $this; - } - - /** - * A wrapper function for the jsonSerialize method of the Preparation Instance - * Class. This converts this Specimen Preparation into an array - * - * @return array Specimen Array - */ - public function toArray() - { - return $this->jsonSerialize(); - } - - /** - * Returns an array representing the state of the Specimen. - * - * @return array - */ - public function jsonSerialize() : array - { - $parent = parent::jsonSerialize(); - return array_merge( - $parent, - array() - ); - } -} - diff --git a/modules/biobank_nottracked/php/primarycontainerfilter.class.inc b/modules/biobank_nottracked/php/primarycontainerfilter.class.inc deleted file mode 100644 index c49d50b2359..00000000000 --- a/modules/biobank_nottracked/php/primarycontainerfilter.class.inc +++ /dev/null @@ -1,65 +0,0 @@ - - * @license http://www.gnu.org/licenses/gpl-3.0.txt GPLv3 - * @link https://www.github.com/aces/Loris/ - */ -namespace LORIS\biobank; - -/** - * PrimaryContainerFilter filters out primary or non primary containers, - * depending on the value passed to the constructor. - * - * PHP Version 7.2 - * - * @category Filter - * @package Loris - * @subpackage Biobank - * @author Henri Rabalais - * @license http://www.gnu.org/licenses/gpl-3.0.txt GPLv3 - * @link https://www.github.com/aces/Loris/ - */ -class PrimaryContainerFilter implements \LORIS\Data\Filter -{ - - /** - * $primary determines whether to filter primary or non primary containers. - * If the value is '1', primary containers will be filtered. If the value - * '0', non primary containers will be filtered. - */ - private $primary; - - /** - * Class constructor. - * - * @param int $primary A value of '0' or '1' which indicates if the - * container is primary. - */ - function __construct(int $primary) - { - $this->primary = $primary; - } - - /** - * Implements the \LORIS\Data\Filter interface - * - * @param User $user The user that the data is being filtered for. - * @param Container $container The container being filtered. - * - * @return bool true if the container is of type primary. - */ - public function filter(\User $user, \Loris\Data\DataInstance $container) : bool - { - $db = \Database::singleton(); - $containerDAO = new ContainerDAO($db); - $containerTypes = $containerDAO->getContainerTypes(); - return $containerTypes[$container->getTypeId()]['primary'] === $this->primary; - } -} diff --git a/modules/biobank_nottracked/php/process.class.inc b/modules/biobank_nottracked/php/process.class.inc deleted file mode 100644 index 9f270ec6f0b..00000000000 --- a/modules/biobank_nottracked/php/process.class.inc +++ /dev/null @@ -1,263 +0,0 @@ - - * @license http://www.gnu.org/licenses/gpl-3.0.txt GPLv3 - * @link https://www.github.com/aces/Loris/ - */ -namespace LORIS\biobank; - -/** - * Process Object Class - * This class contains an instance of a database handling that is needed to - * permanently store and retrieve Process Object instances. - * - * PHP Version 7.2 - * - * @category Entity - * @package Loris - * @subpackage Biobank - * @author Henri Rabalais - * @license http://www.gnu.org/licenses/gpl-3.0.txt GPLv3 - * @link https://www.github.com/aces/Loris/ - */ -abstract class Process implements \JsonSerializable -{ - /** - * Persistent Instance variables. - * - * These variables describe a process instance. - * - * @var int $protocolId - * @var int $centerId - * @var int $examinerId - * @var \DateTime $date - * @var \DateTime $time - * @var string $comments - * @var array $data - */ - private $protocolId; - private $centerId; - private $examinerId; - private $date; - private $time; - private $comments; - private $data; - - /** - * Initiliazes a new instance of the Process Class - */ - function __construct() - { - } - - /** - * Sets the ID of the specimen's processing protocol. - * - * @param int $protocolId the ID of the processing protocol - * - * @return void - */ - public function setProtocolId(int $protocolId) : void - { - if ($protocolId > 0) { - $this->protocolId = $protocolId; - } - } - - /** - * Gets the ID of the specimen's processing protocol. - * - * @return int - */ - public function getProtocolId() : int - { - return $this->protocolId; - } - - /** - * Sets the ID of the specimen's center at time of processing. - * - * @param int $centerId the ID of the processing center - * - * @return void - */ - public function setCenterId(int $centerId) : void - { - if ($centerId > 0) { - $this->centerId = $centerId; - } - } - - /** - * Gets the ID of the specimen's processing center - * - * @return int - */ - public function getCenterId() : int - { - return $this->centerId; - } - - /** - * Sets the ID of the specimen's examiner at time of processing. - * - * @param int $examinerId the ID of the processing center - * - * @return void - */ - public function setExaminerId(int $examinerId) : void - { - if ($examinerId > 0) { - $this->examinerId = $examinerId; - } - } - - /** - * Gets the ID of the specimen's processing examiner - * - * @return int - */ - public function getExaminerId() : int - { - return $this->examinerId; - } - - /** - * Sets the date of collection - * - * @param \DateTime $date the date of processing - * - * @return void - */ - public function setDate(\DateTime $date) : void - { - $this->date = $date; - } - - /** - * Gets the date of processing - * - * @return \DateTime - */ - public function getDate() : \DateTime - { - return $this->date; - } - - /** - * Sets the time of processing - * - * @param \DateTime $time the time of processing - * - * @return void - */ - public function setTime(\DateTime $time) : void - { - $this->time = $time; - } - - /** - * Gets the time of processing - * - * @return DateTime - */ - public function getTime() : \DateTime - { - return $this->time; - } - - /** - * Sets processing comments - * - * @param string $comments comments relating to processing - * - * @return void - */ - public function setComments(string $comments) : void - { - $this->comments = $comments; - } - - /** - * Gets the processing comments - * - * @return ?string - */ - public function getComments() : ?string - { - return $this->comments; - } - - /** - * Sets the Data array that contains custom attributes and values. - * - * @param array $data of custom attributes and values. - * - * @return void - */ - public function setData(array $data) : void - { - $this->data = $data; - } - - /** - * Gets the Data array that contains custom attributes and values. - * - * @return ?array - */ - public function getData() : ?array - { - return $this->data; - } - - /** - * Instatiates a Process Object using the values sent from the client-side. - * - * @param array $data Data to be used to instantiate the Process Object. - * - * @return Process - */ - public function fromArray(array $data) : Process - { - isset($data['protocolId']) && $this->setProtocolId((int) $data['protocolId']); - isset($data['centerId']) && $this->setCenterId((int) $data['centerId']); - isset($data['examinerId']) && $this->setExaminerId((int) $data['examinerId']); - isset($data['date']) && $this->setDate(new \DateTime($data['date'])); - isset($data['time']) && $this->setTime(new \DateTime($data['time'])); - isset($data['data']) && $this->setData($data['data']); - isset($data['comments']) && $this->setComments((string) $data['comments']); - - return $this; - } - - - /** - * Returns an array representing the state of the Process. - * - * @return array - */ - public function jsonSerialize() : array - { - // TODO: Date and Time formats should be gotten from some sort of config - // setting. - return array( - 'protocolId' => $this->protocolId, - 'centerId' => $this->centerId, - 'examinerId' => $this->examinerId, - 'date' => $this->date->format('Y-m-d'), - 'time' => $this->time->format('H:i'), - 'comments' => $this->comments, - 'data' => $this->data, - ); - } -} - diff --git a/modules/biobank_nottracked/php/specimen.class.inc b/modules/biobank_nottracked/php/specimen.class.inc deleted file mode 100644 index eb09df45067..00000000000 --- a/modules/biobank_nottracked/php/specimen.class.inc +++ /dev/null @@ -1,482 +0,0 @@ - - * @license http://www.gnu.org/licenses/gpl-3.0.txt GPLv3 - * @link https://www.github.com/aces/Loris/ - */ -namespace LORIS\biobank; - -/** - * Specimen Object Class - * This class contains an instance of a database handling that is needed to - * permanently store and retrieve Specimen Object instances. - * - * PHP Version 7.2 - * - * @category Entity - * @package Loris - * @subpackage Biobank - * @author Henri Rabalais - * @license http://www.gnu.org/licenses/gpl-3.0.txt GPLv3 - * @link https://www.github.com/aces/Loris/ - */ -class Specimen implements \JsonSerializable, \LORIS\Data\DataInstance -{ - /** - * Persistent Instance variables. - * - * These properties describe a specimen entity. - * - * @var int $id - * @var int $containerId - * @var int $typeId - * @var string $quantity - * @var int $unitId - * @var int $fTCycle - * @var array $parentSpecimenIds - * @var int $candidateId - * @var int $sessionId - * @var int $poolId - * @var Collection $collection - * @var Preparation $preparation - * @var Analysis $analysis - */ - private $id; - private $containerId; - private $typeId; - private $quantity; - private $unitId; - private $fTCycle; - private $parentSpecimenIds; - private $candidateId; - private $sessionId; - private $poolId; - private $collection; - private $preparation; - private $analysis; - - /** - * Initiliazes a new instance of the Specimen Class - */ - function __construct() - { - } - - /** - * Sets the specimen's ID. - * - * @param int $id the specimen's ID - * - * @return void - */ - public function setId(int $id) : void - { - if ($id > 0) { - $this->id = $id; - } - } - - /** - * Gets the specimen's ID - * - * @return int - */ - public function getId() : ?int - { - return $this->id; - } - - /** - * Sets the ID of the specimen's container - * - * @param int $containerId the ID of the specimen's container - * - * @return void - */ - public function setContainerId($containerId) : void - { - if ($containerId > 0) { - $this->containerId = $containerId; - } - } - - /** - * Gets the ID of the specimen's container - * - * @return int - */ - public function getContainerId() : ?int - { - return $this->containerId; - } - - /** - * Sets the ID of the specimen type - * - * @param int $typeId ID of the specimen type - * - * @return void - */ - public function setTypeId(int $typeId) : void - { - if ($typeId > 0) { - $this->typeId = $typeId; - } - } - - /** - * Gets the ID of the specimen type - * - * @return int - */ - public function getTypeId() : int - { - return $this->typeId; - } - - /** - * Sets the current amount of specimen available - * - * @param string $quantity the current amount of specimen available - * - * @return void - */ - public function setQuantity(string $quantity) : void - { - $this->quantity = $quantity; - } - - /** - * Gets the current amount of specimen available - * - * @return ?string - */ - public function getQuantity() : ?string - { - return $this->quantity; - } - - /** - * Sets the ID of the specimen's unit of quantity - * - * @param int $unitId the ID of the quantity's unit - * - * @return void - */ - public function setUnitId(int $unitId) : void - { - if ($unitId > 0) { - $this->unitId = $unitId; - } - } - - /** - * Gets the ID of the specimen's unit of quantity - * - * @return ?int - */ - public function getUnitId() : ?int - { - return $this->unitId; - } - - /** - * Sets the specimen's current Freeze-Thaw cycle. - * - * @param int $fTCycle the specimen's current F-T cycle - * - * @return void - */ - public function setFTCycle(int $fTCycle) : void - { - if ($fTCycle >= 0) { - $this->fTCycle = $fTCycle; - } - } - - /** - * Gets the specimen's current Freeze-Thaw cycle - * - * @return int - */ - public function getFTCycle() : ?int - { - return $this->fTCycle; - } - - /** - * Sets the parent specimen's ID. - * - * @param array $parentSpecimenIds the parent specimen's IDs - * - * @return void - */ - public function setParentSpecimenIds(array $parentSpecimenIds) : void - { - $this->parentSpecimenIds = $parentSpecimenIds; - } - - /** - * Gets the parent specimen's ID - * - * @return array - */ - public function getParentSpecimenIds() : ?array - { - return $this->parentSpecimenIds; - } - - /** - * Sets the ID of the candidate to which the specimen belongs - * - * @param int $candidateId ID of the specimen's donor - * - * @return void - */ - public function setCandidateId(int $candidateId) : void - { - if ($candidateId > 0) { - $this->candidateId = $candidateId; - } - } - - /** - * Gets the ID of the candidate to which the specimen belongs - * - * @return ?int - */ - public function getCandidateId() : ?int - { - return $this->candidateId; - } - - /** - * Sets the ID of the candidate's session/timepoint in which the specimen was collected - * - * @param int $sessionId the ID of the specimen's session of collection - * - * @return void - */ - public function setSessionId(int $sessionId) : void - { - if ($sessionId > 0) { - $this->sessionId = $sessionId; - } - } - - /** - * Gets the ID of the candidate's session/timepoint in which the specimen - * was collected. - * - * @return ?int - */ - public function getSessionId() : ?int - { - return $this->sessionId; - } - - /** - * Sets the ID of the specimen's pool group, if it exists. - * - * @param int $poolId the ID of the specimen's pool group - * - * @return void - */ - public function setPoolId(int $poolId) : void - { - if ($poolId > 0) { - $this->poolId = $poolId; - } - } - - /** - * Gets the ID of the specimen's pool group. - * - * @return int - */ - public function getPoolId() : ?int - { - return $this->poolId; - } - - /** - * Sets a Collection object for the Specimen. - * - * @param Collection $collection A collection instance - * - * @return void - */ - public function setCollection(Collection $collection) : void - { - $this->collection = $collection; - } - - /** - * Gets an associative array of data stored for the specimen's collection stage - * - * @return ?Collection - */ - public function getCollection() : ?Collection - { - return $this->collection; - } - - /** - * Sets a Preparation object for the Specimen. - * - * @param Preparation $preparation A Preparation Instance - * - * @return void - */ - public function setPreparation(Preparation $preparation) : void - { - $this->preparation = $preparation; - } - - /** - * Gets an associative array of data stored for the specimen's preparation - * stage. - * - * @return Preparation|null - */ - public function getPreparation() : ?Preparation - { - return $this->preparation; - } - - /** - * Sets an Analysis object for the Specimen. - * - * @param Analysis $analysis An Analysis Instance. - * - * @return void - */ - public function setAnalysis(Analysis $analysis) : void - { - $this->analysis = $analysis; - } - - /** - * Gets an associative array of data stored for the specimen's analysis stage - * - * @return Analysis|null - */ - public function getAnalysis() : ?Analysis - { - return $this->analysis; - } - - // FIXME: THIS IS A MASSIVE HACK. Specimens should not be provisioned if - // their Container is not provisioned. Therefore, a check must be made that - // the Container's Center ID is accesibile by the current User. This function - // allows this check to happen upon provisioner filtering. - /** - * Return Center ID of affiliated specimen container. - * - * @return int - */ - public function getCenterId() - { - $db = \Database::singleton(); - $containerDAO = new ContainerDAO($db); - $containerId = $this->getContainerId(); - $container = $containerDAO->getInstanceFromId($containerId); - return $container->getCenterId(); - } - - /** - * Instatiates a Specimen Object using the values sent from the front-end. - * - * @param array $data Data to be used to instantiate the Specimen Object. - * - * @return Specimen $specimen Instantiated Specimen Object - */ - public function fromArray(array $data) : Specimen - { - isset($data['id']) && $this->setId((int) $data['id']); - isset($data['containerId']) && $this->setContainerId((int) $data['containerId']); - isset($data['typeId']) && $this->setTypeId((int) $data['typeId']); - isset($data['quantity']) && $this->setQuantity((string) $data['quantity']); - isset($data['unitId']) && $this->setUnitId((int) $data['unitId']); - isset($data['fTCycle']) && $this->setFTCycle((int) $data['fTCycle']); - isset($data['parentSpecimenIds']) && $this->setParentSpecimenIds($data['parentSpecimenIds']); - isset($data['candidateId']) && $this->setCandidateId((int) $data['candidateId']); - isset($data['sessionId']) && $this->setSessionId((int) $data['sessionId']); - isset($data['poolId']) && $this->setPoolId((int) $data['poolId']); - - if (isset($data['collection'])) { - $collection = (new Collection())->fromArray($data['collection']); - $this->setCollection($collection); - } - - if (isset($data['preparation'])) { - $preparation = (new Preparation())->fromArray($data['preparation']); - $this->setPreparation($preparation); - } - if (isset($data['analysis'])) { - $analysis = (new Analysis())->fromArray($data['analysis']); - $this->setAnalysis($analysis); - } - - return $this; - } - - /** - * A wrapper function for the jsonSerialize method of the Specimen Instance - * Class. This converts this Specimen Instance into an array - * - * @return array - */ - public function toArray() : array - { - return $this->jsonSerialize(); - } - - /** - * Returns an array representing the state of the Specimen. - * - * @return array - */ - public function jsonSerialize() : array - { - $array = array( - 'id' => $this->id, - 'containerId' => $this->containerId, - 'typeId' => $this->typeId, - 'quantity' => $this->quantity, - 'unitId' => $this->unitId, - 'fTCycle' => $this->fTCycle, - 'parentSpecimenIds' => $this->parentSpecimenIds, - 'candidateId' => $this->candidateId, - 'sessionId' => $this->sessionId, - 'poolId' => $this->poolId, - 'collection' => $this->collection->jsonSerialize(), - ); - if ($this->preparation) { - $array['preparation'] = $this->preparation->jsonSerialize(); - } - if ($this->analysis) { - $array['analysis'] = $this->analysis->jsonSerialize(); - } - return $array; - } - - /** - * Returns a JSON encoded string of the state of the Specimen - * - * @return string JSON encoded string of Specimen data - */ - public function toJSON() : string - { - return json_encode($this); - } -} diff --git a/modules/biobank_nottracked/php/specimencontroller.class.inc b/modules/biobank_nottracked/php/specimencontroller.class.inc deleted file mode 100644 index 3bb5bc7fbaa..00000000000 --- a/modules/biobank_nottracked/php/specimencontroller.class.inc +++ /dev/null @@ -1,569 +0,0 @@ - - * @license http://www.gnu.org/licenses/gpl-3.0.text GPLv3 - * @link http://www.github.com/aces/Lors/ - */ -namespace LORIS\biobank; - -/** - * This class features the code that enables access to the Specimens of the LORIS - * Biobank Module. - * - * PHP Version 7.2 - * - * @category Controller - * @package Loris - * @subpackage Biobank - * @author Henri Rabalais - * @license http://www.gnu.org/licenses/gpl-3.0.text GPLv3 - * @link http://www.github.com/aces/Lors/ - */ -class SpecimenController -{ - /** - * Private instances of the Database, User and ContainerDAO classes - * - * @var \Database $db - * @var \User $user - * @var SpecimenDAO $dao - */ - private $db; - private $user; - private $dao; - - /** - * Specimen Controller Class constructor - * - * @param Database $db Database Instance. - * @param User $user User Instance. - */ - function __construct(\Database $db, \User $user) - { - $this->db = $db; - $this->user = $user; - $this->dao = $this->getDataProvisioner(); - } - - /** - * Get all Specimen Objects permitted by the Specimen Data Provisioner (DAO). - * - * @return array - */ - public function getInstances() : array - { - $this->validatePermission('view'); - $specimens = array(); - $specimenIt = $this->dao->execute($this->user); - foreach ($specimenIt as $id => $specimen) { - $specimens[$id] = $specimen; - } - - return $specimens; - } - - /** - * This method takes in a list of specimen and container arrays from the - * front-end. The specimens are validated while the containers are - * sent to their respective controller to be validated and saved. The ids of - * the saved containers are set to the specimen instances which are then - * sent to the DAO to be saved. - * - * @param array $list a list of specimen and container arrays to be created. - */ - public function createInstances(array $list) : void - { - $this->validatePermission('create'); - - foreach ($list as $i => $specimen) { - $containerList[$i] = $specimen['container']; - $specimenList[$i] = $this->prepare($specimen); - } - - $contController = new ContainerController($this->db, $this->user); - $containers = $contController->createInstances($containerList); - - foreach ($specimenList as $i => $specimen) { - $specimen->setContainerId($containers[$i]->getId()); - $this->dao->saveInstance($specimen); - } - } - - /** - * This method takes in a specimen array from the front-end, validates it, - * instantiates it and then sends it to the DAO to be saved to the - * database. - * - * @param array $specimenArray specimen array to be created - * - * @return \Specimen updated specimen - */ - public function updateInstance(array $specimenArray) : Specimen - { - $this->validatePermission('update'); - $specimen = $this->prepare($specimenArray); - $specimenId = $this->dao->saveInstance($specimen); - return $this->dao->getInstanceFromId($specimenId); - } - - /** - * Converts data into a specimen intance validates the specimen. - * - * @param array $specimenArray Specimen data to be instantiated - * - * @return Specimen $specimen to be submitted - */ - private function prepare(array $specimenArray) : Specimen - { - $specimen = (new Specimen)->fromArray($specimenArray); - $this->validateInstance($specimen); - - return $specimen; - } - - /** - * Get all data associated with the Specimen entity. This is used for - * front-end mapping and populating form options. - * - * @return array Associative array of option data. - */ - public function getOptions() : array - { - $this->validatePermission('view'); - return array( - 'types' => $this->dao->getTypes(), - 'typeUnits' => $this->dao->getTypeUnits(), - 'typeContainerTypes' => $this->dao->getTypeContainerTypes(), - 'protocols' => $this->dao->getProtocols(), - 'processes' => $this->dao->getProcesses(), - 'protocolAttributes' => $this->dao->getProtocolAttributes(), - 'protocolContainers' => $this->dao->getProtocolContainers(), - 'units' => $this->dao->getUnits(), - 'attributeDatatypes' => $this->dao->getAttributeDatatypes(), - 'attributeOptions' => $this->dao->getAttributeReferenceTableOptions(), - ); - } - - /** - * Treats the Specimen DAO as a Provisioner that can be iteratated - * through to provide the permissable Specimen Objects for the current User. - * - * @return \LORIS\Data\Provisioner - */ - private function getDataProvisioner() : \LORIS\Data\Provisioner - { - $dao = new SpecimenDAO($this->db); - - if ($this->user->hasPermission('access_all_profiles') === false) { - $dao = $dao->filter(new \LORIS\Data\Filters\UserSiteMatch()); - } - return $dao; - } - - /** - * Checks User Permissions for creating or updating Specimen Objects. - * - * @param string $method User requested action - * - * @return void - */ - private function validatePermission(string $method) : void - { - switch($method) { - case 'view': - if (!$this->user->hasPermission('biobank_specimen_view')) { - throw new \Forbidden('Specimen: View Permission Denied'); - } - case 'update': - if (!$this->user->hasPermission('biobank_specimen_update')) { - throw new \Forbidden('Specimen: Update Permission Denied'); - } - case 'create': - if (!$this->user->hasPermission('biobank_specimen_create')) { - throw new \Forbidden('Specimen: Create Permission Denied'); - } - } - } - - /** - * Validates Specimen Data before being saved - * - * @param Specimen $specimen Specimen to be validated. - * - * @return void - */ - private function validateInstance(Specimen $specimen) : void - { - $this->validateTypeId($specimen); - $this->validateQuantity($specimen); - $this->validateUnitId($specimen); - $this->validateFTCycle($specimen); - $this->validateParentSpecimenIds($specimen); - $this->validateCandidateId($specimen); - $this->validateSessionId($specimen); - $this->validateCollection($specimen); - $this->validatePreparation($specimen); - $this->validateAnalysis($specimen); - } - - /** - * Validates Specimen Object Type ID. - * - * @param Specimen $specimen Specimen to be validated. - * - * @throws BadRequest if the provided Specimen does not meet validation requirements. - * - * @return void - */ - private function validateTypeId(Specimen $specimen) : void - { - if (is_null($specimen->getTypeId())) { - throw new \BadRequest("Specimen Type value must be set"); - } - } - - /** - * Validates Specimen Object Quantity. - * - * @param Specimen|Process $object Object to be validated. - * - * @throws BadRequest if the provided object does not meet validation requirements. - * - * @return void - */ - private function validateQuantity(object $object) : void - { - $quantity = $object->getQuantity(); - if (is_null($quantity)) { - throw new \BadRequest('Specimen Quantity value must be set'); - } - if (!(is_numeric($quantity) && is_float(floatval($quantity)))) { - throw new \BadRequest('Specimen Quantity value must be a number'); - } - //TODO: This is where a capacity check would go, i.e. $quantity > $capacity. - if ($quantity < 0) { - throw new \BadRequest('Specimen Quantity cannot be less than 0'); - } - } - - /** - * Validates Specimen Object Unit ID. - * - * @param Specimen|Process $object Object to be validated. - * - * @throws BadRequest if the provided object does not meet validation requirements. - * - * @return void - */ - private function validateUnitId(object $object) : void - { - if (is_null($object->getUnitId())) { - throw new \BadRequest("Specimen Unit value must be set"); - } - } - - /** - * Validates Specimen Object FT Cycle. - * - * @param Specimen $specimen Specimen to be validated. - * - * @throws BadRequest if the provided Specimen does not meet validation requirements. - * - * @return void - */ - private function validateFTCycle(Specimen $specimen) : void - { - $fTCycle = $specimen->getFTCycle(); - if (isset($fTCycle)) { - if (!is_numeric($fTCycle) || intval($fTCycle) < 0) { - throw new \BadRequest("F/T Cycle must be 0 or more"); - } - } - } - - /** - * Validates Specimen Object Parent Specimen IDs. - * - * @param Specimen $specimen Specimen to be validated. - * - * @throws BadRequest if the provided Specimen does not meet validation requirements. - * - * @return void - */ - private function validateParentSpecimenIds(Specimen $specimen) : void - { - $parentSpecimenIds = $specimen->getParentSpecimenIds(); - if ($parentSpecimenIds) { - $baseParentSpecimen = $this->dao->getInstanceFromId((int) $parentSpecimenIds[0]); - } - $specimenTypes = $this->dao->getTypes(); - - foreach ($parentSpecimenIds as $parentSpecimenId) { - $parentSpecimen = $this->dao->getInstanceFromId((int) $parentSpecimenId); - - if ($baseParentSpecimen->getCandidateId() != $parentSpecimen->getCandidateId()) { - throw new \BadRequest('Parent Specimens must be from the same Candidate'); - } - - if ($baseParentSpecimen->getSessionId() != $parentSpecimen->getSessionId()) { - throw new \BadRequest('Parent Specimens must be from the same Session'); - } - - if ($baseParentSpecimen->getTypeId() != $parentSpecimen->getTypeId()) { - throw new \BadRequest('Parent Specimens must be of the same Type'); - } - - if (!in_array($parentSpecimen->getTypeId(), - $specimenTypes[$specimen->getTypeId()]['parentTypeIds']) - ) { - throw new \BadRequest('Parent Specimens must be of a type that - is a parent to the current Specimen type'); - } - } - } - - /** - * Validates Specimen Object Candidate ID. - * - * @param Specimen $specimen Specimen to be validated. - * - * @throws BadRequest if the provided Specimen does not meet validation requirements. - * - * @return void - */ - private function validateCandidateId(Specimen $specimen) : void - { - if (is_null($specimen->getCandidateId())) { - throw new \BadRequest("PSCID value must be set"); - } - } - - /** - * Validates Specimen Object Session ID. - * - * @param Specimen $specimen Specimen to be validated. - * - * @throws BadRequest if the provided Specimen does not meet validation requirements. - * - * @return void - */ - private function validateSessionId(Specimen $specimen) : void - { - if (is_null($specimen->getSessionId())) { - throw new \BadRequest("Visit Label value must be set"); - } - } - - /** - * Validates Specimen Object Collection. - * - * @param Specimen $specimen Specimen to be validated. - * - * @throws BadRequest if the provided Specimen does not meet validation requirements. - * - * @return void - */ - private function validateCollection(Specimen $specimen) : void - { - $collection = $specimen->getCollection(); - $this->validateProtocolId($collection); - $this->validateExaminerId($collection); - $this->validateQuantity($collection); - $this->validateUnitId($collection); - $this->validateCenterId($collection); - $this->validateDate($collection); - $this->validateTime($collection); - $this->validateData($collection); - } - - /** - * Validates Specimen Object Preparation. - * - * @param Specimen $specimen Specimen to be validated. - * - * @throws BadRequest if the provided Specimen does not meet validation requirements. - * - * @return void - */ - private function validatePreparation(Specimen $specimen) : void - { - $preparation = $specimen->getPreparation(); - if (isset($preparation)) { - $this->validateProtocolId($preparation); - $this->validateExaminerId($preparation); - $this->validateCenterId($preparation); - $this->validateDate($preparation); - $this->validateTime($preparation); - $this->validateData($preparation); - } - } - - /** - * Validates Specimen Object Type ID. - * - * @param Specimen $specimen Specimen to be validated. - * - * @throws BadRequest if the provided Specimen does not meet validation requirements. - * - * @return void - */ - private function validateAnalysis(Specimen $specimen) : void - { - // Validate Analysis - $analysis = $specimen->getAnalysis(); - if (isset($analysis)) { - $this->validateProtocolId($analysis); - $this->validateExaminerId($analysis); - $this->validateCenterId($analysis); - $this->validateDate($analysis); - $this->validateTime($analysis); - $this->validateData($analysis); - } - } - - /** - * Validates Specimen Process Protocol ID. - * - * @param Process $process Process to be validated. - * - * @throws BadRequest if the provided Specimen does not meet validation requirements. - * - * @return void - */ - private function validateProtocolId(Process $process) : void - { - if (is_null($process->getProtocolId())) { - throw new \BadRequest('Specimen Processing Protocol must be set'); - } - } - - /** - * Validates Specimen Process Examiner ID. - * - * @param Process $process Process to be validated. - * - * @throws BadRequest if the provided Specimen does not meet validation requirements. - * - * @return void - */ - private function validateExaminerId(Process $process) : void - { - if (is_null($process->getProtocolId())) { - throw new \BadRequest('Specimen Processing Examiner must be set'); - } - // TODO: Potentially check that examinerId is within the set of possible - // values. I.e. an ID of the examiner table. - } - - /** - * Validates Specimen Process Center ID. - * - * @param Process $process Process to be validated. - * - * @throws BadRequest if the provided Process does not meet validation requirements. - * - * @return void - */ - private function validateCenterId(Process $process) : void - { - if (is_null($process->getCenterId())) { - throw new \BadRequest('Specimen Processing Center must be set'); - } - } - - // XXX: Now that the DateTime object is used to store date and time, - // I don't know if these checks are as important because the DateTime - // doesn't have a native format. As long as it can be converted to - // datetime properly, then there isn't really need for validation here. - // TODO: - /** - * Validates Specimen Process Date. - * - * @param Process $process Process to be validated. - * - * @throws BadRequest if the provided Process does not meet validation requirements. - * - * @return void - */ - private function validateDate(Process $process) : void - { - // TODO: query date format from backend configuration. - // $format = 'd-m-Y'; - // $date = \DateTime::createFromFormat($format, $pool->getDate()); - // if ($date && $date->format($format) !== $pool->getDate()) { - // throw new \BadRequest("Processing date must be of the format: $format"); - // } - } - - /** - * Validates Specimen Process Time. - * - * @param Process $process Process to be validated. - * - * @throws BadRequest if the provided Process does not meet validation requirements. - * - * @return void - */ - private function validateTime(Process $process) : void - { - // TODO: query time format from backend configuration. - // $format = 'H:i'; - // $time = \DateTime::createFromFormat($format, $pool->getTime()); - // if ($time && $time->format($format) !== $pool->getTime()) { - // throw new \BadRequest("Processing time must be of the format: $format"); - // } - } - - /** - * Validates Specimen Process Data. - * - * @param Process $process Process to be validated. - * - * @throws BadRequest if the provided Process does not meet validation requirements. - * - * @return void - */ - private function validateData(Process $process) : void - { - $protocolAttributes = $this->dao->getProtocolAttributes(); - $attributeDatatypes = $this->dao->getAttributeDatatypes(); - $protocolId = $process->getProtocolId(); - $attributes = $protocolAttributes[$protocolId]; - $data = $process->getData(); - - foreach ($data as $attributeId => $value) { - $attribute = $attributes[$attributeId]; - - if (!array_key_exists($attributeId, $attributes)) { - throw new \BadRequest(""); - } - - if ($attributeDatatypes[$attribute['datatypeId']]['datatype'] === 'boolean') { - if (false) { - throw new \BadRequest($attribute['label'] . " must be a boolean ". $value); - } - } - if ($attributeDatatypes[$attribute['datatypeId']]['datatype'] === 'number') { - if (false) { - throw new \BadRequest(""); - } - } - if ($attributeDatatypes[$attribute['datatypeId']]['datatype'] === 'text') { - } - if ($attributeDatatypes[$attribute['datatypeId']]['datatype'] === 'date') { - } - if ($attributeDatatypes[$attribute['datatypeId']]['datatype'] === 'time') { - } - if ($attributeDatatypes[$attribute['datatypeId']]['datatype'] === 'file') { - } - } - } -} diff --git a/modules/biobank_nottracked/php/specimendao.class.inc b/modules/biobank_nottracked/php/specimendao.class.inc deleted file mode 100644 index 433f3645b58..00000000000 --- a/modules/biobank_nottracked/php/specimendao.class.inc +++ /dev/null @@ -1,678 +0,0 @@ - - * @license http://www.gnu.org/licenses/gpl-3.0.txt GPLv3 - * @link https://www.github.com/aces/Loris/ - */ -namespace LORIS\biobank; - -/** - * Specimen Data Access Object (DAO) Class - * This class contains all database handling that is needed to - * permanently store and retrieve Specimen Object instances - * - * PHP Version 7.2 - * - * @category DAO - * @package Loris - * @subpackage Biobank - * @author Henri Rabalais - * @license http://www.gnu.org/licenses/gpl-3.0.txt GPLv3 - * @link https://www.github.com/aces/Loris/ - */ -class SpecimenDAO extends \LORIS\Data\ProvisionerInstance -{ - /** - * Private instance of the Database class. - * - * @var \Database $dao - */ - private $db; - - /** - * Initializes a new instance of the SpecimenDAO Class - * - * @param Database $db Instance of the LORIS Database class - */ - function __construct(\Database $db) - { - $this->db = $db; - } - - // XXX: I'm not sure if this function is really necessary since it is only - // being used once, and should likely not be accessed outside this class. - /** - * This method is used when the DAO class needs to create a new Specimen - * instance. - * - * @return Specimen - */ - private function getInstance() : Specimen - { - return new Specimen(); - } - - /** - * This will load all specimen persistence variables from the database for a - * given $id into a Specimen object, and return the object. - * - * @param int $id Value of the $id for the Specimen that will be - * instantiated - * - * @return Specimen $specimen Specimen Instance. - */ - public function getInstanceFromId(int $id) : Specimen - { - $specimenData = $this->getInstanceDataFromId($id); - $parentSpecimenIds = $this->getParentSpecimenIdsFromId($id); - $specimen = $this->getInstanceFromSQL($specimenData, $parentSpecimenIds); - - return $specimen; - } - - /** - * Queries data from the database for the Specimen at the requested ID. - * - * @param int $id Value of the $id for the Specimen whose data is being - * queried. - * - * @return array Specimen Data at that ID. - */ - private function getInstanceDataFromId(int $id) - { - $query = "SELECT bs.SpecimenID, - bs.ContainerID, - bs.SpecimenTypeID, - bs.Quantity, - bs.UnitID, - bsf.FreezeThawCycle, - s.CandID as CandidateID, - bs.SessionID, - bspr.PoolID, - bsc.SpecimenProtocolID as CollectionProtocolID, - bsc.Quantity as CollectionQuantity, - bsc.UnitID as CollectionUnitID, - bsc.CenterID as CollectionCenterID, - bsc.ExaminerID as CollectionExaminerID, - bsc.Date as CollectionDate, - bsc.Time as CollectionTime, - bsc.Comments as CollectionComments, - bsc.Data as CollectionData, - bsp.SpecimenProtocolID as PreparationProtocolID, - bsp.CenterID as PreparationCenterID, - bsp.ExaminerID as PreparationExaminerID, - bsp.Date as PreparationDate, - bsp.Time as PreparationTime, - bsp.Comments as PreparationComments, - bsp.Data as PreparationData, - bsa.SpecimenProtocolID as AnalysisProtocolID, - bsa.CenterID as AnalysisCenterID, - bsa.ExaminerID as AnalysisExaminerID, - bsa.Date as AnalysisDate, - bsa.Time as AnalysisTime, - bsa.Comments as AnalysisComments, - bsa.Data as AnalysisData - FROM biobank_specimen bs - LEFT JOIN biobank_specimen_freezethaw bsf - USING (SpecimenID) - LEFT JOIN session s - ON bs.SessionID=s.ID - LEFT JOIN biobank_specimen_pool_rel bspr - USING (SpecimenID) - LEFT JOIN biobank_specimen_collection bsc - USING (SpecimenID) - LEFT JOIN biobank_specimen_preparation bsp - USING (SpecimenID) - LEFT JOIN biobank_specimen_analysis bsa - USING (SpecimenID) - WHERE bs.SpecimenID=:i"; - return $this->db->pselectRow($query, array('i' => $id)); - } - - /** - * This function returns an array of all the Parent Specimen IDs that are - * associated with the given Specimen ID in the biobank_specimen_parent - * table. - * - * @param int $id of Specimen - * - * @return array $parentSpecimenIds List of Specimen IDs that are - * parents of the given Specimen ID - */ - public function getParentSpecimenIdsFromId(int $id) : array - { - $query = 'SELECT ParentSpecimenID - FROM biobank_specimen_parent - WHERE SpecimenID=:i'; - return $this->db->pselectcol($query, array('i' => $id)); - } - - /** - * This will select all specimens from the database that match the - * attribute values passed by $conditions and will return an array - * of specimen objects. - * - * @param array $conditions Conditions to be met by the query - * - * @return array $specimens List of Specimen Objects that match the query - */ - public function selectInstances(array $conditions = null) : array - { - $query = 'SELECT SpecimenID - FROM biobank_specimen'; - $query .= $conditions ? ' WHERE '.$this->db->implodeWithKeys(' AND ', $conditions) : ''; - - $result = $this->db->pselect($query, array()); - $specimens = array(); - if (!empty($result)) { - foreach ($result as $row) { - $id = intval($row['SpecimenID']); - $specimen = $this->getInstanceFromId($id); - $specimens[$id] = $specimen; - } - } - - return $specimens; - } - - /** - * Instantiates an ArrayIterator class that is composed of all the Specimen - * Objects. - * - * @return traversable Iterator of Specimen Objects - */ - protected function getAllInstances() : \Traversable - { - return new \ArrayIterator($this->selectInstances()); - } - - - /** - * Queries all rows of the biobank_specimen_type table and returns a nested - * array with the ID field as the index. - * - * @return array $types All data concerning each specimen type - */ - public function getTypes() : array - { - $query = "SELECT SpecimenTypeID as id, - Label as label, - FreezeThaw as freezeThaw - FROM biobank_specimen_type"; - $types = $this->db->pselectWithIndexKey($query, array(), 'id'); - - $query = "SELECT SpecimenTypeID as id, - ParentSpecimenTypeID as parentId - FROM biobank_specimen_type_parent"; - $result = $this->db->pselect($query, array()); - foreach ($result as $row) { - $types[$row['id']]['parentTypeIds'][] = $row['parentId']; - } - - return $types; - } - - /** - * Queries all rows of the biobank_specimen_protocol table and returns a - * nested array with the ID field as the index. - * - * @return array $protocols All data concerning each specimen - * protocol. - */ - public function getProtocols() : array - { - $query = "SELECT SpecimenProtocolID as id, - Label as label, - SpecimenProcessID as processId, - SpecimenTypeID as typeId - FROM biobank_specimen_protocol"; - $protocols = $this->db->pselectWithIndexKey($query, array(), 'id'); - - return $protocols; - } - - /** - * Queries all rows of the biobank_specimen_process table and returns a - * nested array with the ID field as the index. - * - * @return array $processes All data concerning each specimen - * process. - */ - public function getProcesses() : array - { - $query = "SELECT SpecimenProcessID as id, - Label as label - FROM biobank_specimen_process"; - $processes = $this->db->pselectWithIndexKey($query, array(), 'id'); - - return $processes; - } - - /** - * Queries all rows of the biobank_datatype table and returns a nested array - * with the ID field as the index - * - * @return array $attributeDatatypes All data concerning each attribute datatype - */ - public function getAttributeDatatypes() : array - { - $query = 'SELECT DatatypeID as id, - Datatype as datatype - FROM biobank_specimen_attribute_datatype'; - $attributeDatatypes = $this->db->pselectWithIndexKey($query, array(), 'id'); - - return $attributeDatatypes; - } - - /** - * Queries all rows the biobank_reference_table table. This data is used to - * query the referenced tables and columns and build a nested array of - * reference table option values, with the Reference Table ID as the index. - * - * @return array $attributeOptions A nested array of attribute reference - * table options indexed by Reference Table - * ID - */ - public function getAttributeReferenceTableOptions() : array - { - $query = 'SELECT ReferenceTableID as id, - TableName as tableName, - ColumnName as columnName - FROM biobank_specimen_attribute_referencetable'; - $attributeOptionsReferences = $this->db->pselect($query, array()); - - $attributeOptions = array(); - foreach ($attributeOptionsReferences as $reference) { - $query = 'SELECT '.$reference['columnName'].' FROM '.$reference['tableName']; - $result = $this->db->pselect($query, array()); - - $options = array(); - foreach ($result as $row) { - $options[$row[$reference['columnName']]] = $row[$reference['columnName']]; - } - - $attributeOptions[$reference['id']] = $options; - } - - return $attributeOptions; - } - - - // XXX: This should potentially be queried from a table called - // `biobank_specimen_units` since containers are not currently using units. - // Discussions need to be had with Rida regarding this. - /** - * Queries all rows of the biobank_unit table and returns a nested - * array with the ID field as the index. - * - * @return array $specimenUnits All data concerning each unit - */ - public function getUnits() : array - { - $query = "SELECT UnitID as id, - Label as label - FROM biobank_unit"; - $units = $this->db->pselectWithIndexKey($query, array(), 'id'); - - return $units; - } - - /** - * Queries all rows of the biobank_specimen_type_unit_rel table and returns - * a nested array of specimen unit values, with the Type ID as the first index, - * and the Unit ID as the second index. - * - * @return array $typeUnits A nested array of unit values index by - * Type ID and Unit ID - */ - public function getTypeUnits() : array - { - $query = "SELECT bst.SpecimenTypeID as typeId, - bu.UnitID as unitId, - bu.Label as label - FROM biobank_specimen_type_unit_rel bstu - JOIN biobank_specimen_type bst USING (SpecimenTypeID) - JOIN biobank_unit bu USING (UnitID)"; - $result = $this->db->pselect($query, array()); - $typeUnits = array(); - foreach ($result as $row) { - foreach ($row as $value) { - $typeUnits[$row['typeId']][$row['unitId']]['label'] = $row['label']; - } - } - - return $typeUnits; - } - - /** - * Queries all rows of the biobank_specimen_type_container_type_rel table - * and returns a nested array of container type value, with the specimen - * Type ID as the index. - * - * @return array $typeContainerTypes A nested array of container type values - * indexex by Specimen Type ID. - */ - public function getTypeContainerTypes() : array - { - $query = "SELECT SpecimenTypeID as specimenTypeId, - ContainerTypeID as containerTypeId - FROM biobank_specimen_type_container_type_rel"; - $result = $this->db->pselect($query, array()); - $typeContainerTypes = array(); - foreach ($result as $row) { - $typeContainerTypes[$row['specimenTypeId']][] = $row['containerTypeId']; - } - - return $typeContainerTypes; - } - - /** - * Queries all rows from the biobank_specimen_protocol_attribute_rel table - * and returns a nested array of specimen-protocol-specific attribute data - * with the Protocol ID as the first index, and the Attribute ID as the - * second index. - * - * @return array $pA A nested array of attribute data indexed by Protocol - * ID and Attribute ID - */ - public function getProtocolAttributes() : array - { - $query = "SELECT bsp.SpecimenProtocolID as protocolId, - bsa.SpecimenAttributeID as attributeId, - bsa.Label as label, - bsa.DatatypeID as datatypeId, - bsa.ReferenceTableID as refTableId, - bspa.Required as required - FROM biobank_specimen_protocol_attribute_rel bspa - LEFT JOIN biobank_specimen_protocol bsp - USING (SpecimenProtocolID) - LEFT JOIN biobank_specimen_attribute bsa - USING (SpecimenAttributeID)"; - $result = $this->db->pselect($query, array()); - $pA = array(); //protocolAttributes - foreach ($result as $row) { - foreach ($row as $value) { - $pA[$row['protocolId']][$row['attributeId']]['label'] = $row['label']; - $pA[$row['protocolId']][$row['attributeId']]['datatypeId'] = $row['datatypeId']; - $pA[$row['protocolId']][$row['attributeId']]['refTableId'] = $row['refTableId']; - $pA[$row['protocolId']][$row['attributeId']]['required'] = (int) $row['required']; - } - } - - return $pA; - } - - /** - * Queries all rows from the biobank_specimen_protocol_container_type_rel - * table and returns a nested array of specimen-protocol-specific attribute - * data with the Protocol ID as the first index, and the Attribute ID as the - * second index. - * - * @return array $pA A nested array of attribute data indexed by Protocol - * ID and Attribute ID - */ - public function getProtocolContainers() : array - { - $query = "SELECT SpecimenProtocolID as protocolId, - ContainerTypeID as typeId - FROM biobank_specimen_protocol_container_type_rel"; - $result = $this->db->pselect($query, array()); - $pC = array(); //protocolContainers - foreach ($result as $row) { - $type[] = $row['typeId']; - $pC[$row['protocolId']] = $type; - } - - return $pC; - } - - /** - * This function receives a Specimen Object, converts it into a SQL format - * and inserts it into all relevant tables in the database. - * - * @param Specimen $specimen The Specimen Object to be saved the - * database. - * - * @return void - */ - public function saveInstance(Specimen $specimen) : int - { - // Converts Specimen Object into SQL format. - $data = $this->getSQLFromInstance($specimen); - - // Inserts or Updates the biobank_specimen table with respective data. - $this->db->insertOnDuplicateUpdate( - 'biobank_specimen', - $data['biobank_specimen'] - ); - - $specimenId = $specimen->getId(); - if (isset($specimenId)) { - // If update: - // Do nothing. - } else { - // If insert: - $specimen->setId((int) $this->db->getLastInsertId()); - // set the respective data array index to the value of the new - // specimen ID - $parentSpecimenIds = $specimen->getParentSpecimenIds(); - foreach ($parentSpecimenIds as $id) { - $data['biobank_specimen_parent'][$id] - = array( - 'SpecimenID' => $specimen->getId(), - 'ParentSpecimenID' => $id, - ); - } - $data['biobank_specimen_freezethaw']['SpecimenID'] = $specimen->getId(); - $data['biobank_specimen_collection']['SpecimenID'] = $specimen->getId(); - $data['biobank_specimen_preparation']['SpecimenID'] = $specimen->getId(); - $data['biobank_specimen_analysis']['SpecimenID'] = $specimen->getId(); - } - - // Insert or update biobank_specimen_collection with respective data. - $this->db->unsafeInsertOnDuplicateUpdate( - 'biobank_specimen_collection', - $data['biobank_specimen_collection'] - ); - - // If protocol exists, insert or update biobank_specimen_preparation - // with respective data. - if (isset($data['biobank_specimen_preparation']['SpecimenProtocolID'])) { - $this->db->unsafeInsertOnDuplicateUpdate( - 'biobank_specimen_preparation', - $data['biobank_specimen_preparation'] - ); - } - - // If method exists, insert or update biobank_specimen_analysis - // with respective data. - if (isset($data['biobank_specimen_analysis']['SpecimenMethodID'])) { - $this->db->unsafeInsertOnDuplicateUpdate( - 'biobank_specimen_analysis', - $data['biobank_specimen_analysis'] - ); - } - - // If parent exists, insert or update biobank_specimen_parent - // with respective data. - if (isset($data['biobank_specimen_parent'])) { - foreach ($data['biobank_specimen_parent'] as $insert) { - $this->db->insertOnDuplicateUpdate( - 'biobank_specimen_parent', - $insert - ); - } - } - - // If F/T Cycle exists, insert or update biobank_specimen_freezethaw - // with respective data. - $fTCycle = $specimen->getFTCycle(); - if (isset($fTCycle)) { - $this->db->insertOnDuplicateUpdate( - 'biobank_specimen_freezethaw', - $data['biobank_specimen_freezethaw'] - ); - } - - return $specimen->getId(); - } - - /** - * This function takes a Specimen Instance and prepares the data to be - * inserted into the database by converting it to a data array. This one to - * one mapping is done to enable the update or insertion of data into the - * database directly from the resulting arrays. - * - * @param Specimen $specimen Specimen Instance to be converted - * - * @return array $data Array containing the data to be inserted - */ - private function getSQLFromInstance(Specimen $specimen) : array - { - $specimenData = array( - 'SpecimenID' => $specimen->getId(), - 'ContainerID' => $specimen->getContainerId(), - 'SpecimenTypeID' => $specimen->getTypeId(), - 'Quantity' => $specimen->getQuantity(), - 'UnitID' => $specimen->getUnitId(), - 'SessionID' => $specimen->getSessionId(), - ); - - $freezeThawData = array( - 'SpecimenID' => $specimen->getId(), - 'FreezeThawCycle' => $specimen->getFTCycle(), - ); - - $collection = $specimen->getCollection(); - $collectionData = array( - 'SpecimenID' => $specimen->getId(), - 'SpecimenProtocolID' => $collection->getProtocolId(), - 'Quantity' => $collection->getQuantity(), - 'UnitID' => $collection->getUnitId(), - 'CenterID' => $collection->getCenterId(), - 'ExaminerID' => $collection->getExaminerId(), - 'Date' => $collection->getDate()->format('Y-m-d H:i'), - 'Time' => $collection->getTime()->format('Y-m-d H:i'), - 'Comments' => $collection->getComments(), - ); - if ($collection->getData()) { - $collectionData['Data'] = json_encode($collection->getData()); - } - - $preparation = $specimen->getPreparation(); - if (isset($preparation)) { - $preparationData = array( - 'SpecimenID' => $specimen->getId(), - 'SpecimenProtocolID' => $preparation->getProtocolId(), - 'CenterID' => $preparation->getCenterId(), - 'ExaminerID' => $preparation->getExaminerId(), - 'Date' => $preparation->getDate()->format('Y-m-d H:i'), - 'Time' => $preparation->getTime()->format('Y-m-d H:i'), - 'Comments' => $preparation->getComments(), - ); - - if ($preparation->getData()) { - $preparationData['Data'] = json_encode($preparation->getData()); - } - } - - $analysis = $specimen->getAnalysis(); - if (isset($analysis)) { - $analysisData = array( - 'SpecimenID' => $specimen->getId(), - 'SpecimenProtocolID' => $analysis->getProtocolId(), - 'CenterID' => $analysis->getCenterId(), - 'ExaminerID' => $analysis->getExaminerId(), - 'Date' => $analysis->getDate()->format('Y-m-d H:i'), - 'Time' => $analysis->getTime()->format('Y-m-d H:i'), - 'Comments' => $analysis->getComments(), - ); - - if ($analysis->getData()) { - $analysisData['Data'] = json_encode($analysis->getData()); - } - } - - return $data = array( - 'biobank_specimen' => $specimenData, - 'biobank_specimen_freezethaw' => $freezeThawData, - 'biobank_specimen_collection' => $collectionData, - 'biobank_specimen_preparation' => $preparationData, - 'biobank_specimen_analysis' => $analysisData, - ); - } - - /** - * This function takes an array that resulted from an SQL query and - * instantiates it as a Specimen Object. - * - * @param array $data Values to be converted to array. - * @param array $parentSpecimenIds IDs of the parent Specimen. - * - * @return Specimen - */ - private function getInstanceFromSQL(array $data, array $parentSpecimenIds) : Specimen - { - $specimen = $this->getInstance(); - isset($data['SpecimenID']) && $specimen->setId((int) $data['SpecimenID']); - isset($data['ContainerID']) && $specimen->setContainerId((int) $data['ContainerID']); - isset($data['SpecimenTypeID']) && $specimen->setTypeId((int) $data['SpecimenTypeID']); - isset($data['Quantity']) && $specimen->setQuantity((string) $data['Quantity']); - isset($data['UnitID']) && $specimen->setUnitId((int) $data['UnitID']); - isset($data['FreezeThawCycle']) && $specimen->setFTCycle((int) $data['FreezeThawCycle']); - !empty($parentSpecimenIds) && $specimen->setParentSpecimenIds(!empty($parentSpecimenIds) ? $parentSpecimenIds : null); - isset($data['CandidateID']) && $specimen->setCandidateId((int) $data['CandidateID']); - isset($data['SessionID']) && $specimen->setSessionId((int) $data['SessionID']); - isset($data['PoolID']) && $specimen->setPoolId((int) $data['PoolID']); - - $collection = new Collection(); - isset($data['CollectionProtocolID']) && $collection->setProtocolId((int) $data['CollectionProtocolID']); - isset($data['CollectionQuantity']) && $collection->setQuantity((string) $data['CollectionQuantity']); - isset($data['CollectionUnitID']) && $collection->setUnitId((int) $data['CollectionUnitID']); - isset($data['CollectionCenterID']) && $collection->setCenterId((int) $data['CollectionCenterID']); - isset($data['CollectionExaminerID']) && $collection->setExaminerId((int) $data['CollectionExaminerID']); - isset($data['CollectionDate']) && $collection->setDate(new \DateTime($data['CollectionDate'])); - isset($data['CollectionTime']) && $collection->setTime(new \DateTime($data['CollectionTime'])); - isset($data['CollectionComments']) && $collection->setComments((string) $data['CollectionComments']); - isset($data['CollectionData']) && $collection->setData(json_decode($data['CollectionData'], true)); - $specimen->setCollection($collection); - - // XXX: These checks for instantiating $prepartion and $analysis are not - // the best. Perhaps they should be queried separately and it should be - // checked whether or not the array itself exists. - $preparation = new Preparation(); - if ($data['PreparationProtocolID']) { - isset($data['PreparationProtocolID']) && $preparation->setProtocolId((int) $data['PreparationProtocolID']); - isset($data['PreparationCenterID']) && $preparation->setCenterId((int) $data['PreparationCenterID']); - isset($data['PreparationExaminerID']) && $preparation->setExaminerId((int) $data['PreparationExaminerID']); - isset($data['PreparationDate']) && $preparation->setDate(new \DateTime($data['PreparationDate'])); - isset($data['PreparationTime']) && $preparation->setTime(new \DateTime($data['PreparationTime'])); - isset($data['PreparationComments']) && $preparation->setComments((string) $data['PreparationComments']); - isset($data['PreparationData']) && $preparation->setData(json_decode($data['PreparationData'], true)); - $specimen->setPreparation($preparation); - } - - if ($data['AnalysisProtocolID']) { - $analysis = new Analysis(); - isset($data['AnalysisProtocolID']) && $analysis->setProtocolId((int) $data['AnalysisProtocolID']); - isset($data['AnalysisCenterID']) && $analysis->setCenterId((int) $data['AnalysisCenterID']); - isset($data['AnalysisExaminerID']) && $analysis->setExaminerId((int) $data['AnalysisExaminerID']); - isset($data['AnalysisDate']) && $analysis->setDate(new \DateTime($data['AnalysisDate'])); - isset($data['AnalysisTime']) && $analysis->setTime(new \DateTime($data['AnalysisTime'])); - isset($data['AnalysisComments']) && $analysis->setComments((string) $data['AnalysisComments']); - isset($data['AnalysisData']) && $analysis->setData(json_decode($data['AnalysisData'], true)); - $specimen->setAnalysis($analysis); - } - - return $specimen; - } -} diff --git a/modules/biobank_nottracked/php/specimenendpoint.class.inc b/modules/biobank_nottracked/php/specimenendpoint.class.inc deleted file mode 100644 index 24bdc28c8d2..00000000000 --- a/modules/biobank_nottracked/php/specimenendpoint.class.inc +++ /dev/null @@ -1,171 +0,0 @@ - - * @license http://www.gnu.org/licenses/gpl-3.0.text GPLv3 - * @link http://www.github.com/aces/Loris/ - */ -namespace LORIS\biobank; -use \Psr\Http\Message\ServerRequestInterface; -use \Psr\Http\Server\RequestHandlerInterface; -use \Psr\Http\Message\ResponseInterface; - -/** - * A class for handling the /biobank/specimens/ endpoint. - * - * PHP Version 7.2 - * - * @category Biobank - * @package Main - * @subpackage Biobank - * @author Henri Rabalais - * @license http://www.gnu.org/licenses/gpl-3.0.text GPLv3 - * @link http://www.github.com/aces/Lors/ - */ -class SpecimenEndpoint implements RequestHandlerInterface -{ - /** - * Returns true if user has acces to this Endpoint. - * - * @param \User $user The user whose access is being checked - * - * @return bool - */ - function _hasAccess(\User $user) : bool - { - return true; - } - - /** - * Return which methods are supported by this endpoint. - * - * @return array supported HTTP methods - */ - protected function allowedMethods() : array - { - return array( - 'GET', - 'PUT', - 'POST', - 'OPTIONS', - ); - } - - /** - * This function passes the request to the handler. This is necessary since - * the Endpoint bypass the Module class. - * - * TODO: This function should be extracted to a parent class. - * - * @param ServerRequestInterface $request The PSR7 request. - * @param RequestHandlerInterface $handler The request handler. - * - * @return ResponseInterface The outgoing PSR7 response. - */ - public function process( - ServerRequestInterface $request, - RequestHandlerInterface $handler - ) : ResponseInterface { - return $handler->handle($request); - } - - /** - * Handles Endpoint requests - * - * @param ServerRequestInterface $request The incoming PSR7 request - * - * @return ResponseInterface The outgoing PSR7 response - */ - public function handle(ServerRequestInterface $request) : ResponseInterface - { - $db = \Database::singleton(); - $user = $request->getAttribute('user'); - $specCont = new SpecimenController($db, $user); - - try { - $db->beginTransaction(); - switch($request->getMethod()) { - case 'GET': - $specimens = $specCont->getInstances(); - return new \LORIS\Http\Response\OK($specimens); - case 'POST': - $specimens = json_decode($request->getBody()->getContents(), true); - $specCont->createInstances($specimens); - - if (!empty($request->getUploadedFiles())) { - $response = $this->uploadFiles($request); - if ($response->getStatusCode() !== 200) { - $db->rollBack(); - return $response; - } - } - return new \LORIS\Http\Response\OK(); - case 'PUT': - $specimenArray = json_decode($request->getBody()->getContents(), true); - $specimen = $specCont->updateInstance($specimenArray); - return new \LORIS\Http\Response\OK([$specimen]); - case 'OPTIONS': - return (new \LORIS\Http\Response()) - ->withHeader('Allow', $this->allowedMethods()); - } - - // I would like to move this logic into the controller, but the only - // way to do that while maintaining - } catch (\BadRequest $e) { - $db->rollBack(); - return new \LORIS\Http\Response\BadRequest($e->getMessage()); - } catch (\Forbidden $e) { - $db->rollBack(); - return new \LORIS\Http\Response\Forbidden($e->getMessage()); - } catch (\NotFound $e) { - $db->rollBack(); - return new \LORIS\Http\Response\NotFound($e->getMessage()); - } catch (\DatabaseException $e) { - $db->rollBack(); - return new \LORIS\Http\Response\InternalServerError($e->getMessage()); - } catch (\TypeError $e) { - $db->rollBack(); - return new \LORIS\Http\Response\InternalServerError($e->getMessage()); - } catch (\Exception $e) { - $db->rollBack(); - // PUT SOMETHING HERE LATER - return new \LORIS\Http\Response\BadRequest($e->getMessage()); - } finally { - if ($db->inTransaction()) { - $db->commit(); - } - } - } - - /** - * Validates and Uploades files - * - * @param ServerRequestInterface $request The incoming PSR7 request - * containg the files to be uploaded. - * - * @return ResponseInterface - */ - public function uploadFiles(ServerRequestInterface $request) : ResponseInterface - { - $config = \NDB_Config::singleton(); - $path = $config->getSetting('biobankPath'); - - if (!isset($path)) { - throw new \NotFound('Biobank File Upload Path is not configured'); - } - $targetdir = new \SplFileInfo($path); - - $uploader = (new \LORIS\FilesUploadHandler($targetdir)) - ->withPermittedMIMETypes( - 'text/plain' - ); - - return $uploader->handle($request); - } -} diff --git a/modules/biobank_nottracked/sql/CRUDATA.sql b/modules/biobank_nottracked/sql/CRUDATA.sql deleted file mode 100644 index 71e9c926aef..00000000000 --- a/modules/biobank_nottracked/sql/CRUDATA.sql +++ /dev/null @@ -1,321 +0,0 @@ -/*Container*/ -INSERT INTO biobank_unit (Label) -VALUES ('µL'), - ('mL') -; - -INSERT INTO biobank_container_capacity (Quantity, UnitId) -VALUES (10, (select UnitID from biobank_unit where Label='mL')), - (1000, (select UnitID from biobank_unit where Label='µL')) -; - -INSERT INTO biobank_container_dimension (X, XNumerical, Y, YNumerical, Z, ZNumerical) -VALUES (1, 1, 5, 1, 1, 1), - (6, 1, 1, 1, 1, 1), - (4, 1, 4, 1, 1, 1), - (1, 1, 3, 1, 1, 1), - (4, 1, 1, 1, 1, 1), - (6, 1, 4, 1, 1, 1), - (10, 0, 10, 1, 1, 1), - (5, 0, 5, 1, 1, 1), - (1, 1, 12, 1, 1, 1) -; - -INSERT INTO biobank_container_type (Brand, ProductNumber, Label, `Primary`, ContainerCapacityID, ContainerDimensionID) -VALUES ('FreezerCo.', '##1', 'Freezer - 5 Shelf', 0, NULL, - (select ContainerDimensionID from biobank_container_dimension where X=1 and Y=5 and Z=1)), - ('ShelfCo.', '##1', 'Shelf - 6 Rack', 0, NULL, - (select ContainerDimensionID from biobank_container_dimension where X=6 and Y=1 and Z=1)), - ('RackCo.', '##1', 'Rack - 16 Box', 0, NULL, - (select ContainerDimensionID from biobank_container_dimension where X=4 and Y=4 and Z=1)), - ('FreezerCo.', '##2', 'Freezer - 3 Shelf', 0, NULL, - (select ContainerDimensionID from biobank_container_dimension where X=1 and Y=3 and Z=1)), - ('ShelfCo.', '##2', 'Shelf - 4 Rack', 0, NULL, - (select ContainerDimensionID from biobank_container_dimension where X=4 and Y=1 and Z=1)), - ('RackCo.', '##2', 'Rack - 28 Box', 0, NULL, - (select ContainerDimensionID from biobank_container_dimension where X=6 and Y=4 and Z=1)), - ('MatrixCo.', '##1', 'Matrix Box - 10x10', 0, NULL, - (select ContainerDimensionID from biobank_container_dimension where X=10 and Y=10 and Z=1)), - ('Core Cryolab', 'MVE HEco Series 800-190', 'LN2 Tank', 0, NULL, - (select ContainerDimensionID from biobank_container_dimension where X=4 and Y=4 and Z=1)), - ('RackCo.', '##3', 'LN2 Rack - 10x10 box', 0, NULL, - (select ContainerDimensionID from biobank_container_dimension where X=1 and Y=12 and Z=1)), - ('RackCo.', '##4', 'LN2 Rack - 5x5 box', 0, NULL, - (select ContainerDimensionID from biobank_container_dimension where X=1 and Y=12 and Z=1)), - ('MatrixCo.', '##2', 'Matrix Box - 5x5', 0, NULL, - (select ContainerDimensionID from biobank_container_dimension where X=5 and Y=5 and Z=1)), - ('Vacutainer', '366430', 'Red Top Tube (RTT)', 1, - (select ContainerCapacityID from biobank_container_capacity where Quantity=10 - and UnitID=(select UnitID from biobank_unit where Label='mL')), - NULL), - ('Vacutainer', '366480', 'Green Top Tube (GTT)', 1, - (select ContainerCapacityID from biobank_container_capacity where Quantity=10 - and UnitID=(select UnitID from biobank_unit where Label='mL')), - NULL), - ('Vacutainer', '366643', 'Purple Top Tube (PTT)', 1, - (select ContainerCapacityID from biobank_container_capacity where Quantity=10 - and UnitID=(select UnitID from biobank_unit where Label='mL')), - NULL), - ('Vacutainer', '###', 'Cryotube Vial', 1, - (select ContainerCapacityID from biobank_container_capacity where Quantity=1000 - and UnitID=(select UnitID from biobank_unit where Label='µL')), - NULL) -; - -/*Specimen*/ -INSERT INTO biobank_specimen_type (Label, FreezeThaw) -VALUES ('Blood', 0), - ('Urine', 0), - ('Saliva', 0), - ('Serum', 1), - ('Plasma', 1), - ('DNA', 1), - ('PBMC', 0), - ('IPSC', 0), - ('CSF', 1), - ('Muscle Biopsy', 0), - ('Skin Biopsy', 0) -; - -INSERT INTO biobank_specimen_type_parent (SpecimenTypeID, ParentSpecimenTypeID) -VALUES ((select SpecimenTypeID from biobank_specimen_type where Label='Serum'), - (select SpecimenTypeID from biobank_specimen_type where Label='Blood')), - ((select SpecimenTypeID from biobank_specimen_type where Label='Plasma'), - (select SpecimenTypeID from biobank_specimen_type where Label='Blood')), - ((select SpecimenTypeID from biobank_specimen_type where Label='DNA'), - (select SpecimenTypeID from biobank_specimen_type where Label='Blood')), - ((select SpecimenTypeID from biobank_specimen_type where Label='DNA'), - (select SpecimenTypeID from biobank_specimen_type where Label='Saliva')), - ((select SpecimenTypeID from biobank_specimen_type where Label='PBMC'), - (select SpecimenTypeID from biobank_specimen_type where Label='Blood')) -; - -INSERT INTO biobank_specimen_protocol (Label, SpecimenProcessID, SpecimenTypeID) -VALUES ('Blood Collection', - (SELECT SpecimenProcessID FROM biobank_specimen_process WHERE Label='Collection'), - (SELECT SpecimenTypeID FROM biobank_specimen_type WHERE Label='Blood') - ), - ('Saliva Collection', - (SELECT SpecimenProcessID FROM biobank_specimen_process WHERE Label='Collection'), - (SELECT SpecimenTypeID FROM biobank_specimen_type WHERE Label='Saliva') - ), - ('DNA Isolation From Blood (BB-P-0002)', - (SELECT SpecimenProcessID FROM biobank_specimen_process WHERE Label='Collection'), - (SELECT SpecimenTypeID FROM biobank_specimen_type WHERE Label='DNA') - ), - ('DNA Isolation From Saliva', - (SELECT SpecimenProcessID FROM biobank_specimen_process WHERE Label='Collection'), - (SELECT SpecimenTypeID FROM biobank_specimen_type WHERE Label='DNA') - ), - ('PBMC Isolation (BB-P-0001)', - (SELECT SpecimenProcessID FROM biobank_specimen_process WHERE Label='Collection'), - (SELECT SpecimenTypeID FROM biobank_specimen_type WHERE Label='PBMC') - ), - ('Serum Isolation (BB-P-0003)', - (SELECT SpecimenProcessID FROM biobank_specimen_process WHERE Label='Collection'), - (SELECT SpecimenTypeID FROM biobank_specimen_type WHERE Label='Serum') - ), - ('Blood Processing for PBMC (BB-P-0001)', - (SELECT SpecimenProcessID FROM biobank_specimen_process WHERE Label='Preparation'), - (SELECT SpecimenTypeID FROM biobank_specimen_type WHERE Label='Blood') - ), - ('Blood Processing for Serum (BB-P-0003)', - (SELECT SpecimenProcessID FROM biobank_specimen_process WHERE Label='Preparation'), - (SELECT SpecimenTypeID FROM biobank_specimen_type WHERE Label='Blood') - ), - ('Blood Processing for DNA (BB-P-0002)', - (SELECT SpecimenProcessID FROM biobank_specimen_process WHERE Label='Preparation'), - (SELECT SpecimenTypeID FROM biobank_specimen_type WHERE Label='Blood') - ), - ('Skin Biopsy Processing', - (SELECT SpecimenProcessID FROM biobank_specimen_process WHERE Label='Preparation'), - (SELECT SpecimenTypeID FROM biobank_specimen_type WHERE Label='Skin Biopsy') - ), - ('Saliva Processing for DNA', - (SELECT SpecimenProcessID FROM biobank_specimen_process WHERE Label='Preparation'), - (SELECT SpecimenTypeID FROM biobank_specimen_type WHERE Label='Saliva') - ), - ('CSF Processing', - (SELECT SpecimenProcessID FROM biobank_specimen_process WHERE Label='Preparation'), - (SELECT SpecimenTypeID FROM biobank_specimen_type WHERE Label='CSF') - ) -; - -INSERT INTO biobank_specimen_attribute (Label, DatatypeID, ReferenceTableID) -VALUES ('Clotted', (SELECT DatatypeID FROM biobank_specimen_attribute_datatype WHERE Datatype='boolean'), NULL), - ('Tube Expired', (SELECT DatatypeID FROM biobank_specimen_attribute_datatype WHERE Datatype='boolean'), NULL), - ('Centrifuge Start #1', (SELECT DatatypeID FROM biobank_specimen_attribute_datatype WHERE Datatype='time'), NULL), - ('Centrifuge End #1', (SELECT DatatypeID FROM biobank_specimen_attribute_datatype WHERE Datatype='time'), NULL), - ('Centrifuge Start #2', (SELECT DatatypeID FROM biobank_specimen_attribute_datatype WHERE Datatype='time'), NULL), - ('Centrifuge End #2', (SELECT DatatypeID FROM biobank_specimen_attribute_datatype WHERE Datatype='time'), NULL), - ('Centrifuge Start #3', (SELECT DatatypeID FROM biobank_specimen_attribute_datatype WHERE Datatype='time'), NULL), - ('Centrifuge End #3', (SELECT DatatypeID FROM biobank_specimen_attribute_datatype WHERE Datatype='time'), NULL), - ('Centrifuge Start #4', (SELECT DatatypeID FROM biobank_specimen_attribute_datatype WHERE Datatype='time'), NULL), - ('Centrifuge End #4', (SELECT DatatypeID FROM biobank_specimen_attribute_datatype WHERE Datatype='time'), NULL), - ('Red Pellet', (SELECT DatatypeID FROM biobank_specimen_attribute_datatype WHERE Datatype='boolean'), NULL), - ('Total PBMC Count (10⁶/mL cells)', (SELECT DatatypeID FROM biobank_specimen_attribute_datatype WHERE Datatype='number'), NULL), - ('Milky Serum', (SELECT DatatypeID FROM biobank_specimen_attribute_datatype WHERE Datatype='boolean'), NULL), - ('Hemolyzed', (SELECT DatatypeID FROM biobank_specimen_attribute_datatype WHERE Datatype='boolean'), NULL), - ('Hemodialysis Index', (SELECT DatatypeID FROM biobank_specimen_attribute_datatype WHERE Datatype='number'), NULL), - ('No Visible Pellet', (SELECT DatatypeID FROM biobank_specimen_attribute_datatype WHERE Datatype='boolean'), NULL), - ('DNA Concentration (ng/µL)', (SELECT DatatypeID FROM biobank_specimen_attribute_datatype WHERE Datatype='number'), NULL), - ('260/280 Ratio', (SELECT DatatypeID FROM biobank_specimen_attribute_datatype WHERE Datatype='number'), NULL), - ('Incubation Start #1', (SELECT DatatypeID FROM biobank_specimen_attribute_datatype WHERE Datatype='time'), NULL), - ('Incubation End #1', (SELECT DatatypeID FROM biobank_specimen_attribute_datatype WHERE Datatype='time'), NULL), - ('Incubation Start #2', (SELECT DatatypeID FROM biobank_specimen_attribute_datatype WHERE Datatype='time'), NULL), - ('Incubation End #2', (SELECT DatatypeID FROM biobank_specimen_attribute_datatype WHERE Datatype='time'), NULL), - ('Incubation Start #3', (SELECT DatatypeID FROM biobank_specimen_attribute_datatype WHERE Datatype='time'), NULL), - ('Incubation End #3', (SELECT DatatypeID FROM biobank_specimen_attribute_datatype WHERE Datatype='time'), NULL), - ('Airdry Start #1', (SELECT DatatypeID FROM biobank_specimen_attribute_datatype WHERE Datatype='time'), NULL), - ('Airdry End #1', (SELECT DatatypeID FROM biobank_specimen_attribute_datatype WHERE Datatype='time'), NULL), - ('Blood Contamination', (SELECT DatatypeID FROM biobank_specimen_attribute_datatype WHERE Datatype='boolean'), NULL), - ('Bring To Pathology', (SELECT DatatypeID FROM biobank_specimen_attribute_datatype WHERE Datatype='boolean'), NULL), - ('Bring To Pathology Start #1', (SELECT DatatypeID FROM biobank_specimen_attribute_datatype WHERE Datatype='time'), NULL), - ('Bring To Pathology End #1', (SELECT DatatypeID FROM biobank_specimen_attribute_datatype WHERE Datatype='time'), NULL) - -; - -INSERT INTO biobank_specimen_protocol_attribute_rel (SpecimenProtocolID, SpecimenAttributeID, Required) -VALUES ((select SpecimenProtocolID from biobank_specimen_protocol where Label='Blood Processing for PBMC (BB-P-0001)'), - (select SpecimenAttributeID from biobank_specimen_attribute where Label='Clotted'), 0), - ((select SpecimenProtocolID from biobank_specimen_protocol where Label='Blood Processing for PBMC (BB-P-0001)'), - (select SpecimenAttributeID from biobank_specimen_attribute where Label='Tube Expired'), 0), - ((select SpecimenProtocolID from biobank_specimen_protocol where Label='Blood Processing for PBMC (BB-P-0001)'), - (select SpecimenAttributeID from biobank_specimen_attribute where Label='Centrifuge Start #1'), 1), - ((select SpecimenProtocolID from biobank_specimen_protocol where Label='Blood Processing for PBMC (BB-P-0001)'), - (select SpecimenAttributeID from biobank_specimen_attribute where Label='Centrifuge End #1'), 1), - ((select SpecimenProtocolID from biobank_specimen_protocol where Label='Blood Processing for PBMC (BB-P-0001)'), - (select SpecimenAttributeID from biobank_specimen_attribute where Label='Centrifuge Start #2'), 1), - ((select SpecimenProtocolID from biobank_specimen_protocol where Label='Blood Processing for PBMC (BB-P-0001)'), - (select SpecimenAttributeID from biobank_specimen_attribute where Label='Centrifuge End #2'), 1), - ((select SpecimenProtocolID from biobank_specimen_protocol where Label='Blood Processing for PBMC (BB-P-0001)'), - (select SpecimenAttributeID from biobank_specimen_attribute where Label='Centrifuge Start #3'), 1), - ((select SpecimenProtocolID from biobank_specimen_protocol where Label='Blood Processing for PBMC (BB-P-0001)'), - (select SpecimenAttributeID from biobank_specimen_attribute where Label='Centrifuge End #3'), 1), - ((select SpecimenProtocolID from biobank_specimen_protocol where Label='Blood Processing for Serum (BB-P-0003)'), - (select SpecimenAttributeID from biobank_specimen_attribute where Label='Tube Expired'), 0), - ((select SpecimenProtocolID from biobank_specimen_protocol where Label='Blood Processing for Serum (BB-P-0003)'), - (select SpecimenAttributeID from biobank_specimen_attribute where Label='Centrifuge Start #1'), 1), - ((select SpecimenProtocolID from biobank_specimen_protocol where Label='Blood Processing for Serum (BB-P-0003)'), - (select SpecimenAttributeID from biobank_specimen_attribute where Label='Centrifuge End #1'), 1), - ((select SpecimenProtocolID from biobank_specimen_protocol where Label='Blood Processing for DNA (BB-P-0002)'), - (select SpecimenAttributeID from biobank_specimen_attribute where Label='Tube Expired'), 0), - ((select SpecimenProtocolID from biobank_specimen_protocol where Label='Blood Processing for DNA (BB-P-0002)'), - (select SpecimenAttributeID from biobank_specimen_attribute where Label='Incubation Start #1'), 1), - ((select SpecimenProtocolID from biobank_specimen_protocol where Label='Blood Processing for DNA (BB-P-0002)'), - (select SpecimenAttributeID from biobank_specimen_attribute where Label='Incubation End #1'), 1), - ((select SpecimenProtocolID from biobank_specimen_protocol where Label='Blood Processing for DNA (BB-P-0002)'), - (select SpecimenAttributeID from biobank_specimen_attribute where Label='Centrifuge Start #1'), 1), - ((select SpecimenProtocolID from biobank_specimen_protocol where Label='Blood Processing for DNA (BB-P-0002)'), - (select SpecimenAttributeID from biobank_specimen_attribute where Label='Centrifuge End #1'), 1), - ((select SpecimenProtocolID from biobank_specimen_protocol where Label='Blood Processing for DNA (BB-P-0002)'), - (select SpecimenAttributeID from biobank_specimen_attribute where Label='Centrifuge Start #2'), 1), - ((select SpecimenProtocolID from biobank_specimen_protocol where Label='Blood Processing for DNA (BB-P-0002)'), - (select SpecimenAttributeID from biobank_specimen_attribute where Label='Centrifuge End #2'), 1), - ((select SpecimenProtocolID from biobank_specimen_protocol where Label='Blood Processing for DNA (BB-P-0002)'), - (select SpecimenAttributeID from biobank_specimen_attribute where Label='Centrifuge Start #3'), 1), - ((select SpecimenProtocolID from biobank_specimen_protocol where Label='Blood Processing for DNA (BB-P-0002)'), - (select SpecimenAttributeID from biobank_specimen_attribute where Label='Centrifuge End #3'), 1), - ((select SpecimenProtocolID from biobank_specimen_protocol where Label='Blood Processing for DNA (BB-P-0002)'), - (select SpecimenAttributeID from biobank_specimen_attribute where Label='Centrifuge Start #4'), 1), - ((select SpecimenProtocolID from biobank_specimen_protocol where Label='Blood Processing for DNA (BB-P-0002)'), - (select SpecimenAttributeID from biobank_specimen_attribute where Label='Centrifuge End #4'), 1), - ((select SpecimenProtocolID from biobank_specimen_protocol where Label='Blood Processing for DNA (BB-P-0002)'), - (select SpecimenAttributeID from biobank_specimen_attribute where Label='Airdry Start #1'), 1), - ((select SpecimenProtocolID from biobank_specimen_protocol where Label='Blood Processing for DNA (BB-P-0002)'), - (select SpecimenAttributeID from biobank_specimen_attribute where Label='Airdry End #1'), 1), - ((select SpecimenProtocolID from biobank_specimen_protocol where Label='PBMC Isolation (BB-P-0001)'), - (select SpecimenAttributeID from biobank_specimen_attribute where Label='Clotted'), 0), - ((select SpecimenProtocolID from biobank_specimen_protocol where Label='PBMC Isolation (BB-P-0001)'), - (select SpecimenAttributeID from biobank_specimen_attribute where Label='Red Pellet'), 0), - ((select SpecimenProtocolID from biobank_specimen_protocol where Label='PBMC Isolation (BB-P-0001)'), - (select SpecimenAttributeID from biobank_specimen_attribute where Label='Total PBMC Count (10⁶/mL cells)'), 1), - ((select SpecimenProtocolID from biobank_specimen_protocol where Label='Serum Isolation (BB-P-0003)'), - (select SpecimenAttributeID from biobank_specimen_attribute where Label='Milky Serum'), 0), - ((select SpecimenProtocolID from biobank_specimen_protocol where Label='Serum Isolation (BB-P-0003)'), - (select SpecimenAttributeID from biobank_specimen_attribute where Label='Hemolyzed'), 0), - ((select SpecimenProtocolID from biobank_specimen_protocol where Label='Serum Isolation (BB-P-0003)'), - (select SpecimenAttributeID from biobank_specimen_attribute where Label='Hemodialysis Index'), 0), - ((select SpecimenProtocolID from biobank_specimen_protocol where Label='DNA Isolation From Blood (BB-P-0002)'), - (select SpecimenAttributeID from biobank_specimen_attribute where Label='Red Pellet'), 0), - ((select SpecimenProtocolID from biobank_specimen_protocol where Label='DNA Isolation From Blood (BB-P-0002)'), - (select SpecimenAttributeID from biobank_specimen_attribute where Label='No Visible Pellet'), 0), - ((select SpecimenProtocolID from biobank_specimen_protocol where Label='DNA Isolation From Blood (BB-P-0002)'), - (select SpecimenAttributeID from biobank_specimen_attribute where Label='DNA Concentration (ng/µL)'), 1), - ((select SpecimenProtocolID from biobank_specimen_protocol where Label='DNA Isolation From Blood (BB-P-0002)'), - (select SpecimenAttributeID from biobank_specimen_attribute where Label='260/280 Ratio'), 1), - ((select SpecimenProtocolID from biobank_specimen_protocol where Label='Skin Biopsy Processing'), - (select SpecimenAttributeID from biobank_specimen_attribute where Label='Incubation Start #1'), 1), - ((select SpecimenProtocolID from biobank_specimen_protocol where Label='Skin Biopsy Processing'), - (select SpecimenAttributeID from biobank_specimen_attribute where Label='Incubation End #1'), 1), - ((select SpecimenProtocolID from biobank_specimen_protocol where Label='Saliva Processing for DNA'), - (select SpecimenAttributeID from biobank_specimen_attribute where Label='Tube Expired'), 0), - ((select SpecimenProtocolID from biobank_specimen_protocol where Label='Saliva Processing for DNA'), - (select SpecimenAttributeID from biobank_specimen_attribute where Label='Incubation Start #1'), 1), - ((select SpecimenProtocolID from biobank_specimen_protocol where Label='Saliva Processing for DNA'), - (select SpecimenAttributeID from biobank_specimen_attribute where Label='Incubation End #1'), 1), - ((select SpecimenProtocolID from biobank_specimen_protocol where Label='Saliva Processing for DNA'), - (select SpecimenAttributeID from biobank_specimen_attribute where Label='Incubation Start #2'), 1), - ((select SpecimenProtocolID from biobank_specimen_protocol where Label='Saliva Processing for DNA'), - (select SpecimenAttributeID from biobank_specimen_attribute where Label='Incubation End #2'), 1), - ((select SpecimenProtocolID from biobank_specimen_protocol where Label='Saliva Processing for DNA'), - (select SpecimenAttributeID from biobank_specimen_attribute where Label='Incubation Start #3'), 1), - ((select SpecimenProtocolID from biobank_specimen_protocol where Label='Saliva Processing for DNA'), - (select SpecimenAttributeID from biobank_specimen_attribute where Label='Incubation End #3'), 1), - ((select SpecimenProtocolID from biobank_specimen_protocol where Label='Saliva Processing for DNA'), - (select SpecimenAttributeID from biobank_specimen_attribute where Label='Airdry Start #1'), 1), - ((select SpecimenProtocolID from biobank_specimen_protocol where Label='Saliva Processing for DNA'), - (select SpecimenAttributeID from biobank_specimen_attribute where Label='Airdry End #1'), 1), - ((select SpecimenProtocolID from biobank_specimen_protocol where Label='DNA Isolation From Saliva'), - (select SpecimenAttributeID from biobank_specimen_attribute where Label='Red Pellet'), 0), - ((select SpecimenProtocolID from biobank_specimen_protocol where Label='DNA Isolation From Saliva'), - (select SpecimenAttributeID from biobank_specimen_attribute where Label='No Visible Pellet'), 0), - ((select SpecimenProtocolID from biobank_specimen_protocol where Label='DNA Isolation From Saliva'), - (select SpecimenAttributeID from biobank_specimen_attribute where Label='DNA Concentration (ng/µL)'), 1), - ((select SpecimenProtocolID from biobank_specimen_protocol where Label='DNA Isolation From Saliva'), - (select SpecimenAttributeID from biobank_specimen_attribute where Label='260/280 Ratio'), 1), - ((select SpecimenProtocolID from biobank_specimen_protocol where Label='CSF Processing'), - (select SpecimenAttributeID from biobank_specimen_attribute where Label='Blood Contamination'), 0), - ((select SpecimenProtocolID from biobank_specimen_protocol where Label='CSF Processing'), - (select SpecimenAttributeID from biobank_specimen_attribute where Label='Tube Expired'), 0), - ((select SpecimenProtocolID from biobank_specimen_protocol where Label='CSF Processing'), - (select SpecimenAttributeID from biobank_specimen_attribute where Label='Bring To Pathology'), 0), - ((select SpecimenProtocolID from biobank_specimen_protocol where Label='CSF Processing'), - (select SpecimenAttributeID from biobank_specimen_attribute where Label='Bring To Pathology Start #1'), 0), - ((select SpecimenProtocolID from biobank_specimen_protocol where Label='CSF Processing'), - (select SpecimenAttributeID from biobank_specimen_attribute where Label='Bring To Pathology End #1'), 0) -; - -INSERT INTO biobank_specimen_type_unit_rel (SpecimenTypeID, UnitID) -VALUES ((select SpecimenTypeID from biobank_specimen_type where Label='Blood'), - (select UnitID from biobank_unit where Label='mL')), - ((select SpecimenTypeID from biobank_specimen_type where Label='Urine'), - (select UnitID from biobank_unit where Label='mL')), - ((select SpecimenTypeID from biobank_specimen_type where Label='Serum'), - (select UnitID from biobank_unit where Label='µL')), - ((select SpecimenTypeID from biobank_specimen_type where Label='Plasma'), - (select UnitID from biobank_unit where Label='µL')), - ((select SpecimenTypeID from biobank_specimen_type where Label='DNA'), - (select UnitID from biobank_unit where Label='µL')), - ((select SpecimenTypeID from biobank_specimen_type where Label='PBMC'), - (select UnitID from biobank_unit where Label='mL')), - ((select SpecimenTypeID from biobank_specimen_type where Label='CSF'), - (select UnitID from biobank_unit where Label='µL')) -; - -INSERT INTO biobank_specimen_type_container_type_rel (SpecimenTypeID, ContainerTypeID) -VALUES ((select SpecimenTypeID from biobank_specimen_type where Label='Blood'), - (select ContainerTypeID from biobank_container_type where label='Green Top Tube (GTT)')), - ((select SpecimenTypeID from biobank_specimen_type where Label='Blood'), - (select ContainerTypeID from biobank_container_type where label='Red Top Tube (RTT)')), - ((select SpecimenTypeID from biobank_specimen_type where Label='Blood'), - (select ContainerTypeID from biobank_container_type where label='Purple Top Tube (PTT)')), - ((select SpecimenTypeID from biobank_specimen_type where Label='Serum'), - (select ContainerTypeID from biobank_container_type where label='Cryotube Vial')), - ((select SpecimenTypeID from biobank_specimen_type where Label='Plasma'), - (select ContainerTypeID from biobank_container_type where label='Cryotube Vial')), - ((select SpecimenTypeID from biobank_specimen_type where Label='DNA'), - (select ContainerTypeID from biobank_container_type where label='Cryotube Vial')), - ((select SpecimenTypeID from biobank_specimen_type where Label='PBMC'), - (select ContainerTypeID from biobank_container_type where label='Cryotube Vial')) -; From b6361be6bc90ca3fedffc054b88007f5cedef544 Mon Sep 17 00:00:00 2001 From: Krishna Chatpar Date: Wed, 16 Oct 2019 14:24:17 -0400 Subject: [PATCH 60/95] Fiexed date error message --- jsx/Form.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jsx/Form.js b/jsx/Form.js index ef2a5b076d7..8e5faeed71f 100644 --- a/jsx/Form.js +++ b/jsx/Form.js @@ -1055,7 +1055,7 @@ class DateElement extends Component { min={this.props.minYear} max={this.props.maxYear} onChange={this.handleChange} - value={this.props.value} + value={this.props.value || ''} required={required} disabled={disabled} /> From 11734c58175ae4b1203f706543379ac5bd4d6a42 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A9lanie=20Legault?= Date: Thu, 24 Oct 2019 13:03:56 -0400 Subject: [PATCH 61/95] Fixed Datatable functionality --- jsx/DataTable.js | 1 + webpack.config.js | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/jsx/DataTable.js b/jsx/DataTable.js index 11a33725ec4..f4e8eb40153 100644 --- a/jsx/DataTable.js +++ b/jsx/DataTable.js @@ -418,6 +418,7 @@ class DataTable extends Component { let rowIndex = index[i].RowIdx; let rowData = this.props.data[rowIndex]; let curRow = []; + filteredData.push(rowData); // Iterates through headers to populate row columns // with corresponding data diff --git a/webpack.config.js b/webpack.config.js index cbd5532867d..8c2cfc32733 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -13,7 +13,7 @@ const config = [{ './htdocs/js/components/Markdown.js': './jsx/Markdown.js', './modules/media/js/mediaIndex.js': './modules/media/jsx/mediaIndex.js', './modules/issue_tracker/js/issueTrackerIndex.js': './modules/issue_tracker/jsx/issueTrackerIndex.js', - './modules/biobank/js/biobankIndex.js': './modules/biobank/jsx/biobankIndex.js', + './project/modules/biobank/js/biobankIndex.js': './project/modules/biobank/jsx/biobankIndex.js', './modules/issue_tracker/js/index.js': './modules/issue_tracker/jsx/index.js', './modules/candidate_parameters/js/CandidateParameters.js': './modules/candidate_parameters/jsx/CandidateParameters.js', './modules/configuration/js/SubprojectRelations.js': './modules/configuration/jsx/SubprojectRelations.js', From db5f5de1b0d3475c82035ac3e8560af2eafa23a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A9lanie=20Legault?= Date: Thu, 24 Oct 2019 17:05:57 -0400 Subject: [PATCH 62/95] added autoSelect prop which will auotomatically select the dropdown option if there is only one --- jsx/Form.js | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/jsx/Form.js b/jsx/Form.js index 8e5faeed71f..4259006bd6c 100644 --- a/jsx/Form.js +++ b/jsx/Form.js @@ -405,6 +405,24 @@ class SelectElement extends Component { this.handleChange = this.handleChange.bind(this); } + componentDidMount() { + const optionsArray = Object.keys(this.props.options); + if (this.props.autoSelect && optionsArray.length === 1) { + this.props.onUserInput(this.props.name, optionsArray[0]); + } + } + + componentDidUpdate(prevProps) { + const options = Object.keys(this.props.options); + const prevOptions = Object.keys(prevProps.options); + if (options.length !== prevOptions.length || + !options.every((v, i) => v === prevOptions[i])) { + if (this.props.autoSelect && options.length === 1) { + this.props.onUserInput(this.props.name, options[0]); + } + } + } + handleChange(e) { let value = e.target.value; let options = e.target.options; From 26bcd6ab9197df03b3487a347ca3fac00827195f Mon Sep 17 00:00:00 2001 From: Loris Admin Date: Tue, 29 Oct 2019 14:43:48 -0400 Subject: [PATCH 63/95] made changes requested by Krishna --- .gitignore | 2 +- composer.json | 2 +- modules/biobank | 1 - 3 files changed, 2 insertions(+), 3 deletions(-) delete mode 160000 modules/biobank diff --git a/.gitignore b/.gitignore index 395a82212e5..5c5a409bcf2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ -project +project/ smarty/templates_c .gitmodules project-* diff --git a/composer.json b/composer.json index b78bac610ad..562809068ad 100644 --- a/composer.json +++ b/composer.json @@ -28,6 +28,6 @@ "psr-4": { "LORIS\\": "src/" }, - "classmap": ["project/libraries", "php/libraries", "php/exceptions", "modules/biobank/php"] + "classmap": ["project/libraries", "php/libraries", "php/exceptions"] } } diff --git a/modules/biobank b/modules/biobank deleted file mode 160000 index eb2e30a1913..00000000000 --- a/modules/biobank +++ /dev/null @@ -1 +0,0 @@ -Subproject commit eb2e30a1913bbf8341f2f51f0a0befe7bac750fd From e1734c5578203910fe80509359c8b673067ca973 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A9lanie=20Legault?= Date: Fri, 1 Nov 2019 16:39:09 -0400 Subject: [PATCH 64/95] made overrides for CBIGR --- .../candidate_list/jsx/candidateListIndex.js | 14 ++++++-- .../php/candidate_list.class.inc | 4 +++ .../dashboard/templates/form_dashboard.tpl | 36 ++++++++++++++----- 3 files changed, 43 insertions(+), 11 deletions(-) diff --git a/modules/candidate_list/jsx/candidateListIndex.js b/modules/candidate_list/jsx/candidateListIndex.js index e98b377c574..57de782d563 100644 --- a/modules/candidate_list/jsx/candidateListIndex.js +++ b/modules/candidate_list/jsx/candidateListIndex.js @@ -158,6 +158,10 @@ class CandidateListIndex extends Component { type: 'text', }, }, + {label: 'Diagnosis', show: true, filter: { + name: 'diagnosis', + type: 'text', + }}, { label: 'Site', show: true, @@ -178,7 +182,7 @@ class CandidateListIndex extends Component { }, { label: 'Entity Type', - show: true, + show: false, filter: { name: 'entityType', type: 'select', @@ -211,6 +215,10 @@ class CandidateListIndex extends Component { options: options.participantstatus, }, }, + {label: 'Age', show: true, filter: { + name: 'age', + type: 'text', + }}, { 'label': 'DoB', 'show': true, @@ -244,7 +252,7 @@ class CandidateListIndex extends Component { }, { 'label': 'Feedback', - 'show': true, + 'show': false, 'filter': { name: 'feedback', type: 'select', @@ -260,7 +268,7 @@ class CandidateListIndex extends Component { }, { 'label': 'Latest Visit Status', - 'show': true, + 'show': false, 'filter': { name: 'latestVisitStatus', type: 'select', diff --git a/modules/candidate_list/php/candidate_list.class.inc b/modules/candidate_list/php/candidate_list.class.inc index 30382fa6c00..b09559d99b9 100644 --- a/modules/candidate_list/php/candidate_list.class.inc +++ b/modules/candidate_list/php/candidate_list.class.inc @@ -59,11 +59,13 @@ class Candidate_List extends \NDB_Menu_Filter 'c.PSCID', 'c.CandID AS DCCID', 'GROUP_CONCAT(DISTINCT s.Visit_label) AS VisitLabel', + 'd.Name as Diagnosis', 'psc.Name AS RegistrationSite', 'GROUP_CONCAT(DISTINCT sp.title) as Subproject', 'c.Entity_type AS EntityType', 'MAX(s.Scan_done) as scanDone', 'COALESCE(pso.Description,"Active") AS ParticipantStatus', + '(SELECT FLOOR(DATEDIFF(CURDATE(), c.DoB)/365.25)) as Age', 'DATE_FORMAT(c.DoB,\'%Y-%m-%d\') AS DoB', 'c.Sex', 'COUNT(DISTINCT s.Visit_label) AS VisitCount', @@ -79,6 +81,8 @@ class Candidate_List extends \NDB_Menu_Filter $this->query = " FROM candidate c LEFT JOIN psc ON (c.RegistrationCenterID=psc.CenterID) LEFT JOIN session s ON (c.CandID = s.CandID AND s.Active = 'Y') + LEFT JOIN candidate_diagnosis_rel cdr ON (c.CandID=cdr.CandID) + LEFT JOIN diagnosis d ON (d.DiagnosisID=cdr.DiagnosisID) LEFT JOIN feedback_bvl_thread ON (c.CandID=feedback_bvl_thread.CandID) LEFT JOIN participant_status ps ON (ps.CandID=c.CandID) diff --git a/modules/dashboard/templates/form_dashboard.tpl b/modules/dashboard/templates/form_dashboard.tpl index 009d33f98ca..7875875f559 100644 --- a/modules/dashboard/templates/form_dashboard.tpl +++ b/modules/dashboard/templates/form_dashboard.tpl @@ -35,18 +35,15 @@
-
- {include file='progress_bar.tpl' project=$recruitment["overall"]} -
-
{value}{barcodes}{value}{value}{value}{value}{value}{value}{value}{value.join(', ')}{value}{value}{value}{value}{value}{value}{value}{value}{value.join(', ')}{value}{value}{barcodes}{value}{value} this.openAliquotForm(row['ID'])}/>{value}{value}{barcodes}{value}{value}{value}{value}{value}{value}{value}{value.join(', ')}{value}{value}{value}{value}{value}{value}{value}{value}{value.join(', ')}{value}{value}{barcodes}{value}{value} this.openAliquotForm(row['ID'])}/>{value}