diff --git a/CHANGELOG.md b/CHANGELOG.md index ada49c9..c650a74 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## 3.6.5 - 2020-05-18 +### Added +- Add redirect ordering (Closes #274) + ## 3.6.4 - 2020-04-15 ### Fixed - Fix JS error when `%` appeared in SEO snippet text diff --git a/composer.json b/composer.json index 11c0457..6813a42 100644 --- a/composer.json +++ b/composer.json @@ -2,7 +2,7 @@ "name": "ether/seo", "license": "MIT", "description": "SEO utilities including a unique field type, sitemap, & redirect manager", - "version": "3.6.4", + "version": "3.6.5", "type": "craft-plugin", "minimum-stability": "dev", "require": { diff --git a/resources/js/settings/Redirects.js b/resources/js/settings/Redirects.js index 4ac24ab..50dd54d 100644 --- a/resources/js/settings/Redirects.js +++ b/resources/js/settings/Redirects.js @@ -53,6 +53,13 @@ export default class Redirects { initTables () { Object.keys(this.tables).forEach(key => { + if (this.tables[key].__sorter) + this.tables[key].__sorter.destroy(); + + this.tables[key].__sorter = new Craft.DataTableSorter(this.tables[key].parentNode, { + onSortChange: () => this.onSort(this.tables[key]), + }); + [].slice.call(this.tables[key].getElementsByTagName("tr")).forEach(row => { const links = row.getElementsByTagName("a"); @@ -60,7 +67,7 @@ export default class Redirects { this.onEditClick(key, e, row); }); - links[1].addEventListener("click", e => { + links[2].addEventListener("click", e => { this.onDeleteClick(key, e, row); }); }); @@ -80,18 +87,22 @@ export default class Redirects { , type = form.elements[this.namespaceField("type")] , siteId = form.elements[this.namespaceField("siteId")]; + const order = this.tables[siteId.value].children.length; + // Validate if (!Redirects._validate(uri, to, spinner)) return; this.post("POST", { + action: 'seo/redirects/save', + order, uri: uri.value, to: to.value, type: type.value, siteId: siteId.value, }, ({ id }) => { this.tables[siteId.value].appendChild(this.rowStatic( - id, uri.value, to.value, type.value, siteId.value + id, order, uri.value, to.value, type.value, siteId.value )); Craft.cp.displayNotice( @@ -102,6 +113,7 @@ export default class Redirects { uri.value = ''; to.value = ''; uri.focus(); + this.initTables(); }, error => { Craft.cp.displayError("SEO: " + error); spinner.classList.add("hidden"); @@ -141,9 +153,9 @@ export default class Redirects { type: type.value, siteId: siteId.value, }, ({ redirects: newRedirects }) => { - newRedirects.forEach(({ id, uri, to, type, siteId }) => { + newRedirects.forEach(({ id, order, uri, to, type, siteId }) => { this.tables[siteId || 'null'].appendChild(this.rowStatic( - id, uri, to, type, siteId + id, order, uri, to, type, siteId )); }); @@ -151,6 +163,7 @@ export default class Redirects { spinner.classList.add("hidden"); redirects.value = ''; + this.initTables(); }, error => { Craft.cp.displayError('SEO: ' + error); spinner.classList.add("hidden"); @@ -164,17 +177,20 @@ export default class Redirects { const form = e.target , spinner = form.getElementsByClassName("spinner")[0]; - const id = form.elements[this.namespaceField("id")] - , uri = form.elements[this.namespaceField("uri")] - , to = form.elements[this.namespaceField("to")] - , type = form.elements[this.namespaceField("type")]; + const id = form.elements[this.namespaceField("id")] + , order = form.elements[this.namespaceField("order")] + , uri = form.elements[this.namespaceField("uri")] + , to = form.elements[this.namespaceField("to")] + , type = form.elements[this.namespaceField("type")]; // Validate if (!Redirects._validate(uri, to, spinner)) return; this.post("POST", { + action: 'seo/redirects/save', id: id.value, + order: order.value, uri: uri.value, to: to.value, type: type.value, @@ -185,7 +201,7 @@ export default class Redirects { this.tables[siteId].insertBefore( this.rowStatic( - id.value, uri.value, to.value, type.value, siteId.value, + id.value, order.value, uri.value, to.value, type.value, siteId.value, row.dataset.added ), row @@ -200,10 +216,10 @@ export default class Redirects { onEditClick = (siteId, e, row) => { e.preventDefault(); - const { id, uri, to, type, added } = e.target.dataset; + const { id, order, uri, to, type, added } = e.target.dataset; this.cancelCurrentEdit(); - const editRows = this.rowEdit(id, uri, to, type); + const editRows = this.rowEdit(id, order, uri, to, type); this.editRow = row; this.editRow.setAttribute('data-added', added); @@ -247,6 +263,27 @@ export default class Redirects { Craft.cp.displayNotice('SEO: ' + error); }); }; + + onSort = table => { + const rows = table.querySelectorAll('tr'); + const post = []; + + for (let i = 0, l = rows.length; i < l; i++) { + const row = rows[i]; + row.dataset.order = i; + row.querySelector('a').dataset.order = i; + post.push({ id: row.dataset.id, order: row.dataset.order }); + } + + this.post('POST', { + action: 'seo/redirects/sort', + order: post, + }, () => { + Craft.cp.displayNotice('SEO: Redirect order saved'); + }, error => { + Craft.cp.displayNotice('SEO: ' + error); + }); + }; // Helpers // ========================================================================= @@ -259,7 +296,7 @@ export default class Redirects { method, fields = {}, onSuccess = () => {}, - onError = () => {} + onError = () => {}, ) { const jsonData = {}; @@ -294,7 +331,7 @@ export default class Redirects { }); } - rowStatic (id = -1, uri = "", to = "", type = 301, siteId = null, dateCreated = null) { + rowStatic (id = -1, order = -1, uri = "", to = "", type = 301, siteId = null, dateCreated = null) { const added = dateCreated || 'Now'; const row = c("tr", { "tabindex": 0, "data-id": id }, [ @@ -307,11 +344,12 @@ export default class Redirects { "href": "#", "title": "Edit Redirect", "data-id": id, + "data-order": order, "data-uri": uri, "data-to": to, "data-type": type, "data-added": dateCreated, - "click": e => this.onEditClick(siteId, e, row) + "click": e => this.onEditClick(siteId, e, row), }, uri) ]) ]) @@ -327,14 +365,22 @@ export default class Redirects { // Added c("td", {}, added), + // Reorder + c("td", { "class": "thin action" }, [ + c("a", { + "class": "move icon", + "title": "Reorder", + }), + ]), + // Delete c("td", { "class": "thin action" }, [ c("a", { "class": "delete icon", "title": "Delete", - "click": e => this.onDeleteClick(siteId, e, row) - }) - ]) + "click": e => this.onDeleteClick(siteId, e, row), + }), + ]), ]); return row; diff --git a/src/Seo.php b/src/Seo.php index 557a6a3..60003c6 100644 --- a/src/Seo.php +++ b/src/Seo.php @@ -55,7 +55,7 @@ class Seo extends Plugin public $documentationUrl = 'https://github.com/ethercreative/seo/blob/v3/README.md'; - public $schemaVersion = '3.1.0'; + public $schemaVersion = '3.1.1'; // Craft // ========================================================================= @@ -236,7 +236,7 @@ public function onRegisterCPUrlRules (RegisterUrlRulesEvent $event) // Redirects // --------------------------------------------------------------------- $event->rules['DELETE seo/redirects'] = 'seo/redirects/delete'; - $event->rules['POST seo/redirects'] = 'seo/redirects/save'; + //$event->rules['POST seo/redirects'] = 'seo/redirects/save'; $event->rules['PUT seo/redirects'] = 'seo/redirects/bulk'; $event->rules['seo/redirects'] = 'seo/redirects/index'; diff --git a/src/controllers/RedirectsController.php b/src/controllers/RedirectsController.php index 6d3f718..844d9dd 100644 --- a/src/controllers/RedirectsController.php +++ b/src/controllers/RedirectsController.php @@ -58,13 +58,14 @@ public function actionSave () $request = Craft::$app->request; + $order = $request->getRequiredBodyParam('order'); $uri = $request->getRequiredBodyParam('uri'); $to = $request->getRequiredBodyParam('to'); $type = $request->getRequiredBodyParam('type'); $siteId = $request->getBodyParam('siteId', false); $id = $request->getBodyParam('id'); - $err = Seo::$i->redirects->save($uri, $to, $type, $siteId, $id); + $err = Seo::$i->redirects->save($order, $uri, $to, $type, $siteId, $id); if (is_numeric($err)) { @@ -107,6 +108,20 @@ public function actionBulk () } } + public function actionSort () + { + $order = Craft::$app->getRequest()->getBodyParam('order'); + + $error = Seo::$i->redirects->sort($order); + + if ($error) return $this->asErrorJson($error); + else { + return $this->asJson([ + 'success' => true, + ]); + } + } + /** * @throws Exception * @throws Throwable diff --git a/src/migrations/m200518_110721_add_order_to_redirects.php b/src/migrations/m200518_110721_add_order_to_redirects.php new file mode 100644 index 0000000..81e760b --- /dev/null +++ b/src/migrations/m200518_110721_add_order_to_redirects.php @@ -0,0 +1,51 @@ +addColumn( + RedirectRecord::$tableName, + 'order', + $this->integer()->null() + ); + + $rows = RedirectRecord::find()->select(['id', 'siteId'])->all(); + $siteCounts = []; + + foreach ($rows as $row) + { + if (!array_key_exists($row->siteId, $siteCounts)) + $siteCounts[$row->siteId] = 0; + + $record = RedirectRecord::findOne(['id' => $row->id]); + $record->order = $siteCounts[$row->siteId]; + $record->save(false); + + $siteCounts[$row->siteId]++; + } + } + + /** + * @inheritdoc + */ + public function safeDown() + { + $this->dropColumn( + RedirectRecord::$tableName, + 'order' + ); + } +} diff --git a/src/models/Redirect.php b/src/models/Redirect.php index d55c1b6..7d6ce70 100644 --- a/src/models/Redirect.php +++ b/src/models/Redirect.php @@ -13,6 +13,9 @@ class Redirect extends Model // Props: Public Instance // ------------------------------------------------------------------------- + /** @var int */ + public $order; + /** @var string */ public $uri; @@ -37,6 +40,12 @@ public function rules (): array { $rules = parent::rules(); + $rules[] = [ + ['order'], + 'integer', + 'required', + ]; + $rules[] = [ ['url', 'to', 'type'], 'string', diff --git a/src/records/RedirectRecord.php b/src/records/RedirectRecord.php index 51912fc..5077f54 100644 --- a/src/records/RedirectRecord.php +++ b/src/records/RedirectRecord.php @@ -8,6 +8,7 @@ * Class RedirectRecord * * @property int $id + * @property int $order * @property string $uri * @property string $to * @property string $type diff --git a/src/services/RedirectsService.php b/src/services/RedirectsService.php index 64564e8..5476804 100644 --- a/src/services/RedirectsService.php +++ b/src/services/RedirectsService.php @@ -5,6 +5,7 @@ use Craft; use craft\base\Component; use craft\events\ExceptionEvent; +use craft\helpers\ArrayHelper; use craft\helpers\UrlHelper; use ether\seo\records\RedirectRecord; use Exception; @@ -80,10 +81,10 @@ public function findAllRedirects ($currentSiteOnly = false) return RedirectRecord::find()->where( '[[siteId]] IS NULL OR [[siteId]] = ' . Craft::$app->sites->currentSite->id - )->orderBy('dateCreated asc, siteId asc')->all(); + )->orderBy('order asc')->all(); return array_reduce( - RedirectRecord::find()->orderBy('dateCreated ASC')->all(), + RedirectRecord::find()->orderBy('order asc')->all(), function ($a, RedirectRecord $record) { $a[$record->siteId ?? 'null'][] = $record; return $a; @@ -142,6 +143,7 @@ public function findRedirectByPath ($path) /** * Saves the redirect * + * @param int $order * @param string $uri * @param string $to * @param string $type @@ -150,7 +152,7 @@ public function findRedirectByPath ($path) * * @return array|int|string */ - public function save ($uri, $to, $type, $siteId = null, $id = null) + public function save ($order, $uri, $to, $type, $siteId = null, $id = null) { if ($siteId === 'null') $siteId = null; @@ -177,6 +179,7 @@ public function save ($uri, $to, $type, $siteId = null, $id = null) $record = new RedirectRecord(); } + $record->order = $order; $record->uri = $uri; $record->to = $to; $record->type = $type; @@ -210,9 +213,12 @@ public function bulk ($redirects, $separator, $type, $siteId) $newFormatted = []; + $order = RedirectRecord::find()->where(['siteId' => $siteId])->count(); + foreach ($rawRedirects as $redirect) { $record = new RedirectRecord(); + $record->order = $order++; $record->uri = $redirect[0]; $record->to = $redirect[1]; $record->type = array_key_exists(2, $redirect) ? $redirect[2] : $type; @@ -221,6 +227,7 @@ public function bulk ($redirects, $separator, $type, $siteId) $newFormatted[] = [ 'id' => $record->id, + 'order' => $record->order, 'uri' => $record->uri, 'to' => $record->to, 'type' => $record->type, @@ -231,6 +238,29 @@ public function bulk ($redirects, $separator, $type, $siteId) return [$newFormatted, false]; } + public function sort ($order) + { + $table = RedirectRecord::$tableName; + + $db = Craft::$app->getDb(); + $transaction = $db->beginTransaction(); + + try { + foreach ($order as $row) { + $db->createCommand() + ->update($table, ['order' => $row['order']], ['id' => $row['id']]) + ->execute(); + } + + $transaction->commit(); + } catch (Exception $e) { + $transaction->rollBack(); + return $e->getMessage(); + } + + return false; + } + /** * Deletes the redirect with the given ID * diff --git a/src/templates/redirects.twig b/src/templates/redirects.twig index 246da05..fc013d8 100644 --- a/src/templates/redirects.twig +++ b/src/templates/redirects.twig @@ -158,7 +158,7 @@ To Type Added - + @@ -169,13 +169,14 @@ {% endif %} {% for redirect in siteRedirects %} - +
{{ redirect.dateCreated|datetime('short') }} + + + diff --git a/src/web/assets/js/SeoSettings.min.js b/src/web/assets/js/SeoSettings.min.js index 571b5ed..b19d984 100644 --- a/src/web/assets/js/SeoSettings.min.js +++ b/src/web/assets/js/SeoSettings.min.js @@ -1,2 +1,2 @@ -!function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="/assets/js/",n(n.s="./js/SeoSettings.js")}({"../../../../../../usr/local/lib/node_modules/build/node_modules/@babel/runtime/helpers/defineProperty.js":function(e,t){e.exports=function(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}},"../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/a-function.js":function(e,t){e.exports=function(e){if("function"!=typeof e)throw TypeError(String(e)+" is not a function");return e}},"../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/a-possible-prototype.js":function(e,t,n){var r=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/is-object.js");e.exports=function(e){if(!r(e)&&null!==e)throw TypeError("Can't set "+String(e)+" as a prototype");return e}},"../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/add-to-unscopables.js":function(e,t,n){var r=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/well-known-symbol.js"),o=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/object-create.js"),i=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/object-define-property.js"),l=r("unscopables"),s=Array.prototype;null==s[l]&&i.f(s,l,{configurable:!0,value:o(null)}),e.exports=function(e){s[l][e]=!0}},"../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/advance-string-index.js":function(e,t,n){"use strict";var r=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/string-multibyte.js").charAt;e.exports=function(e,t,n){return t+(n?r(e,t).length:1)}},"../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/an-object.js":function(e,t,n){var r=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/is-object.js");e.exports=function(e){if(!r(e))throw TypeError(String(e)+" is not an object");return e}},"../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/array-includes.js":function(e,t,n){var r=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/to-indexed-object.js"),o=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/to-length.js"),i=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/to-absolute-index.js"),l=function(e){return function(t,n,l){var s,a=r(t),u=o(a.length),c=i(l,u);if(e&&n!=n){for(;u>c;)if((s=a[c++])!=s)return!0}else for(;u>c;c++)if((e||c in a)&&a[c]===n)return e||c||0;return!e&&-1}};e.exports={includes:l(!0),indexOf:l(!1)}},"../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/classof-raw.js":function(e,t){var n={}.toString;e.exports=function(e){return n.call(e).slice(8,-1)}},"../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/copy-constructor-properties.js":function(e,t,n){var r=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/has.js"),o=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/own-keys.js"),i=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/object-get-own-property-descriptor.js"),l=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/object-define-property.js");e.exports=function(e,t){for(var n=o(t),s=l.f,a=i.f,u=0;u")})),c="$0"==="a".replace(/./,"$0"),d=i("replace"),f=!!/./[d]&&""===/./[d]("a","$0"),h=!o((function(){var e=/(?:)/,t=e.exec;e.exec=function(){return t.apply(this,arguments)};var n="ab".split(e);return 2!==n.length||"a"!==n[0]||"b"!==n[1]}));e.exports=function(e,t,n,d){var p=i(e),m=!o((function(){var t={};return t[p]=function(){return 7},7!=""[e](t)})),g=m&&!o((function(){var t=!1,n=/a/;return"split"===e&&((n={}).constructor={},n.constructor[a]=function(){return n},n.flags="",n[p]=/./[p]),n.exec=function(){return t=!0,null},n[p](""),!t}));if(!m||!g||"replace"===e&&(!u||!c||f)||"split"===e&&!h){var v=/./[p],b=n(p,""[e],(function(e,t,n,r,o){return t.exec===l?m&&!o?{done:!0,value:v.call(t,n,r)}:{done:!0,value:e.call(n,t,r)}:{done:!1}}),{REPLACE_KEEPS_$0:c,REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE:f}),y=b[0],x=b[1];r(String.prototype,e,y),r(RegExp.prototype,p,2==t?function(e,t){return x.call(e,this,t)}:function(e){return x.call(e,this)})}d&&s(RegExp.prototype[p],"sham",!0)}},"../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/get-built-in.js":function(e,t,n){var r=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/path.js"),o=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/global.js"),i=function(e){return"function"==typeof e?e:void 0};e.exports=function(e,t){return arguments.length<2?i(r[e])||i(o[e]):r[e]&&r[e][t]||o[e]&&o[e][t]}},"../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/global.js":function(e,t,n){(function(t){var n=function(e){return e&&e.Math==Math&&e};e.exports=n("object"==typeof globalThis&&globalThis)||n("object"==typeof window&&window)||n("object"==typeof self&&self)||n("object"==typeof t&&t)||Function("return this")()}).call(this,n("../../../../../../usr/local/lib/node_modules/build/node_modules/webpack/buildin/global.js"))},"../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/has.js":function(e,t){var n={}.hasOwnProperty;e.exports=function(e,t){return n.call(e,t)}},"../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/hidden-keys.js":function(e,t){e.exports={}},"../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/html.js":function(e,t,n){var r=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/get-built-in.js");e.exports=r("document","documentElement")},"../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/ie8-dom-define.js":function(e,t,n){var r=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/descriptors.js"),o=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/fails.js"),i=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/document-create-element.js");e.exports=!r&&!o((function(){return 7!=Object.defineProperty(i("div"),"a",{get:function(){return 7}}).a}))},"../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/indexed-object.js":function(e,t,n){var r=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/fails.js"),o=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/classof-raw.js"),i="".split;e.exports=r((function(){return!Object("z").propertyIsEnumerable(0)}))?function(e){return"String"==o(e)?i.call(e,""):Object(e)}:Object},"../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/inspect-source.js":function(e,t,n){var r=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/shared-store.js"),o=Function.toString;"function"!=typeof r.inspectSource&&(r.inspectSource=function(e){return o.call(e)}),e.exports=r.inspectSource},"../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/internal-state.js":function(e,t,n){var r,o,i,l=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/native-weak-map.js"),s=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/global.js"),a=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/is-object.js"),u=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/create-non-enumerable-property.js"),c=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/has.js"),d=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/shared-key.js"),f=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/hidden-keys.js"),h=s.WeakMap;if(l){var p=new h,m=p.get,g=p.has,v=p.set;r=function(e,t){return v.call(p,e,t),t},o=function(e){return m.call(p,e)||{}},i=function(e){return g.call(p,e)}}else{var b=d("state");f[b]=!0,r=function(e,t){return u(e,b,t),t},o=function(e){return c(e,b)?e[b]:{}},i=function(e){return c(e,b)}}e.exports={set:r,get:o,has:i,enforce:function(e){return i(e)?o(e):r(e,{})},getterFor:function(e){return function(t){var n;if(!a(t)||(n=o(t)).type!==e)throw TypeError("Incompatible receiver, "+e+" required");return n}}}},"../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/is-forced.js":function(e,t,n){var r=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/fails.js"),o=/#|\.prototype\./,i=function(e,t){var n=s[l(e)];return n==u||n!=a&&("function"==typeof t?r(t):!!t)},l=i.normalize=function(e){return String(e).replace(o,".").toLowerCase()},s=i.data={},a=i.NATIVE="N",u=i.POLYFILL="P";e.exports=i},"../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/is-object.js":function(e,t){e.exports=function(e){return"object"==typeof e?null!==e:"function"==typeof e}},"../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/is-pure.js":function(e,t){e.exports=!1},"../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/is-regexp.js":function(e,t,n){var r=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/is-object.js"),o=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/classof-raw.js"),i=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/well-known-symbol.js")("match");e.exports=function(e){var t;return r(e)&&(void 0!==(t=e[i])?!!t:"RegExp"==o(e))}},"../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/iterators-core.js":function(e,t,n){"use strict";var r,o,i,l=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/object-get-prototype-of.js"),s=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/create-non-enumerable-property.js"),a=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/has.js"),u=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/well-known-symbol.js"),c=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/is-pure.js"),d=u("iterator"),f=!1;[].keys&&("next"in(i=[].keys())?(o=l(l(i)))!==Object.prototype&&(r=o):f=!0),null==r&&(r={}),c||a(r,d)||s(r,d,(function(){return this})),e.exports={IteratorPrototype:r,BUGGY_SAFARI_ITERATORS:f}},"../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/iterators.js":function(e,t){e.exports={}},"../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/native-symbol.js":function(e,t,n){var r=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/fails.js");e.exports=!!Object.getOwnPropertySymbols&&!r((function(){return!String(Symbol())}))},"../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/native-weak-map.js":function(e,t,n){var r=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/global.js"),o=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/inspect-source.js"),i=r.WeakMap;e.exports="function"==typeof i&&/native code/.test(o(i))},"../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/object-create.js":function(e,t,n){var r,o=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/an-object.js"),i=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/object-define-properties.js"),l=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/enum-bug-keys.js"),s=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/hidden-keys.js"),a=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/html.js"),u=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/document-create-element.js"),c=n("../../../../../../usr/local/lib/node_modules/build/node_modules/core-js/internals/shared-key.js"),d=c("IE_PROTO"),f=function(){},h=function(e){return"