@bundle-stats/ui 3.2.9 → 3.4.0-alpha.1

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 (74) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/lib/app/app.js +20 -5
  3. package/lib/app/app.stories.js +22 -1
  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/budget-info/budget-info.js +80 -0
  8. package/lib/components/budget-info/budget-info.module.css +40 -0
  9. package/lib/components/budget-info/budget-info.stories.js +44 -0
  10. package/lib/components/budget-info/index.js +18 -0
  11. package/lib/components/budget-insights/budget-insights.js +200 -0
  12. package/lib/components/budget-insights/budget-insights.module.css +53 -0
  13. package/lib/components/budget-insights/budget-insights.stories.js +104 -0
  14. package/lib/components/budget-insights/index.js +18 -0
  15. package/lib/components/bundle-assets-totals-table/bundle-assets-totals-table.js +43 -7
  16. package/lib/components/bundle-assets-totals-table/bundle-assets-totals-table.module.css +2 -2
  17. package/lib/components/bundle-assets-totals-table/bundle-assets-totals-table.stories.js +20 -1
  18. package/lib/components/index.js +8 -0
  19. package/lib/components/summary/summary.js +12 -7
  20. package/lib/components/summary/summary.module.css +1 -1
  21. package/lib/components/summary/summary.stories.js +29 -0
  22. package/lib/components/summary-item/summary-item.js +22 -5
  23. package/lib/components/summary-item/summary-item.module.css +11 -0
  24. package/lib/components/summary-item/summary-item.stories.js +51 -53
  25. package/lib/constants.js +4 -4
  26. package/lib/ui/alert/alert.js +13 -3
  27. package/lib/ui/icon/icon.js +2 -0
  28. package/lib-esm/app/app.js +19 -5
  29. package/lib-esm/app/app.stories.js +22 -1
  30. package/lib-esm/assets/icons/alert-circle.svg +1 -0
  31. package/lib-esm/assets/icons/check-circle.svg +1 -0
  32. package/lib-esm/assets/icons.svg +8 -0
  33. package/lib-esm/components/budget-info/budget-info.js +58 -0
  34. package/lib-esm/components/budget-info/budget-info.module.css +40 -0
  35. package/lib-esm/components/budget-info/budget-info.stories.js +30 -0
  36. package/lib-esm/components/budget-info/index.js +1 -0
  37. package/lib-esm/components/budget-insights/budget-insights.js +148 -0
  38. package/lib-esm/components/budget-insights/budget-insights.module.css +53 -0
  39. package/lib-esm/components/budget-insights/budget-insights.stories.js +84 -0
  40. package/lib-esm/components/budget-insights/index.js +1 -0
  41. package/lib-esm/components/bundle-assets-totals-table/bundle-assets-totals-table.js +24 -7
  42. package/lib-esm/components/bundle-assets-totals-table/bundle-assets-totals-table.module.css +2 -2
  43. package/lib-esm/components/bundle-assets-totals-table/bundle-assets-totals-table.stories.js +18 -0
  44. package/lib-esm/components/index.js +1 -0
  45. package/lib-esm/components/summary/summary.js +11 -7
  46. package/lib-esm/components/summary/summary.module.css +1 -1
  47. package/lib-esm/components/summary/summary.stories.js +27 -0
  48. package/lib-esm/components/summary-item/summary-item.js +20 -4
  49. package/lib-esm/components/summary-item/summary-item.module.css +11 -0
  50. package/lib-esm/components/summary-item/summary-item.stories.js +50 -38
  51. package/lib-esm/constants.js +4 -4
  52. package/lib-esm/ui/alert/alert.js +6 -3
  53. package/lib-esm/ui/icon/icon.js +2 -0
  54. package/package.json +3 -3
  55. package/src/app/app.jsx +12 -5
  56. package/src/assets/icons/alert-circle.svg +1 -0
  57. package/src/assets/icons/check-circle.svg +1 -0
  58. package/src/assets/icons.svg +8 -0
  59. package/src/components/budget-info/budget-info.jsx +65 -0
  60. package/src/components/budget-info/budget-info.module.css +40 -0
  61. package/src/components/budget-info/index.js +1 -0
  62. package/src/components/budget-insights/budget-insights.jsx +157 -0
  63. package/src/components/budget-insights/budget-insights.module.css +53 -0
  64. package/src/components/budget-insights/index.js +1 -0
  65. package/src/components/bundle-assets-totals-table/bundle-assets-totals-table.jsx +27 -13
  66. package/src/components/bundle-assets-totals-table/bundle-assets-totals-table.module.css +2 -2
  67. package/src/components/index.js +1 -0
  68. package/src/components/summary/summary.jsx +8 -7
  69. package/src/components/summary/summary.module.css +1 -1
  70. package/src/components/summary-item/summary-item.jsx +13 -2
  71. package/src/components/summary-item/summary-item.module.css +11 -0
  72. package/src/constants.js +7 -7
  73. package/src/ui/alert/alert.jsx +7 -2
  74. package/src/ui/icon/icon.jsx +2 -0
package/CHANGELOG.md CHANGED
@@ -3,6 +3,35 @@
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.4.0-alpha.0](https://github.com/relative-ci/bundle-stats/compare/v3.2.9...v3.4.0-alpha.0) (2022-03-12)
7
+
8
+
9
+ ### Bug Fixes
10
+
11
+ * **ui:** Alert - allow to override props ([c9f85cd](https://github.com/relative-ci/bundle-stats/commit/c9f85cde563291da7de47f7c5ddaa7f2caa1d674))
12
+ * **ui:** Summary - pass budget data to SummaryItem ([9023a19](https://github.com/relative-ci/bundle-stats/commit/9023a19d164cf8e5c6b7c23d086b689c938c67c8))
13
+ * **utils:** Budgets - take biggerIsBetter in consideration ([b95b956](https://github.com/relative-ci/bundle-stats/commit/b95b95637a47cc266d4e4c254cb49f1a4f19794c))
14
+
15
+
16
+ ### Features
17
+
18
+ * App - add BudgetInsights ([84a6698](https://github.com/relative-ci/bundle-stats/commit/84a669806f25a1f164055ab1cbca39dc1e19987a))
19
+ * **ui:** App - pass budgets info to Summary ([d665805](https://github.com/relative-ci/bundle-stats/commit/d665805298e26d9771c017c0bddacc80dcc19f87))
20
+ * **ui:** BudgetInsights component ([f097f38](https://github.com/relative-ci/bundle-stats/commit/f097f388147910b6abb69fc3398d04796102aad1))
21
+ * **ui:** BundleAssetsTotalsTable - add budgets ([1a45ce8](https://github.com/relative-ci/bundle-stats/commit/1a45ce8a63f411b95a2a9092a13d45925e692062))
22
+ * **ui:** Icon - add check-circle icon ([8ce4c40](https://github.com/relative-ci/bundle-stats/commit/8ce4c40d92759d1a898c2311026d52d311520451))
23
+ * **ui:** Icon - alert-circle icon ([c571e57](https://github.com/relative-ci/bundle-stats/commit/c571e57405b4533cf55067f7ba71b944552579a5))
24
+ * **ui:** SummaryItem - budgets ([105ed0e](https://github.com/relative-ci/bundle-stats/commit/105ed0ef693c0b26c44217189d2d3cb5c4547af5))
25
+
26
+
27
+ ### Performance Improvements
28
+
29
+ * **ui:** BundleAssetsTotalsTable - use memo / callback ([f027cbc](https://github.com/relative-ci/bundle-stats/commit/f027cbcb59ff3890b2bf6db6b95d23c7c898bc6b))
30
+
31
+
32
+
33
+
34
+
6
35
  ## [3.2.8](https://github.com/relative-ci/bundle-stats/compare/v3.2.7...v3.2.8) (2022-03-10)
7
36
 
8
37
  **Note:** Version bump only for package @bundle-stats/ui
package/lib/app/app.js CHANGED
@@ -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");
@@ -137,6 +139,8 @@ JobsProvider.propTypes = {
137
139
  };
138
140
 
139
141
  var OverviewContent = function OverviewContent() {
142
+ var _jobs$0$insights, _jobs$0$insights$webp;
143
+
140
144
  var _useContext = (0, _react.useContext)(JobsContext),
141
145
  jobs = _useContext.jobs;
142
146
 
@@ -144,10 +148,15 @@ var OverviewContent = function OverviewContent() {
144
148
  var duplicatePackagesInsights = Boolean(duplicatePackagesCount.current || duplicatePackagesCount.baseline);
145
149
  return /*#__PURE__*/_react["default"].createElement(_stack.Stack, {
146
150
  space: "medium"
147
- }, duplicatePackagesInsights && /*#__PURE__*/_react["default"].createElement(_container.Container, null, /*#__PURE__*/_react["default"].createElement(_duplicatePackagesWarning.DuplicatePackagesWarning, {
151
+ }, duplicatePackagesInsights && /*#__PURE__*/_react["default"].createElement(_container.Container, null, /*#__PURE__*/_react["default"].createElement(_stack.Stack, {
152
+ space: "small"
153
+ }, /*#__PURE__*/_react["default"].createElement(_duplicatePackagesWarning.DuplicatePackagesWarning, {
148
154
  duplicatePackagesCount: duplicatePackagesCount,
149
155
  showDelta: jobs.length > 1
150
- })), /*#__PURE__*/_react["default"].createElement(_container.Container, null, /*#__PURE__*/_react["default"].createElement(_stack.Stack, {
156
+ }), /*#__PURE__*/_react["default"].createElement(_budgetInsights.BudgetInsights, {
157
+ source: "webpack",
158
+ budgets: (_jobs$0$insights = jobs[0].insights) === null || _jobs$0$insights === void 0 ? void 0 : (_jobs$0$insights$webp = _jobs$0$insights.webpack) === null || _jobs$0$insights$webp === void 0 ? void 0 : _jobs$0$insights$webp.budgets
159
+ }))), /*#__PURE__*/_react["default"].createElement(_container.Container, null, /*#__PURE__*/_react["default"].createElement(_stack.Stack, {
151
160
  space: "small"
152
161
  }, /*#__PURE__*/_react["default"].createElement(_totalSizeTypeTitle.TotalSizeTypeTitle, null), /*#__PURE__*/_react["default"].createElement(_bundleAssetsTotalsChartBars.BundleAssetsTotalsChartBars, {
153
162
  jobs: jobs
@@ -158,7 +167,7 @@ var OverviewContent = function OverviewContent() {
158
167
  };
159
168
 
160
169
  var AssetsContent = function AssetsContent() {
161
- var _jobs$;
170
+ var _jobs$, _jobs$0$insights2, _jobs$0$insights2$web;
162
171
 
163
172
  var _useComponentQuerySta = (0, _queryState.useComponentQueryState)(_utils.COMPONENT.BUNDLE_ASSETS),
164
173
  _useComponentQuerySta2 = _slicedToArray(_useComponentQuerySta, 2),
@@ -173,6 +182,7 @@ var AssetsContent = function AssetsContent() {
173
182
  }, /*#__PURE__*/_react["default"].createElement(_summary.Summary, {
174
183
  keys: _constants.METRICS_WEBPACK_ASSETS,
175
184
  data: jobs === null || jobs === void 0 ? void 0 : (_jobs$ = jobs[0]) === null || _jobs$ === void 0 ? void 0 : _jobs$.summary,
185
+ budgets: (_jobs$0$insights2 = jobs[0].insights) === null || _jobs$0$insights2 === void 0 ? void 0 : (_jobs$0$insights2$web = _jobs$0$insights2.webpack) === null || _jobs$0$insights2$web === void 0 ? void 0 : _jobs$0$insights2$web.budgets,
176
186
  showSummaryItemDelta: (jobs === null || jobs === void 0 ? void 0 : jobs.length) !== 1
177
187
  }), /*#__PURE__*/_react["default"].createElement(_box.Box, {
178
188
  outline: true
@@ -183,7 +193,7 @@ var AssetsContent = function AssetsContent() {
183
193
  };
184
194
 
185
195
  var ModulesContent = function ModulesContent() {
186
- var _jobs$2;
196
+ var _jobs$2, _jobs$0$insights3, _jobs$0$insights3$web;
187
197
 
188
198
  var _useComponentQuerySta3 = (0, _queryState.useComponentQueryState)(_utils.COMPONENT.BUNDLE_MODULES),
189
199
  _useComponentQuerySta4 = _slicedToArray(_useComponentQuerySta3, 2),
@@ -198,6 +208,7 @@ var ModulesContent = function ModulesContent() {
198
208
  }, /*#__PURE__*/_react["default"].createElement(_summary.Summary, {
199
209
  keys: _constants.METRICS_WEBPACK_MODULES,
200
210
  data: jobs === null || jobs === void 0 ? void 0 : (_jobs$2 = jobs[0]) === null || _jobs$2 === void 0 ? void 0 : _jobs$2.summary,
211
+ budgets: (_jobs$0$insights3 = jobs[0].insights) === null || _jobs$0$insights3 === void 0 ? void 0 : (_jobs$0$insights3$web = _jobs$0$insights3.webpack) === null || _jobs$0$insights3$web === void 0 ? void 0 : _jobs$0$insights3$web.budgets,
201
212
  showSummaryItemDelta: (jobs === null || jobs === void 0 ? void 0 : jobs.length) !== 1
202
213
  }), /*#__PURE__*/_react["default"].createElement(_box.Box, {
203
214
  outline: true
@@ -208,7 +219,7 @@ var ModulesContent = function ModulesContent() {
208
219
  };
209
220
 
210
221
  var PackagesContent = function PackagesContent() {
211
- var _jobs$3;
222
+ var _jobs$3, _jobs$0$insights4, _jobs$0$insights4$web;
212
223
 
213
224
  var _useComponentQuerySta5 = (0, _queryState.useComponentQueryState)(_utils.COMPONENT.BUNDLE_PACKAGES),
214
225
  _useComponentQuerySta6 = _slicedToArray(_useComponentQuerySta5, 2),
@@ -223,6 +234,7 @@ var PackagesContent = function PackagesContent() {
223
234
  }, /*#__PURE__*/_react["default"].createElement(_summary.Summary, {
224
235
  keys: _constants.METRICS_WEBPACK_PACKAGES,
225
236
  data: jobs === null || jobs === void 0 ? void 0 : (_jobs$3 = jobs[0]) === null || _jobs$3 === void 0 ? void 0 : _jobs$3.summary,
237
+ budgets: (_jobs$0$insights4 = jobs[0].insights) === null || _jobs$0$insights4 === void 0 ? void 0 : (_jobs$0$insights4$web = _jobs$0$insights4.webpack) === null || _jobs$0$insights4$web === void 0 ? void 0 : _jobs$0$insights4$web.budgets,
226
238
  showSummaryItemDelta: (jobs === null || jobs === void 0 ? void 0 : jobs.length) !== 1
227
239
  }), /*#__PURE__*/_react["default"].createElement(_box.Box, {
228
240
  outline: true
@@ -234,6 +246,8 @@ var PackagesContent = function PackagesContent() {
234
246
  };
235
247
 
236
248
  var AppComponent = function AppComponent(_ref3) {
249
+ var _jobs$0$insights5, _jobs$0$insights5$web;
250
+
237
251
  var version = _ref3.version,
238
252
  jobs = _ref3.jobs;
239
253
 
@@ -256,6 +270,7 @@ var AppComponent = function AppComponent(_ref3) {
256
270
  size: "large",
257
271
  keys: _constants.METRICS_WEBPACK_GENERAL,
258
272
  data: jobs[0].summary,
273
+ budgets: (_jobs$0$insights5 = jobs[0].insights) === null || _jobs$0$insights5 === void 0 ? void 0 : (_jobs$0$insights5$web = _jobs$0$insights5.webpack) === null || _jobs$0$insights5$web === void 0 ? void 0 : _jobs$0$insights5$web.budgets,
259
274
  showSummaryItemDelta: jobs.length !== 1
260
275
  })), /*#__PURE__*/_react["default"].createElement(_container.Container, {
261
276
  className: _appModule["default"].tabsContainer
@@ -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"/>
@@ -0,0 +1,80 @@
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.BudgetInfo = void 0;
9
+
10
+ var _react = _interopRequireDefault(require("react"));
11
+
12
+ var _classnames = _interopRequireDefault(require("classnames"));
13
+
14
+ var _propTypes = _interopRequireDefault(require("prop-types"));
15
+
16
+ var _utils = require("@bundle-stats/utils");
17
+
18
+ var budgetsInsightsTransformer = _interopRequireWildcard(require("@bundle-stats/utils/lib-esm/transformers/budgets-insights"));
19
+
20
+ var _icon = require("../../ui/icon");
21
+
22
+ var _tooltip = require("../../ui/tooltip");
23
+
24
+ var _budgetInfoModule = _interopRequireDefault(require("./budget-info.module.css"));
25
+
26
+ var _INSIGHT_TYPE_MAP;
27
+
28
+ 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); }
29
+
30
+ 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; }
31
+
32
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
33
+
34
+ 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; }
35
+
36
+ var INSIGHT_TYPE_MAP = (_INSIGHT_TYPE_MAP = {}, _defineProperty(_INSIGHT_TYPE_MAP, _utils.InsightType.SUCCESS, {
37
+ className: _budgetInfoModule["default"].success,
38
+ glyph: _icon.Icon.ICONS.CHECK_CIRCLE
39
+ }), _defineProperty(_INSIGHT_TYPE_MAP, _utils.InsightType.ERROR, {
40
+ className: _budgetInfoModule["default"].error,
41
+ glyph: _icon.Icon.ICONS.ALERT_CIRCLE
42
+ }), _defineProperty(_INSIGHT_TYPE_MAP, _utils.InsightType.WARNING, {
43
+ className: _budgetInfoModule["default"].warning,
44
+ glyph: _icon.Icon.ICONS.WARNING
45
+ }), _INSIGHT_TYPE_MAP);
46
+
47
+ var BudgetInfo = function BudgetInfo(_ref) {
48
+ var _ref$className = _ref.className,
49
+ className = _ref$className === void 0 ? '' : _ref$className,
50
+ metricId = _ref.metricId,
51
+ budgetInsight = _ref.budgetInsight;
52
+ var budgetInsightInfo = budgetsInsightsTransformer.getInfo(metricId, budgetInsight);
53
+ var _INSIGHT_TYPE_MAP$bud = INSIGHT_TYPE_MAP[budgetInsightInfo.type],
54
+ insightTypeClassName = _INSIGHT_TYPE_MAP$bud.className,
55
+ glyph = _INSIGHT_TYPE_MAP$bud.glyph;
56
+ var rootClassName = (0, _classnames["default"])(_budgetInfoModule["default"].root, insightTypeClassName, className);
57
+ var messageData = budgetInsightInfo.message.data;
58
+ return /*#__PURE__*/_react["default"].createElement(_tooltip.Tooltip, {
59
+ className: rootClassName,
60
+ title: /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement("strong", null, messageData.metricLabel), " value (", /*#__PURE__*/_react["default"].createElement("strong", null, messageData.currentValue), ") is ".concat(messageData.diffLabel, " "), /*#__PURE__*/_react["default"].createElement("strong", null, messageData.budgetValue), " budget ")
61
+ }, /*#__PURE__*/_react["default"].createElement(_icon.Icon, {
62
+ className: _budgetInfoModule["default"].icon,
63
+ glyph: glyph,
64
+ size: "medium"
65
+ }));
66
+ };
67
+
68
+ exports.BudgetInfo = BudgetInfo;
69
+ BudgetInfo.propTypes = {
70
+ metricId: _propTypes["default"].string.isRequired,
71
+ budgetInsight: _propTypes["default"].shape({
72
+ currentValue: _propTypes["default"].number,
73
+ budgetValue: _propTypes["default"].number,
74
+ failed: _propTypes["default"].bool
75
+ }).isRequired,
76
+ className: _propTypes["default"].string
77
+ };
78
+ BudgetInfo.defaultProps = {
79
+ className: ''
80
+ };
@@ -0,0 +1,40 @@
1
+ .root {
2
+ display: inline-block;
3
+ line-height: 1em;
4
+ }
5
+
6
+ /* Budget error */
7
+ .error .icon {
8
+ color: var(--color-danger);
9
+ }
10
+
11
+ .error .icon:hover,
12
+ .error .icon:focus,
13
+ .error .icon:active
14
+ {
15
+ color: var(--color-danger-light);
16
+ }
17
+
18
+ /* Budget success */
19
+ .success .icon {
20
+ color: var(--color-success);
21
+ }
22
+
23
+ .success .icon:hover,
24
+ .success .icon:focus,
25
+ .success .icon:active
26
+ {
27
+ color: var(--color-success-light);
28
+ }
29
+
30
+ /* Budget warning */
31
+ .warning .icon {
32
+ color: var(--color-warning-dark);
33
+ }
34
+
35
+ .warning .icon:hover,
36
+ .warning .icon:focus,
37
+ .warning .icon:active
38
+ {
39
+ color: var(--color-warning);
40
+ }
@@ -0,0 +1,44 @@
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
+ metricId: "webpack.assetCount",
18
+ budgetInsight: {
19
+ budgetValue: 300,
20
+ currentValue: 250,
21
+ failed: false
22
+ }
23
+ });
24
+ });
25
+ stories.add('error', function () {
26
+ return /*#__PURE__*/_react["default"].createElement(_.BudgetInfo, {
27
+ metricId: "webpack.assetCount",
28
+ budgetInsight: {
29
+ budgetValue: 300,
30
+ currentValue: 350,
31
+ failed: true
32
+ }
33
+ });
34
+ });
35
+ stories.add('warning', function () {
36
+ return /*#__PURE__*/_react["default"].createElement(_.BudgetInfo, {
37
+ metricId: "webpack.assetCount",
38
+ budgetInsight: {
39
+ budgetValue: 300,
40
+ currentValue: 300,
41
+ failed: false
42
+ }
43
+ });
44
+ });
@@ -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 budgetsInsightsTransformer = _interopRequireWildcard(require("@bundle-stats/utils/lib-esm/transformers/budgets-insights"));
19
+
20
+ var _box = require("../../layout/box");
21
+
22
+ var _stack = require("../../layout/stack");
23
+
24
+ var _flexStack = require("../../layout/flex-stack");
25
+
26
+ var _alert = require("../../ui/alert");
27
+
28
+ var _icon = require("../../ui/icon");
29
+
30
+ var _componentLink = require("../component-link");
31
+
32
+ var _budgetInsightsModule = _interopRequireDefault(require("./budget-insights.module.css"));
33
+
34
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
35
+
36
+ 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); }
37
+
38
+ 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; }
39
+
40
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
41
+
42
+ 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."); }
43
+
44
+ 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); }
45
+
46
+ 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; }
47
+
48
+ 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; }
49
+
50
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
51
+
52
+ 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); }
53
+
54
+ var Budget = function Budget(props) {
55
+ var className = props.className,
56
+ metricId = props.metricId,
57
+ budgetInsight = props.budgetInsight,
58
+ CustomLink = props.CustomLink;
59
+
60
+ var componentLinkOptions = _utils.METRIC_COMPONENT_LINKS.get(metricId);
61
+
62
+ var budgetInsightInfo = budgetsInsightsTransformer.getInfo(metricId, budgetInsight);
63
+ var messageData = budgetInsightInfo.message.data;
64
+ return /*#__PURE__*/_react["default"].createElement(CustomLink, _extends({
65
+ className: (0, _classnames["default"])(_budgetInsightsModule["default"].budget, className)
66
+ }, componentLinkOptions === null || componentLinkOptions === void 0 ? void 0 : componentLinkOptions.link), /*#__PURE__*/_react["default"].createElement("strong", null, messageData.metricLabel), " value (", /*#__PURE__*/_react["default"].createElement("strong", null, messageData.currentValue), ") is ".concat(messageData.diffLabel, " "), /*#__PURE__*/_react["default"].createElement("strong", null, messageData.budgetValue), " budget ");
67
+ };
68
+
69
+ Budget.propTypes = {
70
+ className: _propTypes["default"].string,
71
+ metricId: _propTypes["default"].string.isRequired,
72
+ budgetInsight: _propTypes["default"].shape({
73
+ currentValue: _propTypes["default"].number.isRequired,
74
+ budgetValue: _propTypes["default"].number.isRequired,
75
+ failed: _propTypes["default"].bool.isRequired
76
+ }).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, {
127
+ key: key,
128
+ metricId: "".concat(source, ".").concat(key),
129
+ budgetInsight: budget,
130
+ CustomLink: CustomLink
131
+ });
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
+ }