From 72bda8f3cb74caaf1c25be7868f5e29c54a96972 Mon Sep 17 00:00:00 2001 From: Teoh Han Hui Date: Tue, 12 Jun 2018 21:59:48 +0200 Subject: [PATCH] Use rollup to bundle JS (ES6 modules) --- .babelrc | 5 - .editorconfig | 82 +++ .eslintrc.js | 7 + UPGRADE-1.0.md | 2 +- gulpfile.babel.js | 4 +- package.json | 22 +- .../Resources/private/.eslintrc.js | 29 ++ .../AdminBundle/Resources/private/js/app.js | 166 +++--- .../Resources/private/js/shim/shim-jquery.js | 4 + .../private/js/shim/shim-polyfill.js | 1 + .../private/js/shim/shim-semantic-ui.js | 24 + .../private/js/sylius-compound-form-errors.js | 73 ++- .../private/js/sylius-lazy-choice-tree.js | 325 ++++++------ .../private/js/sylius-move-product-variant.js | 69 ++- .../private/js/sylius-move-product.js | 69 ++- .../Resources/private/js/sylius-move-taxon.js | 74 +-- .../private/js/sylius-notification.js | 197 ++++--- .../js/sylius-product-images-preview.js | 91 ++-- .../private/js/sylius-product-slug.js | 98 ++-- .../Resources/private/js/sylius-taxon-slug.js | 126 ++--- .../Bundle/AdminBundle/gulpfile.babel.js | 118 ++++- .../ShopBundle/Resources/private/.eslintrc.js | 29 ++ .../ShopBundle/Resources/private/js/app.js | 104 ++-- .../Resources/private/js/shim/shim-jquery.js | 4 + .../private/js/shim/shim-lightbox.js | 3 + .../private/js/shim/shim-polyfill.js | 1 + .../private/js/shim/shim-semantic-ui.js | 24 + .../private/js/sylius-add-to-cart.js | 66 +-- .../private/js/sylius-address-book.js | 90 ++-- .../private/js/sylius-province-field.js | 176 +++---- .../private/js/sylius-remove-from-cart.js | 47 +- .../private/js/sylius-variant-images.js | 154 +++--- .../private/js/sylius-variants-prices.js | 69 ++- .../Bundle/ShopBundle/gulpfile.babel.js | 120 ++++- .../UiBundle/Resources/private/.eslintrc.js | 20 + .../UiBundle/Resources/private/js/app.js | 92 ++-- .../Resources/private/js/sylius-api-login.js | 95 ++-- .../Resources/private/js/sylius-api-toggle.js | 70 +-- .../private/js/sylius-auto-complete.js | 128 +++-- ...sylius-bulk-action-require-confirmation.js | 51 +- .../private/js/sylius-form-collection.js | 276 +++++----- .../private/js/sylius-product-attributes.js | 203 ++++---- .../js/sylius-product-auto-complete.js | 103 ++-- .../private/js/sylius-prototype-handler.js | 123 +++-- .../private/js/sylius-require-confirmation.js | 43 +- .../Resources/private/js/sylius-toggle.js | 36 +- yarn.lock | 486 ++++++++++++++---- 47 files changed, 2428 insertions(+), 1771 deletions(-) create mode 100644 .editorconfig create mode 100644 src/Sylius/Bundle/AdminBundle/Resources/private/.eslintrc.js create mode 100644 src/Sylius/Bundle/AdminBundle/Resources/private/js/shim/shim-jquery.js create mode 100644 src/Sylius/Bundle/AdminBundle/Resources/private/js/shim/shim-polyfill.js create mode 100644 src/Sylius/Bundle/AdminBundle/Resources/private/js/shim/shim-semantic-ui.js create mode 100644 src/Sylius/Bundle/ShopBundle/Resources/private/.eslintrc.js create mode 100644 src/Sylius/Bundle/ShopBundle/Resources/private/js/shim/shim-jquery.js create mode 100644 src/Sylius/Bundle/ShopBundle/Resources/private/js/shim/shim-lightbox.js create mode 100644 src/Sylius/Bundle/ShopBundle/Resources/private/js/shim/shim-polyfill.js create mode 100644 src/Sylius/Bundle/ShopBundle/Resources/private/js/shim/shim-semantic-ui.js create mode 100644 src/Sylius/Bundle/UiBundle/Resources/private/.eslintrc.js diff --git a/.babelrc b/.babelrc index 22bda1f00e5..e563a62ea55 100644 --- a/.babelrc +++ b/.babelrc @@ -10,11 +10,6 @@ "plugins": [ ["transform-object-rest-spread", { "useBuiltIns": true - }], - ["transform-runtime", { - "helpers": true, - "polyfill": true, - "regenerator": true }] ] } diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000000..b5f72a57e2b --- /dev/null +++ b/.editorconfig @@ -0,0 +1,82 @@ +# EditorConfig helps developers define and maintain consistent +# coding styles between different editors and IDEs +# editorconfig.org + +root = true + +[*] +# Change these settings to your own preference +indent_style = space +indent_size = 4 + +# We recommend you to keep these unchanged +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[*.feature] +indent_style = space +indent_size = 4 + +[*.js] +indent_style = space +indent_size = 2 + +[*.json] +indent_style = space +indent_size = 2 + +[*.md] +indent_style = space +indent_size = 4 +trim_trailing_whitespace = false + +[*.neon] +indent_style = space +indent_size = 4 + +[*.php] +indent_style = space +indent_size = 4 + +[*.sh] +indent_style = space +indent_size = 4 + +[*.{yaml,yml}] +indent_style = space +indent_size = 4 +trim_trailing_whitespace = false + +[.babelrc] +indent_style = space +indent_size = 2 + +[.gitmodules] +indent_style = tab +indent_size = 4 + +[.php_cs{,.dist}] +indent_style = space +indent_size = 4 + +[composer.json] +indent_style = space +indent_size = 4 + +[package.json] +indent_style = space +indent_size = 2 + +[phpspec.yml{,.dist}] +indent_style = space +indent_size = 4 + +[phpstan.neon] +indent_style = space +indent_size = 4 + +[phpunit.xml{,.dist}] +indent_style = space +indent_size = 4 diff --git a/.eslintrc.js b/.eslintrc.js index f9f3b1ea8ca..dfddb2546b3 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,6 +1,13 @@ module.exports = { extends: 'airbnb-base', + env: { + node: true, + }, rules: { + 'object-shorthand': ['error', 'always', { + avoidQuotes: true, + avoidExplicitReturnArrows: true, + }], 'function-paren-newline': ['error', 'consistent'], 'max-len': ['warn', 120, 2, { ignoreUrls: true, diff --git a/UPGRADE-1.0.md b/UPGRADE-1.0.md index ec4d086f361..6e3d3cf0ef8 100644 --- a/UPGRADE-1.0.md +++ b/UPGRADE-1.0.md @@ -26,7 +26,7 @@ { // Other registrered bundles - if (in_array($this->getEnvironment(), ['prod'])) + if (in_array($this->getEnvironment(), ['prod'])) { $bundles[] = new \Symfony\Bundle\WebServerBundle\WebServerBundle(); } diff --git a/gulpfile.babel.js b/gulpfile.babel.js index c7c8cb5d1b4..15be521a51c 100644 --- a/gulpfile.babel.js +++ b/gulpfile.babel.js @@ -27,7 +27,7 @@ const config = [ export const buildAdmin = function buildAdmin() { return gulp.src('src/Sylius/Bundle/AdminBundle/gulpfile.babel.js', { read: false }) - .pipe(chug({ args: config })); + .pipe(chug({ args: config, tasks: 'build' })); }; buildAdmin.description = 'Build admin assets.'; @@ -39,7 +39,7 @@ watchAdmin.description = 'Watch admin asset sources and rebuild on changes.'; export const buildShop = function buildShop() { return gulp.src('src/Sylius/Bundle/ShopBundle/gulpfile.babel.js', { read: false }) - .pipe(chug({ args: config })); + .pipe(chug({ args: config, tasks: 'build' })); }; buildShop.description = 'Build shop assets.'; diff --git a/package.json b/package.json index cb0c0b426e1..c5b65d5df71 100644 --- a/package.json +++ b/package.json @@ -1,18 +1,23 @@ { "dependencies": { - "babel-runtime": "^6.26.0", + "babel-polyfill": "^6.26.0", "jquery": "^3.2.0", "lightbox2": "^2.9.0", "semantic-ui-css": "^2.2.0" }, "devDependencies": { + "babel-core": "^6.26.3", + "babel-plugin-external-helpers": "^6.22.0", + "babel-plugin-module-resolver": "^3.1.1", "babel-plugin-transform-object-rest-spread": "^6.26.0", - "babel-plugin-transform-runtime": "^6.23.0", "babel-preset-env": "^1.7.0", "babel-register": "^6.26.0", + "dedent": "^0.7.0", "eslint": "^4.19.1", "eslint-config-airbnb-base": "^12.1.0", + "eslint-import-resolver-babel-module": "^4.0.0", "eslint-plugin-import": "^2.11.0", + "fast-async": "^6.3.7", "gulp": "^4.0.0", "gulp-chug": "^0.5", "gulp-concat": "^2.6.0", @@ -22,17 +27,22 @@ "gulp-order": "^1.1.1", "gulp-sass": "^4.0.1", "gulp-sourcemaps": "^1.6.0", - "gulp-uglify": "^1.5.1", "gulp-uglifycss": "^1.0.5", "merge-stream": "^1.0.0", + "rollup": "^0.60.2", + "rollup-plugin-babel": "^3.0.4", + "rollup-plugin-commonjs": "^9.1.3", + "rollup-plugin-inject": "^2.0.0", + "rollup-plugin-node-resolve": "^3.3.0", + "rollup-plugin-uglify": "^4.0.0", "upath": "^1.1.0", "yargs": "^6.4.0" }, "scripts": { - "build": "gulp", - "gulp": "gulp", + "build": "gulp build", + "gulp": "gulp build", "lint": "yarn lint:js", - "lint:js": "eslint gulpfile.babel.js src/Sylius/Bundle/AdminBundle/gulpfile.babel.js src/Sylius/Bundle/ShopBundle/gulpfile.babel.js" + "lint:js": "eslint gulpfile.babel.js src/Sylius/Bundle/AdminBundle/gulpfile.babel.js src/Sylius/Bundle/ShopBundle/gulpfile.babel.js src/Sylius/Bundle/UiBundle/Resources/private/js src/Sylius/Bundle/AdminBundle/Resources/private/js src/Sylius/Bundle/ShopBundle/Resources/private/js" }, "repository": { "type": "git", diff --git a/src/Sylius/Bundle/AdminBundle/Resources/private/.eslintrc.js b/src/Sylius/Bundle/AdminBundle/Resources/private/.eslintrc.js new file mode 100644 index 00000000000..869805593a6 --- /dev/null +++ b/src/Sylius/Bundle/AdminBundle/Resources/private/.eslintrc.js @@ -0,0 +1,29 @@ +module.exports = { + extends: 'airbnb-base', + env: { + browser: true, + }, + rules: { + 'object-shorthand': ['error', 'always', { + avoidQuotes: true, + avoidExplicitReturnArrows: true, + }], + 'function-paren-newline': ['error', 'consistent'], + 'max-len': ['warn', 120, 2, { + ignoreUrls: true, + ignoreComments: false, + ignoreRegExpLiterals: true, + ignoreStrings: true, + ignoreTemplateLiterals: true, + }], + }, + settings: { + 'import/resolver': { + 'babel-module': { + alias: { + 'sylius/ui': './src/Sylius/Bundle/UiBundle/Resources/private/js', + }, + }, + }, + }, +}; diff --git a/src/Sylius/Bundle/AdminBundle/Resources/private/js/app.js b/src/Sylius/Bundle/AdminBundle/Resources/private/js/app.js index 055b574d80d..f6ee56b19ea 100644 --- a/src/Sylius/Bundle/AdminBundle/Resources/private/js/app.js +++ b/src/Sylius/Bundle/AdminBundle/Resources/private/js/app.js @@ -7,77 +7,97 @@ * file that was distributed with this source code. */ -(function($) { - $(document).ready(function () { - $('#sylius_product_variant_pricingCalculator').handlePrototypes({ - 'prototypePrefix': 'sylius_product_variant_pricingCalculator', - 'containerSelector': '#sylius_calculator_container' - }); - - $('#sylius_customer_createUser').change(function () { - $('#user-form').toggle(); - }); - - $('.sylius-autocomplete').autoComplete(); - - $('.product-select.ui.fluid.multiple.search.selection.dropdown').productAutoComplete(); - $('div#attributeChoice > .ui.dropdown.search').productAttributes(); - - $('table thead th.sortable').on('click', function () { - window.location = $(this).find('a').attr('href'); - }); - - $('.sylius-update-product-taxons').moveProduct($('.sylius-product-taxon-position')); - $('.sylius-update-product-variants').moveProductVariant($('.sylius-product-variant-position')); - $('.sylius-taxon-move-up').taxonMoveUp(); - $('.sylius-taxon-move-down').taxonMoveDown(); - - $('#sylius_shipping_method_calculator').handlePrototypes({ - 'prototypePrefix': 'sylius_shipping_method_calculator_calculators', - 'containerSelector': '.configuration' - }); - - $('#actions a[data-form-collection="add"]').on('click', function () { - setTimeout(function(){ - $('select[name^="sylius_promotion[actions]"][name$="[type]"]').last().change(); - }, 50); - }); - $('#rules a[data-form-collection="add"]').on('click', function () { - setTimeout(function(){ - $('select[name^="sylius_promotion[rules]"][name$="[type]"]').last().change(); - }, 50); - }); - - $(document).on('collection-form-add', function () { - $.each($('.sylius-autocomplete'), function (index, element) { - if ($._data($(element).get(0), 'events') == undefined) { - $(element).autoComplete(); - } - }); - }); - $(document).on('collection-form-update', function () { - $.each($('.sylius-autocomplete'), function (index, element) { - if ($._data($(element).get(0), 'events') == undefined) { - $(element).autoComplete(); - } - }); - }); - - $('.sylius-tabular-form').addTabErrors(); - $('.ui.accordion').addAccordionErrors(); - $('#sylius-product-taxonomy-tree').choiceTree('productTaxon', true, 1); - - $(document).notification(); - $(document).productSlugGenerator(); - $(document).taxonSlugGenerator(); - - $(document).previewUploadedImage('#sylius_product_images'); - $(document).previewUploadedImage('#sylius_taxon_images'); - - $('body').on('DOMNodeInserted', '[data-form-collection="item"]', function() { - if ($(this).find('.accordion').length > 0) { - $(this).find('.accordion').accordion(); - } - }); +import 'semantic-ui-css/components/accordion'; +import $ from 'jquery'; + +import 'sylius/ui/app'; +import 'sylius/ui/sylius-auto-complete'; +import 'sylius/ui/sylius-product-attributes'; +import 'sylius/ui/sylius-product-auto-complete'; +import 'sylius/ui/sylius-prototype-handler'; + +import './sylius-compound-form-errors'; +import './sylius-lazy-choice-tree'; +import './sylius-move-product'; +import './sylius-move-product-variant'; +import './sylius-move-taxon'; +import './sylius-notification'; +import './sylius-product-images-preview'; +import './sylius-product-slug'; +import './sylius-taxon-slug'; + +$(document).ready(() => { + $('#sylius_product_variant_pricingCalculator').handlePrototypes({ + prototypePrefix: 'sylius_product_variant_pricingCalculator', + containerSelector: '#sylius_calculator_container', + }); + + $('#sylius_customer_createUser').change(() => { + $('#user-form').toggle(); + }); + + $('.sylius-autocomplete').autoComplete(); + + $('.product-select.ui.fluid.multiple.search.selection.dropdown').productAutoComplete(); + $('div#attributeChoice > .ui.dropdown.search').productAttributes(); + + $('table thead th.sortable').on('click', (event) => { + window.location = $(event.currentTarget).find('a').attr('href'); + }); + + $('.sylius-update-product-taxons').moveProduct($('.sylius-product-taxon-position')); + $('.sylius-update-product-variants').moveProductVariant($('.sylius-product-variant-position')); + $('.sylius-taxon-move-up').taxonMoveUp(); + $('.sylius-taxon-move-down').taxonMoveDown(); + + $('#sylius_shipping_method_calculator').handlePrototypes({ + prototypePrefix: 'sylius_shipping_method_calculator_calculators', + containerSelector: '.configuration', + }); + + $('#actions a[data-form-collection="add"]').on('click', () => { + setTimeout(() => { + $('select[name^="sylius_promotion[actions]"][name$="[type]"]').last().change(); + }, 50); + }); + $('#rules a[data-form-collection="add"]').on('click', () => { + setTimeout(() => { + $('select[name^="sylius_promotion[rules]"][name$="[type]"]').last().change(); + }, 50); + }); + + $(document).on('collection-form-add', () => { + $('.sylius-autocomplete').each((index, element) => { + if ($._data($(element).get(0), 'events') == undefined) { + $(element).autoComplete(); + } }); -})(jQuery); + }); + $(document).on('collection-form-update', () => { + $('.sylius-autocomplete').each((index, element) => { + if ($._data($(element).get(0), 'events') == undefined) { + $(element).autoComplete(); + } + }); + }); + + $('.sylius-tabular-form').addTabErrors(); + $('.ui.accordion').addAccordionErrors(); + $('#sylius-product-taxonomy-tree').choiceTree('productTaxon', true, 1); + + $(document).notification(); + $(document).productSlugGenerator(); + $(document).taxonSlugGenerator(); + + $(document).previewUploadedImage('#sylius_product_images'); + $(document).previewUploadedImage('#sylius_taxon_images'); + + $('body').on('DOMNodeInserted', '[data-form-collection="item"]', (event) => { + if ($(event.relatedNode).find('.accordion').length > 0) { + $(event.relatedNode).find('.accordion').accordion(); + } + }); +}); + +window.$ = $; +window.jQuery = $; diff --git a/src/Sylius/Bundle/AdminBundle/Resources/private/js/shim/shim-jquery.js b/src/Sylius/Bundle/AdminBundle/Resources/private/js/shim/shim-jquery.js new file mode 100644 index 00000000000..37fcc6011b7 --- /dev/null +++ b/src/Sylius/Bundle/AdminBundle/Resources/private/js/shim/shim-jquery.js @@ -0,0 +1,4 @@ +import $ from 'jquery'; + +window.$ = $; +window.jQuery = $; diff --git a/src/Sylius/Bundle/AdminBundle/Resources/private/js/shim/shim-polyfill.js b/src/Sylius/Bundle/AdminBundle/Resources/private/js/shim/shim-polyfill.js new file mode 100644 index 00000000000..b012711b908 --- /dev/null +++ b/src/Sylius/Bundle/AdminBundle/Resources/private/js/shim/shim-polyfill.js @@ -0,0 +1 @@ +import 'babel-polyfill'; diff --git a/src/Sylius/Bundle/AdminBundle/Resources/private/js/shim/shim-semantic-ui.js b/src/Sylius/Bundle/AdminBundle/Resources/private/js/shim/shim-semantic-ui.js new file mode 100644 index 00000000000..8cb9d0a79cc --- /dev/null +++ b/src/Sylius/Bundle/AdminBundle/Resources/private/js/shim/shim-semantic-ui.js @@ -0,0 +1,24 @@ +import 'semantic-ui-css/components/accordion'; +import 'semantic-ui-css/components/api'; +import 'semantic-ui-css/components/checkbox'; +import 'semantic-ui-css/components/colorize'; +import 'semantic-ui-css/components/dimmer'; +import 'semantic-ui-css/components/dropdown'; +import 'semantic-ui-css/components/embed'; +import 'semantic-ui-css/components/form'; +import 'semantic-ui-css/components/modal'; +import 'semantic-ui-css/components/nag'; +import 'semantic-ui-css/components/popup'; +import 'semantic-ui-css/components/progress'; +import 'semantic-ui-css/components/rating'; +import 'semantic-ui-css/components/search'; +import 'semantic-ui-css/components/shape'; +import 'semantic-ui-css/components/sidebar'; +import 'semantic-ui-css/components/site'; +import 'semantic-ui-css/components/state'; +import 'semantic-ui-css/components/sticky'; +import 'semantic-ui-css/components/tab'; +import 'semantic-ui-css/components/transition'; +import 'semantic-ui-css/components/video'; +import 'semantic-ui-css/components/visibility'; +import 'semantic-ui-css/components/visit'; diff --git a/src/Sylius/Bundle/AdminBundle/Resources/private/js/sylius-compound-form-errors.js b/src/Sylius/Bundle/AdminBundle/Resources/private/js/sylius-compound-form-errors.js index a553b5dbe02..a76c5692412 100644 --- a/src/Sylius/Bundle/AdminBundle/Resources/private/js/sylius-compound-form-errors.js +++ b/src/Sylius/Bundle/AdminBundle/Resources/private/js/sylius-compound-form-errors.js @@ -7,40 +7,39 @@ * file that was distributed with this source code. */ -(function ($) { - 'use strict'; - - $.fn.extend({ - addTabErrors: function () { - var element = $(this); - - $('.ui.segment > .ui.tab').each(function () { - var errors = $(this).find('.sylius-validation-error'); - - if(0 !== errors.length) { - var tabName = $(this).attr('data-tab'); - var tabWithErrors = $(element).find('a.item[data-tab="' + tabName + '"]'); - - var label = tabWithErrors.html(); - var newLabel = label + '' + errors.length + ''; - - tabWithErrors.html(newLabel); - } - }); - }, - addAccordionErrors: function () { - var element = $(this); - var accordionElements = element.find('.ui.content'); - - $(accordionElements).each(function () { - var errors = $(this).find('.sylius-validation-error'); - - if(0 !== errors.length) { - var ribWithErrors = $(this).closest('[data-locale]').find('.title'); - - ribWithErrors.css('color', '#DB2828'); - } - }); - } - }) -})( jQuery ); +import $ from 'jquery'; + +$.fn.extend({ + addTabErrors() { + const element = this; + + $('.ui.segment > .ui.tab').each((idx, el) => { + const errors = $(el).find('.sylius-validation-error'); + + if (errors.length !== 0) { + const tabName = $(el).attr('data-tab'); + const tabWithErrors = $(element).find(`a.item[data-tab="${tabName}"]`); + + const label = tabWithErrors.html(); + const newLabel = `${label}${errors.length}`; + + tabWithErrors.html(newLabel); + } + }); + }, + + addAccordionErrors() { + const element = this; + const accordionElements = element.find('.ui.content'); + + $(accordionElements).each((idx, el) => { + const errors = $(el).find('.sylius-validation-error'); + + if (errors.length !== 0) { + const ribWithErrors = $(el).closest('[data-locale]').find('.title'); + + ribWithErrors.css('color', '#DB2828'); + } + }); + }, +}); diff --git a/src/Sylius/Bundle/AdminBundle/Resources/private/js/sylius-lazy-choice-tree.js b/src/Sylius/Bundle/AdminBundle/Resources/private/js/sylius-lazy-choice-tree.js index 7b13c8198bb..f06cf3d91cc 100644 --- a/src/Sylius/Bundle/AdminBundle/Resources/private/js/sylius-lazy-choice-tree.js +++ b/src/Sylius/Bundle/AdminBundle/Resources/private/js/sylius-lazy-choice-tree.js @@ -7,166 +7,169 @@ * file that was distributed with this source code. */ -(function ($) { - 'use strict'; - - $.fn.extend({ - choiceTree: function (type, multiple, defaultLevel) { - var tree = $(this); - var loader = $(this).find('.dimmer'); - var loadedLeafs = []; - var $input = $(this).find('input[type="hidden"]'); - - tree.api({ - on: 'now', - method: 'GET', - url: tree.data('taxon-root-nodes-url'), - cache: false, - beforeSend: function(settings) { - loader.addClass('active'); - - return settings; - }, - onSuccess: function (response) { - var rootContainer = createRootContainer(); - $.each(response, function (rootNodeIndex, rootNode) { - rootContainer.append(createLeaf(rootNode.name, rootNode.code, rootNode.hasChildren, multiple, rootNode.level)); - }); - tree.append(rootContainer); - loader.removeClass('active'); - } +import 'semantic-ui-css/components/api'; +import 'semantic-ui-css/components/checkbox'; +import $ from 'jquery'; + +const createRootContainer = function createRootContainer() { + return $('
'); +}; + +const createLeafContainerElement = function createLeafContainerElement() { + return $('
'); +}; + +const createLeafIconElement = function createLeafIconElement() { + return $(''); +}; + +const createLeafTitleElement = function createLeafTitleElement() { + return $('
'); +}; + +const createLeafTitleSpan = function createLeafTitleSpan(displayName) { + return $(`${displayName}`); +}; + +const createLeafContentElement = function createLeafContentElement() { + return $('
'); +}; + +$.fn.extend({ + choiceTree(type, multiple, defaultLevel) { + const tree = this; + const loader = tree.find('.dimmer'); + const loadedLeafs = []; + const $input = tree.find('input[type="hidden"]'); + + const createCheckboxElement = function createCheckboxElement(name, code, multi) { + const chosenNodes = $input.val().split(','); + let checked = ''; + if (chosenNodes.some(chosenCode => chosenCode === code)) { + checked = 'checked="checked"'; + } + if (multi) { + return $(`
`); + } + + return $(`
`); + }; + + const isLeafLoaded = function isLeafLoaded(code) { + return loadedLeafs.some(leafCode => leafCode === code); + }; + + let createLeafFunc; + + const loadLeafAction = function loadLeafAction(parentCode, expandButton, content, icon, leafContainerElement) { + icon.toggleClass('open'); + + if (!isLeafLoaded(parentCode)) { + expandButton.api({ + on: 'now', + url: tree.data('taxon-leafs-url'), + method: 'GET', + cache: false, + data: { + parentCode, + }, + beforeSend(settings) { + loader.addClass('active'); + + return settings; + }, + onSuccess(response) { + response.forEach((leafNode) => { + leafContainerElement.append(( + createLeafFunc(leafNode.name, leafNode.code, leafNode.hasChildren, multiple, leafNode.level) + )); }); - - var createLeaf = function (name, code, hasChildren, multipleChoice, level) { - var displayNameElement = createLeafTitleSpan(name); - var titleElement = createLeafTitleElement(); - var iconElement = createLeafIconElement(); - var checkboxElement = createCheckboxElement(name, code, multipleChoice); - - bindCheckboxAction(checkboxElement); - - var leafElement = $('
'); - var leafContentElement = createLeafContentElement(); - - leafElement.append(iconElement); - titleElement.append(displayNameElement); - titleElement.append(checkboxElement); - leafContentElement.append(titleElement); - - if (!hasChildren) { - iconElement.addClass('outline'); - } - if (hasChildren) { - bindExpandLeafAction(code, displayNameElement, leafContentElement, iconElement, level); - } - leafElement.append(leafContentElement); - - return leafElement; - }; - - var createRootContainer = function () { - return $('
'); - }; - - var createLeafContainerElement = function () { - return $('
'); - }; - - var createLeafIconElement = function () { - return $(''); - }; - - var createLeafTitleElement = function () { - return $('
'); - }; - - var createLeafTitleSpan = function (displayName) { - return $(''+displayName+'') - }; - - var createLeafContentElement = function () { - return $('
'); - }; - - var createCheckboxElement = function (name, code, multiple) { - var chosenNodes = $input.val().split(','); - var checked = ''; - if (chosenNodes.some(function (chosenCode) {return chosenCode === code})) { - checked = 'checked="checked"'; - } - if (multiple) { - return $('
'); - } - - return $('
'); - }; - - var isLeafLoaded = function (code) { - return loadedLeafs.some(function (leafCode) { - return leafCode === code; - }) - }; - - var bindExpandLeafAction = function (parentCode, expandButton, content, icon, level) { - var leafContainerElement = createLeafContainerElement(); - if (defaultLevel > level) { - loadLeafAction(parentCode, expandButton, content, icon, leafContainerElement); - } - - expandButton.click(function () { - loadLeafAction(parentCode, expandButton, content, icon, leafContainerElement); - }); - }; - - var loadLeafAction = function (parentCode, expandButton, content, icon, leafContainerElement) { - icon.toggleClass('open'); - - if (!isLeafLoaded(parentCode)) { - expandButton.api({ - on: 'now', - url: tree.data('taxon-leafs-url'), - method: 'GET', - cache: false, - data: { - parentCode: parentCode - }, - beforeSend: function(settings) { - loader.addClass('active'); - - return settings; - }, - onSuccess: function (response) { - $.each(response, function (leafIndex, leafNode) { - leafContainerElement.append(createLeaf(leafNode.name, leafNode.code, leafNode.hasChildren, multiple, leafNode.level)); - }); - content.append(leafContainerElement); - loader.removeClass('active'); - loadedLeafs.push(parentCode); - } - }); - - return; - } - - leafContainerElement.toggle(); - }; - - var bindCheckboxAction = function (checkboxElement) { - checkboxElement.checkbox({ - onChange: function () { - var $checkboxes = tree.find('.checkbox'); - var checkedValues = []; - - $checkboxes.each(function () { - if ($(this).checkbox('is checked')) { - checkedValues.push($(this).data('value')); - } - }); - - $input.val(checkedValues.join()); - } - }); - }; - } + content.append(leafContainerElement); + loader.removeClass('active'); + loadedLeafs.push(parentCode); + }, + }); + } + + leafContainerElement.toggle(); + }; + + const bindExpandLeafAction = function bindExpandLeafAction(parentCode, expandButton, content, icon, level) { + const leafContainerElement = createLeafContainerElement(); + if (defaultLevel > level) { + loadLeafAction(parentCode, expandButton, content, icon, leafContainerElement); + } + + expandButton.click(() => { + loadLeafAction(parentCode, expandButton, content, icon, leafContainerElement); + }); + }; + + const bindCheckboxAction = function bindCheckboxAction(checkboxElement) { + checkboxElement.checkbox({ + onChange() { + const $checkboxes = tree.find('.checkbox'); + const checkedValues = []; + + $checkboxes.each((index, element) => { + if ($(element).checkbox('is checked')) { + checkedValues.push($(element).data('value')); + } + }); + + $input.val(checkedValues.join()); + }, + }); + }; + + const createLeaf = function createLeaf(name, code, hasChildren, multipleChoice, level) { + const displayNameElement = createLeafTitleSpan(name); + const titleElement = createLeafTitleElement(); + const iconElement = createLeafIconElement(); + const checkboxElement = createCheckboxElement(name, code, multipleChoice); + + bindCheckboxAction(checkboxElement); + + const leafElement = $('
'); + const leafContentElement = createLeafContentElement(); + + leafElement.append(iconElement); + titleElement.append(displayNameElement); + titleElement.append(checkboxElement); + leafContentElement.append(titleElement); + + if (!hasChildren) { + iconElement.addClass('outline'); + } + if (hasChildren) { + bindExpandLeafAction(code, displayNameElement, leafContentElement, iconElement, level); + } + leafElement.append(leafContentElement); + + return leafElement; + }; + createLeafFunc = createLeaf; + + tree.api({ + on: 'now', + method: 'GET', + url: tree.data('taxon-root-nodes-url'), + cache: false, + beforeSend(settings) { + loader.addClass('active'); + + return settings; + }, + onSuccess(response) { + const rootContainer = createRootContainer(); + response.forEach((rootNode) => { + rootContainer.append(( + createLeaf(rootNode.name, rootNode.code, rootNode.hasChildren, multiple, rootNode.level) + )); + }); + tree.append(rootContainer); + loader.removeClass('active'); + }, }); -})(jQuery); + }, +}); diff --git a/src/Sylius/Bundle/AdminBundle/Resources/private/js/sylius-move-product-variant.js b/src/Sylius/Bundle/AdminBundle/Resources/private/js/sylius-move-product-variant.js index 358afa6d902..8e3406ecbc7 100644 --- a/src/Sylius/Bundle/AdminBundle/Resources/private/js/sylius-move-product-variant.js +++ b/src/Sylius/Bundle/AdminBundle/Resources/private/js/sylius-move-product-variant.js @@ -7,44 +7,43 @@ * file that was distributed with this source code. */ -(function ( $ ) { - 'use strict'; +import 'semantic-ui-css/components/api'; +import $ from 'jquery'; - $.fn.extend({ - moveProductVariant: function (positionInput) { - var productVariantIds = []; - var element = $(this); +$.fn.extend({ + moveProductVariant(positionInput) { + const productVariantRows = []; + const element = this; - element.api({ - method: 'PUT', - beforeSend: function (settings) { - settings.data = { - productVariants: productVariantIds, - _csrf_token: element.data('csrf-token') - }; + element.api({ + method: 'PUT', + beforeSend(settings) { + /* eslint-disable-next-line no-param-reassign */ + settings.data = { + productVariants: productVariantRows, + _csrf_token: element.data('csrf-token'), + }; - return settings; - }, - onSuccess: function (response) { - location.reload(); - } - }); + return settings; + }, + onSuccess() { + window.location.reload(); + }, + }); - positionInput.on('input', function () { - var id = $(this).data('id'); - var rowToEdit = productVariantIds.filter(function (productVariant){ - return productVariant.id == id; - }); + positionInput.on('input', (event) => { + const input = $(event.currentTarget); + const productVariantId = input.data('id'); + const row = productVariantRows.find(({ id }) => id === productVariantId); - if(rowToEdit.length == 0) { - productVariantIds.push({ - id: $(this).data('id'), - position: $(this).val() - }); - } else { - rowToEdit[0].position = $(this).val(); - } - }); - } + if (!row) { + productVariantRows.push({ + id: productVariantId, + position: input.val(), + }); + } else { + row.position = input.val(); + } }); -})(jQuery); + }, +}); diff --git a/src/Sylius/Bundle/AdminBundle/Resources/private/js/sylius-move-product.js b/src/Sylius/Bundle/AdminBundle/Resources/private/js/sylius-move-product.js index 6400786b791..dac12062487 100644 --- a/src/Sylius/Bundle/AdminBundle/Resources/private/js/sylius-move-product.js +++ b/src/Sylius/Bundle/AdminBundle/Resources/private/js/sylius-move-product.js @@ -7,44 +7,43 @@ * file that was distributed with this source code. */ -(function ( $ ) { - 'use strict'; +import 'semantic-ui-css/components/api'; +import $ from 'jquery'; - $.fn.extend({ - moveProduct: function (positionInput) { - var productIds = []; - var element = $(this); +$.fn.extend({ + moveProduct(positionInput) { + const productIds = []; + const element = this; - element.api({ - method: 'PUT', - beforeSend: function (settings) { - settings.data = { - productTaxons: productIds, - _csrf_token: element.data('csrf-token') - }; + element.api({ + method: 'PUT', + beforeSend(settings) { + /* eslint-disable-next-line no-param-reassign */ + settings.data = { + productTaxons: productIds, + _csrf_token: element.data('csrf-token'), + }; - return settings; - }, - onSuccess: function (response) { - location.reload(); - } - }); + return settings; + }, + onSuccess() { + window.location.reload(); + }, + }); - positionInput.on('input', function () { - var id = $(this).data('id'); - var rowToEdit = productIds.filter(function (productTaxon){ - return productTaxon.id == id; - }); + positionInput.on('input', (event) => { + const input = $(event.currentTarget); + const id = input.data('id'); + const rowToEdit = productIds.filter(productTaxon => productTaxon.id == id); - if(rowToEdit.length == 0) { - productIds.push({ - id: $(this).data('id'), - position: $(this).val() - }); - } else { - rowToEdit[0].position = $(this).val(); - } - }); - } + if (rowToEdit.length === 0) { + productIds.push({ + id: input.data('id'), + position: input.val(), + }); + } else { + rowToEdit[0].position = input.val(); + } }); -})(jQuery); + }, +}); diff --git a/src/Sylius/Bundle/AdminBundle/Resources/private/js/sylius-move-taxon.js b/src/Sylius/Bundle/AdminBundle/Resources/private/js/sylius-move-taxon.js index 1a883cb8d46..4f848848dad 100644 --- a/src/Sylius/Bundle/AdminBundle/Resources/private/js/sylius-move-taxon.js +++ b/src/Sylius/Bundle/AdminBundle/Resources/private/js/sylius-move-taxon.js @@ -7,41 +7,47 @@ * file that was distributed with this source code. */ -(function ($) { - 'use strict'; +import 'semantic-ui-css/components/api'; +import $ from 'jquery'; - $.fn.extend({ - taxonMoveUp: function () { - $(this).api({ - method: 'PUT', - on: 'click', - beforeSend: function (settings) { - settings.data = { - position: $(this).data('position') - 1 - }; +$.fn.extend({ + taxonMoveUp() { + const element = this; - return settings; - }, - onSuccess: function (response) { - location.reload(); - } - }); - }, - taxonMoveDown: function () { - $(this).api({ - method: 'PUT', - on: 'click', - beforeSend: function (settings) { - settings.data = { - position: $(this).data('position') + 1 - }; + element.api({ + method: 'PUT', + on: 'click', + beforeSend(settings) { + /* eslint-disable-next-line no-param-reassign */ + settings.data = { + position: element.data('position') - 1, + }; - return settings; - }, - onSuccess: function (response) { - location.reload(); - } - }); - } + return settings; + }, + onSuccess() { + window.location.reload(); + }, }); -})(jQuery); + }, + + taxonMoveDown() { + const element = this; + + element.api({ + method: 'PUT', + on: 'click', + beforeSend(settings) { + /* eslint-disable-next-line no-param-reassign */ + settings.data = { + position: element.data('position') + 1, + }; + + return settings; + }, + onSuccess() { + window.location.reload(); + }, + }); + }, +}); diff --git a/src/Sylius/Bundle/AdminBundle/Resources/private/js/sylius-notification.js b/src/Sylius/Bundle/AdminBundle/Resources/private/js/sylius-notification.js index 6fcf906fc11..1bfc69ef57e 100644 --- a/src/Sylius/Bundle/AdminBundle/Resources/private/js/sylius-notification.js +++ b/src/Sylius/Bundle/AdminBundle/Resources/private/js/sylius-notification.js @@ -7,109 +7,96 @@ * file that was distributed with this source code. */ -(function ($) { - 'use strict'; - - $.fn.extend({ - notification: function () { - var HUB_REQUEST_TIME = 'hub_request_time'; - var LAST_SYLIUS_VERSION = 'last_sylius_version'; - var SYLIUS_VERSION_DISMISSED = 'sylius_version_dismissed'; - var MILISECONDS_MULTIPLIER = 1000; - - var notificationMenu = $('#sylius-version-notification'); - var askFrequency = notificationMenu.attr('data-frequency') * MILISECONDS_MULTIPLIER; - - $(notificationMenu).find('i[data-dismiss]').on('click', function () { - store(SYLIUS_VERSION_DISMISSED, getLatestSyliusVersion()); - - updateNotification(); - }); - - updateNotification(); - - function updateNotification() { - if (isLatest() || isDismissed()) { - hideNotification(); - - return; - } - - showNotification(); - } - - function showNotification() - { - var notificationMenu = $('#sylius-version-notification'); - - $('#notifications').css('display', 'block'); - $('#no-notifications').css('display', 'none'); - notificationMenu.find('.bell.icon').removeClass('outline').addClass('yellow'); - } - - function hideNotification() - { - var notificationMenu = $('#sylius-version-notification'); - - $('#notifications').css('display', 'none'); - $('#no-notifications').css('display', 'block'); - notificationMenu.find('.bell.icon').removeClass('yellow').addClass('outline'); - } - - function getCurrentSyliusVersion() - { - return notificationMenu.data('current-version'); - } - - function getLatestSyliusVersion() - { - if (retrieve(HUB_REQUEST_TIME) !== undefined && milisecondsSinceLastRequest() < askFrequency) { - return retrieve(LAST_SYLIUS_VERSION); - } - - $.ajax({ - type: "GET", - url: notificationMenu.attr('data-url'), - accept: "application/json", - success: function (data) { - if (undefined !== data && data.version !== retrieve(LAST_SYLIUS_VERSION)) { - store(LAST_SYLIUS_VERSION, data.version.toString()); - } - }, - complete: function () { - store(HUB_REQUEST_TIME, new Date().getTime().toString()); - } - }); - - return retrieve(LAST_SYLIUS_VERSION); - } - - function getDismissedSyliusVersion() - { - return retrieve(SYLIUS_VERSION_DISMISSED); - } - - function isLatest() - { - return getCurrentSyliusVersion() === getLatestSyliusVersion(); - } - - function isDismissed() - { - return getLatestSyliusVersion() === getDismissedSyliusVersion(); - } - - function milisecondsSinceLastRequest() { - return new Date().getTime() - parseInt(retrieve(HUB_REQUEST_TIME)); - } - - function store(key, value) { - localStorage.setItem(key, value); - } - - function retrieve(key) { - return localStorage.getItem(key); - } - } +import $ from 'jquery'; + +const HUB_REQUEST_TIME = 'hub_request_time'; +const LAST_SYLIUS_VERSION = 'last_sylius_version'; +const SYLIUS_VERSION_DISMISSED = 'sylius_version_dismissed'; +const MILISECONDS_MULTIPLIER = 1000; + +const store = function store(key, value) { + localStorage.setItem(key, value); +}; + +const retrieve = function retrieve(key) { + return localStorage.getItem(key); +}; + +const milisecondsSinceLastRequest = function milisecondsSinceLastRequest() { + return new Date().getTime() - parseInt(retrieve(HUB_REQUEST_TIME), 10); +}; + +const getDismissedSyliusVersion = function getDismissedSyliusVersion() { + return retrieve(SYLIUS_VERSION_DISMISSED); +}; + +$.fn.extend({ + notification() { + const notificationMenu = $('#sylius-version-notification'); + const askFrequency = notificationMenu.attr('data-frequency') * MILISECONDS_MULTIPLIER; + + const getCurrentSyliusVersion = function getCurrentSyliusVersion() { + return notificationMenu.data('current-version'); + }; + + const getLatestSyliusVersion = function getLatestSyliusVersion() { + if (retrieve(HUB_REQUEST_TIME) !== undefined && milisecondsSinceLastRequest() < askFrequency) { + return retrieve(LAST_SYLIUS_VERSION); + } + + $.ajax({ + type: 'GET', + url: notificationMenu.attr('data-url'), + accept: 'application/json', + success(response) { + if (undefined !== response && response.version !== retrieve(LAST_SYLIUS_VERSION)) { + store(LAST_SYLIUS_VERSION, response.version.toString()); + } + }, + complete() { + store(HUB_REQUEST_TIME, new Date().getTime().toString()); + }, + }); + + return retrieve(LAST_SYLIUS_VERSION); + }; + + const isLatest = function isLatest() { + return getCurrentSyliusVersion() === getLatestSyliusVersion(); + }; + + const isDismissed = function isDismissed() { + return getLatestSyliusVersion() === getDismissedSyliusVersion(); + }; + + const showNotification = function showNotification() { + $('#notifications').css('display', 'block'); + $('#no-notifications').css('display', 'none'); + notificationMenu.find('.bell.icon').removeClass('outline').addClass('yellow'); + }; + + const hideNotification = function hideNotification() { + $('#notifications').css('display', 'none'); + $('#no-notifications').css('display', 'block'); + notificationMenu.find('.bell.icon').removeClass('yellow').addClass('outline'); + }; + + const updateNotification = function updateNotification() { + if (isLatest() || isDismissed()) { + hideNotification(); + + return; + } + + showNotification(); + }; + + $(notificationMenu).find('i[data-dismiss]').on('click', () => { + store(SYLIUS_VERSION_DISMISSED, getLatestSyliusVersion()); + + updateNotification(); }); -})(jQuery); + + updateNotification(); + }, +}); diff --git a/src/Sylius/Bundle/AdminBundle/Resources/private/js/sylius-product-images-preview.js b/src/Sylius/Bundle/AdminBundle/Resources/private/js/sylius-product-images-preview.js index 6ad04e68438..98839bf5bed 100644 --- a/src/Sylius/Bundle/AdminBundle/Resources/private/js/sylius-product-images-preview.js +++ b/src/Sylius/Bundle/AdminBundle/Resources/private/js/sylius-product-images-preview.js @@ -1,43 +1,50 @@ -(function ( $ ) { - 'use strict'; - - $.fn.extend({ - previewUploadedImage: function (root) { - $(root + ' input[type="file"]').each(function() { - $(this).change(function() { - displayUploadedImage(this); - }); - }); - - $(root + ' [data-form-collection="add"]').on('click', function() { - var self = $(this); - - setTimeout(function() { - self.parent().find('.column:last-child input[type="file"]').on('change', function() { - displayUploadedImage(this); - }); - }, 500); - }); - } +/* + * This file is part of the Sylius package. + * + * (c) Paweł Jędrzejewski + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +import $ from 'jquery'; + +const displayUploadedImage = function displayUploadedImage(input) { + if (input.files && input.files[0]) { + const reader = new FileReader(); + + reader.onload = (event) => { + const image = $(input).parent().siblings('.image'); + + if (image.length > 0) { + image.attr('src', event.target.result); + } else { + const img = $(''); + img.attr('src', event.target.result); + $(input).parent().before(img); + } + }; + + reader.readAsDataURL(input.files[0]); + } +}; + +$.fn.extend({ + previewUploadedImage(root) { + $(`${root} input[type="file"]`).each((idx, el) => { + $(el).change((event) => { + displayUploadedImage(event.currentTarget); + }); + }); + + $(`${root} [data-form-collection="add"]`).on('click', (evt) => { + const self = $(evt.currentTarget); + + setTimeout(() => { + self.parent().find('.column:last-child input[type="file"]').on('change', (event) => { + displayUploadedImage(event.currentTarget); + }); + }, 500); }); -})( jQuery ); - -function displayUploadedImage(input) { - if (input.files && input.files[0]) { - var reader = new FileReader(); - - reader.onload = function (e) { - var image = $(input).parent().siblings('.image'); - - if (image.length > 0) { - image.attr('src', e.target.result); - } else { - var img = $(''); - img.attr('src', e.target.result); - $(input).parent().before(img); - } - }; - - reader.readAsDataURL(input.files[0]); - } -} + }, +}); diff --git a/src/Sylius/Bundle/AdminBundle/Resources/private/js/sylius-product-slug.js b/src/Sylius/Bundle/AdminBundle/Resources/private/js/sylius-product-slug.js index a2572586765..845abc89aa8 100644 --- a/src/Sylius/Bundle/AdminBundle/Resources/private/js/sylius-product-slug.js +++ b/src/Sylius/Bundle/AdminBundle/Resources/private/js/sylius-product-slug.js @@ -7,63 +7,61 @@ * file that was distributed with this source code. */ -(function ($) { - 'use strict'; +import $ from 'jquery'; - $.fn.extend({ - productSlugGenerator: function () { - var timeout; +const updateSlug = function updateSlug(element) { + const slugInput = element.parents('.content').find('[name*="[slug]"]'); + const loadableParent = slugInput.parents('.field.loadable'); - $('[name*="sylius_product[translations]"][name*="[name]"]').on('input', function() { - clearTimeout(timeout); - var element = $(this); + if (slugInput.attr('readonly') === 'readonly') { + return; + } - timeout = setTimeout(function() { - updateSlug(element); - }, 1000); - }); + loadableParent.addClass('loading'); - $('.toggle-product-slug-modification').on('click', function(e) { - e.preventDefault(); - toggleSlugModification($(this), $(this).siblings('input')); - }); + $.ajax({ + type: 'GET', + url: slugInput.attr('data-url'), + data: { name: element.val() }, + dataType: 'json', + accept: 'application/json', + success(response) { + slugInput.val(response.slug); + if (slugInput.parents('.field').hasClass('error')) { + slugInput.parents('.field').removeClass('error'); + slugInput.parents('.field').find('.sylius-validation-error').remove(); + } + loadableParent.removeClass('loading'); + }, + }); +}; - function updateSlug(element) { - var slugInput = element.parents('.content').find('[name*="[slug]"]'); - var loadableParent = slugInput.parents('.field.loadable'); +const toggleSlugModification = function toggleSlugModification(button, slugInput) { + if (slugInput.attr('readonly')) { + slugInput.removeAttr('readonly'); + button.html(''); + } else { + slugInput.attr('readonly', 'readonly'); + button.html(''); + } +}; - if ('readonly' == slugInput.attr('readonly')) { - return; - } +$.fn.extend({ + productSlugGenerator() { + let timeout; - loadableParent.addClass('loading'); + $('[name*="sylius_product[translations]"][name*="[name]"]').on('input', (event) => { + clearTimeout(timeout); + const element = $(event.currentTarget); - $.ajax({ - type: "GET", - url: slugInput.attr('data-url'), - data: { name: element.val() }, - dataType: "json", - accept: "application/json", - success: function(data) { - slugInput.val(data.slug); - if (slugInput.parents('.field').hasClass('error')) { - slugInput.parents('.field').removeClass('error'); - slugInput.parents('.field').find('.sylius-validation-error').remove(); - } - loadableParent.removeClass('loading'); - } - }); - } + timeout = setTimeout(() => { + updateSlug(element); + }, 1000); + }); - function toggleSlugModification(button, slugInput) { - if (slugInput.attr('readonly')) { - slugInput.removeAttr('readonly'); - button.html(''); - } else { - slugInput.attr('readonly', 'readonly'); - button.html(''); - } - } - } + $('.toggle-product-slug-modification').on('click', (event) => { + event.preventDefault(); + toggleSlugModification($(event.currentTarget), $(event.currentTarget).siblings('input')); }); -})(jQuery); + }, +}); diff --git a/src/Sylius/Bundle/AdminBundle/Resources/private/js/sylius-taxon-slug.js b/src/Sylius/Bundle/AdminBundle/Resources/private/js/sylius-taxon-slug.js index 02f335b81ca..4999ef4362c 100644 --- a/src/Sylius/Bundle/AdminBundle/Resources/private/js/sylius-taxon-slug.js +++ b/src/Sylius/Bundle/AdminBundle/Resources/private/js/sylius-taxon-slug.js @@ -7,73 +7,81 @@ * file that was distributed with this source code. */ -(function ($) { - 'use strict'; +import $ from 'jquery'; - $.fn.extend({ - taxonSlugGenerator: function () { - var timeout; +const updateSlug = function updateSlug(element) { + const slugInput = element.parents('.content').find('[name*="[slug]"]'); + const loadableParent = slugInput.parents('.field.loadable'); - $('[name*="sylius_taxon[translations]"][name*="[name]"]').on('input', function() { - clearTimeout(timeout); - var element = $(this); + if (slugInput.attr('readonly') === 'readonly') { + return; + } - timeout = setTimeout(function() { - updateSlug(element); - }, 1000); - }); + loadableParent.addClass('loading'); - $('.toggle-taxon-slug-modification').on('click', function(e) { - e.preventDefault(); - toggleSlugModification($(this), $(this).siblings('input')); - }); + let data; + if (slugInput.attr('data-parent') != '' && slugInput.attr('data-parent') != undefined) { + data = { + name: element.val(), + locale: element.closest('[data-locale]').data('locale'), + parentId: slugInput.attr('data-parent'), + }; + } else if ($('#sylius_taxon_parent').length > 0 && $('#sylius_taxon_parent').is(':visible') && $('#sylius_taxon_parent').val() != '') { + data = { + name: element.val(), + locale: element.closest('[data-locale]').data('locale'), + parentId: $('#sylius_taxon_parent').val(), + }; + } else { + data = { + name: element.val(), + locale: element.closest('[data-locale]').data('locale'), + }; + } - function updateSlug(element) { - var slugInput = element.parents('.content').find('[name*="[slug]"]'); - var loadableParent = slugInput.parents('.field.loadable'); + $.ajax({ + type: 'GET', + url: slugInput.attr('data-url'), + data, + dataType: 'json', + accept: 'application/json', + success(response) { + slugInput.val(response.slug); + if (slugInput.parents('.field').hasClass('error')) { + slugInput.parents('.field').removeClass('error'); + slugInput.parents('.field').find('.sylius-validation-error').remove(); + } + loadableParent.removeClass('loading'); + }, + }); +}; - if ('readonly' == slugInput.attr('readonly')) { - return; - } +const toggleSlugModification = function toggleSlugModification(button, slugInput) { + if (slugInput.attr('readonly')) { + slugInput.removeAttr('readonly'); + button.html(''); + } else { + slugInput.attr('readonly', 'readonly'); + button.html(''); + } +}; - loadableParent.addClass('loading'); +$.fn.extend({ + taxonSlugGenerator() { + let timeout; - var data; - if ('' != slugInput.attr('data-parent') && undefined != slugInput.attr('data-parent')) { - data = { name: element.val(), locale: element.closest('[data-locale]').data('locale'), parentId: slugInput.attr('data-parent') }; - } else if ($('#sylius_taxon_parent').length > 0 && $('#sylius_taxon_parent').is(':visible') && '' != $('#sylius_taxon_parent').val()) { - data = { name: element.val(), locale: element.closest('[data-locale]').data('locale'), parentId: $('#sylius_taxon_parent').val() }; - } else { - data = { name: element.val(), locale: element.closest('[data-locale]').data('locale') }; - } + $('[name*="sylius_taxon[translations]"][name*="[name]"]').on('input', (event) => { + clearTimeout(timeout); + const element = $(event.currentTarget); - $.ajax({ - type: "GET", - url: slugInput.attr('data-url'), - data: data, - dataType: "json", - accept: "application/json", - success: function(data) { - slugInput.val(data.slug); - if (slugInput.parents('.field').hasClass('error')) { - slugInput.parents('.field').removeClass('error'); - slugInput.parents('.field').find('.sylius-validation-error').remove(); - } - loadableParent.removeClass('loading'); - } - }); - } - - function toggleSlugModification(button, slugInput) { - if (slugInput.attr('readonly')) { - slugInput.removeAttr('readonly'); - button.html(''); - } else { - slugInput.attr('readonly', 'readonly'); - button.html(''); - } - } - } + timeout = setTimeout(() => { + updateSlug(element); + }, 1000); }); -})(jQuery); + $('.toggle-taxon-slug-modification').on('click', (event) => { + event.preventDefault(); + toggleSlugModification($(event.currentTarget), $(event.currentTarget).siblings('input')); + }); + }, +}); diff --git a/src/Sylius/Bundle/AdminBundle/gulpfile.babel.js b/src/Sylius/Bundle/AdminBundle/gulpfile.babel.js index 63e8278327e..6c473781ebb 100644 --- a/src/Sylius/Bundle/AdminBundle/gulpfile.babel.js +++ b/src/Sylius/Bundle/AdminBundle/gulpfile.babel.js @@ -1,12 +1,18 @@ +import { rollup } from 'rollup'; +import { uglify } from 'rollup-plugin-uglify'; +import babel from 'rollup-plugin-babel'; +import commonjs from 'rollup-plugin-commonjs'; import concat from 'gulp-concat'; +import dedent from 'dedent'; import gulp from 'gulp'; import gulpif from 'gulp-if'; +import inject from 'rollup-plugin-inject'; import livereload from 'gulp-livereload'; import merge from 'merge-stream'; import order from 'gulp-order'; +import resolve from 'rollup-plugin-node-resolve'; import sass from 'gulp-sass'; import sourcemaps from 'gulp-sourcemaps'; -import uglify from 'gulp-uglify'; import uglifycss from 'gulp-uglifycss'; import upath from 'upath'; import yargs from 'yargs'; @@ -34,6 +40,11 @@ const { argv } = yargs }); const env = process.env.GULP_ENV; +const options = { + minify: env === 'prod', + sourcemaps: env !== 'prod', +}; + const rootPath = upath.normalizeSafe(argv.rootPath); const adminRootPath = upath.joinSafe(rootPath, 'admin'); const vendorPath = upath.normalizeSafe(argv.vendorPath || '.'); @@ -44,8 +55,6 @@ const nodeModulesPath = upath.normalizeSafe(argv.nodeModulesPath); const paths = { admin: { js: [ - upath.joinSafe(nodeModulesPath, 'jquery/dist/jquery.min.js'), - upath.joinSafe(nodeModulesPath, 'semantic-ui-css/semantic.min.js'), upath.joinSafe(vendorUiPath, 'Resources/private/js/**'), upath.joinSafe(vendorAdminPath, 'Resources/private/js/**'), ], @@ -80,7 +89,7 @@ const sourcePathMap = [ }, ]; -const mapSourcePath = function mapSourcePath(sourcePath /* , file */) { +const mapSourcePath = function mapSourcePath(sourcePath) { const match = sourcePathMap.find(({ sourceDir }) => ( sourcePath.substring(0, sourceDir.length) === sourceDir )); @@ -94,15 +103,88 @@ const mapSourcePath = function mapSourcePath(sourcePath /* , file */) { return upath.joinSafe(destPath, sourcePath.substring(sourceDir.length)); }; -export const buildAdminJs = function buildAdminJs() { - return gulp.src(paths.admin.js, { base: './' }) - .pipe(gulpif(env !== 'prod', sourcemaps.init())) - .pipe(concat('app.js')) - .pipe(gulpif(env === 'prod', uglify())) - .pipe(gulpif(env !== 'prod', sourcemaps.mapSources(mapSourcePath))) - .pipe(gulpif(env !== 'prod', sourcemaps.write('./'))) - .pipe(gulp.dest(upath.joinSafe(adminRootPath, 'js'))) - .pipe(livereload()); +export const buildAdminJs = async function buildAdminJs() { + const bundle = await rollup({ + input: upath.joinSafe(vendorAdminPath, 'Resources/private/js/app.js'), + plugins: [ + { + name: 'shim-app', + + transform(code, id) { + if (upath.relative('', id) === upath.relative('', upath.joinSafe(vendorAdminPath, 'Resources/private/js/app.js'))) { + return { + code: dedent` + import './shim/shim-polyfill'; + import './shim/shim-jquery'; + import './shim/shim-semantic-ui'; + + ${code} + `, + map: null, + }; + } + + return undefined; + }, + }, + inject({ + include: `${nodeModulesPath}/**`, + modules: { + $: 'jquery', + jQuery: 'jquery', + }, + }), + resolve({ + jail: upath.resolve(nodeModulesPath), + }), + commonjs({ + include: `${nodeModulesPath}/**`, + }), + babel({ + babelrc: false, + exclude: `${nodeModulesPath}/**`, + presets: [ + ['env', { + targets: { + browsers: [ + 'last 2 versions', + 'Firefox ESR', + 'IE >= 9', + 'Android >= 4.0', + 'iOS >= 7', + ], + }, + modules: false, + exclude: [ + 'transform-async-to-generator', + 'transform-regenerator', + ], + useBuiltIns: true, + }], + ], + plugins: [ + ['external-helpers'], + ['fast-async'], + ['module-resolver', { + alias: { + 'sylius/ui': upath.relative('', upath.joinSafe(vendorUiPath, 'Resources/private/js')), + }, + }], + ['transform-object-rest-spread', { + useBuiltIns: false, + }], + ], + }), + options.minify && uglify(), + ], + treeshake: false, + }); + + await bundle.write({ + file: upath.joinSafe(adminRootPath, 'js/app.js'), + format: 'iife', + sourcemap: options.sourcemaps, + }); }; buildAdminJs.description = 'Build admin js assets.'; @@ -113,11 +195,11 @@ export const buildAdminCss = function buildAdminCss() { ); const cssStream = gulp.src(paths.admin.css, { base: './' }) - .pipe(gulpif(env !== 'prod', sourcemaps.init())) + .pipe(gulpif(options.sourcemaps, sourcemaps.init())) .pipe(concat('css-files.css')); const sassStream = gulp.src(paths.admin.sass, { base: './' }) - .pipe(gulpif(env !== 'prod', sourcemaps.init())) + .pipe(gulpif(options.sourcemaps, sourcemaps.init())) .pipe(sass()) .pipe(concat('sass-files.scss')); @@ -126,9 +208,9 @@ export const buildAdminCss = function buildAdminCss() { merge(cssStream, sassStream) .pipe(order(['css-files.css', 'sass-files.scss'])) .pipe(concat('style.css')) - .pipe(gulpif(env === 'prod', uglifycss())) - .pipe(gulpif(env !== 'prod', sourcemaps.mapSources(mapSourcePath))) - .pipe(gulpif(env !== 'prod', sourcemaps.write('./'))) + .pipe(gulpif(options.minify, uglifycss())) + .pipe(gulpif(options.sourcemaps, sourcemaps.mapSources(mapSourcePath))) + .pipe(gulpif(options.sourcemaps, sourcemaps.write('./'))) .pipe(gulp.dest(upath.joinSafe(adminRootPath, 'css'))) .pipe(livereload()), ); diff --git a/src/Sylius/Bundle/ShopBundle/Resources/private/.eslintrc.js b/src/Sylius/Bundle/ShopBundle/Resources/private/.eslintrc.js new file mode 100644 index 00000000000..869805593a6 --- /dev/null +++ b/src/Sylius/Bundle/ShopBundle/Resources/private/.eslintrc.js @@ -0,0 +1,29 @@ +module.exports = { + extends: 'airbnb-base', + env: { + browser: true, + }, + rules: { + 'object-shorthand': ['error', 'always', { + avoidQuotes: true, + avoidExplicitReturnArrows: true, + }], + 'function-paren-newline': ['error', 'consistent'], + 'max-len': ['warn', 120, 2, { + ignoreUrls: true, + ignoreComments: false, + ignoreRegExpLiterals: true, + ignoreStrings: true, + ignoreTemplateLiterals: true, + }], + }, + settings: { + 'import/resolver': { + 'babel-module': { + alias: { + 'sylius/ui': './src/Sylius/Bundle/UiBundle/Resources/private/js', + }, + }, + }, + }, +}; diff --git a/src/Sylius/Bundle/ShopBundle/Resources/private/js/app.js b/src/Sylius/Bundle/ShopBundle/Resources/private/js/app.js index fbf52bcf43e..a41f72f8b41 100644 --- a/src/Sylius/Bundle/ShopBundle/Resources/private/js/app.js +++ b/src/Sylius/Bundle/ShopBundle/Resources/private/js/app.js @@ -7,60 +7,72 @@ * file that was distributed with this source code. */ +import 'semantic-ui-css/components/popup'; +import 'semantic-ui-css/components/rating'; +import $ from 'jquery'; -(function($) { - $(document).ready(function () { - $('.cart.button') - .popup({ - popup: $('.cart.popup'), - on: 'click', - }) - ; +import 'sylius/ui/app'; +import 'sylius/ui/sylius-api-login'; +import 'sylius/ui/sylius-api-toggle'; - $('.star.rating').rating({ - fireOnInit: true, - onRate: function(value) { - $("[name='sylius_product_review[rating]']:checked").removeAttr('checked'); - $("#sylius_product_review_rating_"+(value-1)).attr('checked', 'checked'); - } - }); +import './sylius-add-to-cart'; +import './sylius-address-book'; +import './sylius-province-field'; +import './sylius-remove-from-cart'; +import './sylius-variant-images'; +import './sylius-variants-prices'; - $('#sylius_checkout_address_customer_email').apiToggle({ - dataType: 'json', - method: 'GET', - throttle: 1500, +$(document).ready(() => { + $('.cart.button') + .popup({ + popup: $('.cart.popup'), + on: 'click', + }); - beforeSend: function (settings) { - var email = $('#sylius_checkout_address_customer_email').val(); + $('.star.rating').rating({ + fireOnInit: true, + onRate(value) { + $('[name="sylius_product_review[rating]"]:checked').removeAttr('checked'); + $(`#sylius_product_review_rating_${value - 1}`).attr('checked', 'checked'); + }, + }); - if (email.length < 3) { - return false; - } + $('#sylius_checkout_address_customer_email').apiToggle({ + dataType: 'json', + method: 'GET', + throttle: 1500, - settings.data = { - email: email - }; + beforeSend(settings) { + const email = $('#sylius_checkout_address_customer_email').val(); - return settings; - }, + if (email.length < 3) { + return false; + } - successTest: function (response) { - return $('#sylius_checkout_address_customer_email').val() === response.username; - } - }, $('#sylius-api-login-form')); + /* eslint-disable-next-line no-param-reassign */ + settings.data = { + email, + }; - $('#sylius-api-login').apiLogin({ - method: 'POST', - throttle: 500 - }); + return settings; + }, - $('.sylius-cart-remove-button').removeFromCart(); - $('#sylius-product-adding-to-cart').addToCart(); + successTest(response) { + return $('#sylius_checkout_address_customer_email').val() === response.username; + }, + }, $('#sylius-api-login-form')); - $('#sylius-shipping-address').addressBook(); - $('#sylius-billing-address').addressBook(); - $(document).provinceField(); - $(document).variantPrices(); - $(document).variantImages(); - }); -})(jQuery); + $('#sylius-api-login').apiLogin({ + method: 'POST', + throttle: 500, + }); + + $('.sylius-cart-remove-button').removeFromCart(); + $('#sylius-product-adding-to-cart').addToCart(); + + $('#sylius-shipping-address').addressBook(); + $('#sylius-billing-address').addressBook(); + $(document).provinceField(); + $(document).variantPrices(); + $(document).variantImages(); +}); diff --git a/src/Sylius/Bundle/ShopBundle/Resources/private/js/shim/shim-jquery.js b/src/Sylius/Bundle/ShopBundle/Resources/private/js/shim/shim-jquery.js new file mode 100644 index 00000000000..37fcc6011b7 --- /dev/null +++ b/src/Sylius/Bundle/ShopBundle/Resources/private/js/shim/shim-jquery.js @@ -0,0 +1,4 @@ +import $ from 'jquery'; + +window.$ = $; +window.jQuery = $; diff --git a/src/Sylius/Bundle/ShopBundle/Resources/private/js/shim/shim-lightbox.js b/src/Sylius/Bundle/ShopBundle/Resources/private/js/shim/shim-lightbox.js new file mode 100644 index 00000000000..41e18fa59c4 --- /dev/null +++ b/src/Sylius/Bundle/ShopBundle/Resources/private/js/shim/shim-lightbox.js @@ -0,0 +1,3 @@ +import lightbox from 'lightbox2'; + +window.lightbox = lightbox; diff --git a/src/Sylius/Bundle/ShopBundle/Resources/private/js/shim/shim-polyfill.js b/src/Sylius/Bundle/ShopBundle/Resources/private/js/shim/shim-polyfill.js new file mode 100644 index 00000000000..b012711b908 --- /dev/null +++ b/src/Sylius/Bundle/ShopBundle/Resources/private/js/shim/shim-polyfill.js @@ -0,0 +1 @@ +import 'babel-polyfill'; diff --git a/src/Sylius/Bundle/ShopBundle/Resources/private/js/shim/shim-semantic-ui.js b/src/Sylius/Bundle/ShopBundle/Resources/private/js/shim/shim-semantic-ui.js new file mode 100644 index 00000000000..8cb9d0a79cc --- /dev/null +++ b/src/Sylius/Bundle/ShopBundle/Resources/private/js/shim/shim-semantic-ui.js @@ -0,0 +1,24 @@ +import 'semantic-ui-css/components/accordion'; +import 'semantic-ui-css/components/api'; +import 'semantic-ui-css/components/checkbox'; +import 'semantic-ui-css/components/colorize'; +import 'semantic-ui-css/components/dimmer'; +import 'semantic-ui-css/components/dropdown'; +import 'semantic-ui-css/components/embed'; +import 'semantic-ui-css/components/form'; +import 'semantic-ui-css/components/modal'; +import 'semantic-ui-css/components/nag'; +import 'semantic-ui-css/components/popup'; +import 'semantic-ui-css/components/progress'; +import 'semantic-ui-css/components/rating'; +import 'semantic-ui-css/components/search'; +import 'semantic-ui-css/components/shape'; +import 'semantic-ui-css/components/sidebar'; +import 'semantic-ui-css/components/site'; +import 'semantic-ui-css/components/state'; +import 'semantic-ui-css/components/sticky'; +import 'semantic-ui-css/components/tab'; +import 'semantic-ui-css/components/transition'; +import 'semantic-ui-css/components/video'; +import 'semantic-ui-css/components/visibility'; +import 'semantic-ui-css/components/visit'; diff --git a/src/Sylius/Bundle/ShopBundle/Resources/private/js/sylius-add-to-cart.js b/src/Sylius/Bundle/ShopBundle/Resources/private/js/sylius-add-to-cart.js index 60a3c3e4fe8..23f7c33ae30 100644 --- a/src/Sylius/Bundle/ShopBundle/Resources/private/js/sylius-add-to-cart.js +++ b/src/Sylius/Bundle/ShopBundle/Resources/private/js/sylius-add-to-cart.js @@ -7,41 +7,41 @@ * file that was distributed with this source code. */ -(function ( $ ) { - 'use strict'; +import 'semantic-ui-css/components/api'; +import $ from 'jquery'; - $.fn.extend({ - addToCart: function () { - var element = $(this); - var href = $(element).attr('action'); - var redirectUrl = $(element).data('redirect'); - var validationElement = $('#sylius-cart-validation-error'); +$.fn.extend({ + addToCart() { + const element = this; + const url = $(element).attr('action'); + const redirectUrl = $(element).data('redirect'); + const validationElement = $('#sylius-cart-validation-error'); - $(element).api({ - method: 'POST', - on: 'submit', - cache: false, - url: href, - beforeSend: function (settings) { - settings.data = $(this).serialize(); + element.api({ + method: 'POST', + on: 'submit', + cache: false, + url, + beforeSend(settings) { + /* eslint-disable-next-line no-param-reassign */ + settings.data = element.serialize(); - return settings; - }, - onSuccess: function (response) { - validationElement.addClass('hidden'); - window.location.href = redirectUrl; - }, - onFailure: function (response) { - validationElement.removeClass('hidden'); - var validationMessage = ''; + return settings; + }, + onSuccess() { + validationElement.addClass('hidden'); + window.location.href = redirectUrl; + }, + onFailure(response) { + validationElement.removeClass('hidden'); + let validationMessage = ''; - $.each(response.errors.errors, function (key, message) { - validationMessage += message; - }); - validationElement.html(validationMessage); - $(element).removeClass('loading'); - }, - }); - } + Object.entries(response.errors.errors).forEach(([, message]) => { + validationMessage += message; + }); + validationElement.html(validationMessage); + $(element).removeClass('loading'); + }, }); -})( jQuery ); + }, +}); diff --git a/src/Sylius/Bundle/ShopBundle/Resources/private/js/sylius-address-book.js b/src/Sylius/Bundle/ShopBundle/Resources/private/js/sylius-address-book.js index 414ee588817..8c3e68b8eae 100644 --- a/src/Sylius/Bundle/ShopBundle/Resources/private/js/sylius-address-book.js +++ b/src/Sylius/Bundle/ShopBundle/Resources/private/js/sylius-address-book.js @@ -7,61 +7,59 @@ * file that was distributed with this source code. */ -(function ( $ ) { - 'use strict'; +import 'semantic-ui-css/components/dropdown'; +import $ from 'jquery'; - $.fn.extend({ - addressBook: function () { - var element = $(this); - var select = element.find('.address-book-select'); +const parseKey = function parseKey(key) { + return key.replace(/(_\w)/g, words => words[1].toUpperCase()); +}; - select.dropdown({ - forceSelection: false, +$.fn.extend({ + addressBook() { + const element = this; + const select = element.find('.address-book-select'); + const findByName = function findByName(name) { + return element.find(`[name*=${parseKey(name)}]`); + }; - onChange: function (name, text, choice) { - var provinceCode = choice.data()['provinceCode'], - provinceName = choice.data()['provinceName'], - provinceContainer = $(this).parent().find(".province-container").get(0); + select.dropdown({ + forceSelection: false, - $.each(element.find('input, select'), function (key, input) { - $(input).val(''); - }); + onChange(name, text, choice) { + const { provinceCode, provinceName } = choice.data(); + const provinceContainer = select.parent().find('.province-container').get(0); - $.each(choice.data(), function (property, value) { - var field = findByName(property); + element.find('input, select').each((index, input) => { + $(input).val(''); + }); - if (-1 !== property.indexOf('countryCode')) { - field.val(value).change(); + Object.entries(choice.data()).forEach(([property, value]) => { + const field = findByName(property); - var exists = setInterval(function () { - var provinceCodeField = findByName('provinceCode'); - var provinceNameField = findByName('provinceName'); + if (property.indexOf('countryCode') !== -1) { + field.val(value).change(); - if (!provinceContainer.hasAttribute("data-loading")) { - if (0 !== provinceCodeField.length && ('' !== provinceCode || undefined != provinceCode)) { - provinceCodeField.val(provinceCode); + const exists = setInterval(() => { + const provinceCodeField = findByName('provinceCode'); + const provinceNameField = findByName('provinceName'); - clearInterval(exists); - } else if (0 !== provinceNameField.length && ('' !== provinceName || undefined != provinceName)) { - provinceNameField.val(provinceName); + if (!provinceContainer.hasAttribute('data-loading')) { + if (provinceCodeField.length !== 0 && (provinceCode !== '' || provinceCode != undefined)) { + provinceCodeField.val(provinceCode); - clearInterval(exists); - } - } - }, 100); - } else { - field.val(value); - } - }); - } - }); + clearInterval(exists); + } else if (provinceNameField.length !== 0 && (provinceName !== '' || provinceName != undefined)) { + provinceNameField.val(provinceName); - var parseKey = function (key) { - return key.replace(/(_\w)/g, function (words) {return words[1].toUpperCase()}); - }; - var findByName = function (name) { - return element.find('[name*=' + parseKey(name) + ']'); - }; - } + clearInterval(exists); + } + } + }, 100); + } else { + field.val(value); + } + }); + }, }); -})( jQuery ); + }, +}); diff --git a/src/Sylius/Bundle/ShopBundle/Resources/private/js/sylius-province-field.js b/src/Sylius/Bundle/ShopBundle/Resources/private/js/sylius-province-field.js index ca770313502..4322612953f 100644 --- a/src/Sylius/Bundle/ShopBundle/Resources/private/js/sylius-province-field.js +++ b/src/Sylius/Bundle/ShopBundle/Resources/private/js/sylius-province-field.js @@ -7,98 +7,88 @@ * file that was distributed with this source code. */ -(function ( $ ) { - 'use strict'; - - $.fn.extend({ - provinceField: function () { - var countrySelect = $('select[name$="[countryCode]"]'); - - countrySelect.on('change', function(event) { - var select = $(event.currentTarget); - var provinceContainer = select.parents('.field').next('div.province-container'); - - var provinceSelectFieldName = select.attr('name').replace('country', 'province'); - var provinceInputFieldName = select.attr('name').replace('countryCode', 'provinceName'); - - if ('' === select.val() || undefined == select.val()) { - provinceContainer.fadeOut('slow', function () { - provinceContainer.html(''); - }); - - return; - } - - provinceContainer.attr('data-loading', true); - - $.get(provinceContainer.attr('data-url'), {countryCode: $(this).val()}, function (response) { - if (!response.content) { - provinceContainer.fadeOut('slow', function () { - provinceContainer.html(''); - - provinceContainer.removeAttr('data-loading'); - }); - } else if (-1 !== response.content.indexOf('select')) { - provinceContainer.fadeOut('slow', function () { - - var provinceSelectValue = getProvinceInputValue( - $(provinceContainer).find('select > option[selected$="selected"]').val() - ); - - provinceContainer.html(response.content.replace( - 'name="sylius_address_province"', - 'name="' + provinceSelectFieldName + '"' + provinceSelectValue - ) - .replace( - 'option value="" selected="selected"', - 'option value=""' - ) - .replace( - 'option ' + provinceSelectValue, - 'option ' + provinceSelectValue + '" selected="selected"' - )); - - provinceContainer.removeAttr('data-loading'); - - provinceContainer.fadeIn(); - }); - } else { - provinceContainer.fadeOut('slow', function () { - - var provinceInputValue = getProvinceInputValue($(provinceContainer).find('input').val()); - - provinceContainer.html(response.content.replace( - 'name="sylius_address_province"', - 'name="' + provinceInputFieldName + '"' + provinceInputValue - )); - - provinceContainer.removeAttr('data-loading'); - - provinceContainer.fadeIn(); - }); - } - }); - }); - - if('' !== countrySelect.val()) { - countrySelect.trigger('change'); - } - - if('' === $.trim($('div.province-container').text())) { - $('select.country-select').trigger('change'); - } - - var billingAddressCheckbox = $('input[type="checkbox"][name$="[differentBillingAddress]"]'); - var billingAddressContainer = $('#sylius-billing-address-container'); - var toggleBillingAddress = function() { - billingAddressContainer.toggle(billingAddressCheckbox.prop('checked')); - }; - toggleBillingAddress(); - billingAddressCheckbox.on('change', toggleBillingAddress); - - var getProvinceInputValue = function (valueSelector) { - return undefined == valueSelector ? '' : 'value="'+ valueSelector +'"'; - }; +import $ from 'jquery'; + +const getProvinceInputValue = function getProvinceInputValue(valueSelector) { + return valueSelector == undefined ? '' : `value="${valueSelector}"`; +}; + +$.fn.extend({ + provinceField() { + const countrySelect = $('select[name$="[countryCode]"]'); + + countrySelect.on('change', (event) => { + const select = $(event.currentTarget); + const provinceContainer = select.parents('.field').next('div.province-container'); + + const provinceSelectFieldName = select.attr('name').replace('country', 'province'); + const provinceInputFieldName = select.attr('name').replace('countryCode', 'provinceName'); + + if (select.val() === '' || select.val() == undefined) { + provinceContainer.fadeOut('slow', () => { + provinceContainer.html(''); + }); + + return; + } + + provinceContainer.attr('data-loading', true); + + $.get(provinceContainer.attr('data-url'), { countryCode: select.val() }, (response) => { + if (!response.content) { + provinceContainer.fadeOut('slow', () => { + provinceContainer.html(''); + + provinceContainer.removeAttr('data-loading'); + }); + } else if (response.content.indexOf('select') !== -1) { + provinceContainer.fadeOut('slow', () => { + const provinceSelectValue = getProvinceInputValue(( + $(provinceContainer).find('select > option[selected$="selected"]').val() + )); + + provinceContainer.html(( + response.content + .replace('name="sylius_address_province"', `name="${provinceSelectFieldName}"${provinceSelectValue}`) + .replace('option value="" selected="selected"', 'option value=""') + .replace(`option ${provinceSelectValue}`, `option ${provinceSelectValue}" selected="selected"`) + )); + + provinceContainer.removeAttr('data-loading'); + + provinceContainer.fadeIn(); + }); + } else { + provinceContainer.fadeOut('slow', () => { + const provinceInputValue = getProvinceInputValue($(provinceContainer).find('input').val()); + + provinceContainer.html(( + response.content + .replace('name="sylius_address_province"', `name="${provinceInputFieldName}"${provinceInputValue}`) + )); + + provinceContainer.removeAttr('data-loading'); + + provinceContainer.fadeIn(); + }); } + }); }); -})( jQuery ); + + if (countrySelect.val() !== '') { + countrySelect.trigger('change'); + } + + if ($.trim($('div.province-container').text()) === '') { + $('select.country-select').trigger('change'); + } + + const billingAddressCheckbox = $('input[type="checkbox"][name$="[differentBillingAddress]"]'); + const billingAddressContainer = $('#sylius-billing-address-container'); + const toggleBillingAddress = function toggleBillingAddress() { + billingAddressContainer.toggle(billingAddressCheckbox.prop('checked')); + }; + toggleBillingAddress(); + billingAddressCheckbox.on('change', toggleBillingAddress); + }, +}); diff --git a/src/Sylius/Bundle/ShopBundle/Resources/private/js/sylius-remove-from-cart.js b/src/Sylius/Bundle/ShopBundle/Resources/private/js/sylius-remove-from-cart.js index 8e683b08fbb..6dbbd1557c7 100644 --- a/src/Sylius/Bundle/ShopBundle/Resources/private/js/sylius-remove-from-cart.js +++ b/src/Sylius/Bundle/ShopBundle/Resources/private/js/sylius-remove-from-cart.js @@ -7,31 +7,30 @@ * file that was distributed with this source code. */ -(function ( $ ) { - 'use strict'; +import 'semantic-ui-css/components/api'; +import $ from 'jquery'; - $.fn.extend({ - removeFromCart: function () { - $.each($(this), function (index, element) { - var redirectUrl = $(element).data('redirect'); - var csrfToken = $(element).data('csrf-token'); +$.fn.extend({ + removeFromCart() { + this.each((index, element) => { + const redirectUrl = $(element).data('redirect'); + const csrfToken = $(element).data('csrf-token'); - $(element).api({ - method: 'DELETE', - on: 'click', - beforeSend: function (settings) { - settings.data = { - _csrf_token: csrfToken - }; + $(element).api({ + method: 'DELETE', + on: 'click', + beforeSend(settings) { + /* eslint-disable-next-line no-param-reassign */ + settings.data = { + _csrf_token: csrfToken, + }; - return settings; - }, - onSuccess: function (response) { - window.location.replace(redirectUrl); - } - }); - }); - } + return settings; + }, + onSuccess() { + window.location.replace(redirectUrl); + }, + }); }); - -})( jQuery ); + }, +}); diff --git a/src/Sylius/Bundle/ShopBundle/Resources/private/js/sylius-variant-images.js b/src/Sylius/Bundle/ShopBundle/Resources/private/js/sylius-variant-images.js index 41d1424f5c1..46d9db7dcac 100644 --- a/src/Sylius/Bundle/ShopBundle/Resources/private/js/sylius-variant-images.js +++ b/src/Sylius/Bundle/ShopBundle/Resources/private/js/sylius-variant-images.js @@ -7,83 +7,79 @@ * file that was distributed with this source code. */ -(function ( $ ) { - 'use strict'; - - $.fn.extend({ - variantImages: function () { - if ($('[data-variant-options]').length > 0) { - handleProductOptionImages(); - handleProductOptionChange(); - } else if ($('[data-variant-code]').length > 0) { - handleProductVariantImages($('[name="sylius_add_to_cart[cartItem][variant]"]')); - handleProductVariantChange(); - } - } - }); -})( jQuery ); - -function handleProductOptionChange() { - $('[name*="sylius_add_to_cart[cartItem][variant]"]').on('change', function () { - handleProductOptionImages(); - }); -} - -function handleProductVariantChange() { - $('[name="sylius_add_to_cart[cartItem][variant]"]').on('change', function () { - handleProductVariantImages($(this)) - }); -} - -function handleProductOptionImages() { - var options = ''; - - $('#sylius-product-adding-to-cart select').each(function() { - options += $(this).find('option:selected').val() + ' '; - }); - - var imagesWithOptions = []; - var optionsArray = options.trim().split(' '); - - $('[data-variant-options]').each(function () { - var imageOptions = $(this).attr('data-variant-options'); - var imageHasOptions = optionsArray.every(function(option) { - return imageOptions.indexOf(option) > -1; - }); - - if (imageHasOptions) { - imagesWithOptions.push($(this).closest('div.ui.image')); - } - }); - - changeMainImage(imagesWithOptions.shift()); -} - -function handleProductVariantImages(element) { - var variantCode = $(element).attr('value'); - var imagesWithVariantCode = []; - - $('[data-variant-code*="'+ variantCode +'"]').each(function () { - imagesWithVariantCode.push($(this).closest('div.ui.image')); - }); - - changeMainImage(imagesWithVariantCode.shift()); -} - -function changeMainImage(newImageDiv) { - var mainImageLink = $('a.ui.fluid.image'); - var mainImage = $('a.ui.fluid.image > img'); - - var newImage = $(newImageDiv).find('img'); - var newImageLink = $(newImageDiv).find('a'); - - if (newImage.length == 0 && newImageLink.length == 0) { - mainImage.attr('src', $('div[data-product-image]').attr('data-product-image')); - newImageLink.attr('href', $('div[data-product-link]').attr('data-product-link')); - - return; - } +import $ from 'jquery'; + +const changeMainImage = function changeMainImage(newImageDiv) { + const mainImageLink = $('a.ui.fluid.image'); + const mainImage = $('a.ui.fluid.image > img'); + + const newImage = $(newImageDiv).find('img'); + const newImageLink = $(newImageDiv).find('a'); + + if (newImage.length === 0 && newImageLink.length === 0) { + mainImage.attr('src', $('div[data-product-image]').attr('data-product-image')); + newImageLink.attr('href', $('div[data-product-link]').attr('data-product-link')); + + return; + } + + mainImageLink.attr('href', newImageLink.attr('href')); + mainImage.attr('src', newImage.attr('data-large-thumbnail')); +}; - mainImageLink.attr('href', newImageLink.attr('href')); - mainImage.attr('src', newImage.attr('data-large-thumbnail')); -} +const handleProductOptionImages = function handleProductOptionImages() { + let options = ''; + + $('#sylius-product-adding-to-cart select').each((index, select) => { + options += `${$(select).find('option:selected').val()} `; + }); + + const imagesWithOptions = []; + const optionsArray = options.trim().split(' '); + + $('[data-variant-options]').each((index, element) => { + const imageOptions = $(element).attr('data-variant-options'); + const imageHasOptions = optionsArray.every(option => imageOptions.indexOf(option) > -1); + + if (imageHasOptions) { + imagesWithOptions.push($(element).closest('div.ui.image')); + } + }); + + changeMainImage(imagesWithOptions.shift()); +}; + +const handleProductOptionChange = function handleProductOptionChange() { + $('[name*="sylius_add_to_cart[cartItem][variant]"]').on('change', () => { + handleProductOptionImages(); + }); +}; + +const handleProductVariantImages = function handleProductVariantImages(variantElement) { + const variantCode = $(variantElement).attr('value'); + const imagesWithVariantCode = []; + + $(`[data-variant-code*="${variantCode}"]`).each((index, element) => { + imagesWithVariantCode.push($(element).closest('div.ui.image')); + }); + + changeMainImage(imagesWithVariantCode.shift()); +}; + +const handleProductVariantChange = function handleProductVariantChange() { + $('[name="sylius_add_to_cart[cartItem][variant]"]').on('change', (event) => { + handleProductVariantImages($(event.currentTarget)); + }); +}; + +$.fn.extend({ + variantImages() { + if ($('[data-variant-options]').length > 0) { + handleProductOptionImages(); + handleProductOptionChange(); + } else if ($('[data-variant-code]').length > 0) { + handleProductVariantImages($('[name="sylius_add_to_cart[cartItem][variant]"]')); + handleProductVariantChange(); + } + }, +}); diff --git a/src/Sylius/Bundle/ShopBundle/Resources/private/js/sylius-variants-prices.js b/src/Sylius/Bundle/ShopBundle/Resources/private/js/sylius-variants-prices.js index fde9cca8aab..bfb02c08588 100644 --- a/src/Sylius/Bundle/ShopBundle/Resources/private/js/sylius-variants-prices.js +++ b/src/Sylius/Bundle/ShopBundle/Resources/private/js/sylius-variants-prices.js @@ -7,44 +7,43 @@ * file that was distributed with this source code. */ -(function ( $ ) { - 'use strict'; +import $ from 'jquery'; - $.fn.extend({ - variantPrices: function () { - if ($('#sylius-variants-pricing').length > 0) { - handleProductOptionsChange(); - } else if ($("#sylius-product-variants").length > 0) { - handleProductVariantsChange(); - } - } - }); -})( jQuery ); +const handleProductOptionsChange = function handleProductOptionsChange() { + $('[name*="sylius_add_to_cart[cartItem][variant]"]').on('change', () => { + let selector = ''; -function handleProductOptionsChange() { - $('[name*="sylius_add_to_cart[cartItem][variant]"]').on('change', function() { - var $selector = ''; + $('#sylius-product-adding-to-cart select[data-option]').each((index, element) => { + const select = $(element); + const option = select.find('option:selected').val(); + selector += `[data-${select.attr('data-option')}="${option}"]`; + }); - $('#sylius-product-adding-to-cart select[data-option]').each(function() { - var option = $(this).find('option:selected').val(); - $selector += '[data-' + $(this).attr('data-option') + '="' + option + '"]'; - }); + const price = $('#sylius-variants-pricing').find(selector).attr('data-value'); - var $price = $('#sylius-variants-pricing').find($selector).attr('data-value'); + if (price !== undefined) { + $('#product-price').text(price); + $('button[type=submit]').removeAttr('disabled'); + } else { + $('#product-price').text($('#sylius-variants-pricing').attr('data-unavailable-text')); + $('button[type=submit]').attr('disabled', 'disabled'); + } + }); +}; - if ($price !== undefined) { - $('#product-price').text($price); - $('button[type=submit]').removeAttr('disabled'); - } else { - $('#product-price').text($('#sylius-variants-pricing').attr('data-unavailable-text')); - $('button[type=submit]').attr('disabled', 'disabled'); - } - }); -} +const handleProductVariantsChange = function handleProductVariantsChange() { + $('[name="sylius_add_to_cart[cartItem][variant]"]').on('change', (event) => { + const price = $(event.currentTarget).parents('tr').find('.sylius-product-variant-price').text(); + $('#product-price').text(price); + }); +}; -function handleProductVariantsChange() { - $('[name="sylius_add_to_cart[cartItem][variant]"]').on('change', function() { - var $price = $(this).parents('tr').find('.sylius-product-variant-price').text(); - $('#product-price').text($price); - }); -} +$.fn.extend({ + variantPrices() { + if ($('#sylius-variants-pricing').length > 0) { + handleProductOptionsChange(); + } else if ($('#sylius-product-variants').length > 0) { + handleProductVariantsChange(); + } + }, +}); diff --git a/src/Sylius/Bundle/ShopBundle/gulpfile.babel.js b/src/Sylius/Bundle/ShopBundle/gulpfile.babel.js index cb531030fe4..f9f4153d761 100644 --- a/src/Sylius/Bundle/ShopBundle/gulpfile.babel.js +++ b/src/Sylius/Bundle/ShopBundle/gulpfile.babel.js @@ -1,12 +1,18 @@ +import { rollup } from 'rollup'; +import { uglify } from 'rollup-plugin-uglify'; +import babel from 'rollup-plugin-babel'; +import commonjs from 'rollup-plugin-commonjs'; import concat from 'gulp-concat'; +import dedent from 'dedent'; import gulp from 'gulp'; import gulpif from 'gulp-if'; +import inject from 'rollup-plugin-inject'; import livereload from 'gulp-livereload'; import merge from 'merge-stream'; import order from 'gulp-order'; +import resolve from 'rollup-plugin-node-resolve'; import sass from 'gulp-sass'; import sourcemaps from 'gulp-sourcemaps'; -import uglify from 'gulp-uglify'; import uglifycss from 'gulp-uglifycss'; import upath from 'upath'; import yargs from 'yargs'; @@ -34,6 +40,11 @@ const { argv } = yargs }); const env = process.env.GULP_ENV; +const options = { + minify: env === 'prod', + sourcemaps: env !== 'prod', +}; + const rootPath = upath.normalizeSafe(argv.rootPath); const shopRootPath = upath.joinSafe(rootPath, 'shop'); const vendorPath = upath.normalizeSafe(argv.vendorPath || '.'); @@ -44,9 +55,6 @@ const nodeModulesPath = upath.normalizeSafe(argv.nodeModulesPath); const paths = { shop: { js: [ - upath.joinSafe(nodeModulesPath, 'jquery/dist/jquery.min.js'), - upath.joinSafe(nodeModulesPath, 'semantic-ui-css/semantic.min.js'), - upath.joinSafe(nodeModulesPath, 'lightbox2/dist/js/lightbox.js'), upath.joinSafe(vendorUiPath, 'Resources/private/js/**'), upath.joinSafe(vendorShopPath, 'Resources/private/js/**'), ], @@ -83,7 +91,7 @@ const sourcePathMap = [ }, ]; -const mapSourcePath = function mapSourcePath(sourcePath /* , file */) { +const mapSourcePath = function mapSourcePath(sourcePath) { const match = sourcePathMap.find(({ sourceDir }) => ( sourcePath.substring(0, sourceDir.length) === sourceDir )); @@ -97,15 +105,89 @@ const mapSourcePath = function mapSourcePath(sourcePath /* , file */) { return upath.joinSafe(destPath, sourcePath.substring(sourceDir.length)); }; -export const buildShopJs = function buildShopJs() { - return gulp.src(paths.shop.js, { base: './' }) - .pipe(gulpif(env !== 'prod', sourcemaps.init())) - .pipe(concat('app.js')) - .pipe(gulpif(env === 'prod', uglify())) - .pipe(gulpif(env !== 'prod', sourcemaps.mapSources(mapSourcePath))) - .pipe(gulpif(env !== 'prod', sourcemaps.write('./'))) - .pipe(gulp.dest(upath.joinSafe(shopRootPath, 'js'))) - .pipe(livereload()); +export const buildShopJs = async function buildShopJs() { + const bundle = await rollup({ + input: upath.joinSafe(vendorShopPath, 'Resources/private/js/app.js'), + plugins: [ + { + name: 'shim-app', + + transform(code, id) { + if (upath.relative('', id) === upath.relative('', upath.joinSafe(vendorShopPath, 'Resources/private/js/app.js'))) { + return { + code: dedent` + import './shim/shim-polyfill'; + import './shim/shim-jquery'; + import './shim/shim-semantic-ui'; + import './shim/shim-lightbox'; + + ${code} + `, + map: null, + }; + } + + return undefined; + }, + }, + inject({ + include: `${nodeModulesPath}/**`, + modules: { + $: 'jquery', + jQuery: 'jquery', + }, + }), + resolve({ + jail: upath.resolve(nodeModulesPath), + }), + commonjs({ + include: `${nodeModulesPath}/**`, + }), + babel({ + babelrc: false, + exclude: `${nodeModulesPath}/**`, + presets: [ + ['env', { + targets: { + browsers: [ + 'last 2 versions', + 'Firefox ESR', + 'IE >= 9', + 'Android >= 4.0', + 'iOS >= 7', + ], + }, + modules: false, + exclude: [ + 'transform-async-to-generator', + 'transform-regenerator', + ], + useBuiltIns: true, + }], + ], + plugins: [ + ['external-helpers'], + ['fast-async'], + ['module-resolver', { + alias: { + 'sylius/ui': upath.relative('', upath.joinSafe(vendorUiPath, 'Resources/private/js')), + }, + }], + ['transform-object-rest-spread', { + useBuiltIns: false, + }], + ], + }), + options.minify && uglify(), + ], + treeshake: false, + }); + + await bundle.write({ + file: upath.joinSafe(shopRootPath, 'js/app.js'), + format: 'iife', + sourcemap: options.sourcemaps, + }); }; buildShopJs.description = 'Build shop js assets.'; @@ -116,11 +198,11 @@ export const buildShopCss = function buildShopCss() { ); const cssStream = gulp.src(paths.shop.css, { base: './' }) - .pipe(gulpif(env !== 'prod', sourcemaps.init())) + .pipe(gulpif(options.sourcemaps, sourcemaps.init())) .pipe(concat('css-files.css')); const sassStream = gulp.src(paths.shop.sass, { base: './' }) - .pipe(gulpif(env !== 'prod', sourcemaps.init())) + .pipe(gulpif(options.sourcemaps, sourcemaps.init())) .pipe(sass()) .pipe(concat('sass-files.scss')); @@ -129,9 +211,9 @@ export const buildShopCss = function buildShopCss() { merge(cssStream, sassStream) .pipe(order(['css-files.css', 'sass-files.scss'])) .pipe(concat('style.css')) - .pipe(gulpif(env === 'prod', uglifycss())) - .pipe(gulpif(env !== 'prod', sourcemaps.mapSources(mapSourcePath))) - .pipe(gulpif(env !== 'prod', sourcemaps.write('./'))) + .pipe(gulpif(options.minify, uglifycss())) + .pipe(gulpif(options.sourcemaps, sourcemaps.mapSources(mapSourcePath))) + .pipe(gulpif(options.sourcemaps, sourcemaps.write('./'))) .pipe(gulp.dest(upath.joinSafe(shopRootPath, 'css'))) .pipe(livereload()), ); diff --git a/src/Sylius/Bundle/UiBundle/Resources/private/.eslintrc.js b/src/Sylius/Bundle/UiBundle/Resources/private/.eslintrc.js new file mode 100644 index 00000000000..057bb7c3011 --- /dev/null +++ b/src/Sylius/Bundle/UiBundle/Resources/private/.eslintrc.js @@ -0,0 +1,20 @@ +module.exports = { + extends: 'airbnb-base', + env: { + browser: true, + }, + rules: { + 'object-shorthand': ['error', 'always', { + avoidQuotes: true, + avoidExplicitReturnArrows: true, + }], + 'function-paren-newline': ['error', 'consistent'], + 'max-len': ['warn', 120, 2, { + ignoreUrls: true, + ignoreComments: false, + ignoreRegExpLiterals: true, + ignoreStrings: true, + ignoreTemplateLiterals: true, + }], + }, +}; diff --git a/src/Sylius/Bundle/UiBundle/Resources/private/js/app.js b/src/Sylius/Bundle/UiBundle/Resources/private/js/app.js index 1fc3ebbc49a..0ee48e68724 100644 --- a/src/Sylius/Bundle/UiBundle/Resources/private/js/app.js +++ b/src/Sylius/Bundle/UiBundle/Resources/private/js/app.js @@ -7,45 +7,57 @@ * file that was distributed with this source code. */ -(function($) { - $(document).ready(function() { - $('#sidebar').addClass('visible'); - $('#sidebar').sidebar('attach events', '#sidebar-toggle', 'toggle'); - $('#sidebar').sidebar('setting', { - dimPage: false, - closable: false - }); - - $('.ui.checkbox').checkbox(); - $('.ui.accordion').accordion(); - $('.ui.menu .dropdown').dropdown({action: 'hide'}); - $('.ui.inline.dropdown').dropdown(); - $('.link.ui.dropdown').dropdown({action: 'hide'}); - $('.button.ui.dropdown').dropdown({action: 'hide'}); - $('.ui.fluid.search.selection.ui.dropdown').dropdown(); - $('.menu .item').tab(); - $('.card .image').dimmer({on: 'hover'}); - $('.ui.rating').rating('disable'); - - $('form.loadable button').on('click', function() { - return $(this).closest('form').addClass('loading'); - }); - $('.loadable.button').on('click', function() { - return $(this).addClass('loading'); - }); - $('.message .close').on('click', function() { - return $(this).closest('.message').transition('fade'); - }); - - $('[data-requires-confirmation]').requireConfirmation(); - $('[data-bulk-action-requires-confirmation]').bulkActionRequireConfirmation(); - $('[data-toggles]').toggleElement(); - - $('.special.cards .image').dimmer({ - on: 'hover' - }); - - $('[data-form-type="collection"]').CollectionForm(); +import 'semantic-ui-css/components/accordion'; +import 'semantic-ui-css/components/checkbox'; +import 'semantic-ui-css/components/dimmer'; +import 'semantic-ui-css/components/dropdown'; +import 'semantic-ui-css/components/rating'; +import 'semantic-ui-css/components/sidebar'; +import 'semantic-ui-css/components/tab'; +import 'semantic-ui-css/components/transition'; +import $ from 'jquery'; +import './sylius-bulk-action-require-confirmation'; +import './sylius-form-collection'; +import './sylius-require-confirmation'; +import './sylius-toggle'; + +$(document).ready(() => { + $('#sidebar').addClass('visible'); + $('#sidebar').sidebar('attach events', '#sidebar-toggle', 'toggle'); + $('#sidebar').sidebar('setting', { + dimPage: false, + closable: false, + }); + + $('.ui.checkbox').checkbox(); + $('.ui.accordion').accordion(); + $('.ui.menu .dropdown').dropdown({ action: 'hide' }); + $('.ui.inline.dropdown').dropdown(); + $('.link.ui.dropdown').dropdown({ action: 'hide' }); + $('.button.ui.dropdown').dropdown({ action: 'hide' }); + $('.ui.fluid.search.selection.ui.dropdown').dropdown(); + $('.menu .item').tab(); + $('.card .image').dimmer({ on: 'hover' }); + $('.ui.rating').rating('disable'); + + $('form.loadable button').on('click', (event) => { + $(event.currentTarget).closest('form').addClass('loading'); + }); + $('.loadable.button').on('click', (event) => { + $(event.currentTarget).addClass('loading'); }); -})(jQuery); + $('.message .close').on('click', (event) => { + $(event.currentTarget).closest('.message').transition('fade'); + }); + + $('[data-requires-confirmation]').requireConfirmation(); + $('[data-bulk-action-requires-confirmation]').bulkActionRequireConfirmation(); + $('[data-toggles]').toggleElement(); + + $('.special.cards .image').dimmer({ + on: 'hover', + }); + + $('[data-form-type="collection"]').CollectionForm(); +}); diff --git a/src/Sylius/Bundle/UiBundle/Resources/private/js/sylius-api-login.js b/src/Sylius/Bundle/UiBundle/Resources/private/js/sylius-api-login.js index 3e074014779..e714f3cadac 100644 --- a/src/Sylius/Bundle/UiBundle/Resources/private/js/sylius-api-login.js +++ b/src/Sylius/Bundle/UiBundle/Resources/private/js/sylius-api-login.js @@ -7,50 +7,53 @@ * file that was distributed with this source code. */ -(function ( $ ) { - 'use strict'; - - $.fn.extend({ - apiLogin: function (apiSettings) { - var element = $(this); - var apiSettings = apiSettings; - var passwordField = element.find('input[type=\'password\']'); - var emailField = element.find('input[type=\'email\']'); - var csrfTokenField = element.find('input[type=\'hidden\']'); - var signInButton = element.find('.button'); - var validationField = element.find('.red.label'); - - signInButton.api({ - method: apiSettings.method, - dataType: apiSettings.dataType || 'json', - throttle: apiSettings.throttle || 0, - debug: apiSettings.debug || false, - - beforeSend: function (settings) { - settings.data = { - _username: emailField.val(), - _password: passwordField.val() - }; - settings.data[csrfTokenField.attr('name')] = csrfTokenField.val(); - - return settings; - }, - - successTest: function (response) { - return response.success; - }, - - onSuccess: function (response) { - element.remove(); - location.reload(); - }, - - onFailure: function (response) { - validationField.removeClass('hidden'); - validationField.html(response.message); - } - }); - - } +import 'semantic-ui-css/components/api'; +import $ from 'jquery'; + +$.fn.extend({ + apiLogin({ + method, + dataType = 'json', + throttle = 0, + debug = false, + }) { + const element = this; + const passwordField = element.find('input[type="password"]'); + const emailField = element.find('input[type="email"]'); + const csrfTokenField = element.find('input[type="hidden"]'); + const signInButton = element.find('.button'); + const validationField = element.find('.red.label'); + + signInButton.api({ + method, + dataType, + throttle, + debug, + + beforeSend(settings) { + /* eslint-disable-next-line no-param-reassign */ + settings.data = { + _username: emailField.val(), + _password: passwordField.val(), + [csrfTokenField.attr('name')]: csrfTokenField.val(), + }; + + return settings; + }, + + successTest(response) { + return response.success; + }, + + onSuccess() { + element.remove(); + window.location.reload(); + }, + + onFailure(response) { + validationField.removeClass('hidden'); + validationField.html(response.message); + }, }); -})( jQuery ); + }, +}); diff --git a/src/Sylius/Bundle/UiBundle/Resources/private/js/sylius-api-toggle.js b/src/Sylius/Bundle/UiBundle/Resources/private/js/sylius-api-toggle.js index af1979a9677..08d6b3d2e00 100644 --- a/src/Sylius/Bundle/UiBundle/Resources/private/js/sylius-api-toggle.js +++ b/src/Sylius/Bundle/UiBundle/Resources/private/js/sylius-api-toggle.js @@ -7,38 +7,40 @@ * file that was distributed with this source code. */ -(function ( $ ) { - 'use strict'; - - $.fn.extend({ - apiToggle: function (apiSettings, toggleableElement, isHidden) { - var element = $(this); - var apiSettings = apiSettings; - var toggleableElement = toggleableElement; - var isHidden = isHidden || true; - - if (isHidden) { - toggleableElement.hide(); - } - - element.api({ - method: apiSettings.method, - dataType: apiSettings.dataType || 'json', - throttle: apiSettings.throttle || 0, - debug: apiSettings.debug || false, - - beforeSend: apiSettings.beforeSend, - successTest: apiSettings.successTest, - - onSuccess: function (response) { - toggleableElement.show(); - }, - - onFailure: function (response) { - toggleableElement.hide(); - } - }); - - } +import 'semantic-ui-css/components/api'; +import $ from 'jquery'; + +$.fn.extend({ + apiToggle({ + method, + dataType = 'json', + throttle = 0, + debug = false, + beforeSend, + successTest, + }, toggleableElement, isHidden = true) { + const element = this; + + if (isHidden) { + toggleableElement.hide(); + } + + element.api({ + method, + dataType, + throttle, + debug, + + beforeSend, + successTest, + + onSuccess() { + toggleableElement.show(); + }, + + onFailure() { + toggleableElement.hide(); + }, }); -})( jQuery ); + }, +}); diff --git a/src/Sylius/Bundle/UiBundle/Resources/private/js/sylius-auto-complete.js b/src/Sylius/Bundle/UiBundle/Resources/private/js/sylius-auto-complete.js index 085a9993eb7..3b97f4204ae 100644 --- a/src/Sylius/Bundle/UiBundle/Resources/private/js/sylius-auto-complete.js +++ b/src/Sylius/Bundle/UiBundle/Resources/private/js/sylius-auto-complete.js @@ -7,77 +7,71 @@ * file that was distributed with this source code. */ -(function ( $ ) { - 'use strict'; +import 'semantic-ui-css/components/dropdown'; +import $ from 'jquery'; - $.fn.extend({ - autoComplete: function () { - $(this).each(function () { - var element = $(this); - var criteriaName = $(this).data('criteria-name'); - var choiceName = $(this).data('choice-name'); - var choiceValue = $(this).data('choice-value'); - var autocompleteValue = $(this).find('input.autocomplete').val(); - var loadForEditUrl = $(this).data('load-edit-url'); +$.fn.extend({ + autoComplete() { + this.each((idx, el) => { + const element = $(el); + const criteriaName = element.data('criteria-name'); + const choiceName = element.data('choice-name'); + const choiceValue = element.data('choice-value'); + const autocompleteValue = element.find('input.autocomplete').val(); + const loadForEditUrl = element.data('load-edit-url'); - element.dropdown({ - delay: { - search: 250 - }, - forceSelection: false, - apiSettings: { - dataType: 'JSON', - cache: false, - beforeSend: function(settings) { - settings.data[criteriaName] = settings.urlData.query; + element.dropdown({ + delay: { + search: 250, + }, + forceSelection: false, + apiSettings: { + dataType: 'JSON', + cache: false, + beforeSend(settings) { + /* eslint-disable-next-line no-param-reassign */ + settings.data[criteriaName] = settings.urlData.query; - return settings; - }, - onResponse: function (response) { - var choiceName = element.data('choice-name'); - var choiceValue = element.data('choice-value'); - var myResults = []; - $.each(response, function (index, item) { - myResults.push({ - name: item[choiceName], - value: item[choiceValue] - }); - }); + return settings; + }, + onResponse(response) { + return { + success: true, + results: response.map(item => ({ + name: item[choiceName], + value: item[choiceValue], + })), + }; + }, + }, + }); - return { - success: true, - results: myResults - }; - } - } - }); + if (autocompleteValue.split(',').filter(String).length > 0) { + const menuElement = element.find('div.menu'); - if (0 < autocompleteValue.split(',').filter(String).length) { - var menuElement = element.find('div.menu'); + menuElement.api({ + on: 'now', + method: 'GET', + url: loadForEditUrl, + beforeSend(settings) { + /* eslint-disable-next-line no-param-reassign */ + settings.data[choiceValue] = autocompleteValue.split(',').filter(String); - menuElement.api({ - on: 'now', - method: 'GET', - url: loadForEditUrl, - beforeSend: function (settings) { - settings.data[choiceValue] = autocompleteValue.split(',').filter(String); - - return settings; - }, - onSuccess: function (response) { - $.each(response, function (index, item) { - menuElement.append( - $('
'+item[choiceName]+'
') - ); - }); - } - }); - } - - window.setTimeout(function () { - element.dropdown('set selected', element.find('input.autocomplete').val().split(',').filter(String)); - }, 5000); - }); - } + return settings; + }, + onSuccess(response) { + response.forEach((item) => { + menuElement.append(( + $(`
${item[choiceName]}
`) + )); + }); + }, }); -})( jQuery ); + } + + window.setTimeout(() => { + element.dropdown('set selected', element.find('input.autocomplete').val().split(',').filter(String)); + }, 5000); + }); + }, +}); diff --git a/src/Sylius/Bundle/UiBundle/Resources/private/js/sylius-bulk-action-require-confirmation.js b/src/Sylius/Bundle/UiBundle/Resources/private/js/sylius-bulk-action-require-confirmation.js index b4c5d333472..15be2131829 100644 --- a/src/Sylius/Bundle/UiBundle/Resources/private/js/sylius-bulk-action-require-confirmation.js +++ b/src/Sylius/Bundle/UiBundle/Resources/private/js/sylius-bulk-action-require-confirmation.js @@ -7,37 +7,36 @@ * file that was distributed with this source code. */ -(function ( $ ) { - 'use strict'; +import 'semantic-ui-css/components/modal'; +import $ from 'jquery'; - $.fn.extend({ - bulkActionRequireConfirmation: function() { - return this.each(function() { - return $(this).on('click', function(event) { - event.preventDefault(); +$.fn.extend({ + bulkActionRequireConfirmation() { + this.each((idx, el) => { + $(el).on('click', (evt) => { + evt.preventDefault(); - var actionButton = $(this); + const actionButton = $(evt.currentTarget); - if (actionButton.is('a')) { - $('#confirmation-button').attr('href', actionButton.attr('href')); - } - - if (actionButton.is('button')) { - $('#confirmation-button').on('click', function(event) { - event.preventDefault(); - - var form = actionButton.closest('form'); - $('input.bulk-select-checkbox:checked').each(function() { - $('').appendTo(form); - }); + if (actionButton.is('a')) { + $('#confirmation-button').attr('href', actionButton.attr('href')); + } - return form.submit(); - }); - } + if (actionButton.is('button')) { + $('#confirmation-button').on('click', (event) => { + event.preventDefault(); - return $('#confirmation-modal').modal('show'); - }); + const form = actionButton.closest('form'); + $('input.bulk-select-checkbox:checked').each((index, element) => { + $(``).appendTo(form); }); + + form.submit(); + }); } + + $('#confirmation-modal').modal('show'); + }); }); -})( jQuery ); + }, +}); diff --git a/src/Sylius/Bundle/UiBundle/Resources/private/js/sylius-form-collection.js b/src/Sylius/Bundle/UiBundle/Resources/private/js/sylius-form-collection.js index 0b3f7d9fceb..e4f166b3b77 100644 --- a/src/Sylius/Bundle/UiBundle/Resources/private/js/sylius-form-collection.js +++ b/src/Sylius/Bundle/UiBundle/Resources/private/js/sylius-form-collection.js @@ -7,158 +7,126 @@ * file that was distributed with this source code. */ -!function($){ - - "use strict"; - - /** - * Collection Form plugin - * - * @param element - * @constructor - */ - var CollectionForm = function (element) { - this.$element = $(element); - this.$list = this.$element.find('[data-form-collection="list"]:first'); - this.count = this.$list.children().length; - this.lastChoice = null; - - this.$element.on( - 'click', - '[data-form-collection="add"]:last', - $.proxy(this.addItem, this) - ); - - this.$element.on( - 'click', - '[data-form-collection="delete"]', - $.proxy(this.deleteItem, this) - ); - - this.$element.on( - 'change', - '[data-form-collection="update"]', - $.proxy(this.updateItem, this) - ); - - $(document).on( - 'change', - '[data-form-prototype="update"]', - $.proxy(this.updatePrototype, this) - ); - - $(document).on('collection-form-add', function(e, addedElement) { - $(addedElement).find('[data-form-type="collection"]').CollectionForm(); - $(document).trigger('dom-node-inserted', [$(addedElement)]); - }); +import $ from 'jquery'; + +/** + * Collection Form plugin + * + * @param element + * @constructor + */ +class CollectionForm { + constructor(element) { + this.addItem = this.addItem.bind(this); + this.updateItem = this.updateItem.bind(this); + this.deleteItem = this.constructor.deleteItem; + this.updatePrototype = this.updatePrototype.bind(this); + + this.$element = $(element); + this.$list = this.$element.find('[data-form-collection="list"]:first'); + this.count = this.$list.children().length; + this.lastChoice = null; + this.$element.on('click', '[data-form-collection="add"]:last', this.addItem); + this.$element.on('click', '[data-form-collection="delete"]', this.deleteItem); + this.$element.on('change', '[data-form-collection="update"]', this.updateItem); + $(document).on('change', '[data-form-prototype="update"]', this.updatePrototype); + $(document).on('collection-form-add', (event, addedElement) => { + $(addedElement).find('[data-form-type="collection"]').CollectionForm(); + $(document).trigger('dom-node-inserted', [$(addedElement)]); + }); + } + + /** + * Add a item to the collection. + * @param event + */ + addItem(event) { + event.preventDefault(); + + let prototype = this.$element.data('prototype'); + + prototype = prototype.replace(/__name__/g, this.count); + + this.$list.append(prototype); + this.count = this.count + 1; + + $(document).trigger('collection-form-add', [this.$list.children().last()]); + } + + /** + * Update item from the collection + */ + updateItem(event) { + event.preventDefault(); + const $element = $(event.currentTarget); + const url = $element.data('form-url'); + const value = $element.val(); + const $container = $element.closest('[data-form-collection="item"]'); + const index = $container.data('form-collection-index'); + const position = $container.data('form-collection-index'); + + if (url) { + $container.load(url, { id: value, position }); + } else { + let prototype = this.$element.find(`[data-form-prototype="${value}"]`).val(); + + prototype = prototype.replace(/__name__/g, index); + + $container.replaceWith(prototype); + } + $(document).trigger('collection-form-update', [$(event.currentTarget)]); + } + + /** + * Delete item from the collection + * @param event + */ + static deleteItem(event) { + event.preventDefault(); + + $(event.currentTarget) + .closest('[data-form-collection="item"]') + .remove(); + + $(document).trigger('collection-form-delete', [$(event.currentTarget)]); + } + + /** + * Update the prototype + * @param event + */ + updatePrototype(event) { + const $target = $(event.currentTarget); + let prototypeName = $target.val(); + + if ($target.data('form-prototype-prefix') !== undefined) { + prototypeName = $target.data('form-prototype-prefix') + prototypeName; } - CollectionForm.prototype = { - constructor : CollectionForm, - - /** - * Add a item to the collection. - * @param event - */ - addItem: function (event) { - event.preventDefault(); - - var prototype = this.$element.data('prototype'); - - prototype = prototype.replace( - /__name__/g, - this.count - ); - - this.$list.append(prototype); - this.count = this.count + 1; - - $(document).trigger('collection-form-add', [this.$list.children().last()]); - }, - - /** - * Update item from the collection - */ - updateItem: function (event) { - event.preventDefault(); - var $element = $(event.currentTarget), - url = $element.data('form-url'), - value = $element.val(), - $container = $element.closest('[data-form-collection="item"]'), - index = $container.data('form-collection-index'), - position = $container.data('form-collection-index'); - if (url) { - $container.load(url, {'id' : value, 'position' : position}); - } else { - var prototype = this.$element.find('[data-form-prototype="'+ value +'"]').val(); - - prototype = prototype.replace( - /__name__/g, - index - ); - - $container.replaceWith(prototype); - } - $(document).trigger('collection-form-update', [$(event.currentTarget)]); - }, - - /** - * Delete item from the collection - * @param event - */ - deleteItem: function (event) { - event.preventDefault(); - - $(event.currentTarget) - .closest('[data-form-collection="item"]') - .remove(); - - $(document).trigger('collection-form-delete', [$(event.currentTarget)]); - }, - - /** - * Update the prototype - * @param event - */ - updatePrototype: function (event) { - var $target = $(event.currentTarget); - var prototypeName = $target.val(); - - if (undefined !== $target.data('form-prototype-prefix')) { - prototypeName = $target.data('form-prototype-prefix') + prototypeName; - } - - if (null !== this.lastChoice && this.lastChoice !== prototypeName) { - this.$list.html(''); - } - - this.lastChoice = prototypeName; - - this.$element.data( - 'prototype', - this.$element.find('[data-form-prototype="'+ prototypeName +'"]').val() - ); - } - }; - - /* - * Plugin definition - */ - - $.fn.CollectionForm = function (option) { - return this.each(function () { - var $this = $(this); - var data = $this.data('collectionForm'); - var options = typeof option == 'object' && option; - - if (!data) { - $this.data( - 'collectionForm', - (data = new CollectionForm(this, options)) - ) - } - }) - }; - - $.fn.CollectionForm.Constructor = CollectionForm; - -}(jQuery); + + if (this.lastChoice !== null && this.lastChoice !== prototypeName) { + this.$list.html(''); + } + + this.lastChoice = prototypeName; + + this.$element.data('prototype', this.$element.find(`[data-form-prototype="${prototypeName}"]`).val()); + } +} + +/* + * Plugin definition + */ + +$.fn.CollectionForm = function CollectionFormPlugin(option) { + this.each((idx, el) => { + const $element = $(el); + const data = $element.data('collectionForm'); + const options = typeof option === 'object' && option; + + if (!data) { + $element.data('collectionForm', new CollectionForm(el, options)); + } + }); +}; + +$.fn.CollectionForm.Constructor = CollectionForm; diff --git a/src/Sylius/Bundle/UiBundle/Resources/private/js/sylius-product-attributes.js b/src/Sylius/Bundle/UiBundle/Resources/private/js/sylius-product-attributes.js index 00f818aa5f3..3f3fa87e317 100644 --- a/src/Sylius/Bundle/UiBundle/Resources/private/js/sylius-product-attributes.js +++ b/src/Sylius/Bundle/UiBundle/Resources/private/js/sylius-product-attributes.js @@ -7,118 +7,117 @@ * file that was distributed with this source code. */ -(function ($) { - 'use strict'; - - $.fn.extend({ - productAttributes: function () { - setAttributeChoiceListener(); - - $(this).dropdown({ - onRemove: function(removedValue, removedText, $removedChoice) { - modifyAttributesListOnSelectorElementDelete(removedValue); - }, - forceSelection: false - }); - - controlAttributesList(); - modifySelectorOnAttributesListElementDelete(); - } - }); - - function addAttributesNumber(number) { - var currentIndex = parseInt(getNextIndex()); - $('#attributesContainer').attr('data-count', currentIndex+number); +import 'semantic-ui-css/components/dropdown'; +import $ from 'jquery'; + +const getNextIndex = function getNextIndex() { + return $('#attributesContainer').attr('data-count'); +}; + +const addAttributesNumber = function addAttributesNumber(number) { + const currentIndex = parseInt(getNextIndex(), 10); + $('#attributesContainer').attr('data-count', currentIndex + number); +}; + +const controlAttributesList = function controlAttributesList() { + $('#attributesContainer .attribute').each((index, element) => { + const value = $(element).attr('data-id'); + $('#sylius_product_attribute_choice').dropdown('set selected', value); + }); +}; + +const modifyAttributesListOnSelectorElementDelete = function modifyAttributesListOnSelectorElementDelete(removedValue) { + $(`#attributesContainer .attribute[data-id="${removedValue}"]`).remove(); +}; + +const modifySelectorOnAttributesListElementDelete = function modifySelectorOnAttributesListElementDelete() { + $('.attribute button').off('click').on('click', (event) => { + const attributeId = $(event.currentTarget).parents('.attribute').attr('data-id'); + + $('div#attributeChoice > .ui.dropdown.search').dropdown('remove selected', attributeId); + modifyAttributesListOnSelectorElementDelete(attributeId); + }); +}; + +const modifyAttributeFormElements = function modifyAttributeFormElements($response) { + $response.find('input,select,textarea').each((index, element) => { + if ($(element).attr('data-name') != null) { + $(element).attr('name', $(element).attr('data-name')); } + }); - function getNextIndex() { - return $('#attributesContainer').attr('data-count'); - } + return $response; +}; - function controlAttributesList() { - $('#attributesContainer .attribute').each(function() { - var value = $(this).attr('data-id'); - $('#sylius_product_attribute_choice').dropdown('set selected', value); - }); +const isInTheAttributesContainer = function isInTheAttributesContainer(attributeId) { + let result = false; + $('#attributesContainer .attribute').each((index, element) => { + const dataId = $(element).attr('data-id'); + if (dataId === attributeId) { + result = true; } + }); - function modifyAttributesListOnSelectorElementDelete(removedValue) { - $('#attributesContainer .attribute[data-id="'+removedValue+'"]').remove(); - } + return result; +}; - function modifySelectorOnAttributesListElementDelete() { - $('.attribute button').off('click').on('click', function() { - var attributeId = $(this).parents('.attribute').attr('data-id'); +const setAttributeChoiceListener = function setAttributeChoiceListener() { + const $attributeChoice = $('#attributeChoice'); + $attributeChoice.find('button').on('click', (event) => { + event.preventDefault(); - $('div#attributeChoice > .ui.dropdown.search').dropdown('remove selected', attributeId); - modifyAttributesListOnSelectorElementDelete(attributeId) - }); - } + const $attributeChoiceSelect = $attributeChoice.find('select'); + let queryData = ''; + const $newAttributes = $attributeChoiceSelect.val(); - function modifyAttributeForms(data) { - $.each($(data).find('input,select,textarea'), function() { - if ($(this).attr('data-name') != null) { - $(this).attr('name', $(this).attr('data-name')); - } + if ($newAttributes != null) { + $attributeChoiceSelect.val().forEach((item) => { + if (!isInTheAttributesContainer(item)) { + queryData += `${$attributeChoiceSelect.prop('name')}=${item}&`; + } + }); + } + queryData += `count=${getNextIndex()}`; + + $.ajax({ + type: 'GET', + url: $(event.currentTarget).parent().attr('data-action'), + data: queryData, + dataType: 'html', + error() { + $('form').removeClass('loading'); + }, + success(response) { + const attributeFormElements = modifyAttributeFormElements($(response)); + + attributeFormElements.each((index, element) => { + const localeCode = $(element).find('input[type="hidden"]').last().val(); + $(`#attributesContainer > div[data-tab="${localeCode}"]`).append(element); }); - return data; - } + $('#sylius_product_attribute_choice').val(''); - function setAttributeChoiceListener() { - var $attributeChoice = $('#attributeChoice'); - $attributeChoice.find('button').on('click', function(event) { - event.preventDefault(); - - var $attributeChoiceSelect = $attributeChoice.find('select'); - var data = ''; - var $newAttributes = $attributeChoiceSelect.val(); - - if (null != $newAttributes) { - $attributeChoiceSelect.val().forEach(function(item) { - if (!isInTheAttributesContainer(item)) { - data += $attributeChoiceSelect.prop('name') + '=' + item + "&"; - } - }); - } - data += "count=" + getNextIndex(); - - $.ajax({ - type: 'GET', - url: $(this).parent().attr('data-action'), - data: data, - dataType: 'html', - error: function() { - $('form').removeClass('loading'); - }, - success: function(data) { - var finalData = modifyAttributeForms($(data)); - - $(finalData).each(function() { - var localeCode = $(this).find('input[type="hidden"]').last().val(); - $('#attributesContainer > div[data-tab="'+localeCode+'"]').append(this); - }); - - $('#sylius_product_attribute_choice').val(''); - - addAttributesNumber($.grep($(finalData), function (a) { return $(a).hasClass('attribute'); }).length); - modifySelectorOnAttributesListElementDelete(); - - $('form').removeClass('loading'); - } - }); - }); - } + addAttributesNumber($.grep(attributeFormElements, a => $(a).hasClass('attribute')).length); + modifySelectorOnAttributesListElementDelete(); - function isInTheAttributesContainer(attributeId) { - var result = false; - $('#attributesContainer .attribute').each(function() { - var dataId = $(this).attr('data-id'); - if (dataId === attributeId) { - result = true; - } - }); + $('form').removeClass('loading'); + }, + }); + }); +}; + +$.fn.extend({ + productAttributes() { + setAttributeChoiceListener(); + + this.dropdown({ + onRemove(removedValue) { + modifyAttributesListOnSelectorElementDelete(removedValue); + }, + forceSelection: false, + }); - return result; - } -})( jQuery ); + controlAttributesList(); + modifySelectorOnAttributesListElementDelete(); + }, +}); diff --git a/src/Sylius/Bundle/UiBundle/Resources/private/js/sylius-product-auto-complete.js b/src/Sylius/Bundle/UiBundle/Resources/private/js/sylius-product-auto-complete.js index e9b2a70e2fe..b851b51eb52 100644 --- a/src/Sylius/Bundle/UiBundle/Resources/private/js/sylius-product-auto-complete.js +++ b/src/Sylius/Bundle/UiBundle/Resources/private/js/sylius-product-auto-complete.js @@ -7,65 +7,60 @@ * file that was distributed with this source code. */ -(function ( $ ) { - 'use strict'; +import 'semantic-ui-css/components/dropdown'; +import $ from 'jquery'; - $.fn.extend({ - productAutoComplete: function () { - $(this).each(function() { - $(this).dropdown('set selected', $(this).find('input[name*="[associations]"]').val().split(',').filter(String)); - }); - - $(this).dropdown({ - delay: { - search: 250, - }, - forceSelection: false, - apiSettings: { - dataType: 'JSON', - cache: false, - data: { - criteria: { search: { type: 'contains', value: '' } } - }, - beforeSend: function(settings) { - settings.data.criteria.search.value = settings.urlData.query; +$.fn.extend({ + productAutoComplete() { + this.each((index, element) => { + const $element = $(element); + $element.dropdown('set selected', $element.find('input[name*="[associations]"]').val().split(',').filter(String)); + }); - return settings; - }, - onResponse: function (response) { - var myResults = []; - $.each(response._embedded.items, function (index, item) { - myResults.push({ - name: item.name, - value: item.code - }); - }); + this.dropdown({ + delay: { + search: 250, + }, + forceSelection: false, + apiSettings: { + dataType: 'JSON', + cache: false, + data: { + criteria: { search: { type: 'contains', value: '' } }, + }, + beforeSend(settings) { + /* eslint-disable-next-line no-param-reassign */ + settings.data.criteria.search.value = settings.urlData.query; - return { - success: true, - results: myResults - }; - } - }, - onAdd: function(addedValue, addedText, $addedChoice) { - var inputAssociation = $addedChoice.parents('.product-select').find('input[name*="[associations]"]'); - var associatedProductCodes = 0 < inputAssociation.val().length ? inputAssociation.val().split(',').filter(String) : []; + return settings; + }, + onResponse(response) { + return { + success: true, + results: response._embedded.items.map(item => ({ + name: item.name, + value: item.code, + })), + }; + }, + }, + onAdd(addedValue, addedText, $addedChoice) { + const inputAssociation = $addedChoice.parents('.product-select').find('input[name*="[associations]"]'); + const associatedProductCodes = inputAssociation.val().length > 0 ? inputAssociation.val().split(',').filter(String) : []; - associatedProductCodes.push(addedValue); - $.unique(associatedProductCodes.sort()); + associatedProductCodes.push(addedValue); + $.unique(associatedProductCodes.sort()); - inputAssociation.attr('value', associatedProductCodes.join()); - }, - onRemove: function(removedValue, removedText, $removedChoice) { - var inputAssociation = $removedChoice.parents('.product-select').find('input[name*="[associations]"]'); - var associatedProductCodes = 0 < inputAssociation.val().length ? inputAssociation.val().split(',').filter(String) : []; + inputAssociation.attr('value', associatedProductCodes.join()); + }, + onRemove(removedValue, removedText, $removedChoice) { + const inputAssociation = $removedChoice.parents('.product-select').find('input[name*="[associations]"]'); + const associatedProductCodes = inputAssociation.val().length > 0 ? inputAssociation.val().split(',').filter(String) : []; - associatedProductCodes.splice($.inArray(removedValue, associatedProductCodes), 1); + associatedProductCodes.splice($.inArray(removedValue, associatedProductCodes), 1); - inputAssociation.attr('value', associatedProductCodes.join()); - } - }); - } + inputAssociation.attr('value', associatedProductCodes.join()); + }, }); - -})( jQuery ); + }, +}); diff --git a/src/Sylius/Bundle/UiBundle/Resources/private/js/sylius-prototype-handler.js b/src/Sylius/Bundle/UiBundle/Resources/private/js/sylius-prototype-handler.js index 323a03d855c..dc6ee6b6699 100644 --- a/src/Sylius/Bundle/UiBundle/Resources/private/js/sylius-prototype-handler.js +++ b/src/Sylius/Bundle/UiBundle/Resources/private/js/sylius-prototype-handler.js @@ -1,59 +1,68 @@ -(function ($) { - 'use strict'; - - var methods = { - init: function(options) { - var settings = $.extend({ - 'prototypePrefix': false, - 'containerSelector': false - }, options); - - return this.each(function() { - show($(this), false); - $(this).change(function() { - show($(this), true); - }); - - function show(element, replace) { - var selectedValue = element.val(); - var prototypePrefix = element.attr('id'); - if (false != settings.prototypePrefix) { - prototypePrefix = settings.prototypePrefix; - } - - var prototypeElement = $('#' + prototypePrefix + '_' + selectedValue); - var container; - - if (settings.containerSelector) { - container = $(settings.containerSelector); - } else { - container = $(prototypeElement.data('container')); - } - - if (!container.length) { - return; - } - - if (!prototypeElement.length) { - container.empty(); - return; - } - - if (replace || !container.html().trim()) { - container.html(prototypeElement.data('prototype')); - } - } - }); - } - }; +/* + * This file is part of the Sylius package. + * + * (c) Paweł Jędrzejewski + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +import $ from 'jquery'; + +const methods = { + init(options) { + const settings = $.extend({ + prototypePrefix: false, + containerSelector: false, + }, options); + + const show = function show(element, replace) { + const selectedValue = element.val(); + let prototypePrefix = element.attr('id'); + if (settings.prototypePrefix != false) { + ({ prototypePrefix } = settings); + } + + const prototypeElement = $(`#${prototypePrefix}_${selectedValue}`); + let container; + + if (settings.containerSelector) { + container = $(settings.containerSelector); + } else { + container = $(prototypeElement.data('container')); + } - $.fn.handlePrototypes = function(method) { - if (methods[method]) { - return methods[method].apply(this, Array.prototype.slice.call(arguments, 1)); - } else if (typeof method === 'object' || !method) { - return methods.init.apply(this, arguments); - } else { - $.error( 'Method ' + method + ' does not exist on jQuery.handlePrototypes' ); - } + if (!container.length) { + return; + } + + if (!prototypeElement.length) { + container.empty(); + return; + } + + if (replace || !container.html().trim()) { + container.html(prototypeElement.data('prototype')); + } }; -})(jQuery); + + return this.each((index, element) => { + show($(element), false); + $(element).change((event) => { + show($(event.currentTarget), true); + }); + }); + }, +}; + +$.fn.handlePrototypes = function handlePrototypes(method, ...args) { + if (methods[method]) { + return methods[method].apply(this, args); + } else if (typeof method === 'object' || !method) { + return methods.init.apply(this, [method, ...args]); + } + + $.error(`Method ${method} does not exist on jQuery.handlePrototypes`); + + return undefined; +}; diff --git a/src/Sylius/Bundle/UiBundle/Resources/private/js/sylius-require-confirmation.js b/src/Sylius/Bundle/UiBundle/Resources/private/js/sylius-require-confirmation.js index 16eb6717ccc..828c4f3132b 100644 --- a/src/Sylius/Bundle/UiBundle/Resources/private/js/sylius-require-confirmation.js +++ b/src/Sylius/Bundle/UiBundle/Resources/private/js/sylius-require-confirmation.js @@ -7,32 +7,31 @@ * file that was distributed with this source code. */ -(function ( $ ) { - 'use strict'; +import 'semantic-ui-css/components/modal'; +import $ from 'jquery'; - $.fn.extend({ - requireConfirmation: function() { - return this.each(function() { - return $(this).on('click', function(event) { - event.preventDefault(); +$.fn.extend({ + requireConfirmation() { + this.each((idx, el) => { + $(el).on('click', (evt) => { + evt.preventDefault(); - var actionButton = $(this); + const actionButton = $(evt.currentTarget); - if (actionButton.is('a')) { - $('#confirmation-button').attr('href', actionButton.attr('href')); - } - - if (actionButton.is('button')) { - $('#confirmation-button').on('click', function(event) { - event.preventDefault(); + if (actionButton.is('a')) { + $('#confirmation-button').attr('href', actionButton.attr('href')); + } - return actionButton.closest('form').submit(); - }); - } + if (actionButton.is('button')) { + $('#confirmation-button').on('click', (event) => { + event.preventDefault(); - return $('#confirmation-modal').modal('show'); - }); - }); + actionButton.closest('form').submit(); + }); } + + $('#confirmation-modal').modal('show'); + }); }); -})( jQuery ); + }, +}); diff --git a/src/Sylius/Bundle/UiBundle/Resources/private/js/sylius-toggle.js b/src/Sylius/Bundle/UiBundle/Resources/private/js/sylius-toggle.js index f6159ff373e..33514338cd4 100644 --- a/src/Sylius/Bundle/UiBundle/Resources/private/js/sylius-toggle.js +++ b/src/Sylius/Bundle/UiBundle/Resources/private/js/sylius-toggle.js @@ -7,27 +7,25 @@ * file that was distributed with this source code. */ -(function ( $ ) { - 'use strict'; +import $ from 'jquery'; - $.fn.extend({ - toggleElement: function() { - return this.each(function() { - $(this).on('change', function(event) { - event.preventDefault(); +$.fn.extend({ + toggleElement() { + this.each((idx, el) => { + $(el).on('change', (event) => { + event.preventDefault(); - var toggleElement = $(this); - var targetElement = $('#' + toggleElement.data('toggles')); + const toggle = $(event.currentTarget); + const targetElement = $(`#${toggle.data('toggles')}`); - if (toggleElement.is(':checked')) { - targetElement.show(); - } else { - targetElement.hide(); - } - }); - - return $(this).trigger('change'); - }); + if (toggle.is(':checked')) { + targetElement.show(); + } else { + targetElement.hide(); } + }); + + $(el).trigger('change'); }); -})( jQuery ); + }, +}); diff --git a/yarn.lock b/yarn.lock index 147b085bc28..9443488a476 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,20 @@ # yarn lockfile v1 +"@babel/code-frame@^7.0.0-beta.47": + version "7.0.0-beta.49" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0-beta.49.tgz#becd805482734440c9d137e46d77340e64d7f51b" + dependencies: + "@babel/highlight" "7.0.0-beta.49" + +"@babel/highlight@7.0.0-beta.49": + version "7.0.0-beta.49" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0-beta.49.tgz#96bdc6b43e13482012ba6691b1018492d39622cc" + dependencies: + chalk "^2.0.0" + esutils "^2.0.2" + js-tokens "^3.0.0" + "@gulp-sourcemaps/map-sources@1.X": version "1.0.0" resolved "https://registry.yarnpkg.com/@gulp-sourcemaps/map-sources/-/map-sources-1.0.0.tgz#890ae7c5d8c877f6d384860215ace9d7ec945bda" @@ -9,28 +23,40 @@ normalize-path "^2.0.1" through2 "^2.0.3" +"@types/estree@0.0.39": + version "0.0.39" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" + +"@types/node@*": + version "10.3.2" + resolved "https://registry.yarnpkg.com/@types/node/-/node-10.3.2.tgz#3840ec6c12556fdda6e0e6d036df853101d732a4" + abbrev@1: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" +acorn-es7-plugin@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/acorn-es7-plugin/-/acorn-es7-plugin-1.1.7.tgz#f2ee1f3228a90eead1245f9ab1922eb2e71d336b" + acorn-jsx@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" dependencies: acorn "^3.0.4" -acorn@4.X: +acorn@4.X, acorn@^4.0.3: version "4.0.13" resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787" +acorn@>=2.5.2, acorn@^5.5.0: + version "5.6.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.6.2.tgz#b1da1d7be2ac1b4a327fb9eab851702c5045b4e7" + acorn@^3.0.4: version "3.3.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" -acorn@^5.5.0: - version "5.6.2" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.6.2.tgz#b1da1d7be2ac1b4a327fb9eab851702c5045b4e7" - ajv-keywords@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.1.tgz#617997fc5f60576894c435f940d819e135b80762" @@ -51,14 +77,6 @@ ajv@^5.2.3, ajv@^5.3.0: fast-json-stable-stringify "^2.0.0" json-schema-traverse "^0.3.0" -align-text@^0.1.1, align-text@^0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" - dependencies: - kind-of "^3.0.2" - longest "^1.0.1" - repeat-string "^1.5.2" - amdefine@>=0.0.4: version "1.0.1" resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" @@ -143,6 +161,12 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" +arr-diff@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" + dependencies: + arr-flatten "^1.0.1" + arr-diff@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" @@ -214,6 +238,10 @@ array-uniq@^1.0.1, array-uniq@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" +array-unique@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" + array-unique@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" @@ -261,10 +289,6 @@ async-settle@^1.0.0: dependencies: async-done "^1.2.2" -async@~0.2.6: - version "0.2.10" - resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1" - asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" @@ -289,7 +313,7 @@ babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: esutils "^2.0.2" js-tokens "^3.0.2" -babel-core@^6.26.0: +babel-core@^6.26.0, babel-core@^6.26.3: version "6.26.3" resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" dependencies: @@ -439,6 +463,22 @@ babel-plugin-check-es2015-constants@^6.22.0: dependencies: babel-runtime "^6.22.0" +babel-plugin-external-helpers@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-external-helpers/-/babel-plugin-external-helpers-6.22.0.tgz#2285f48b02bd5dede85175caf8c62e86adccefa1" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-module-resolver@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/babel-plugin-module-resolver/-/babel-plugin-module-resolver-3.1.1.tgz#881cf67e3d4b8400d5eaaefc1be44d2dc1fe404f" + dependencies: + find-babel-config "^1.1.0" + glob "^7.1.2" + pkg-up "^2.0.0" + reselect "^3.0.1" + resolve "^1.4.0" + babel-plugin-syntax-async-functions@^6.8.0: version "6.13.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" @@ -652,12 +692,6 @@ babel-plugin-transform-regenerator@^6.22.0: dependencies: regenerator-transform "^0.10.0" -babel-plugin-transform-runtime@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.23.0.tgz#88490d446502ea9b8e7efb0fe09ec4d99479b1ee" - dependencies: - babel-runtime "^6.22.0" - babel-plugin-transform-strict-mode@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" @@ -665,6 +699,14 @@ babel-plugin-transform-strict-mode@^6.24.1: babel-runtime "^6.22.0" babel-types "^6.24.1" +babel-polyfill@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.26.0.tgz#379937abc67d7895970adc621f284cd966cf2153" + dependencies: + babel-runtime "^6.26.0" + core-js "^2.5.0" + regenerator-runtime "^0.10.5" + babel-preset-env@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.7.0.tgz#dea79fa4ebeb883cd35dab07e260c1c9c04df77a" @@ -834,6 +876,14 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" +braces@^1.8.2: + version "1.8.5" + resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" + dependencies: + expand-range "^1.8.1" + preserve "^0.2.0" + repeat-element "^1.1.2" + braces@^2.3.0, braces@^2.3.1: version "2.3.2" resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" @@ -868,6 +918,10 @@ builtin-modules@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" +builtin-modules@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-2.0.0.tgz#60b7ef5ae6546bd7deefa74b08b62a43a232648e" + bytes@2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.2.0.tgz#fd35464a403f6f9117c2de3609ecff9cae000588" @@ -907,10 +961,6 @@ camelcase-keys@^2.0.0: camelcase "^2.0.0" map-obj "^1.0.0" -camelcase@^1.0.2: - version "1.2.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" - camelcase@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" @@ -931,13 +981,6 @@ caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" -center-align@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" - dependencies: - align-text "^0.1.3" - lazy-cache "^1.0.3" - chalk@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/chalk/-/chalk-0.5.1.tgz#663b3a648b68b55d04690d49167aa837858f2174" @@ -1015,14 +1058,6 @@ cli-width@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" -cliui@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" - dependencies: - center-align "^0.1.1" - right-align "^0.1.1" - wordwrap "0.0.2" - cliui@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" @@ -1102,7 +1137,7 @@ combined-stream@^1.0.5, combined-stream@~1.0.5: dependencies: delayed-stream "~1.0.0" -commander@^2.9.0: +commander@^2.9.0, commander@~2.15.0: version "2.15.1" resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f" @@ -1216,10 +1251,6 @@ dateformat@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-2.2.0.tgz#4065e2013cf9fb916ddfd82efb506ad4c6769062" -deap@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/deap/-/deap-1.0.1.tgz#0646e9e1a095ffe8a9e404d68d1f76dcf57e66fb" - debug-fabulous@0.0.X: version "0.0.4" resolved "https://registry.yarnpkg.com/debug-fabulous/-/debug-fabulous-0.0.4.tgz#fa071c5d87484685424807421ca4b16b0b1a0763" @@ -1246,7 +1277,7 @@ debug@~2.2.0: dependencies: ms "0.7.1" -decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2: +decamelize@^1.1.1, decamelize@^1.1.2: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" @@ -1254,6 +1285,10 @@ decode-uri-component@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" +dedent@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" + deep-extend@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" @@ -1447,6 +1482,13 @@ eslint-config-airbnb-base@^12.1.0: dependencies: eslint-restricted-globals "^0.1.1" +eslint-import-resolver-babel-module@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-babel-module/-/eslint-import-resolver-babel-module-4.0.0.tgz#1c596f7fb9815050292c8750d523b27a5444b4bf" + dependencies: + pkg-up "^2.0.0" + resolve "^1.4.0" + eslint-import-resolver-node@^0.3.1: version "0.3.2" resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz#58f15fb839b8d0576ca980413476aab2472db66a" @@ -1561,6 +1603,14 @@ estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1: version "4.2.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" +estree-walker@^0.2.0, estree-walker@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.2.1.tgz#bdafe8095383d8414d5dc2ecf4c9173b6db9412e" + +estree-walker@^0.5.1, estree-walker@^0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.5.2.tgz#d3850be7529c9580d815600b53126515e146dd39" + esutils@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" @@ -1577,6 +1627,12 @@ event-stream@^3.1.7: stream-combiner "~0.0.4" through "~2.3.1" +expand-brackets@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" + dependencies: + is-posix-bracket "^0.1.0" + expand-brackets@^2.1.4: version "2.1.4" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" @@ -1589,6 +1645,12 @@ expand-brackets@^2.1.4: snapdragon "^0.8.1" to-regex "^3.0.1" +expand-range@^1.8.1: + version "1.8.2" + resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" + dependencies: + fill-range "^2.1.0" + expand-tilde@^2.0.0, expand-tilde@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" @@ -1620,6 +1682,12 @@ external-editor@^2.0.4: iconv-lite "^0.4.17" tmp "^0.0.33" +extglob@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" + dependencies: + is-extglob "^1.0.0" + extglob@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" @@ -1641,7 +1709,7 @@ extsprintf@^1.2.0: version "1.4.0" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" -fancy-log@^1.0.0, fancy-log@^1.1.0, fancy-log@^1.3.2: +fancy-log@^1.1.0, fancy-log@^1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.2.tgz#f41125e3d84f2e7d89a43d06d958c8f78be16be1" dependencies: @@ -1649,6 +1717,13 @@ fancy-log@^1.0.0, fancy-log@^1.1.0, fancy-log@^1.3.2: color-support "^1.1.3" time-stamp "^1.0.0" +fast-async@^6.3.7: + version "6.3.7" + resolved "https://registry.yarnpkg.com/fast-async/-/fast-async-6.3.7.tgz#b4a406f2c59890b8b1b4c8468a36bd7f1a57e47f" + dependencies: + nodent-compiler "^3.2.4" + nodent-runtime ">=3.2.1" + fast-deep-equal@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614" @@ -1680,6 +1755,20 @@ file-entry-cache@^2.0.0: flat-cache "^1.2.1" object-assign "^4.0.1" +filename-regex@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" + +fill-range@^2.1.0: + version "2.2.4" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565" + dependencies: + is-number "^2.1.0" + isobject "^2.0.0" + randomatic "^3.0.0" + repeat-element "^1.1.2" + repeat-string "^1.5.2" + fill-range@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" @@ -1689,6 +1778,13 @@ fill-range@^4.0.0: repeat-string "^1.6.1" to-regex-range "^2.1.0" +find-babel-config@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/find-babel-config/-/find-babel-config-1.1.0.tgz#acc01043a6749fec34429be6b64f542ebb5d6355" + dependencies: + json5 "^0.5.1" + path-exists "^3.0.0" + find-up@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" @@ -1696,7 +1792,7 @@ find-up@^1.0.0: path-exists "^2.0.0" pinkie-promise "^2.0.0" -find-up@^2.0.0: +find-up@^2.0.0, find-up@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" dependencies: @@ -1745,6 +1841,12 @@ for-in@^1.0.1, for-in@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" +for-own@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" + dependencies: + for-in "^1.0.1" + for-own@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/for-own/-/for-own-1.0.0.tgz#c63332f415cedc4b04dbfe70cf836494c53cb44b" @@ -1869,6 +1971,19 @@ getpass@^0.1.1: dependencies: assert-plus "^1.0.0" +glob-base@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" + dependencies: + glob-parent "^2.0.0" + is-glob "^2.0.0" + +glob-parent@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" + dependencies: + is-glob "^2.0.0" + glob-parent@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" @@ -2089,19 +2204,6 @@ gulp-sourcemaps@^1.6.0: through2 "2.X" vinyl "1.X" -gulp-uglify@^1.5.1: - version "1.5.4" - resolved "https://registry.yarnpkg.com/gulp-uglify/-/gulp-uglify-1.5.4.tgz#524788d87666d09f9d0c21fb2177f90039a658c9" - dependencies: - deap "^1.0.0" - fancy-log "^1.0.0" - gulp-util "^3.0.0" - isobject "^2.0.0" - through2 "^2.0.0" - uglify-js "2.6.4" - uglify-save-license "^0.4.1" - vinyl-sourcemaps-apply "^0.2.0" - gulp-uglifycss@^1.0.5: version "1.0.9" resolved "https://registry.yarnpkg.com/gulp-uglifycss/-/gulp-uglifycss-1.0.9.tgz#4d58cca04251c3f1e0140fb2a5dcbe8bebb21244" @@ -2433,6 +2535,16 @@ is-descriptor@^1.0.0, is-descriptor@^1.0.2: is-data-descriptor "^1.0.0" kind-of "^6.0.2" +is-dotfile@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" + +is-equal-shallow@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" + dependencies: + is-primitive "^2.0.0" + is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" @@ -2443,6 +2555,10 @@ is-extendable@^1.0.1: dependencies: is-plain-object "^2.0.4" +is-extglob@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" + is-extglob@^2.1.0, is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" @@ -2463,6 +2579,12 @@ is-fullwidth-code-point@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" +is-glob@^2.0.0, is-glob@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" + dependencies: + is-extglob "^1.0.0" + is-glob@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" @@ -2475,6 +2597,10 @@ is-glob@^4.0.0: dependencies: is-extglob "^2.1.1" +is-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" + is-my-ip-valid@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz#7b351b8e8edd4d3995d4d066680e664d94696824" @@ -2493,6 +2619,12 @@ is-negated-glob@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-negated-glob/-/is-negated-glob-1.0.0.tgz#6910bca5da8c95e784b5751b976cf5a10fee36d2" +is-number@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" + dependencies: + kind-of "^3.0.2" + is-number@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" @@ -2535,6 +2667,14 @@ is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: dependencies: isobject "^3.0.1" +is-posix-bracket@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" + +is-primitive@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" + is-promise@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" @@ -2710,10 +2850,6 @@ last-run@^1.1.0: default-resolution "^2.0.0" es6-weak-map "^2.0.1" -lazy-cache@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" - lazy-debug-legacy@0.0.X: version "0.0.1" resolved "https://registry.yarnpkg.com/lazy-debug-legacy/-/lazy-debug-legacy-0.0.1.tgz#537716c0776e4cf79e3ed1b621f7658c2911b1b1" @@ -2916,10 +3052,6 @@ lodash@^4.0.0, lodash@^4.17.4, lodash@^4.3.0, lodash@~4.17.10: version "4.17.10" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" -longest@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" - loose-envify@^1.0.0: version "1.3.1" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" @@ -2944,6 +3076,18 @@ lru-cache@^4.0.1: pseudomap "^1.0.2" yallist "^2.1.2" +magic-string@^0.16.0: + version "0.16.0" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.16.0.tgz#970ebb0da7193301285fb1aa650f39bdd81eb45a" + dependencies: + vlq "^0.2.1" + +magic-string@^0.22.4: + version "0.22.5" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.22.5.tgz#8e9cf5afddf44385c1da5bc2a6a0dbd10b03657e" + dependencies: + vlq "^0.2.2" + make-iterator@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/make-iterator/-/make-iterator-1.0.1.tgz#29b33f312aa8f547c4a5e490f56afcec99133ad6" @@ -2977,6 +3121,10 @@ matchdep@^2.0.0: resolve "^1.4.0" stack-trace "0.0.10" +math-random@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.1.tgz#8b3aac588b8a66e4975e3cdea67f7bb329601fac" + media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" @@ -3002,6 +3150,24 @@ merge-stream@^1.0.0: dependencies: readable-stream "^2.0.1" +micromatch@^2.3.11: + version "2.3.11" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" + dependencies: + 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" + micromatch@^3.0.4, micromatch@^3.1.4: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" @@ -3207,6 +3373,23 @@ node-sass@^4.8.3: stdout-stream "^1.4.0" "true-case-path" "^1.0.2" +nodent-compiler@^3.2.4: + version "3.2.6" + resolved "https://registry.yarnpkg.com/nodent-compiler/-/nodent-compiler-3.2.6.tgz#ce53314bce7b18f136601068886b0379b8d372a8" + dependencies: + acorn ">=2.5.2" + acorn-es7-plugin "^1.1.7" + nodent-transform "^3.2.6" + source-map "^0.5.7" + +nodent-runtime@>=3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/nodent-runtime/-/nodent-runtime-3.2.1.tgz#9e2755d85e39f764288f0d4752ebcfe3e541e00e" + +nodent-transform@^3.2.6: + version "3.2.6" + resolved "https://registry.yarnpkg.com/nodent-transform/-/nodent-transform-3.2.6.tgz#b782edc0e2aafa6d29df0333b36cd00af757c36d" + "nopt@2 || 3": version "3.0.6" resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" @@ -3324,6 +3507,13 @@ object.map@^1.0.0: for-own "^1.0.0" make-iterator "^1.0.0" +object.omit@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" + dependencies: + for-own "^0.1.4" + is-extendable "^0.1.1" + object.pick@^1.2.0, object.pick@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" @@ -3417,6 +3607,15 @@ parse-filepath@^1.0.1: map-cache "^0.2.0" path-root "^0.1.1" +parse-glob@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" + dependencies: + glob-base "^0.3.0" + is-dotfile "^1.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.0" + parse-json@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" @@ -3515,6 +3714,12 @@ pkg-dir@^1.0.0: dependencies: find-up "^1.0.0" +pkg-up@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-2.0.0.tgz#c819ac728059a461cab1c3889a2be3c49a004d7f" + dependencies: + find-up "^2.1.0" + plugin-error@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/plugin-error/-/plugin-error-1.0.1.tgz#77016bd8919d0ac377fdcdd0322328953ca5781c" @@ -3542,6 +3747,10 @@ prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" +preserve@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" + pretty-hrtime@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1" @@ -3601,6 +3810,14 @@ qs@~6.4.0: version "6.4.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" +randomatic@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.0.0.tgz#d35490030eb4f7578de292ce6dfb04a91a128923" + dependencies: + is-number "^4.0.0" + kind-of "^6.0.0" + math-random "^1.0.1" + raw-body@~2.1.5: version "2.1.7" resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.1.7.tgz#adfeace2e4fb3098058014d08c072dcc59758774" @@ -3695,6 +3912,10 @@ regenerate@^1.2.1: version "1.4.0" resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" +regenerator-runtime@^0.10.5: + version "0.10.5" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" + regenerator-runtime@^0.11.0: version "0.11.1" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" @@ -3707,6 +3928,12 @@ regenerator-transform@^0.10.0: babel-types "^6.19.0" private "^0.1.6" +regex-cache@^0.4.2: + version "0.4.4" + resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" + dependencies: + is-equal-shallow "^0.1.3" + regex-not@^1.0.0, regex-not@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" @@ -3852,6 +4079,10 @@ require-uncached@^1.0.3: caller-path "^0.1.0" resolve-from "^1.0.0" +reselect@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/reselect/-/reselect-3.0.1.tgz#efdaa98ea7451324d092b2b2163a6a1d7a9a2147" + resolve-dir@^1.0.0, resolve-dir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" @@ -3890,18 +4121,72 @@ ret@~0.1.10: version "0.1.15" resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" -right-align@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" - dependencies: - align-text "^0.1.1" - rimraf@2, rimraf@^2.2.8, rimraf@^2.6.1: version "2.6.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" dependencies: glob "^7.0.5" +rollup-plugin-babel@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/rollup-plugin-babel/-/rollup-plugin-babel-3.0.4.tgz#41b3e762fe64450dd61da3105a2cf7ad76be4edc" + dependencies: + rollup-pluginutils "^1.5.0" + +rollup-plugin-commonjs@^9.1.3: + version "9.1.3" + resolved "https://registry.yarnpkg.com/rollup-plugin-commonjs/-/rollup-plugin-commonjs-9.1.3.tgz#37bfbf341292ea14f512438a56df8f9ca3ba4d67" + dependencies: + estree-walker "^0.5.1" + magic-string "^0.22.4" + resolve "^1.5.0" + rollup-pluginutils "^2.0.1" + +rollup-plugin-inject@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/rollup-plugin-inject/-/rollup-plugin-inject-2.0.0.tgz#8934d98a5b0db2d05efcee2ac06a170a4c70b044" + dependencies: + acorn "^4.0.3" + estree-walker "^0.2.0" + magic-string "^0.16.0" + rollup-pluginutils "^1.2.0" + +rollup-plugin-node-resolve@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-3.3.0.tgz#c26d110a36812cbefa7ce117cadcd3439aa1c713" + dependencies: + builtin-modules "^2.0.0" + is-module "^1.0.0" + resolve "^1.1.6" + +rollup-plugin-uglify@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/rollup-plugin-uglify/-/rollup-plugin-uglify-4.0.0.tgz#6eb471738f1ce9ba7d9d4bc43b71cba02417c8fb" + dependencies: + "@babel/code-frame" "^7.0.0-beta.47" + uglify-js "^3.3.25" + +rollup-pluginutils@^1.2.0, rollup-pluginutils@^1.5.0: + version "1.5.2" + resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-1.5.2.tgz#1e156e778f94b7255bfa1b3d0178be8f5c552408" + dependencies: + estree-walker "^0.2.1" + minimatch "^3.0.2" + +rollup-pluginutils@^2.0.1: + version "2.3.0" + resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.3.0.tgz#478ace04bd7f6da2e724356ca798214884738fc4" + dependencies: + estree-walker "^0.5.2" + micromatch "^2.3.11" + +rollup@^0.60.2: + version "0.60.2" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-0.60.2.tgz#9635fea3c2f32095c35cda7bfc2816c675de2da4" + dependencies: + "@types/estree" "0.0.39" + "@types/node" "*" + run-async@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" @@ -4091,11 +4376,11 @@ source-map@^0.4.2: dependencies: amdefine ">=0.0.4" -source-map@^0.5.1, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.1: +source-map@^0.5.1, source-map@^0.5.6, source-map@^0.5.7: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" -source-map@^0.6.1, source-map@~0.6.0: +source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" @@ -4454,22 +4739,12 @@ typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" -uglify-js@2.6.4: - version "2.6.4" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.6.4.tgz#65ea2fb3059c9394692f15fed87c2b36c16b9adf" +uglify-js@^3.3.25: + version "3.4.0" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.0.tgz#796762282b5b5f0eafe7d5c8c708d1d7bd5ba11d" dependencies: - async "~0.2.6" - source-map "~0.5.1" - uglify-to-browserify "~1.0.0" - yargs "~3.10.0" - -uglify-save-license@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/uglify-save-license/-/uglify-save-license-0.4.1.tgz#95726c17cc6fd171c3617e3bf4d8d82aa8c4cce1" - -uglify-to-browserify@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" + commander "~2.15.0" + source-map "~0.6.1" uglifycss@^0.0.25: version "0.0.25" @@ -4638,6 +4913,10 @@ vinyl@^2.0.0: remove-trailing-separator "^1.0.1" replace-ext "^1.0.0" +vlq@^0.2.1, vlq@^0.2.2: + version "0.2.3" + resolved "https://registry.yarnpkg.com/vlq/-/vlq-0.2.3.tgz#8f3e4328cf63b1540c0d67e1b2778386f8975b26" + websocket-driver@>=0.3.6: version "0.7.0" resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.0.tgz#0caf9d2d755d93aee049d4bdd0d3fe2cca2a24eb" @@ -4665,14 +4944,6 @@ wide-align@^1.1.0: dependencies: string-width "^1.0.2 || 2" -window-size@0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" - -wordwrap@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" - wordwrap@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" @@ -4757,12 +5028,3 @@ yargs@^7.0.0, yargs@^7.1.0: which-module "^1.0.0" y18n "^3.2.1" yargs-parser "^5.0.0" - -yargs@~3.10.0: - version "3.10.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" - dependencies: - camelcase "^1.0.2" - cliui "^2.1.0" - decamelize "^1.0.0" - window-size "0.1.0"