@bundle-stats/ui 3.2.2 → 3.3.0-alpha.0

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 (99) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/lib/app/app.js +31 -6
  3. package/lib/app/app.stories.js +24 -3
  4. package/lib/assets/icons/alert-circle.svg +1 -0
  5. package/lib/assets/icons/check-circle.svg +1 -0
  6. package/lib/assets/icons.svg +8 -0
  7. package/lib/components/browsertime-table/browsertime-table.js +1 -1
  8. package/lib/components/browsertime-table/browsertime-table.stories.js +1 -1
  9. package/lib/components/budget-info/budget-info.js +53 -0
  10. package/lib/components/budget-info/budget-info.module.css +28 -0
  11. package/lib/components/budget-info/budget-info.stories.js +42 -0
  12. package/lib/components/budget-info/index.js +18 -0
  13. package/lib/components/budget-insights/budget-insights.js +200 -0
  14. package/lib/components/budget-insights/budget-insights.module.css +53 -0
  15. package/lib/components/budget-insights/budget-insights.stories.js +104 -0
  16. package/lib/components/budget-insights/index.js +18 -0
  17. package/lib/components/bundle-assets/bundle-assets.js +3 -3
  18. package/lib/components/bundle-assets/bundle-assets.utils.js +2 -2
  19. package/lib/components/bundle-assets/index.js +3 -3
  20. package/lib/components/bundle-assets-totals-chart-bars/bundle-assets-totals-chart-bars.js +1 -1
  21. package/lib/components/bundle-assets-totals-table/bundle-assets-totals-table.js +45 -8
  22. package/lib/components/bundle-assets-totals-table/bundle-assets-totals-table.module.css +2 -2
  23. package/lib/components/bundle-assets-totals-table/bundle-assets-totals-table.stories.js +20 -1
  24. package/lib/components/bundle-modules/bundle-modules.js +3 -3
  25. package/lib/components/bundle-modules/bundle-modules.utils.js +2 -2
  26. package/lib/components/bundle-modules/index.js +3 -3
  27. package/lib/components/bundle-packages/bundle-packages.js +1 -1
  28. package/lib/components/bundle-packages/bundle-packages.utils.js +2 -2
  29. package/lib/components/bundle-packages/index.js +1 -1
  30. package/lib/components/lighthouse-table/lighthouse-table.js +1 -1
  31. package/lib/components/metrics-table/metrics-table.js +1 -1
  32. package/lib/components/metrics-table-search/metrics-table-search.js +1 -1
  33. package/lib/components/metrics-table-search/metrics-table-search.stories.js +1 -1
  34. package/lib/components/summary/summary.js +12 -7
  35. package/lib/components/summary/summary.module.css +1 -1
  36. package/lib/components/summary/summary.stories.js +29 -0
  37. package/lib/components/summary-item/summary-item.js +22 -5
  38. package/lib/components/summary-item/summary-item.module.css +15 -0
  39. package/lib/components/summary-item/summary-item.stories.js +51 -53
  40. package/lib/constants.js +6 -6
  41. package/lib/hooks/search-params.js +2 -2
  42. package/lib/query-state.js +1 -1
  43. package/lib/stories/wrapper.js +2 -2
  44. package/lib/ui/alert/alert.js +13 -3
  45. package/lib/ui/filters/filters.container.js +5 -5
  46. package/lib/ui/filters/filters.js +2 -2
  47. package/lib/ui/filters/filters.stories.js +3 -3
  48. package/lib/ui/horizontal-bar-chart/horizontal-bar-chart.js +3 -3
  49. package/lib/ui/icon/icon.js +2 -0
  50. package/lib/ui/panels/panels.js +2 -2
  51. package/lib/ui/popover/popover.js +1 -1
  52. package/lib/ui/tabs/tabs.js +2 -2
  53. package/lib/utils.js +2 -2
  54. package/lib-esm/app/app.js +57 -31
  55. package/lib-esm/app/app.stories.js +22 -1
  56. package/lib-esm/assets/icons/alert-circle.svg +1 -0
  57. package/lib-esm/assets/icons/check-circle.svg +1 -0
  58. package/lib-esm/assets/icons.svg +8 -0
  59. package/lib-esm/components/budget-info/budget-info.js +37 -0
  60. package/lib-esm/components/budget-info/budget-info.module.css +28 -0
  61. package/lib-esm/components/budget-info/budget-info.stories.js +26 -0
  62. package/lib-esm/components/budget-info/index.js +1 -0
  63. package/lib-esm/components/budget-insights/budget-insights.js +147 -0
  64. package/lib-esm/components/budget-insights/budget-insights.module.css +53 -0
  65. package/lib-esm/components/budget-insights/budget-insights.stories.js +84 -0
  66. package/lib-esm/components/budget-insights/index.js +1 -0
  67. package/lib-esm/components/bundle-assets-totals-table/bundle-assets-totals-table.js +24 -7
  68. package/lib-esm/components/bundle-assets-totals-table/bundle-assets-totals-table.module.css +2 -2
  69. package/lib-esm/components/bundle-assets-totals-table/bundle-assets-totals-table.stories.js +18 -0
  70. package/lib-esm/components/summary/summary.js +11 -7
  71. package/lib-esm/components/summary/summary.module.css +1 -1
  72. package/lib-esm/components/summary/summary.stories.js +27 -0
  73. package/lib-esm/components/summary-item/summary-item.js +20 -4
  74. package/lib-esm/components/summary-item/summary-item.module.css +15 -0
  75. package/lib-esm/components/summary-item/summary-item.stories.js +50 -38
  76. package/lib-esm/constants.js +4 -4
  77. package/lib-esm/ui/alert/alert.js +6 -3
  78. package/lib-esm/ui/filters/filters.container.js +39 -41
  79. package/lib-esm/ui/icon/icon.js +2 -0
  80. package/package.json +3 -3
  81. package/src/app/app.jsx +24 -8
  82. package/src/assets/icons/alert-circle.svg +1 -0
  83. package/src/assets/icons/check-circle.svg +1 -0
  84. package/src/assets/icons.svg +8 -0
  85. package/src/components/budget-info/budget-info.jsx +49 -0
  86. package/src/components/budget-info/budget-info.module.css +28 -0
  87. package/src/components/budget-info/index.js +1 -0
  88. package/src/components/budget-insights/budget-insights.jsx +152 -0
  89. package/src/components/budget-insights/budget-insights.module.css +53 -0
  90. package/src/components/budget-insights/index.js +1 -0
  91. package/src/components/bundle-assets-totals-table/bundle-assets-totals-table.jsx +28 -13
  92. package/src/components/bundle-assets-totals-table/bundle-assets-totals-table.module.css +2 -2
  93. package/src/components/summary/summary.jsx +8 -7
  94. package/src/components/summary/summary.module.css +1 -1
  95. package/src/components/summary-item/summary-item.jsx +13 -2
  96. package/src/components/summary-item/summary-item.module.css +15 -0
  97. package/src/constants.js +7 -7
  98. package/src/ui/alert/alert.jsx +7 -2
  99. package/src/ui/icon/icon.jsx +2 -0
package/CHANGELOG.md CHANGED
@@ -3,6 +3,33 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ # [3.3.0-alpha.0](https://github.com/relative-ci/bundle-stats/compare/v3.2.2...v3.3.0-alpha.0) (2021-12-17)
7
+
8
+
9
+ ### Bug Fixes
10
+
11
+ * **ui:** Alert - allow to override props ([4d52999](https://github.com/relative-ci/bundle-stats/commit/4d52999e80427f95bac30d0123cc149566b54282))
12
+
13
+
14
+ ### Features
15
+
16
+ * App - add BudgetInsights ([4068e33](https://github.com/relative-ci/bundle-stats/commit/4068e334465f6eb624b92790da11306d711718f6))
17
+ * **ui:** App - pass budgets info to Summary ([102a4c1](https://github.com/relative-ci/bundle-stats/commit/102a4c1b4a8ab445c1a39ba8d19fba88b0c259d5))
18
+ * **ui:** BudgetInsights component ([4458395](https://github.com/relative-ci/bundle-stats/commit/44583958a83458285b896c5564b03df0960fb992))
19
+ * **ui:** BundleAssetsTotalsTable - add budgets ([b2fa86e](https://github.com/relative-ci/bundle-stats/commit/b2fa86eb1ec2ad1e4ea183a4f4dee2eefa4cfddc))
20
+ * **ui:** Icon - add check-circle icon ([1bc3707](https://github.com/relative-ci/bundle-stats/commit/1bc3707a868ca216da5b9e500ba0536d0163b168))
21
+ * **ui:** Icon - alert-circle icon ([9ae82bc](https://github.com/relative-ci/bundle-stats/commit/9ae82bcac0ff55511eafb158322b571e09a4de60))
22
+ * **ui:** SummaryItem - budgets ([591bb41](https://github.com/relative-ci/bundle-stats/commit/591bb414f7aa93c2e1f4208f1dfedffa037e5225))
23
+
24
+
25
+ ### Performance Improvements
26
+
27
+ * **ui:** BundleAssetsTotalsTable - use memo / callback ([22ec007](https://github.com/relative-ci/bundle-stats/commit/22ec00772b1b27d19d89a106fbcf93ac49b3d57e))
28
+
29
+
30
+
31
+
32
+
6
33
  ## [3.2.2](https://github.com/relative-ci/bundle-stats/compare/v3.2.1...v3.2.2) (2021-12-08)
7
34
 
8
35
 
package/lib/app/app.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
 
3
- function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
3
+ function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
4
4
 
5
5
  Object.defineProperty(exports, "__esModule", {
6
6
  value: true
@@ -23,6 +23,8 @@ var _container = require("../ui/container");
23
23
 
24
24
  var _duplicatePackagesWarning = require("../components/duplicate-packages-warning");
25
25
 
26
+ var _budgetInsights = require("../components/budget-insights");
27
+
26
28
  var _summary = require("../components/summary");
27
29
 
28
30
  var _bundleAssets = require("../components/bundle-assets");
@@ -114,6 +116,8 @@ Layout.defaultProps = {
114
116
  };
115
117
 
116
118
  var AppComponent = function AppComponent(_ref2) {
119
+ var _insights$webpack;
120
+
117
121
  var version = _ref2.version,
118
122
  jobs = _ref2.jobs;
119
123
 
@@ -140,7 +144,13 @@ var AppComponent = function AppComponent(_ref2) {
140
144
  }, _i18n["default"].NO_DATA)));
141
145
  }
142
146
 
143
- var duplicatePackagesCount = jobs[0].summary.webpack.duplicatePackagesCount;
147
+ var _useMemo = (0, _react.useMemo)(function () {
148
+ return jobs[0];
149
+ }, jobs),
150
+ summary = _useMemo.summary,
151
+ insights = _useMemo.insights;
152
+
153
+ var duplicatePackagesCount = summary.webpack.duplicatePackagesCount;
144
154
  var duplicatePackagesInsights = Boolean(duplicatePackagesCount.current || duplicatePackagesCount.baseline);
145
155
  return /*#__PURE__*/_react["default"].createElement(Layout, {
146
156
  jobs: jobs,
@@ -150,7 +160,8 @@ var AppComponent = function AppComponent(_ref2) {
150
160
  }, /*#__PURE__*/_react["default"].createElement(_summary.Summary, {
151
161
  size: "large",
152
162
  keys: _constants.METRICS_WEBPACK_GENERAL,
153
- data: jobs[0].summary,
163
+ data: summary,
164
+ budgets: insights === null || insights === void 0 ? void 0 : (_insights$webpack = insights.webpack) === null || _insights$webpack === void 0 ? void 0 : _insights$webpack.budgets,
154
165
  showSummaryItemDelta: jobs.length !== 1
155
166
  })), /*#__PURE__*/_react["default"].createElement(_container.Container, {
156
167
  className: _appModule["default"].tabsContainer
@@ -178,12 +189,15 @@ var AppComponent = function AppComponent(_ref2) {
178
189
  exact: true,
179
190
  path: _constants.URLS.ASSETS,
180
191
  render: function render(_ref3) {
192
+ var _insights$webpack2;
193
+
181
194
  var location = _ref3.location;
182
195
  return /*#__PURE__*/_react["default"].createElement(_container.Container, null, /*#__PURE__*/_react["default"].createElement(_stack.Stack, {
183
196
  space: "medium"
184
197
  }, /*#__PURE__*/_react["default"].createElement(_summary.Summary, {
185
198
  keys: _constants.METRICS_WEBPACK_ASSETS,
186
- data: jobs[0].summary,
199
+ data: summary,
200
+ budgets: insights === null || insights === void 0 ? void 0 : (_insights$webpack2 = insights.webpack) === null || _insights$webpack2 === void 0 ? void 0 : _insights$webpack2.budgets,
187
201
  showSummaryItemDelta: jobs.length !== 1
188
202
  }), /*#__PURE__*/_react["default"].createElement(_box.Box, {
189
203
  outline: true
@@ -198,11 +212,14 @@ var AppComponent = function AppComponent(_ref2) {
198
212
  exact: true,
199
213
  path: _constants.URLS.MODULES,
200
214
  render: function render() {
215
+ var _insights$webpack3;
216
+
201
217
  return /*#__PURE__*/_react["default"].createElement(_container.Container, null, /*#__PURE__*/_react["default"].createElement(_stack.Stack, {
202
218
  space: "medium"
203
219
  }, /*#__PURE__*/_react["default"].createElement(_summary.Summary, {
204
220
  keys: _constants.METRICS_WEBPACK_MODULES,
205
- data: jobs[0].summary,
221
+ data: summary,
222
+ budgets: insights === null || insights === void 0 ? void 0 : (_insights$webpack3 = insights.webpack) === null || _insights$webpack3 === void 0 ? void 0 : _insights$webpack3.budgets,
206
223
  showSummaryItemDelta: jobs.length !== 1
207
224
  }), /*#__PURE__*/_react["default"].createElement(_box.Box, {
208
225
  outline: true
@@ -215,12 +232,15 @@ var AppComponent = function AppComponent(_ref2) {
215
232
  exact: true,
216
233
  path: _constants.URLS.PACKAGES,
217
234
  render: function render(_ref4) {
235
+ var _insights$webpack4;
236
+
218
237
  var location = _ref4.location;
219
238
  return /*#__PURE__*/_react["default"].createElement(_container.Container, null, /*#__PURE__*/_react["default"].createElement(_stack.Stack, {
220
239
  space: "medium"
221
240
  }, /*#__PURE__*/_react["default"].createElement(_summary.Summary, {
222
241
  keys: _constants.METRICS_WEBPACK_PACKAGES,
223
- data: jobs[0].summary,
242
+ data: summary,
243
+ budgets: insights === null || insights === void 0 ? void 0 : (_insights$webpack4 = insights.webpack) === null || _insights$webpack4 === void 0 ? void 0 : _insights$webpack4.budgets,
224
244
  showSummaryItemDelta: jobs.length !== 1
225
245
  }), /*#__PURE__*/_react["default"].createElement(_box.Box, {
226
246
  outline: true
@@ -235,11 +255,16 @@ var AppComponent = function AppComponent(_ref2) {
235
255
  exact: true,
236
256
  path: _constants.URLS.OVERVIEW,
237
257
  render: function render() {
258
+ var _insights$webpack5;
259
+
238
260
  return /*#__PURE__*/_react["default"].createElement(_stack.Stack, {
239
261
  space: "large"
240
262
  }, duplicatePackagesInsights && /*#__PURE__*/_react["default"].createElement(_container.Container, null, /*#__PURE__*/_react["default"].createElement(_duplicatePackagesWarning.DuplicatePackagesWarning, {
241
263
  duplicatePackagesCount: duplicatePackagesCount,
242
264
  showDelta: jobs.length > 1
265
+ })), (insights === null || insights === void 0 ? void 0 : (_insights$webpack5 = insights.webpack) === null || _insights$webpack5 === void 0 ? void 0 : _insights$webpack5.budgets) && /*#__PURE__*/_react["default"].createElement(_container.Container, null, /*#__PURE__*/_react["default"].createElement(_budgetInsights.BudgetInsights, {
266
+ source: "webpack",
267
+ budgets: insights.webpack.budgets
243
268
  })), /*#__PURE__*/_react["default"].createElement(_container.Container, null, /*#__PURE__*/_react["default"].createElement(_stack.Stack, {
244
269
  space: "small"
245
270
  }, /*#__PURE__*/_react["default"].createElement(_totalSizeTypeTitle.TotalSizeTypeTitle, null), /*#__PURE__*/_react["default"].createElement(_bundleAssetsTotalsChartBars.BundleAssetsTotalsChartBars, {
@@ -26,9 +26,9 @@ function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Sy
26
26
 
27
27
  function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
28
28
 
29
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
29
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
30
30
 
31
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
31
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
32
32
 
33
33
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
34
34
 
@@ -48,7 +48,28 @@ var JOBS = (0, _utils.createJobs)([CURRENT_SOURCE, BASELINE_SOURCE], {
48
48
  webpack: {
49
49
  budgets: [{
50
50
  metric: 'totalSizeByTypeALL',
51
- value: 1024 * 1024
51
+ value: 2 * 1024 * 1024
52
+ }, {
53
+ metric: 'totalInitialSizeJS',
54
+ value: 512 * 1024
55
+ }, {
56
+ metric: 'totalInitialSizeCSS',
57
+ value: 50 * 1024
58
+ }, {
59
+ metric: 'chunkCount',
60
+ value: 50
61
+ }, {
62
+ metric: 'moduleCount',
63
+ value: 2000
64
+ }, {
65
+ metric: 'duplicatePackagesCount',
66
+ value: 5
67
+ }, {
68
+ metric: 'sizes.totalSizeByTypeJS',
69
+ value: 2 * 1024 * 1024
70
+ }, {
71
+ metric: 'sizes.totalSizeByTypeCSS',
72
+ value: 20 * 1024
52
73
  }]
53
74
  }
54
75
  });
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-alert-circle"><circle cx="12" cy="12" r="10"></circle><line x1="12" y1="8" x2="12" y2="12"></line><line x1="12" y1="16" x2="12.01" y2="16"></line></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-check-circle"><path d="M22 11.08V12a10 10 0 1 1-5.93-9.14"></path><polyline points="22 4 12 14.01 9 11.01"></polyline></svg>
@@ -1,4 +1,8 @@
1
1
  <svg width="16" height="16">
2
+ <symbol fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-alert-circle" viewBox="0 0 24 24" id="alert-circle" xmlns="http://www.w3.org/2000/svg">
3
+ <circle cx="12" cy="12" r="10"/>
4
+ <path d="M12 8v4M12 16h.01"/>
5
+ </symbol>
2
6
  <symbol viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-arrow-down" id="arrow" xmlns="http://www.w3.org/2000/svg">
3
7
  <path d="M12 5v14M19 12l-7 7-7-7"/>
4
8
  </symbol>
@@ -10,6 +14,10 @@
10
14
  <circle cx="12" cy="12" r="10"/>
11
15
  <path d="M15 9l-6 6M9 9l6 6"/>
12
16
  </symbol>
17
+ <symbol fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-check-circle" viewBox="0 0 24 24" id="check-circle" xmlns="http://www.w3.org/2000/svg">
18
+ <path d="M22 11.08V12a10 10 0 11-5.93-9.14"/>
19
+ <path d="M22 4L12 14.01l-3-3"/>
20
+ </symbol>
13
21
  <symbol viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-clock" id="clock" xmlns="http://www.w3.org/2000/svg">
14
22
  <circle cx="12" cy="12" r="10"/>
15
23
  <path d="M12 6v6l4 2"/>
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
 
3
- function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
3
+ function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
4
4
 
5
5
  Object.defineProperty(exports, "__esModule", {
6
6
  value: true
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
 
3
- function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
3
+ function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
4
4
 
5
5
  var _react = _interopRequireDefault(require("react"));
6
6
 
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.BudgetInfo = void 0;
7
+
8
+ var _react = _interopRequireDefault(require("react"));
9
+
10
+ var _classnames = _interopRequireDefault(require("classnames"));
11
+
12
+ var _propTypes = _interopRequireDefault(require("prop-types"));
13
+
14
+ var _icon = require("../../ui/icon");
15
+
16
+ var _tooltip = require("../../ui/tooltip");
17
+
18
+ var _budgetInfoModule = _interopRequireDefault(require("./budget-info.module.css"));
19
+
20
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
21
+
22
+ var BudgetInfo = function BudgetInfo(_ref) {
23
+ var _ref$className = _ref.className,
24
+ className = _ref$className === void 0 ? '' : _ref$className,
25
+ budget = _ref.budget,
26
+ metric = _ref.metric;
27
+ var rootClassName = (0, _classnames["default"])(_budgetInfoModule["default"].root, budget.failed ? _budgetInfoModule["default"].over : _budgetInfoModule["default"].under, className);
28
+ return /*#__PURE__*/_react["default"].createElement(_tooltip.Tooltip, {
29
+ className: rootClassName,
30
+ title: /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement("strong", null, metric.label), " is ".concat(budget.failed ? 'over' : 'under', " "), metric.formatter(budget.budgetValue), " budget")
31
+ }, /*#__PURE__*/_react["default"].createElement(_icon.Icon, {
32
+ className: _budgetInfoModule["default"].icon,
33
+ glyph: budget.failed ? _icon.Icon.ICONS.ALERT_CIRCLE : _icon.Icon.ICONS.CHECK_CIRCLE,
34
+ size: "medium"
35
+ }));
36
+ };
37
+
38
+ exports.BudgetInfo = BudgetInfo;
39
+ BudgetInfo.propTypes = {
40
+ budget: _propTypes["default"].shape({
41
+ currentValue: _propTypes["default"].number,
42
+ budgetValue: _propTypes["default"].number,
43
+ failed: _propTypes["default"].bool
44
+ }).isRequired,
45
+ metric: _propTypes["default"].shape({
46
+ label: _propTypes["default"].string,
47
+ formatter: _propTypes["default"].func
48
+ }).isRequired,
49
+ className: _propTypes["default"].string
50
+ };
51
+ BudgetInfo.defaultProps = {
52
+ className: ''
53
+ };
@@ -0,0 +1,28 @@
1
+ .root {
2
+ display: inline-block;
3
+ line-height: 1em;
4
+ }
5
+
6
+ /* Budget over */
7
+ .over .icon {
8
+ color: var(--color-danger-light);
9
+ }
10
+
11
+ .over .icon:hover,
12
+ .over .icon:focus,
13
+ .over .icon:active
14
+ {
15
+ color: var(--color-danger);
16
+ }
17
+
18
+ /* Budget under */
19
+ .under .icon {
20
+ color: var(--color-success-light);
21
+ }
22
+
23
+ .under .icon:hover,
24
+ .under .icon:focus,
25
+ .under .icon:active
26
+ {
27
+ color: var(--color-success);
28
+ }
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+
3
+ var _react = _interopRequireDefault(require("react"));
4
+
5
+ var _react2 = require("@storybook/react");
6
+
7
+ var _stories = require("../../stories");
8
+
9
+ var _ = require(".");
10
+
11
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
12
+
13
+ var stories = (0, _react2.storiesOf)('Components/BudgetInfo', module);
14
+ stories.addDecorator((0, _stories.getWrapperDecorator)());
15
+ stories.add('default', function () {
16
+ return /*#__PURE__*/_react["default"].createElement(_.BudgetInfo, {
17
+ budget: {
18
+ budget: 300,
19
+ value: 250,
20
+ overBudget: false
21
+ },
22
+ metric: {
23
+ formatter: function formatter(v) {
24
+ return v;
25
+ }
26
+ }
27
+ });
28
+ });
29
+ stories.add('over', function () {
30
+ return /*#__PURE__*/_react["default"].createElement(_.BudgetInfo, {
31
+ budget: {
32
+ budget: 300,
33
+ value: 350,
34
+ overBudget: true
35
+ },
36
+ metric: {
37
+ formatter: function formatter(v) {
38
+ return v;
39
+ }
40
+ }
41
+ });
42
+ });
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+
7
+ var _budgetInfo = require("./budget-info");
8
+
9
+ Object.keys(_budgetInfo).forEach(function (key) {
10
+ if (key === "default" || key === "__esModule") return;
11
+ if (key in exports && exports[key] === _budgetInfo[key]) return;
12
+ Object.defineProperty(exports, key, {
13
+ enumerable: true,
14
+ get: function get() {
15
+ return _budgetInfo[key];
16
+ }
17
+ });
18
+ });
@@ -0,0 +1,200 @@
1
+ "use strict";
2
+
3
+ function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.BudgetInsights = void 0;
9
+
10
+ var _react = _interopRequireWildcard(require("react"));
11
+
12
+ var _propTypes = _interopRequireDefault(require("prop-types"));
13
+
14
+ var _classnames = _interopRequireDefault(require("classnames"));
15
+
16
+ var _utils = require("@bundle-stats/utils");
17
+
18
+ var _box = require("../../layout/box");
19
+
20
+ var _stack = require("../../layout/stack");
21
+
22
+ var _flexStack = require("../../layout/flex-stack");
23
+
24
+ var _alert = require("../../ui/alert");
25
+
26
+ var _icon = require("../../ui/icon");
27
+
28
+ var _componentLink = require("../component-link");
29
+
30
+ var _budgetInsightsModule = _interopRequireDefault(require("./budget-insights.module.css"));
31
+
32
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
33
+
34
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
35
+
36
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
37
+
38
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
39
+
40
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
41
+
42
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
43
+
44
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
45
+
46
+ function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
47
+
48
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
49
+
50
+ 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); }
51
+
52
+ var Budget = function Budget(props) {
53
+ var className = props.className,
54
+ metricKey = props.metricKey,
55
+ CustomLink = props.CustomLink,
56
+ failed = props.failed,
57
+ budgetValue = props.budgetValue;
58
+ var metric = (0, _utils.getGlobalMetricType)(metricKey);
59
+
60
+ var componentLinkOptions = _utils.METRIC_COMPONENT_LINKS.get(metricKey);
61
+
62
+ return /*#__PURE__*/_react["default"].createElement(CustomLink, _extends({
63
+ className: (0, _classnames["default"])(_budgetInsightsModule["default"].budget, className)
64
+ }, componentLinkOptions === null || componentLinkOptions === void 0 ? void 0 : componentLinkOptions.link), /*#__PURE__*/_react["default"].createElement("span", {
65
+ className: _budgetInsightsModule["default"].budgetLabel
66
+ }, metric.label), " is ".concat(failed ? 'over' : 'under', " "), /*#__PURE__*/_react["default"].createElement("span", {
67
+ className: _budgetInsightsModule["default"].budgetValue
68
+ }, metric.formatter(budgetValue)), " budget");
69
+ };
70
+
71
+ Budget.propTypes = {
72
+ className: _propTypes["default"].string,
73
+ metricKey: _propTypes["default"].string.isRequired,
74
+ failed: _propTypes["default"].bool.isRequired,
75
+ currentValue: _propTypes["default"].number.isRequired,
76
+ budgetValue: _propTypes["default"].number.isRequired,
77
+ CustomLink: _propTypes["default"].elementType.isRequired
78
+ };
79
+ Budget.defaultProps = {
80
+ className: ''
81
+ };
82
+
83
+ var BudgetsGroup = function BudgetsGroup(props) {
84
+ var className = props.className,
85
+ kind = props.kind,
86
+ source = props.source,
87
+ budgets = props.budgets,
88
+ CustomLink = props.CustomLink;
89
+
90
+ var _useState = (0, _react.useState)(false),
91
+ _useState2 = _slicedToArray(_useState, 2),
92
+ showBudgets = _useState2[0],
93
+ setShowBudgets = _useState2[1];
94
+
95
+ var isFailed = kind === 'danger';
96
+ return /*#__PURE__*/_react["default"].createElement(_alert.Alert, {
97
+ kind: kind,
98
+ padding: "none",
99
+ className: (0, _classnames["default"])(_budgetInsightsModule["default"].group, _budgetInsightsModule["default"][kind], className)
100
+ }, /*#__PURE__*/_react["default"].createElement(_box.Box, {
101
+ padding: ['xsmall', 'small'],
102
+ className: _budgetInsightsModule["default"].groupHeader,
103
+ as: "button",
104
+ type: "button",
105
+ onClick: function onClick() {
106
+ return setShowBudgets(!showBudgets);
107
+ }
108
+ }, /*#__PURE__*/_react["default"].createElement(_flexStack.FlexStack, {
109
+ space: "xxsmall",
110
+ className: _budgetInsightsModule["default"].groupTitle
111
+ }, /*#__PURE__*/_react["default"].createElement(_icon.Icon, {
112
+ className: _budgetInsightsModule["default"].groupIcon,
113
+ glyph: isFailed ? _icon.Icon.ICONS.ALERT_CIRCLE : _icon.Icon.ICONS.CHECK_CIRCLE
114
+ }), /*#__PURE__*/_react["default"].createElement("span", null, /*#__PURE__*/_react["default"].createElement("strong", null, budgets.length), " budget ".concat(budgets.length > 1 ? 'checks' : 'check', " ").concat(isFailed ? 'failed' : 'passed')), /*#__PURE__*/_react["default"].createElement("span", {
115
+ className: _budgetInsightsModule["default"].groupTitleToggle
116
+ }, showBudgets ? 'hide' : 'show', " all"))), showBudgets && /*#__PURE__*/_react["default"].createElement(_box.Box, {
117
+ padding: ['xsmall', 'small'],
118
+ className: _budgetInsightsModule["default"].groupContent
119
+ }, /*#__PURE__*/_react["default"].createElement(_stack.Stack, {
120
+ space: "none"
121
+ }, budgets.map(function (_ref) {
122
+ var _ref2 = _slicedToArray(_ref, 2),
123
+ key = _ref2[0],
124
+ budget = _ref2[1];
125
+
126
+ return /*#__PURE__*/_react["default"].createElement(Budget, _extends({
127
+ key: key,
128
+ source: source,
129
+ metricKey: "".concat(source, ".").concat(key),
130
+ CustomLink: CustomLink
131
+ }, budget));
132
+ }))));
133
+ };
134
+
135
+ BudgetsGroup.propTypes = {
136
+ className: _propTypes["default"].string,
137
+ kind: _propTypes["default"].oneOf(['success', 'danger']).isRequired,
138
+ source: _propTypes["default"].string.isRequired,
139
+ budgets: _propTypes["default"].object.isRequired,
140
+ // eslint-disable-line react/forbid-prop-types
141
+ CustomLink: _propTypes["default"].elementType.isRequired
142
+ };
143
+ BudgetsGroup.defaultProps = {
144
+ className: ''
145
+ };
146
+
147
+ var BudgetInsights = function BudgetInsights(props) {
148
+ var className = props.className,
149
+ source = props.source,
150
+ budgets = props.budgets,
151
+ CustomLink = props.CustomLink;
152
+
153
+ var _useMemo = (0, _react.useMemo)(function () {
154
+ var passed = [];
155
+ var failed = [];
156
+ Object.entries(budgets).forEach(function (_ref3) {
157
+ var _ref4 = _slicedToArray(_ref3, 2),
158
+ key = _ref4[0],
159
+ budget = _ref4[1];
160
+
161
+ if (budget.failed) {
162
+ failed.push([key, budget]);
163
+ } else {
164
+ passed.push([key, budget]);
165
+ }
166
+ });
167
+ return [failed, passed];
168
+ }, [budgets]),
169
+ _useMemo2 = _slicedToArray(_useMemo, 2),
170
+ failedBudgets = _useMemo2[0],
171
+ passedBudgets = _useMemo2[1];
172
+
173
+ return /*#__PURE__*/_react["default"].createElement(_stack.Stack, {
174
+ className: className,
175
+ space: "xsmall"
176
+ }, failedBudgets.length > 0 && /*#__PURE__*/_react["default"].createElement(BudgetsGroup, {
177
+ kind: "danger",
178
+ source: source,
179
+ budgets: failedBudgets,
180
+ CustomLink: CustomLink
181
+ }), passedBudgets.length > 0 && /*#__PURE__*/_react["default"].createElement(BudgetsGroup, {
182
+ kind: "success",
183
+ source: source,
184
+ budgets: passedBudgets,
185
+ CustomLink: CustomLink
186
+ }));
187
+ };
188
+
189
+ exports.BudgetInsights = BudgetInsights;
190
+ BudgetInsights.propTypes = {
191
+ className: _propTypes["default"].string,
192
+ source: _propTypes["default"].string.isRequired,
193
+ budgets: _propTypes["default"].object.isRequired,
194
+ // eslint-disable-line react/forbid-prop-types
195
+ CustomLink: _propTypes["default"].elementType
196
+ };
197
+ BudgetInsights.defaultProps = {
198
+ className: '',
199
+ CustomLink: _componentLink.ComponentLink
200
+ };
@@ -0,0 +1,53 @@
1
+ .groupHeader {
2
+ width: 100%;
3
+ border: none;
4
+ background: none;
5
+ cursor: pointer;
6
+ color: inherit;
7
+ }
8
+
9
+ .groupTitle {
10
+ width: 100%;
11
+ align-items: center;
12
+ }
13
+
14
+ .groupTitle:hover {
15
+ color: var(--color-text-dark);
16
+ text-decoration: underline;
17
+ }
18
+
19
+ .groupTitleToggle {
20
+ margin: 0 0 0 auto !important;
21
+ }
22
+
23
+ .danger .groupIcon {
24
+ color: var(--color-danger);
25
+ }
26
+
27
+ .success .groupIcon {
28
+ color: var(--color-success);
29
+ }
30
+
31
+ .groupContent {
32
+ padding-top: 0px;
33
+ background: transparent;
34
+ }
35
+
36
+ .budget {
37
+ display: block;
38
+ color: var(--color-text);
39
+ text-decoration: none;
40
+ }
41
+
42
+ .budgetLabel,
43
+ .budgetValue {
44
+ color: var(--color-text-dark);
45
+ font-weight: 500;
46
+ }
47
+
48
+ .budget:hover,
49
+ .budget:focus,
50
+ .budget:active {
51
+ color: var(--color-text);
52
+ text-decoration: underline;
53
+ }