@bundle-stats/ui 3.2.0-beta.1 → 3.2.1-beta.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (266) hide show
  1. package/.babelrc.js +3 -3
  2. package/CHANGELOG.md +11 -4
  3. package/lib/assets/icons/arrow.svg +1 -0
  4. package/lib/assets/icons/cancel.svg +1 -0
  5. package/lib/assets/icons/clock.svg +1 -0
  6. package/lib/assets/icons/close.svg +1 -0
  7. package/lib/assets/icons/commit.svg +1 -0
  8. package/lib/assets/icons/filter.svg +1 -0
  9. package/lib/assets/icons/help.svg +1 -0
  10. package/lib/assets/icons/menu.svg +1 -0
  11. package/lib/{ui/icon/assets → assets/icons}/sort.svg +0 -0
  12. package/lib/assets/icons/warning.svg +1 -0
  13. package/lib/assets/icons.svg +1 -0
  14. package/lib/components/browsertime-table/browsertime-table.stories.js +1 -0
  15. package/lib/components/bundle-assets/bundle-assets.js +3 -3
  16. package/lib/components/bundle-assets/bundle-assets.stories.js +19 -7
  17. package/lib/components/bundle-assets/bundle-assets.utils.js +95 -28
  18. package/lib/components/bundle-assets/index.js +115 -4
  19. package/lib/components/bundle-assets-totals-chart-bars/bundle-assets-totals-chart-bars.js +17 -18
  20. package/lib/components/bundle-modules/bundle-modules.js +3 -3
  21. package/lib/components/bundle-modules/bundle-modules.utils.js +152 -0
  22. package/lib/components/bundle-modules/index.js +135 -4
  23. package/lib/components/bundle-packages/bundle-packages.js +3 -3
  24. package/lib/components/bundle-packages/{bundle-packages.container.js → bundle-packages.utils.js} +8 -42
  25. package/lib/components/bundle-packages/index.js +111 -3
  26. package/lib/components/job-meta/job-meta.js +1 -1
  27. package/lib/components/metrics-table/metrics-table.js +3 -7
  28. package/lib/components/metrics-table-search/metrics-table-search.js +2 -1
  29. package/lib/components/metrics-table-search/metrics-table-search.module.css +2 -1
  30. package/lib/components/summary/summary.js +52 -34
  31. package/lib/hooks/rows-filter.js +28 -0
  32. package/lib/hooks/rows-sort.js +54 -0
  33. package/lib/{hocs/with-search.js → hooks/search-params.js} +16 -65
  34. package/lib/layout/box/box.js +2 -2
  35. package/lib/layout/stack/stack.js +13 -3
  36. package/lib/ui/icon/icon.js +4 -191
  37. package/lib/ui/sort-dropdown/sort-dropdown.js +12 -13
  38. package/lib/ui/sort-dropdown/sort-dropdown.stories.js +2 -2
  39. package/lib/utils.js +6 -3
  40. package/lib-esm/app/app.js +60 -70
  41. package/lib-esm/app/app.stories.js +50 -71
  42. package/lib-esm/app/header/header.js +5 -3
  43. package/lib-esm/assets/icons/arrow.svg +1 -0
  44. package/lib-esm/assets/icons/cancel.svg +1 -0
  45. package/lib-esm/assets/icons/clock.svg +1 -0
  46. package/lib-esm/assets/icons/close.svg +1 -0
  47. package/lib-esm/assets/icons/commit.svg +1 -0
  48. package/lib-esm/assets/icons/filter.svg +1 -0
  49. package/lib-esm/assets/icons/help.svg +1 -0
  50. package/lib-esm/assets/icons/menu.svg +1 -0
  51. package/lib-esm/{ui/icon/assets → assets/icons}/sort.svg +0 -0
  52. package/lib-esm/assets/icons/warning.svg +1 -0
  53. package/lib-esm/assets/icons.svg +1 -0
  54. package/lib-esm/components/asset-info/asset-info.js +21 -17
  55. package/lib-esm/components/asset-info/asset-info.stories.js +29 -33
  56. package/lib-esm/components/browsertime-table/browsertime-table.js +6 -4
  57. package/lib-esm/components/browsertime-table/browsertime-table.stories.js +11 -14
  58. package/lib-esm/components/bundle-assets/bundle-assets.constants.js +17 -15
  59. package/lib-esm/components/bundle-assets/bundle-assets.js +107 -97
  60. package/lib-esm/components/bundle-assets/bundle-assets.stories.js +58 -63
  61. package/lib-esm/components/bundle-assets/bundle-assets.utils.js +65 -21
  62. package/lib-esm/components/bundle-assets/index.js +89 -2
  63. package/lib-esm/components/bundle-assets-totals-chart-bars/bundle-assets-totals-chart-bars.js +51 -53
  64. package/lib-esm/components/bundle-assets-totals-chart-bars/bundle-assets-totals-chart-bars.stories.js +9 -13
  65. package/lib-esm/components/bundle-assets-totals-table/bundle-assets-totals-table.js +14 -13
  66. package/lib-esm/components/bundle-assets-totals-table/bundle-assets-totals-table.stories.js +13 -19
  67. package/lib-esm/components/bundle-modules/bundle-modules.constants.js +17 -15
  68. package/lib-esm/components/bundle-modules/bundle-modules.js +112 -110
  69. package/lib-esm/components/bundle-modules/bundle-modules.stories.js +46 -58
  70. package/lib-esm/components/bundle-modules/bundle-modules.utils.js +98 -0
  71. package/lib-esm/components/bundle-modules/index.js +114 -3
  72. package/lib-esm/components/bundle-packages/bundle-packages.constants.js +17 -15
  73. package/lib-esm/components/bundle-packages/bundle-packages.js +71 -69
  74. package/lib-esm/components/bundle-packages/bundle-packages.stories.js +34 -46
  75. package/lib-esm/components/bundle-packages/bundle-packages.utils.js +44 -0
  76. package/lib-esm/components/bundle-packages/index.js +87 -2
  77. package/lib-esm/components/component-link.js +10 -13
  78. package/lib-esm/components/delta/delta.js +8 -6
  79. package/lib-esm/components/delta/delta.stories.js +26 -38
  80. package/lib-esm/components/duplicate-packages-warning/duplicate-packages-warning.js +11 -9
  81. package/lib-esm/components/duplicate-packages-warning/duplicate-packages-warning.stories.js +20 -26
  82. package/lib-esm/components/job-header/job-header.js +14 -11
  83. package/lib-esm/components/job-header/job-header.stories.js +12 -18
  84. package/lib-esm/components/job-meta/job-meta.js +15 -18
  85. package/lib-esm/components/job-meta/job-meta.stories.js +10 -12
  86. package/lib-esm/components/job-name/job-name.js +9 -12
  87. package/lib-esm/components/job-name/job-name.stories.js +15 -23
  88. package/lib-esm/components/jobs-header/jobs-header.js +12 -12
  89. package/lib-esm/components/jobs-header/jobs-header.stories.js +80 -86
  90. package/lib-esm/components/lighthouse-table/lighthouse-table.js +6 -4
  91. package/lib-esm/components/lighthouse-table/lighthouse-table.stories.js +10 -14
  92. package/lib-esm/components/metric/metric.js +15 -19
  93. package/lib-esm/components/metric/metric.stories.js +36 -58
  94. package/lib-esm/components/metrics-table/metrics-table.js +128 -139
  95. package/lib-esm/components/metrics-table/metrics-table.stories.js +27 -35
  96. package/lib-esm/components/metrics-table-options/metrics-table-options.js +16 -19
  97. package/lib-esm/components/metrics-table-options/metrics-table-options.stories.js +6 -12
  98. package/lib-esm/components/metrics-table-search/metrics-table-search.js +17 -18
  99. package/lib-esm/components/metrics-table-search/metrics-table-search.module.css +2 -1
  100. package/lib-esm/components/metrics-table-search/metrics-table-search.stories.js +4 -9
  101. package/lib-esm/components/metrics-table-title/metrics-table-title.js +9 -7
  102. package/lib-esm/components/module-info/module-info.js +15 -13
  103. package/lib-esm/components/module-info/module-info.stories.js +20 -22
  104. package/lib-esm/components/summary/summary.js +52 -36
  105. package/lib-esm/components/summary/summary.stories.js +31 -46
  106. package/lib-esm/components/summary-item/summary-item.js +27 -28
  107. package/lib-esm/components/summary-item/summary-item.stories.js +40 -50
  108. package/lib-esm/components/total-size-type-title/total-size-type-title.js +4 -2
  109. package/lib-esm/constants.js +25 -30
  110. package/lib-esm/hooks/rows-filter.js +20 -0
  111. package/lib-esm/hooks/rows-sort.js +22 -0
  112. package/lib-esm/hooks/search-params.js +170 -0
  113. package/lib-esm/layout/box/box.js +14 -21
  114. package/lib-esm/layout/box/box.stories.js +34 -46
  115. package/lib-esm/layout/flex-stack/flex-stack.js +9 -12
  116. package/lib-esm/layout/flex-stack/flex-stack.stories.js +39 -49
  117. package/lib-esm/layout/footer/footer.js +11 -11
  118. package/lib-esm/layout/footer/footer.stories.js +7 -11
  119. package/lib-esm/layout/header/header.js +10 -14
  120. package/lib-esm/layout/header/header.stories.js +50 -44
  121. package/lib-esm/layout/stack/stack.js +13 -8
  122. package/lib-esm/layout/stack/stack.stories.js +39 -49
  123. package/lib-esm/layout/sub-header/sub-header.js +14 -12
  124. package/lib-esm/layout/sub-header/sub-header.stories.js +57 -69
  125. package/lib-esm/prototypes/typography.stories.js +49 -58
  126. package/lib-esm/query-state.js +13 -16
  127. package/lib-esm/stories/wrapper.js +6 -12
  128. package/lib-esm/ui/alert/alert.js +6 -4
  129. package/lib-esm/ui/alert/alert.stories.js +14 -24
  130. package/lib-esm/ui/container/container.js +6 -9
  131. package/lib-esm/ui/container/container.stories.js +15 -17
  132. package/lib-esm/ui/dropdown/dropdown.js +13 -11
  133. package/lib-esm/ui/dropdown/dropdown.stories.js +22 -26
  134. package/lib-esm/ui/empty-set/empty-set.js +12 -12
  135. package/lib-esm/ui/empty-set/empty-set.stories.js +11 -19
  136. package/lib-esm/ui/file-name/file-name.js +6 -4
  137. package/lib-esm/ui/file-name/file-name.stories.js +12 -16
  138. package/lib-esm/ui/filters/filters.container.js +57 -76
  139. package/lib-esm/ui/filters/filters.js +71 -77
  140. package/lib-esm/ui/filters/filters.stories.js +82 -100
  141. package/lib-esm/ui/filters/filters.utils.js +26 -24
  142. package/lib-esm/ui/filters/index.js +1 -1
  143. package/lib-esm/ui/horizontal-bar-chart/horizontal-bar-chart.js +68 -78
  144. package/lib-esm/ui/horizontal-bar-chart/horizontal-bar-chart.stories.js +67 -77
  145. package/lib-esm/ui/icon/icon.js +13 -202
  146. package/lib-esm/ui/icon/icon.stories.js +16 -24
  147. package/lib-esm/ui/input/input.js +7 -10
  148. package/lib-esm/ui/input/input.stories.js +8 -12
  149. package/lib-esm/ui/loader/loader.js +6 -9
  150. package/lib-esm/ui/loader/loader.stories.js +5 -9
  151. package/lib-esm/ui/logo/logo.constants.js +6 -6
  152. package/lib-esm/ui/logo/logo.js +15 -15
  153. package/lib-esm/ui/logo/logo.stories.js +14 -22
  154. package/lib-esm/ui/panels/panels.js +13 -23
  155. package/lib-esm/ui/panels/panels.stories.js +14 -16
  156. package/lib-esm/ui/popover/popover.js +11 -9
  157. package/lib-esm/ui/popover/popover.stories.js +7 -11
  158. package/lib-esm/ui/skeleton/skeleton.js +6 -9
  159. package/lib-esm/ui/skeleton/skeleton.stories.js +2 -4
  160. package/lib-esm/ui/sort-dropdown/sort-dropdown.js +38 -38
  161. package/lib-esm/ui/sort-dropdown/sort-dropdown.stories.js +14 -16
  162. package/lib-esm/ui/table/table.js +26 -31
  163. package/lib-esm/ui/table/table.stories.js +84 -102
  164. package/lib-esm/ui/tabs/tabs.js +13 -21
  165. package/lib-esm/ui/tabs/tabs.stories.js +4 -6
  166. package/lib-esm/ui/toolbar/toolbar.js +7 -5
  167. package/lib-esm/ui/toolbar/toolbar.stories.js +14 -16
  168. package/lib-esm/ui/tooltip/tooltip.js +13 -16
  169. package/lib-esm/ui/tooltip/tooltip.stories.js +8 -12
  170. package/lib-esm/utils.js +20 -24
  171. package/package.json +30 -33
  172. package/src/assets/icons/arrow.svg +1 -0
  173. package/src/assets/icons/cancel.svg +1 -0
  174. package/src/assets/icons/clock.svg +1 -0
  175. package/src/assets/icons/close.svg +1 -0
  176. package/src/assets/icons/commit.svg +1 -0
  177. package/src/assets/icons/filter.svg +1 -0
  178. package/src/assets/icons/help.svg +1 -0
  179. package/src/assets/icons/menu.svg +1 -0
  180. package/src/{ui/icon/assets → assets/icons}/sort.svg +0 -0
  181. package/src/assets/icons/warning.svg +1 -0
  182. package/src/assets/icons.svg +1 -0
  183. package/src/components/bundle-assets/bundle-assets.jsx +3 -3
  184. package/src/components/bundle-assets/bundle-assets.utils.js +96 -17
  185. package/src/components/bundle-assets/index.jsx +89 -0
  186. package/src/components/bundle-assets-totals-chart-bars/bundle-assets-totals-chart-bars.jsx +15 -15
  187. package/src/components/bundle-modules/bundle-modules.jsx +3 -3
  188. package/src/components/bundle-modules/bundle-modules.utils.js +101 -0
  189. package/src/components/bundle-modules/index.jsx +107 -0
  190. package/src/components/bundle-packages/bundle-packages.jsx +3 -3
  191. package/src/components/bundle-packages/bundle-packages.utils.js +47 -0
  192. package/src/components/bundle-packages/index.jsx +84 -0
  193. package/src/components/job-meta/job-meta.jsx +1 -3
  194. package/src/components/metrics-table/metrics-table.jsx +2 -7
  195. package/src/components/metrics-table-search/metrics-table-search.jsx +1 -0
  196. package/src/components/metrics-table-search/metrics-table-search.module.css +2 -1
  197. package/src/components/summary/summary.jsx +26 -10
  198. package/src/hooks/rows-filter.js +16 -0
  199. package/src/hooks/rows-sort.js +24 -0
  200. package/src/hooks/search-params.js +153 -0
  201. package/src/layout/box/box.jsx +1 -1
  202. package/src/layout/stack/stack.jsx +2 -2
  203. package/src/ui/icon/icon.jsx +7 -42
  204. package/src/ui/sort-dropdown/sort-dropdown.jsx +11 -11
  205. package/src/utils.jsx +5 -3
  206. package/lib/components/bundle-assets/bundle-assets.container.js +0 -140
  207. package/lib/components/bundle-modules/bundle-modules.container.js +0 -222
  208. package/lib/hocs/with-custom-sort.js +0 -75
  209. package/lib/hocs/with-filtered-items.js +0 -54
  210. package/lib/ui/icon/assets/arrow.svg +0 -4
  211. package/lib/ui/icon/assets/branch.svg +0 -3
  212. package/lib/ui/icon/assets/cancel.svg +0 -4
  213. package/lib/ui/icon/assets/clock.svg +0 -3
  214. package/lib/ui/icon/assets/close.svg +0 -4
  215. package/lib/ui/icon/assets/commit.svg +0 -3
  216. package/lib/ui/icon/assets/filter.svg +0 -4
  217. package/lib/ui/icon/assets/help.svg +0 -4
  218. package/lib/ui/icon/assets/job.svg +0 -3
  219. package/lib/ui/icon/assets/menu.svg +0 -4
  220. package/lib/ui/icon/assets/package.svg +0 -3
  221. package/lib/ui/icon/assets/pull-request.svg +0 -3
  222. package/lib/ui/icon/assets/repository.svg +0 -3
  223. package/lib/ui/icon/assets/warning.svg +0 -4
  224. package/lib-esm/components/bundle-assets/bundle-assets.container.js +0 -119
  225. package/lib-esm/components/bundle-modules/bundle-modules.container.js +0 -175
  226. package/lib-esm/components/bundle-packages/bundle-packages.container.js +0 -91
  227. package/lib-esm/hocs/with-custom-sort.js +0 -43
  228. package/lib-esm/hocs/with-filtered-items.js +0 -35
  229. package/lib-esm/hocs/with-search.js +0 -214
  230. package/lib-esm/ui/icon/assets/arrow.svg +0 -4
  231. package/lib-esm/ui/icon/assets/branch.svg +0 -3
  232. package/lib-esm/ui/icon/assets/cancel.svg +0 -4
  233. package/lib-esm/ui/icon/assets/clock.svg +0 -3
  234. package/lib-esm/ui/icon/assets/close.svg +0 -4
  235. package/lib-esm/ui/icon/assets/commit.svg +0 -3
  236. package/lib-esm/ui/icon/assets/filter.svg +0 -4
  237. package/lib-esm/ui/icon/assets/help.svg +0 -4
  238. package/lib-esm/ui/icon/assets/job.svg +0 -3
  239. package/lib-esm/ui/icon/assets/menu.svg +0 -4
  240. package/lib-esm/ui/icon/assets/package.svg +0 -3
  241. package/lib-esm/ui/icon/assets/pull-request.svg +0 -3
  242. package/lib-esm/ui/icon/assets/repository.svg +0 -3
  243. package/lib-esm/ui/icon/assets/warning.svg +0 -4
  244. package/src/components/bundle-assets/bundle-assets.container.js +0 -146
  245. package/src/components/bundle-assets/index.js +0 -4
  246. package/src/components/bundle-modules/bundle-modules.container.js +0 -158
  247. package/src/components/bundle-modules/index.js +0 -4
  248. package/src/components/bundle-packages/bundle-packages.container.js +0 -93
  249. package/src/components/bundle-packages/index.js +0 -4
  250. package/src/hocs/with-custom-sort.jsx +0 -35
  251. package/src/hocs/with-filtered-items.jsx +0 -34
  252. package/src/hocs/with-search.jsx +0 -184
  253. package/src/ui/icon/assets/arrow.svg +0 -4
  254. package/src/ui/icon/assets/branch.svg +0 -3
  255. package/src/ui/icon/assets/cancel.svg +0 -4
  256. package/src/ui/icon/assets/clock.svg +0 -3
  257. package/src/ui/icon/assets/close.svg +0 -4
  258. package/src/ui/icon/assets/commit.svg +0 -3
  259. package/src/ui/icon/assets/filter.svg +0 -4
  260. package/src/ui/icon/assets/help.svg +0 -4
  261. package/src/ui/icon/assets/job.svg +0 -3
  262. package/src/ui/icon/assets/menu.svg +0 -4
  263. package/src/ui/icon/assets/package.svg +0 -3
  264. package/src/ui/icon/assets/pull-request.svg +0 -3
  265. package/src/ui/icon/assets/repository.svg +0 -3
  266. package/src/ui/icon/assets/warning.svg +0 -4
@@ -7,58 +7,46 @@ import baselineStats from '../../../__mocks__/webpack-stats.baseline.json';
7
7
  import currentStats from '../../../__mocks__/webpack-stats.current.json';
8
8
  import { getWrapperDecorator } from '../../stories';
9
9
  import { BundlePackages } from '.';
10
- var JOBS = createJobs([{
10
+ const JOBS = createJobs([{
11
11
  webpack: currentStats
12
12
  }, {
13
13
  webpack: baselineStats
14
14
  }]);
15
- var currentJob = JOBS[0],
16
- baselineJob = JOBS[1];
17
- var stories = storiesOf('Components/BundlePackages', module);
15
+ const [currentJob, baselineJob] = JOBS;
16
+ const stories = storiesOf('Components/BundlePackages', module);
18
17
  stories.addDecorator(getWrapperDecorator());
19
- stories.add('default', function () {
20
- return /*#__PURE__*/React.createElement(BundlePackages, {
21
- jobs: [baselineJob]
22
- });
23
- });
24
- stories.add('multiple jobs', function () {
25
- return /*#__PURE__*/React.createElement(BundlePackages, {
26
- jobs: JOBS
27
- });
28
- });
29
- stories.add('custom filters', function () {
30
- var _ref;
31
-
32
- return /*#__PURE__*/React.createElement(BundlePackages, {
33
- jobs: JOBS,
34
- filters: (_ref = {}, _ref[PACKAGE_FILTERS.CHANGED] = false, _ref[PACKAGE_FILTERS.DUPLICATE] = true, _ref)
35
- });
36
- });
37
- stories.add('empty packages', function () {
38
- return /*#__PURE__*/React.createElement(BundlePackages, {
39
- jobs: [_set(_merge({}, currentJob), 'metrics.webpack.packages', {}), _set(_merge({}, baselineJob), 'metrics.webpack.packages', {})]
40
- });
41
- });
42
- stories.add('empty filtered packages', function () {
43
- return /*#__PURE__*/React.createElement(BundlePackages, {
44
- jobs: [_set(_merge({}, currentJob), 'metrics.webpack.packages', {
45
- 'package-a': {
46
- value: 100
47
- }
48
- }), _set(_merge({}, baselineJob), 'metrics.webpack.packages', {
49
- 'package-a': {
50
- value: 100
51
- }
52
- })]
53
- });
54
- });
55
- var JOBS_EMPTY_BASELINE = createJobs([{
18
+ stories.add('default', () => /*#__PURE__*/React.createElement(BundlePackages, {
19
+ jobs: [baselineJob]
20
+ }));
21
+ stories.add('multiple jobs', () => /*#__PURE__*/React.createElement(BundlePackages, {
22
+ jobs: JOBS
23
+ }));
24
+ stories.add('custom filters', () => /*#__PURE__*/React.createElement(BundlePackages, {
25
+ jobs: JOBS,
26
+ filters: {
27
+ [PACKAGE_FILTERS.CHANGED]: false,
28
+ [PACKAGE_FILTERS.DUPLICATE]: true
29
+ }
30
+ }));
31
+ stories.add('empty packages', () => /*#__PURE__*/React.createElement(BundlePackages, {
32
+ jobs: [_set(_merge({}, currentJob), 'metrics.webpack.packages', {}), _set(_merge({}, baselineJob), 'metrics.webpack.packages', {})]
33
+ }));
34
+ stories.add('empty filtered packages', () => /*#__PURE__*/React.createElement(BundlePackages, {
35
+ jobs: [_set(_merge({}, currentJob), 'metrics.webpack.packages', {
36
+ 'package-a': {
37
+ value: 100
38
+ }
39
+ }), _set(_merge({}, baselineJob), 'metrics.webpack.packages', {
40
+ 'package-a': {
41
+ value: 100
42
+ }
43
+ })]
44
+ }));
45
+ const JOBS_EMPTY_BASELINE = createJobs([{
56
46
  webpack: currentStats
57
47
  }, {
58
48
  webpack: null
59
49
  }]);
60
- stories.add('empty baseline', function () {
61
- return /*#__PURE__*/React.createElement(BundlePackages, {
62
- jobs: JOBS_EMPTY_BASELINE
63
- });
64
- });
50
+ stories.add('empty baseline', () => /*#__PURE__*/React.createElement(BundlePackages, {
51
+ jobs: JOBS_EMPTY_BASELINE
52
+ }));
@@ -0,0 +1,44 @@
1
+ import _uniq from "lodash/uniq";
2
+ import _flatten from "lodash/flatten";
3
+ import _get from "lodash/get";
4
+ import { PACKAGE_FILTERS } from '@bundle-stats/utils';
5
+ import { SORT_BY_NAME, SORT_BY_DELTA, SORT_BY_SIZE } from './bundle-packages.constants'; // Get a list of duplicate packages across jobs
6
+
7
+ export const getDuplicatePackages = jobs => {
8
+ const jobsDuplicatePackages = jobs.map(job => {
9
+ var _job$insights, _job$insights$webpack, _job$insights$webpack2;
10
+
11
+ const insightsData = (job == null ? void 0 : (_job$insights = job.insights) == null ? void 0 : (_job$insights$webpack = _job$insights.webpack) == null ? void 0 : (_job$insights$webpack2 = _job$insights$webpack.duplicatePackages) == null ? void 0 : _job$insights$webpack2.data) || {};
12
+ return Object.values(insightsData).flat();
13
+ });
14
+ return _uniq(_flatten(jobsDuplicatePackages));
15
+ };
16
+ export const getRowFilter = filters => item => {
17
+ if (filters[PACKAGE_FILTERS.CHANGED] && !item.changed) {
18
+ return false;
19
+ }
20
+
21
+ if (filters[PACKAGE_FILTERS.DUPLICATE] && !item.duplicate) {
22
+ return false;
23
+ }
24
+
25
+ return true;
26
+ };
27
+ export const getCustomSort = sortId => item => {
28
+ if (sortId === SORT_BY_NAME) {
29
+ return item.key;
30
+ }
31
+
32
+ if (sortId === SORT_BY_DELTA) {
33
+ return _get(item, 'runs[0].deltaPercentage', 0);
34
+ }
35
+
36
+ if (sortId === SORT_BY_SIZE) {
37
+ return _get(item, 'runs[0].value', 0);
38
+ }
39
+
40
+ return [!item.changed, item.key];
41
+ };
42
+ export const getAddRowDuplicateFlag = duplicateJobs => row => ({ ...row,
43
+ duplicate: duplicateJobs.includes(row.key)
44
+ });
@@ -1,3 +1,88 @@
1
- import { enhance } from './bundle-packages.container';
1
+ function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
2
+
3
+ import React, { useMemo } from 'react';
4
+ import PropTypes from 'prop-types';
5
+ import { PACKAGE_FILTERS } from '@bundle-stats/utils';
6
+ import * as webpack from '@bundle-stats/utils/lib-esm/webpack/compare';
7
+ import { useRowsFilter } from '../../hooks/rows-filter';
8
+ import { useRowsSort } from '../../hooks/rows-sort';
9
+ import { useSearchParams } from '../../hooks/search-params';
10
+ import { SORT_BY } from './bundle-packages.constants';
2
11
  import { BundlePackages as BundlePackagesComponent } from './bundle-packages';
3
- export var BundlePackages = enhance(BundlePackagesComponent);
12
+ import { getDuplicatePackages, getAddRowDuplicateFlag, getRowFilter, getCustomSort } from './bundle-packages.utils';
13
+ export const BundlePackages = props => {
14
+ const {
15
+ jobs,
16
+ search,
17
+ filters,
18
+ setState,
19
+ sortBy,
20
+ direction,
21
+ ...restProps
22
+ } = props;
23
+ const {
24
+ defaultFilters,
25
+ allEntriesFilters
26
+ } = useMemo(() => ({
27
+ defaultFilters: {
28
+ [PACKAGE_FILTERS.CHANGED]: (jobs == null ? void 0 : jobs.length) > 1,
29
+ [PACKAGE_FILTERS.DUPLICATE]: false
30
+ },
31
+ allEntriesFilters: {
32
+ [PACKAGE_FILTERS.CHANGED]: false,
33
+ [PACKAGE_FILTERS.DUPLICATE]: false
34
+ }
35
+ }), [jobs]);
36
+ const searchParams = useSearchParams({
37
+ search,
38
+ filters,
39
+ defaultFilters,
40
+ allEntriesFilters,
41
+ setState
42
+ });
43
+ const {
44
+ rows,
45
+ totalRowCount
46
+ } = useMemo(() => {
47
+ const duplicateJobs = getDuplicatePackages(jobs);
48
+ const result = webpack.compareBySection.packages(jobs, [getAddRowDuplicateFlag(duplicateJobs)]);
49
+ return {
50
+ rows: result,
51
+ totalRowCount: result.length
52
+ };
53
+ }, [jobs]);
54
+ const filteredRows = useRowsFilter({
55
+ rows,
56
+ searchPattern: searchParams.searchPattern,
57
+ filters: searchParams.filters,
58
+ getRowFilter
59
+ });
60
+ const sortParams = useRowsSort({
61
+ rows: filteredRows,
62
+ sortFields: SORT_BY,
63
+ sortBy,
64
+ sortDirection: direction,
65
+ getCustomSort
66
+ });
67
+ return /*#__PURE__*/React.createElement(BundlePackagesComponent, _extends({
68
+ jobs: jobs
69
+ }, restProps, searchParams, sortParams, {
70
+ totalRowCount: totalRowCount
71
+ }));
72
+ };
73
+ BundlePackages.propTypes = {
74
+ jobs: PropTypes.arrayOf(PropTypes.object).isRequired,
75
+ // eslint-disable-line react/forbid-prop-types
76
+ filters: PropTypes.object,
77
+ // eslint-disable-line react/forbid-prop-types
78
+ search: PropTypes.string,
79
+ sortBy: PropTypes.string,
80
+ direction: PropTypes.string,
81
+ setState: PropTypes.func.isRequired
82
+ };
83
+ BundlePackages.defaultProps = {
84
+ filters: undefined,
85
+ search: undefined,
86
+ sortBy: undefined,
87
+ direction: undefined
88
+ };
@@ -1,24 +1,21 @@
1
- var _excluded = ["section", "title", "params"];
2
-
3
1
  function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
4
2
 
5
- function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
6
-
7
3
  import React from 'react';
8
4
  import PropTypes from 'prop-types';
9
5
  import { Link } from 'react-router-dom';
10
6
  import { getComponentStateQueryString } from '@bundle-stats/utils';
11
7
  import { SECTION_URLS } from '../constants';
12
- export var ComponentLink = function ComponentLink(_ref) {
13
- var section = _ref.section,
14
- title = _ref.title,
15
- params = _ref.params,
16
- props = _objectWithoutPropertiesLoose(_ref, _excluded);
17
-
18
- var search = getComponentStateQueryString(params);
19
- var location = {
8
+ export const ComponentLink = _ref => {
9
+ let {
10
+ section,
11
+ title,
12
+ params,
13
+ ...props
14
+ } = _ref;
15
+ const search = getComponentStateQueryString(params);
16
+ const location = {
20
17
  pathname: SECTION_URLS[section],
21
- search: search
18
+ search
22
19
  };
23
20
  return /*#__PURE__*/React.createElement(Link, _extends({
24
21
  to: location,
@@ -2,12 +2,14 @@ import React from 'react';
2
2
  import PropTypes from 'prop-types';
3
3
  import cx from 'classnames';
4
4
  import css from './delta.module.css';
5
- export var Delta = function Delta(_ref) {
6
- var className = _ref.className,
7
- displayValue = _ref.displayValue,
8
- deltaType = _ref.deltaType,
9
- inverted = _ref.inverted;
10
- var rootClassName = cx(css.root, className, inverted && css.inverted, css[deltaType]);
5
+ export const Delta = _ref => {
6
+ let {
7
+ className,
8
+ displayValue,
9
+ deltaType,
10
+ inverted
11
+ } = _ref;
12
+ const rootClassName = cx(css.root, className, inverted && css.inverted, css[deltaType]);
11
13
  return /*#__PURE__*/React.createElement("span", {
12
14
  className: rootClassName
13
15
  }, displayValue);
@@ -2,42 +2,30 @@ import React from 'react';
2
2
  import { storiesOf } from '@storybook/react';
3
3
  import { getWrapperDecorator } from '../../stories';
4
4
  import { Delta } from '.';
5
- var stories = storiesOf('Components/Delta', module);
5
+ const stories = storiesOf('Components/Delta', module);
6
6
  stories.addDecorator(getWrapperDecorator());
7
- stories.add('default', function () {
8
- return /*#__PURE__*/React.createElement(Delta, {
9
- displayValue: "20%",
10
- deltaType: "POSITIVE"
11
- });
12
- });
13
- stories.add('negative', function () {
14
- return /*#__PURE__*/React.createElement(Delta, {
15
- displayValue: "20%",
16
- deltaType: "NEGATIVE"
17
- });
18
- });
19
- stories.add('slightlyNegative', function () {
20
- return /*#__PURE__*/React.createElement(Delta, {
21
- displayValue: "1%",
22
- deltaType: "LOW_NEGATIVE"
23
- });
24
- });
25
- stories.add('slightlyPositive', function () {
26
- return /*#__PURE__*/React.createElement(Delta, {
27
- displayValue: "1%",
28
- deltaType: "LOW_POSITIVE"
29
- });
30
- });
31
- stories.add('empty', function () {
32
- return /*#__PURE__*/React.createElement(Delta, {
33
- displayValue: "0%",
34
- deltaType: "NO_CHANGE"
35
- });
36
- });
37
- stories.add('inverted', function () {
38
- return /*#__PURE__*/React.createElement(Delta, {
39
- displayValue: "1%",
40
- deltaType: "LOW_NEGATIVE",
41
- inverted: true
42
- });
43
- });
7
+ stories.add('default', () => /*#__PURE__*/React.createElement(Delta, {
8
+ displayValue: "20%",
9
+ deltaType: "POSITIVE"
10
+ }));
11
+ stories.add('negative', () => /*#__PURE__*/React.createElement(Delta, {
12
+ displayValue: "20%",
13
+ deltaType: "NEGATIVE"
14
+ }));
15
+ stories.add('slightlyNegative', () => /*#__PURE__*/React.createElement(Delta, {
16
+ displayValue: "1%",
17
+ deltaType: "LOW_NEGATIVE"
18
+ }));
19
+ stories.add('slightlyPositive', () => /*#__PURE__*/React.createElement(Delta, {
20
+ displayValue: "1%",
21
+ deltaType: "LOW_POSITIVE"
22
+ }));
23
+ stories.add('empty', () => /*#__PURE__*/React.createElement(Delta, {
24
+ displayValue: "0%",
25
+ deltaType: "NO_CHANGE"
26
+ }));
27
+ stories.add('inverted', () => /*#__PURE__*/React.createElement(Delta, {
28
+ displayValue: "1%",
29
+ deltaType: "LOW_NEGATIVE",
30
+ inverted: true
31
+ }));
@@ -6,22 +6,24 @@ import { Alert } from '../../ui/alert';
6
6
  import { ComponentLink } from '../component-link';
7
7
  import { Delta } from '../delta';
8
8
  import css from './duplicate-packages-warning.module.css';
9
- var numberMetric = METRIC_TYPES[METRIC_TYPE_NUMERIC];
10
- export var DuplicatePackagesWarning = function DuplicatePackagesWarning(props) {
11
- var className = props.className,
12
- duplicatePackagesCount = props.duplicatePackagesCount,
13
- CustomComponentLink = props.customComponentLink,
14
- showDelta = props.showDelta;
15
- var metricRunInfo = getMetricRunInfo(numberMetric, duplicatePackagesCount.current, duplicatePackagesCount.baseline);
9
+ const numberMetric = METRIC_TYPES[METRIC_TYPE_NUMERIC];
10
+ export const DuplicatePackagesWarning = props => {
11
+ const {
12
+ className,
13
+ duplicatePackagesCount,
14
+ customComponentLink: CustomComponentLink,
15
+ showDelta
16
+ } = props;
17
+ const metricRunInfo = getMetricRunInfo(numberMetric, duplicatePackagesCount.current, duplicatePackagesCount.baseline);
16
18
  return /*#__PURE__*/React.createElement(Alert, {
17
19
  kind: "warning",
18
20
  className: cx(css.root, className)
19
- }, "Bundle contains ", /*#__PURE__*/React.createElement(CustomComponentLink, BUNDLE_PACKAGES_DUPLICATE, metricRunInfo.value, showDelta && metricRunInfo.delta !== 0 && /*#__PURE__*/React.createElement(Delta, {
21
+ }, `Bundle contains `, /*#__PURE__*/React.createElement(CustomComponentLink, BUNDLE_PACKAGES_DUPLICATE, metricRunInfo.value, showDelta && metricRunInfo.delta !== 0 && /*#__PURE__*/React.createElement(Delta, {
20
22
  className: css.titleDelta,
21
23
  inverted: true,
22
24
  displayValue: metricRunInfo.displayDelta,
23
25
  deltaType: metricRunInfo.deltaType
24
- }), " duplicate " + (metricRunInfo.value === 1 ? 'package' : 'packages') + "."));
26
+ }), ` duplicate ${metricRunInfo.value === 1 ? 'package' : 'packages'}.`));
25
27
  };
26
28
  DuplicatePackagesWarning.propTypes = {
27
29
  className: PropTypes.string,
@@ -2,30 +2,24 @@ import React from 'react';
2
2
  import { storiesOf } from '@storybook/react';
3
3
  import { getWrapperDecorator } from '../../stories';
4
4
  import { DuplicatePackagesWarning } from '.';
5
- var stories = storiesOf('Components/DuplicatePackagesWarning', module);
5
+ const stories = storiesOf('Components/DuplicatePackagesWarning', module);
6
6
  stories.addDecorator(getWrapperDecorator());
7
- stories.add('single job', function () {
8
- return /*#__PURE__*/React.createElement(DuplicatePackagesWarning, {
9
- duplicatePackagesCount: {
10
- current: 1,
11
- baseline: 0
12
- },
13
- showDelta: false
14
- });
15
- });
16
- stories.add('multiple jobs', function () {
17
- return /*#__PURE__*/React.createElement(DuplicatePackagesWarning, {
18
- duplicatePackagesCount: {
19
- current: 2,
20
- baseline: 3
21
- }
22
- });
23
- });
24
- stories.add('no changes', function () {
25
- return /*#__PURE__*/React.createElement(DuplicatePackagesWarning, {
26
- duplicatePackagesCount: {
27
- current: 2,
28
- baseline: 2
29
- }
30
- });
31
- });
7
+ stories.add('single job', () => /*#__PURE__*/React.createElement(DuplicatePackagesWarning, {
8
+ duplicatePackagesCount: {
9
+ current: 1,
10
+ baseline: 0
11
+ },
12
+ showDelta: false
13
+ }));
14
+ stories.add('multiple jobs', () => /*#__PURE__*/React.createElement(DuplicatePackagesWarning, {
15
+ duplicatePackagesCount: {
16
+ current: 2,
17
+ baseline: 3
18
+ }
19
+ }));
20
+ stories.add('no changes', () => /*#__PURE__*/React.createElement(DuplicatePackagesWarning, {
21
+ duplicatePackagesCount: {
22
+ current: 2,
23
+ baseline: 2
24
+ }
25
+ }));
@@ -8,30 +8,33 @@ import { FlexStack } from '../../layout/flex-stack';
8
8
  import { Stack } from '../../layout/stack';
9
9
  import { Icon } from '../../ui/icon';
10
10
  import css from './job-header.module.css';
11
- export var JobHeader = function JobHeader(props) {
12
- var className = props.className,
13
- tag = props.tag,
14
- job = props.job,
15
- children = props.children;
11
+ export const JobHeader = props => {
12
+ const {
13
+ className,
14
+ tag,
15
+ job,
16
+ children
17
+ } = props;
16
18
 
17
- var _get2 = _get(job, "meta." + SOURCE_PATH_WEBPACK_STATS, {}),
18
- builtAt = _get2.builtAt,
19
- hash = _get2.hash;
19
+ const {
20
+ builtAt,
21
+ hash
22
+ } = _get(job, `meta.${SOURCE_PATH_WEBPACK_STATS}`, {});
20
23
 
21
- var rootClassName = cx(css.root, className);
24
+ const rootClassName = cx(css.root, className);
22
25
  return /*#__PURE__*/React.createElement(Stack, {
23
26
  className: rootClassName,
24
27
  space: "xxsmall"
25
28
  }, /*#__PURE__*/React.createElement("h1", {
26
29
  className: css.title
27
- }, /*#__PURE__*/React.createElement("span", null, "#" + job.internalBuildNumber), tag && /*#__PURE__*/React.createElement("span", {
30
+ }, /*#__PURE__*/React.createElement("span", null, `#${job.internalBuildNumber}`), tag && /*#__PURE__*/React.createElement("span", {
28
31
  className: css.tag
29
32
  }, tag)), /*#__PURE__*/React.createElement(FlexStack, {
30
33
  className: css.meta,
31
34
  space: "xxsmall"
32
35
  }, builtAt && /*#__PURE__*/React.createElement("span", {
33
36
  className: css.metaItem,
34
- title: formatDate(builtAt) + " " + formatTime(builtAt)
37
+ title: `${formatDate(builtAt)} ${formatTime(builtAt)}`
35
38
  }, /*#__PURE__*/React.createElement(Icon, {
36
39
  glyph: "clock",
37
40
  className: css.metaIcon
@@ -2,9 +2,9 @@ import React from 'react';
2
2
  import { storiesOf } from '@storybook/react';
3
3
  import { getWrapperDecorator } from '../../stories';
4
4
  import { JobHeader } from '.';
5
- var stories = storiesOf('Components/JobHeader', module);
5
+ const stories = storiesOf('Components/JobHeader', module);
6
6
  stories.addDecorator(getWrapperDecorator());
7
- var JOB = {
7
+ const JOB = {
8
8
  internalBuildNumber: 1,
9
9
  meta: {
10
10
  webpack: {
@@ -21,19 +21,13 @@ var JOB = {
21
21
  }
22
22
  }
23
23
  };
24
- stories.add('default', function () {
25
- return /*#__PURE__*/React.createElement(JobHeader, {
26
- job: JOB
27
- });
28
- });
29
- stories.add('with tag', function () {
30
- return /*#__PURE__*/React.createElement(JobHeader, {
31
- job: JOB,
32
- tag: "current"
33
- });
34
- });
35
- stories.add('with custom content', function () {
36
- return /*#__PURE__*/React.createElement(JobHeader, {
37
- job: JOB
38
- }, /*#__PURE__*/React.createElement("p", null, "Lorem ipsum dolor sit amed"));
39
- });
24
+ stories.add('default', () => /*#__PURE__*/React.createElement(JobHeader, {
25
+ job: JOB
26
+ }));
27
+ stories.add('with tag', () => /*#__PURE__*/React.createElement(JobHeader, {
28
+ job: JOB,
29
+ tag: "current"
30
+ }));
31
+ stories.add('with custom content', () => /*#__PURE__*/React.createElement(JobHeader, {
32
+ job: JOB
33
+ }, /*#__PURE__*/React.createElement("p", null, "Lorem ipsum dolor sit amed")));
@@ -1,34 +1,31 @@
1
- var _excluded = ["as", "className", "meta"];
2
-
3
1
  function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
4
2
 
5
- function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
6
-
7
3
  import React from 'react';
8
4
  import PropTypes from 'prop-types';
9
5
  import cx from 'classnames';
10
6
  import css from './job-meta.module.css';
11
- export var JobMeta = function JobMeta(props) {
12
- var Component = props.as,
13
- className = props.className,
14
- meta = props.meta,
15
- restProps = _objectWithoutPropertiesLoose(props, _excluded);
16
-
17
- var rootClassName = cx(css.root, className);
7
+ export const JobMeta = props => {
8
+ const {
9
+ as: Component,
10
+ className,
11
+ meta,
12
+ ...restProps
13
+ } = props;
14
+ const rootClassName = cx(css.root, className);
18
15
  return /*#__PURE__*/React.createElement(Component, _extends({
19
16
  className: rootClassName
20
- }, restProps), meta.map(function (_ref, index) {
21
- var title = _ref.title,
22
- content = _ref.content;
23
- var key = index;
17
+ }, restProps), meta.map((_ref, index) => {
18
+ let {
19
+ title,
20
+ content
21
+ } = _ref;
22
+ const key = index;
24
23
  return /*#__PURE__*/React.createElement("div", {
25
24
  className: css.item,
26
25
  key: key
27
26
  }, title && /*#__PURE__*/React.createElement("h2", {
28
27
  className: css.itemTitle
29
- }, title), content.map(function (item) {
30
- return /*#__PURE__*/React.createElement(React.Fragment, null, item);
31
- }));
28
+ }, title), content.map(item => item));
32
29
  }));
33
30
  };
34
31
  JobMeta.propTypes = {
@@ -2,16 +2,14 @@ import React from 'react';
2
2
  import { storiesOf } from '@storybook/react';
3
3
  import { getWrapperDecorator } from '../../stories';
4
4
  import { JobMeta } from '.';
5
- var stories = storiesOf('Components/JobMeta', module);
5
+ const stories = storiesOf('Components/JobMeta', module);
6
6
  stories.addDecorator(getWrapperDecorator());
7
- stories.add('default', function () {
8
- return /*#__PURE__*/React.createElement(JobMeta, {
9
- meta: [{
10
- title: '#123',
11
- content: [/*#__PURE__*/React.createElement("p", null, "July 3th ")]
12
- }, {
13
- title: '#122',
14
- content: [/*#__PURE__*/React.createElement("p", null, "July 4th")]
15
- }]
16
- });
17
- });
7
+ stories.add('default', () => /*#__PURE__*/React.createElement(JobMeta, {
8
+ meta: [{
9
+ title: '#123',
10
+ content: [/*#__PURE__*/React.createElement("p", null, "July 3th ")]
11
+ }, {
12
+ title: '#122',
13
+ content: [/*#__PURE__*/React.createElement("p", null, "July 4th")]
14
+ }]
15
+ }));
@@ -1,25 +1,22 @@
1
- var _excluded = ["as", "title", "internalBuildNumber", "children"];
2
-
3
1
  function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
4
2
 
5
- function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
6
-
7
3
  import React from 'react';
8
4
  import PropTypes from 'prop-types';
9
5
  import { Tooltip } from '../../ui/tooltip';
10
6
  import css from './job-name.module.css';
11
- export var JobName = function JobName(_ref) {
12
- var Component = _ref.as,
13
- title = _ref.title,
14
- internalBuildNumber = _ref.internalBuildNumber,
15
- children = _ref.children,
16
- restProps = _objectWithoutPropertiesLoose(_ref, _excluded);
17
-
7
+ export const JobName = _ref => {
8
+ let {
9
+ as: Component,
10
+ title,
11
+ internalBuildNumber,
12
+ children,
13
+ ...restProps
14
+ } = _ref;
18
15
  return /*#__PURE__*/React.createElement(Tooltip, _extends({
19
16
  className: css.root,
20
17
  as: Component,
21
18
  title: title
22
- }, restProps), children || "Job #" + internalBuildNumber);
19
+ }, restProps), children || `Job #${internalBuildNumber}`);
23
20
  };
24
21
  JobName.defaultProps = {
25
22
  as: 'span',