diff --git a/.eslintrc.yml b/.eslintrc.yml new file mode 100644 index 0000000..30a021f --- /dev/null +++ b/.eslintrc.yml @@ -0,0 +1,16 @@ +env: + browser: true + node: true + es6: true +extends: 'eslint:recommended' +globals: + Atomics: readonly + SharedArrayBuffer: readonly +parserOptions: + ecmaFeatures: + jsx: true + ecmaVersion: 2018 + sourceType: module +plugins: + - react +rules: {} diff --git a/.github/workflows/sitespeedio.yml b/.github/workflows/sitespeedio.yml new file mode 100644 index 0000000..49cd248 --- /dev/null +++ b/.github/workflows/sitespeedio.yml @@ -0,0 +1,10 @@ +name: sitespeedio +on: [push] +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: checkout + uses: actions/checkout@v4 + - name: run sitespeed.io + run: docker run -v "$(pwd):/sitespeed.io" sitespeedio/sitespeed.io:latest https://18ee-95-91-241-147.ngrok-free.app/ -n 1 --budget.configPath ./homeBudget.json diff --git a/.ruby-version b/.ruby-version index ec1cf33..1f7da99 100644 --- a/.ruby-version +++ b/.ruby-version @@ -1 +1 @@ -2.6.3 +2.7.7 diff --git a/Gemfile b/Gemfile index a86895c..98963db 100644 --- a/Gemfile +++ b/Gemfile @@ -1,6 +1,6 @@ # rubocop:disable LineLength source "https://rubygems.org" -ruby "2.6.3" +ruby "2.7.7" # Enforce git to transmitted via https. # workaround until bundler 2.0 is released. @@ -16,7 +16,7 @@ end gem "actionpack-action_caching", "~> 1.2" gem "active_record_union", "~> 1.3" gem "acts-as-taggable-on", "~> 5.0" -gem "acts_as_follower" +gem "acts_as_follower", github: "forem/acts_as_follower", branch: "master" gem "addressable", "~> 2.5", ">= 2.5.2" gem "administrate", "~> 0.11" gem "ahoy_email", "~> 0.5" @@ -122,7 +122,7 @@ group :development, :test do gem "derailed", "~> 0.1" gem "erb_lint", "~> 0.0", require: false gem "faker", git: "https://github.com/stympy/faker.git", branch: "master" - gem "fix-db-schema-conflicts" + gem "fix-db-schema-conflicts", github: "jakeonrails/fix-db-schema-conflicts", branch: "master" gem "memory_profiler", "~> 0.9" gem "parallel_tests", "~> 2.27" gem "pry-byebug", "~> 3.7" diff --git a/Gemfile.lock b/Gemfile.lock index f02cfc1..0dcfec2 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,3 +1,19 @@ +GIT + remote: https://github.com/forem/acts_as_follower.git + revision: 06393d3693a1a3d4b390aec4976c8b8f3a81cf01 + branch: master + specs: + acts_as_follower (0.2.1) + activerecord (>= 4.0) + +GIT + remote: https://github.com/jakeonrails/fix-db-schema-conflicts.git + revision: ae9135e0bb1fb142dd483f883da0064b8be17732 + branch: master + specs: + fix-db-schema-conflicts (3.1.1) + rubocop (>= 0.38.0) + GIT remote: https://github.com/stympy/faker.git revision: 9910aa58d92c018abab25d491191576fcc1a7707 @@ -58,7 +74,6 @@ GEM tzinfo (~> 1.1) acts-as-taggable-on (5.0.0) activerecord (>= 4.2.8) - acts_as_follower (0.2.1) addressable (2.5.2) public_suffix (>= 2.0.2, < 4.0) administrate (0.11.0) @@ -302,13 +317,11 @@ GEM faraday_middleware (>= 0.9) loofah (>= 2.0) sax-machine (>= 1.0) - ffi (1.9.25) + ffi (1.16.3) figaro (1.1.1) thor (~> 0.14) fission (0.5.0) CFPropertyList (~> 2.2) - fix-db-schema-conflicts (3.1.0) - rubocop (>= 0.38.0) fog (1.41.0) fog-aliyun (>= 0.1.0) fog-atmos @@ -600,7 +613,7 @@ GEM connection_pool (~> 2.2) netrc (0.11.0) nio4r (2.3.1) - nokogiri (1.10.1) + nokogiri (1.10.2) mini_portile2 (~> 2.4.0) notiffany (0.1.1) nenv (~> 0.1) @@ -935,7 +948,7 @@ DEPENDENCIES actionpack-action_caching (~> 1.2) active_record_union (~> 1.3) acts-as-taggable-on (~> 5.0) - acts_as_follower + acts_as_follower! addressable (~> 2.5, >= 2.5.2) administrate (~> 0.11) ahoy_email (~> 0.5) @@ -979,7 +992,7 @@ DEPENDENCIES fastly-rails (~> 0.8) feedjira (~> 2.2) figaro (~> 1.1) - fix-db-schema-conflicts + fix-db-schema-conflicts! fog (~> 1.41) front_matter_parser (~> 0.2) gemoji (~> 3.0.0) @@ -1069,7 +1082,7 @@ DEPENDENCIES zonebie (~> 0.6.1) RUBY VERSION - ruby 2.6.3p62 + ruby 2.7.7p221 BUNDLED WITH 1.17.3 diff --git a/case-study.md b/case-study.md new file mode 100644 index 0000000..555d0cf --- /dev/null +++ b/case-study.md @@ -0,0 +1,24 @@ +# Case-study оптимизации + +## Cleanup + +Отправной точкой работы над проектом стало задание бюджета на размер сборки JavaScript файлов для главной страницы сайта. +Установка дополнительного плагина `webpack-bundle-analyzer` позволила обнаружить нерациональное использование библиотеки Moment.js, а именно ее загрузки на каждой странице. + +В первую очередь были сделаны два скриншота текущего состояния бандла до внесения изменений и после первого подхода, состоящего во временном отключении содержимого файла `proCharts.js` (графики, создаваемые с помощью `Chart.js` часто используют операции с датами и временем для построения координат, т.е. напрямую связаны с `Moment.js`, что так же отражено в зависимостях в файле `yarn.lock` между этими двумя библиотеками): + +- `sitespeed-result/Bundle_before_changes.png` +- `sitespeed-result/Bundle_without_Moment.png` + +Следующим шагом стало исследование проекта на предмет выявления места, где библиотека `Moment.js` (как зависимость для `Chart.js`) должна по задумке использоваться, чтобы загружать ее только там. + +- `app/views/dashboards/pro.html.erb` шаблон использует файл `proCharts`: `<%= javascript_pack_tag "proCharts", defer: true %>`, который мы для проверки гипотезы закомментировали ранее. +- этот шаблон используется `app/controllers/dashboards_controller.rb` для пользователей с ролью `pro` (авторы статей и блогеры) и вызывается переходом по адресу `get "/dashboard/pro" => "dashboards#pro` +- в файле `config/webpack/environment.js` уже используется плагин для Webpack `CommonsChunkPlugin`, который, следуя документации https://webpack.js.org/plugins/commons-chunk-plugin/#passing-the-minchunks-property-a-function, позволяет настроить условие для включения библиотек в бандл `vendor.js` +- добавляем условия исключения Moment и Chart из этой функции настройки плагина и в результате уменьшаем размер бандла: `sitespeed-result/Bundle_after_repack.png` + +Бюджет немного пришлось увеличить с 460000 до 468000, чтобы тест sitespeed.io стал выполняться. Очевидно, это связано с добавлением нескольких зависемостей в сборке (см `yarn.lock`) + +## Настройка CI + +Теперь настроим `CI` `Github Actions` для защиты от регрессии: файл `.github/workflows/sitespeedio.yml` использует сервис `ngrok` и создает публичный адрес для туннеля на локальный компьютер для тестирования укладывания в бюджет по размеру сборки. diff --git a/config/webpack/development.js b/config/webpack/development.js index 009652d..f50d830 100644 --- a/config/webpack/development.js +++ b/config/webpack/development.js @@ -1,4 +1,15 @@ const environment = require('./environment'); + +const BundleAnalyzerPlugin = require('webpack-bundle-analyzer') + .BundleAnalyzerPlugin; +environment.plugins.append( + 'BundleAnalyzer', + new BundleAnalyzerPlugin({ + analyzerMode: 'static', + openAnalyzer: true, + }), +); + const config = environment.toWebpackConfig(); // For more information, see https://webpack.js.org/configuration/devtool/#devtool diff --git a/config/webpack/environment.js b/config/webpack/environment.js index da47cd7..2c7ca83 100644 --- a/config/webpack/environment.js +++ b/config/webpack/environment.js @@ -8,27 +8,32 @@ // module.exports = environment; - -const { environment } = require('@rails/webpacker') -const webpack = require('webpack') +const { environment } = require('@rails/webpacker'); +const webpack = require('webpack'); environment.plugins.append( 'CommonsChunkVendor', new webpack.optimize.CommonsChunkPlugin({ name: 'vendor', - minChunks: (module) => { + minChunks: module => { // this assumes your vendor imports exist in the node_modules directory - return module.context && module.context.indexOf('node_modules') !== -1 - } - }) -) + // exclude chart.js from vendor chunk + return ( + module.context && + module.context.indexOf('node_modules') !== -1 && + module.context.indexOf('chart.js') === -1 && + module.context.indexOf('moment') === -1 + ); + }, + }), +); environment.plugins.append( 'CommonsChunkManifest', new webpack.optimize.CommonsChunkPlugin({ name: 'manifest', - minChunks: Infinity - }) -) + minChunks: Infinity, + }), +); -module.exports = environment +module.exports = environment; diff --git a/homeBudget.json b/homeBudget.json new file mode 100644 index 0000000..1f962ed --- /dev/null +++ b/homeBudget.json @@ -0,0 +1,7 @@ +{ + "budget": { + "transferSize": { + "javascript": 468000 + } + } +} diff --git a/package.json b/package.json index 5532679..79f4371 100644 --- a/package.json +++ b/package.json @@ -82,6 +82,7 @@ "preact-render-spy": "^1.3.0", "preact-render-to-json": "^3.6.6", "prettier": "^1.16.4", + "webpack-bundle-analyzer": "^4.10.1", "webpack-dev-server": "^2.11.3" }, "dependencies": { diff --git a/sitespeed-result/Bundle_after_repack.png b/sitespeed-result/Bundle_after_repack.png new file mode 100644 index 0000000..a5dcd6f Binary files /dev/null and b/sitespeed-result/Bundle_after_repack.png differ diff --git a/sitespeed-result/Bundle_before_changes.png b/sitespeed-result/Bundle_before_changes.png new file mode 100644 index 0000000..f1e9698 Binary files /dev/null and b/sitespeed-result/Bundle_before_changes.png differ diff --git a/sitespeed-result/Bundle_without_Moment.png b/sitespeed-result/Bundle_without_Moment.png new file mode 100644 index 0000000..5a90934 Binary files /dev/null and b/sitespeed-result/Bundle_without_Moment.png differ diff --git a/yarn.lock b/yarn.lock index 98288bd..17052ed 100644 --- a/yarn.lock +++ b/yarn.lock @@ -118,6 +118,11 @@ lodash "^4.17.10" to-fast-properties "^2.0.0" +"@discoveryjs/json-ext@0.5.7": + version "0.5.7" + resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" + integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== + "@emotion/cache@^10.0.9": version "10.0.9" resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-10.0.9.tgz#e0c7b7a289f7530edcfad4dcf3858bd2e5700a6f" @@ -219,6 +224,11 @@ resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.2.2.tgz#63985d3d8b02530e0869962f4da09142ee8e200e" integrity sha512-n/VQ4mbfr81aqkx/XmVicOLjviMuy02eenSdJY33SVA7S2J42EU0P1H0mOogfYedb3wXA0d/LVtBrgTSm04WEA== +"@polka/url@^1.0.0-next.20": + version "1.0.0-next.23" + resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.23.tgz#498e41218ab3b6a1419c735e5c6ae2c5ed609b6c" + integrity sha512-C16M+IYz0rgRhWZdCmK+h58JMv8vijAA61gmz2rspCSwKwzBebpdcsiUmwrtJRdphuY30i6BSLEOP8ppbNLyLg== + "@rails/webpacker@^3.5.5": version "3.5.5" resolved "https://registry.yarnpkg.com/@rails/webpacker/-/webpacker-3.5.5.tgz#8911c66bcefc8bc6b91270e92f0d39e3c2d43116" @@ -665,6 +675,11 @@ acorn-walk@^6.0.1: resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.1.1.tgz#d363b66f5fac5f018ff9c3a1e7b6f8e310cc3913" integrity sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw== +acorn-walk@^8.0.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.0.tgz#2097665af50fd0cf7a2dfccd2b9368964e66540f" + integrity sha512-FS7hV565M5l1R08MXqo8odwMTB02C2UqzB17RVgu9EyuYFBqJZ3/ZY97sQD5FewVu1UyDFc1yztUDrAwT0EypA== + acorn@^4.0.3: version "4.0.13" resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787" @@ -680,6 +695,11 @@ acorn@^6.0.1, acorn@^6.0.4, acorn@^6.0.7: resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.1.0.tgz#b0a3be31752c97a0f7013c5f4903b71a05db6818" integrity sha512-MW/FjM+IvU9CgBzjO3UIPCE2pyEwUsoFl+VGdczOPEdxfGFjuKny/gN54mOuX7Qxmb9Rg9MCn2oKiSUeW+pjrw== +acorn@^8.0.4: + version "8.11.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.2.tgz#ca0d78b51895be5390a5903c5b3bdcdaf78ae40b" + integrity sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w== + address@1.0.3, address@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/address/-/address-1.0.3.tgz#b5f50631f8d6cec8bd20c963963afb55e06cbce9" @@ -2964,6 +2984,11 @@ commander@^2.11.0, commander@^2.14.1, commander@^2.15.0, commander@^2.19.0, comm resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg== +commander@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== + commander@~2.13.0: version "2.13.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c" @@ -3448,6 +3473,11 @@ date-now@^0.1.4: resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" integrity sha1-6vQ5/U1ISK105cx9vvIAZyueNFs= +debounce@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.1.tgz#38881d8f4166a5c5848020c11827b834bcb3e0a5" + integrity sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug== + debug@2.6.9, debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.6, debug@^2.6.8, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" @@ -3777,6 +3807,11 @@ duplexer@^0.1.1: resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" integrity sha1-rOb/gIwc5mtX0ev5eXessCM0z8E= +duplexer@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" + integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== + duplexify@^3.4.2, duplexify@^3.6.0: version "3.6.1" resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.6.1.tgz#b1a7a29c4abfd639585efaecce80d666b1e34125" @@ -4008,6 +4043,11 @@ escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1 resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + escodegen@^1.11.0, escodegen@^1.9.1: version "1.11.0" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.11.0.tgz#b27a9389481d5bfd5bec76f7bb1eb3f8f4556589" @@ -5115,6 +5155,13 @@ gzip-size@3.0.0: dependencies: duplexer "^0.1.1" +gzip-size@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-6.0.0.tgz#065367fd50c239c0671cbcbad5be3e2eeb10e462" + integrity sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q== + dependencies: + duplexer "^0.1.2" + handle-thing@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-1.2.5.tgz#fd7aad726bf1a5fd16dfc29b2f7a6601d27139c4" @@ -5333,6 +5380,11 @@ html-entities@^1.2.0: resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f" integrity sha1-DfKTUfByEWNRXfueVUPl9u7VFi8= +html-escaper@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== + html-loader@^0.5.5: version "0.5.5" resolved "https://registry.yarnpkg.com/html-loader/-/html-loader-0.5.5.tgz#6356dbeb0c49756d8ebd5ca327f16ff06ab5faea" @@ -5993,6 +6045,11 @@ is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: dependencies: isobject "^3.0.1" +is-plain-object@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" + integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== + 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" @@ -7474,6 +7531,11 @@ move-concurrently@^1.0.1: rimraf "^2.5.4" run-queue "^1.0.3" +mrmime@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mrmime/-/mrmime-1.0.1.tgz#5f90c825fad4bdd41dc914eff5d1a8cfdaf24f27" + integrity sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw== + ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" @@ -7948,6 +8010,11 @@ onetime@^2.0.0: dependencies: mimic-fn "^1.0.0" +opener@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" + integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== + opn@5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/opn/-/opn-5.2.0.tgz#71fdf934d6827d676cecbea1531f95d354641225" @@ -8274,6 +8341,11 @@ performance-now@^2.1.0: resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + pify@^2.0.0, pify@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" @@ -10401,6 +10473,15 @@ simple-swizzle@^0.2.2: dependencies: is-arrayish "^0.3.1" +sirv@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/sirv/-/sirv-2.0.3.tgz#ca5868b87205a74bef62a469ed0296abceccd446" + integrity sha512-O9jm9BsID1P+0HOi81VpXPoDxYP374pkOLzACAoyUQ/3OUVndNpsz6wMnY2z+yOxzbllCKZrM+9QrWsv4THnyA== + dependencies: + "@polka/url" "^1.0.0-next.20" + mrmime "^1.0.0" + totalist "^3.0.0" + sisteransi@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-0.1.1.tgz#5431447d5f7d1675aac667ccd0b865a4994cb3ce" @@ -11097,6 +11178,11 @@ toposort@^2.0.2: resolved "https://registry.yarnpkg.com/toposort/-/toposort-2.0.2.tgz#ae21768175d1559d48bef35420b2f4962f09c330" integrity sha1-riF2gXXRVZ1IvvNUILL0li8JwzA= +totalist@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/totalist/-/totalist-3.0.1.tgz#ba3a3d600c915b1a97872348f79c127475f6acf8" + integrity sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ== + tough-cookie@>=2.3.3, tough-cookie@^2.3.4, tough-cookie@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" @@ -11547,6 +11633,25 @@ webidl-conversions@^4.0.2: resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== +webpack-bundle-analyzer@^4.10.1: + version "4.10.1" + resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.1.tgz#84b7473b630a7b8c21c741f81d8fe4593208b454" + integrity sha512-s3P7pgexgT/HTUSYgxJyn28A+99mmLq4HsJepMPzu0R8ImJc52QNqaFYW1Z2z2uIb1/J3eYgaAWVpaC+v/1aAQ== + dependencies: + "@discoveryjs/json-ext" "0.5.7" + acorn "^8.0.4" + acorn-walk "^8.0.0" + commander "^7.2.0" + debounce "^1.2.1" + escape-string-regexp "^4.0.0" + gzip-size "^6.0.0" + html-escaper "^2.0.2" + is-plain-object "^5.0.0" + opener "^1.5.2" + picocolors "^1.0.0" + sirv "^2.0.3" + ws "^7.3.1" + webpack-dev-middleware@1.12.2, webpack-dev-middleware@^1.12.2: version "1.12.2" resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-1.12.2.tgz#f8fc1120ce3b4fc5680ceecb43d777966b21105e" @@ -11814,6 +11919,11 @@ ws@^6.1.2: dependencies: async-limiter "~1.0.0" +ws@^7.3.1: + version "7.5.9" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" + integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== + xml-name-validator@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a"