@verdaccio/ui-components 3.0.0-next-7.4 → 3.0.0-next-7.6

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 (56) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/build/AppTest/AppRoute.js +34 -0
  3. package/build/AppTest/pages/Front/Home.js +9 -0
  4. package/build/AppTest/pages/Front/index.js +14 -0
  5. package/build/AppTest/pages/Version/Version.js +34 -0
  6. package/build/AppTest/pages/Version/index.js +14 -0
  7. package/build/Theme/theme.js +1 -1
  8. package/build/components/Engines/Engines.js +1 -1
  9. package/build/components/Forbidden/Forbidden.js +75 -0
  10. package/build/components/Forbidden/index.js +14 -0
  11. package/build/components/Install/InstallListItem.js +7 -7
  12. package/build/components/NotFound/NotFound.js +16 -14
  13. package/build/components/Repository/Repository.js +9 -9
  14. package/build/components/Versions/HistoryList.js +26 -22
  15. package/build/components/Versions/Versions.js +41 -10
  16. package/build/index.js +8 -0
  17. package/build/sections/Detail/Tabs.js +1 -3
  18. package/build/src/AppTest/App.stories.d.ts +8 -0
  19. package/build/src/AppTest/AppRoute.d.ts +3 -0
  20. package/build/src/AppTest/pages/Front/Home.d.ts +2 -0
  21. package/build/src/AppTest/pages/Front/index.d.ts +1 -0
  22. package/build/src/AppTest/pages/Version/Version.d.ts +3 -0
  23. package/build/src/AppTest/pages/Version/index.d.ts +1 -0
  24. package/build/src/components/Forbidden/Forbidden.d.ts +3 -0
  25. package/build/src/components/Forbidden/Forbidden.test.d.ts +1 -0
  26. package/build/src/components/Forbidden/index.d.ts +1 -0
  27. package/build/src/index.d.ts +1 -0
  28. package/build/src/sections/Detail/Detail.stories.d.ts +1 -0
  29. package/build/src/store/models/manifest.d.ts +11 -0
  30. package/build/store/api.js +12 -6
  31. package/build/store/models/manifest.js +20 -2
  32. package/package.json +3 -1
  33. package/src/AppTest/App.stories.tsx +32 -0
  34. package/src/AppTest/AppRoute.tsx +42 -0
  35. package/src/AppTest/pages/Front/Home.ts +3 -0
  36. package/src/AppTest/pages/Front/index.ts +1 -0
  37. package/src/AppTest/pages/Version/Version.tsx +28 -0
  38. package/src/AppTest/pages/Version/index.ts +1 -0
  39. package/src/Theme/theme.ts +1 -1
  40. package/src/components/Engines/Engines.tsx +1 -1
  41. package/src/components/Forbidden/Forbidden.test.tsx +38 -0
  42. package/src/components/Forbidden/Forbidden.tsx +56 -0
  43. package/src/components/Forbidden/index.ts +1 -0
  44. package/src/components/Install/InstallListItem.tsx +1 -0
  45. package/src/components/NotFound/NotFound.tsx +6 -5
  46. package/src/components/NotFound/Notfound.test.tsx +6 -3
  47. package/src/components/Repository/Repository.tsx +1 -3
  48. package/src/components/Versions/HistoryList.tsx +2 -2
  49. package/src/components/Versions/Versions.test.tsx +24 -8
  50. package/src/components/Versions/Versions.tsx +46 -18
  51. package/src/index.ts +1 -0
  52. package/src/sections/Detail/Detail.stories.tsx +10 -0
  53. package/src/sections/Detail/Tabs.tsx +1 -7
  54. package/src/store/api.test.ts +3 -2
  55. package/src/store/api.ts +13 -6
  56. package/src/store/models/manifest.ts +19 -1
@@ -41,28 +41,32 @@ const VersionsHistoryList = ({
41
41
  const listVersions = hideDeprecatedVersions ? filterDeprecated(versions) : versions;
42
42
  return /*#__PURE__*/_react.default.createElement(_List.default, {
43
43
  dense: true
44
- }, Object.keys(listVersions).reverse().map(version => /*#__PURE__*/_react.default.createElement(_ListItem.default, {
45
- className: "version-item",
46
- "data-testid": `version-${version}`,
47
- key: version
48
- }, /*#__PURE__*/_react.default.createElement(_Link.Link, {
49
- to: `/-/web/detail/${packageName}/v/${version}`,
50
- variant: "caption"
51
- }, /*#__PURE__*/_react.default.createElement(_styles2.ListItemText, {
52
- disableTypography: false,
53
- primary: version
54
- })), typeof versions[version].deprecated === 'string' ? /*#__PURE__*/_react.default.createElement(_Chip.default, {
55
- color: "warning",
56
- "data-testid": "deprecated-badge",
57
- label: t('versions.deprecated'),
58
- size: "small",
59
- sx: {
60
- marginLeft: theme.spacing(1)
61
- },
62
- variant: "outlined"
63
- }) : null, /*#__PURE__*/_react.default.createElement(_styles2.Spacer, null), /*#__PURE__*/_react.default.createElement(_styles2.ListItemText, {
64
- title: _utils.utils.formatDate(time[version])
65
- }, time[version] ? _utils.utils.formatDateDistance(time[version]) : t('versions.not-available')))));
44
+ }, Object.keys(listVersions).reverse().map(version => {
45
+ var _versions$version;
46
+ return /*#__PURE__*/_react.default.createElement(_ListItem.default, {
47
+ className: "version-item",
48
+ "data-testid": `version-${version}`,
49
+ key: version
50
+ }, /*#__PURE__*/_react.default.createElement(_Link.Link, {
51
+ to: `/-/web/detail/${packageName}/v/${version}`,
52
+ variant: "caption"
53
+ }, /*#__PURE__*/_react.default.createElement(_styles2.ListItemText, {
54
+ disableTypography: false,
55
+ primary: version
56
+ })), typeof ((_versions$version = versions[version]) === null || _versions$version === void 0 ? void 0 : _versions$version.deprecated) === 'string' ? /*#__PURE__*/_react.default.createElement(_Chip.default, {
57
+ color: "warning",
58
+ "data-testid": "deprecated-badge",
59
+ label: t('versions.deprecated'),
60
+ size: "small",
61
+ sx: {
62
+ marginLeft: theme.spacing(1)
63
+ },
64
+ variant: "outlined"
65
+ }) : null, /*#__PURE__*/_react.default.createElement(_styles2.Spacer, null), /*#__PURE__*/_react.default.createElement(_styles2.ListItemText, {
66
+ "data-testid": `version-list-text`,
67
+ title: _utils.utils.formatDate(time[version])
68
+ }, time[version] ? _utils.utils.formatDateDistance(time[version]) : t('versions.not-available')));
69
+ }));
66
70
  };
67
71
  var _default = exports.default = VersionsHistoryList;
68
72
  //# sourceMappingURL=HistoryList.js.map
@@ -5,13 +5,18 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.default = void 0;
7
7
  var _Alert = _interopRequireDefault(require("@mui/material/Alert"));
8
+ var _TextField = _interopRequireDefault(require("@mui/material/TextField"));
8
9
  var _Typography = _interopRequireDefault(require("@mui/material/Typography"));
9
10
  var _styles = require("@mui/styles");
10
- var _react = _interopRequireDefault(require("react"));
11
+ var _debounce = _interopRequireDefault(require("lodash/debounce"));
12
+ var _react = _interopRequireWildcard(require("react"));
11
13
  var _reactI18next = require("react-i18next");
14
+ var _semver = _interopRequireDefault(require("semver"));
12
15
  var _providers = require("../../providers");
13
16
  var _HistoryList = _interopRequireDefault(require("./HistoryList"));
14
17
  var _TagList = _interopRequireDefault(require("./TagList"));
18
+ function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
19
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
15
20
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
16
21
  const Versions = ({
17
22
  packageMeta,
@@ -24,26 +29,52 @@ const Versions = ({
24
29
  configOptions
25
30
  } = (0, _providers.useConfig)();
26
31
  const theme = (0, _styles.useTheme)();
27
- if (!packageMeta) {
28
- return null;
29
- }
30
32
  const {
31
33
  versions = {},
32
34
  time = {},
33
35
  ['dist-tags']: distTags = {}
34
36
  } = packageMeta;
35
- const hasDistTags = distTags && Object.keys(distTags).length > 0 && packageName;
36
- const hasVersionHistory = versions && Object.keys(versions).length > 0 && packageName;
37
+ const [packageVersions, setPackageVersions] = (0, _react.useState)(versions);
38
+ if (!packageMeta || Object.keys(packageMeta).length === 0) {
39
+ return null;
40
+ }
37
41
  const hideDeprecatedVersions = configOptions.hideDeprecatedVersions;
42
+ const hasDistTags = distTags && Object.keys(distTags).length > 0 && packageName;
43
+ const hasVersionHistory = packageVersions && Object.keys(packageVersions).length > 0 && packageName;
44
+ const filterVersions = textSearch => {
45
+ const filteredVersions = Object.keys(versions).reduce((acc, version) => {
46
+ if (textSearch !== '') {
47
+ if (typeof versions[version] !== 'undefined') {
48
+ if (_semver.default.satisfies(version, textSearch, {
49
+ includePrerelease: true,
50
+ loose: true
51
+ })) {
52
+ acc[version] = versions[version];
53
+ }
54
+ }
55
+ } else {
56
+ acc[version] = versions[version];
57
+ }
58
+ return acc;
59
+ }, {});
60
+ setPackageVersions(filteredVersions);
61
+ };
38
62
  return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, hasDistTags ? /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_Typography.default, {
39
63
  variant: "subtitle1"
40
64
  }, t('versions.current-tags')), /*#__PURE__*/_react.default.createElement(_TagList.default, {
41
65
  packageName: packageName,
42
66
  tags: distTags,
43
67
  time: time
44
- })) : null, hasVersionHistory ? /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_Typography.default, {
68
+ })) : null, /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_Typography.default, {
45
69
  variant: "subtitle1"
46
- }, t('versions.version-history')), /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, hideDeprecatedVersions && /*#__PURE__*/_react.default.createElement(_Alert.default, {
70
+ }, t('versions.version-history')), /*#__PURE__*/_react.default.createElement(_TextField.default, {
71
+ helperText: t('versions.search.placeholder'),
72
+ onChange: (0, _debounce.default)(e => {
73
+ filterVersions(e.target.value);
74
+ }, 200),
75
+ size: "small",
76
+ variant: "standard"
77
+ })), hasVersionHistory ? /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, hideDeprecatedVersions === true && /*#__PURE__*/_react.default.createElement(_Alert.default, {
47
78
  severity: "info",
48
79
  sx: {
49
80
  marginTop: theme.spacing(1),
@@ -52,8 +83,8 @@ const Versions = ({
52
83
  }, t('versions.hide-deprecated')), /*#__PURE__*/_react.default.createElement(_HistoryList.default, {
53
84
  packageName: packageName,
54
85
  time: time,
55
- versions: versions
56
- }))) : null);
86
+ versions: packageVersions
87
+ })) : null);
57
88
  };
58
89
  var _default = exports.default = Versions;
59
90
  //# sourceMappingURL=Versions.js.map
package/build/index.js CHANGED
@@ -28,6 +28,7 @@ var _exportNames = {
28
28
  Logo: true,
29
29
  MenuItem: true,
30
30
  NotFound: true,
31
+ Forbidden: true,
31
32
  LoginDialog: true,
32
33
  Search: true,
33
34
  HeaderInfoDialog: true,
@@ -136,6 +137,12 @@ Object.defineProperty(exports, "Footer", {
136
137
  return _Footer.default;
137
138
  }
138
139
  });
140
+ Object.defineProperty(exports, "Forbidden", {
141
+ enumerable: true,
142
+ get: function () {
143
+ return _Forbidden.default;
144
+ }
145
+ });
139
146
  Object.defineProperty(exports, "FundButton", {
140
147
  enumerable: true,
141
148
  get: function () {
@@ -406,6 +413,7 @@ var _Label = _interopRequireDefault(require("./components/Label"));
406
413
  var _Logo = _interopRequireDefault(require("./components/Logo"));
407
414
  var _MenuItem = _interopRequireDefault(require("./components/MenuItem"));
408
415
  var _NotFound = _interopRequireDefault(require("./components/NotFound"));
416
+ var _Forbidden = _interopRequireDefault(require("./components/Forbidden"));
409
417
  var _LoginDialog = _interopRequireDefault(require("./components/LoginDialog"));
410
418
  var _Search = _interopRequireDefault(require("./components/Search"));
411
419
  var _HeaderInfoDialog = _interopRequireDefault(require("./components/HeaderInfoDialog"));
@@ -19,8 +19,6 @@ const DetailContainerTabs = ({
19
19
  t
20
20
  } = (0, _reactI18next.useTranslation)();
21
21
  return /*#__PURE__*/_react.default.createElement(Tabs, {
22
- color: 'primary',
23
- indicatorColor: 'primary',
24
22
  onChange: onChange,
25
23
  value: tabPosition,
26
24
  variant: 'fullWidth'
@@ -54,7 +52,7 @@ const Tabs = /*#__PURE__*/(0, _base.default)(_Tabs.default, process.env.NODE_ENV
54
52
  } : {
55
53
  name: "18uqayh",
56
54
  styles: "margin-bottom:16px",
57
- map: "/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zZWN0aW9ucy9EZXRhaWwvVGFicy50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBaUNhIiwiZmlsZSI6Ii4uLy4uLy4uL3NyYy9zZWN0aW9ucy9EZXRhaWwvVGFicy50c3giLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgc3R5bGVkIGZyb20gJ0BlbW90aW9uL3N0eWxlZCc7XG5pbXBvcnQgVGFiIGZyb20gJ0BtdWkvbWF0ZXJpYWwvVGFiJztcbmltcG9ydCB7IGRlZmF1bHQgYXMgTXVpVGFicyB9IGZyb20gJ0BtdWkvbWF0ZXJpYWwvVGFicyc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlVHJhbnNsYXRpb24gfSBmcm9tICdyZWFjdC1pMThuZXh0JztcblxuaW1wb3J0IHsgVGhlbWUgfSBmcm9tICcuLi8uLi9UaGVtZSc7XG5cbmludGVyZmFjZSBQcm9wcyB7XG4gIG9uQ2hhbmdlOiAoZXZlbnQ6IFJlYWN0LkNoYW5nZUV2ZW50PHt9PiwgbmV3VmFsdWU6IG51bWJlcikgPT4gdm9pZDtcbiAgdGFiUG9zaXRpb246IG51bWJlcjtcbn1cblxuY29uc3QgRGV0YWlsQ29udGFpbmVyVGFiczogUmVhY3QuRkM8UHJvcHM+ID0gKHsgdGFiUG9zaXRpb24sIG9uQ2hhbmdlIH0pID0+IHtcbiAgY29uc3QgeyB0IH0gPSB1c2VUcmFuc2xhdGlvbigpO1xuICByZXR1cm4gKFxuICAgIDxUYWJzXG4gICAgICBjb2xvcj17J3ByaW1hcnknfVxuICAgICAgaW5kaWNhdG9yQ29sb3I9eydwcmltYXJ5J31cbiAgICAgIG9uQ2hhbmdlPXtvbkNoYW5nZX1cbiAgICAgIHZhbHVlPXt0YWJQb3NpdGlvbn1cbiAgICAgIHZhcmlhbnQ9eydmdWxsV2lkdGgnfVxuICAgID5cbiAgICAgIDxUYWIgZGF0YS10ZXN0aWQ9eydyZWFkbWUtdGFiJ30gaWQ9eydyZWFkbWUtdGFiJ30gbGFiZWw9e3QoJ3RhYi5yZWFkbWUnKX0gLz5cbiAgICAgIDxUYWIgZGF0YS10ZXN0aWQ9eydkZXBlbmRlbmNpZXMtdGFiJ30gaWQ9eydkZXBlbmRlbmNpZXMtdGFiJ30gbGFiZWw9e3QoJ3RhYi5kZXBlbmRlbmNpZXMnKX0gLz5cbiAgICAgIDxUYWIgZGF0YS10ZXN0aWQ9eyd2ZXJzaW9ucy10YWInfSBpZD17J3ZlcnNpb25zLXRhYid9IGxhYmVsPXt0KCd0YWIudmVyc2lvbnMnKX0gLz5cbiAgICAgIDxUYWIgZGF0YS10ZXN0aWQ9eyd1cGxpbmtzLXRhYid9IGlkPXsndXBsaW5rcy10YWInfSBsYWJlbD17dCgndGFiLnVwbGlua3MnKX0gLz5cbiAgICA8L1RhYnM+XG4gICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBEZXRhaWxDb250YWluZXJUYWJzO1xuXG5jb25zdCBUYWJzID0gc3R5bGVkKE11aVRhYnMpPHsgdGhlbWU/OiBUaGVtZSB9Pih7XG4gIG1hcmdpbkJvdHRvbTogMTYsXG59KTtcbiJdfQ== */",
55
+ map: "/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zZWN0aW9ucy9EZXRhaWwvVGFicy50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBMkJhIiwiZmlsZSI6Ii4uLy4uLy4uL3NyYy9zZWN0aW9ucy9EZXRhaWwvVGFicy50c3giLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgc3R5bGVkIGZyb20gJ0BlbW90aW9uL3N0eWxlZCc7XG5pbXBvcnQgVGFiIGZyb20gJ0BtdWkvbWF0ZXJpYWwvVGFiJztcbmltcG9ydCB7IGRlZmF1bHQgYXMgTXVpVGFicyB9IGZyb20gJ0BtdWkvbWF0ZXJpYWwvVGFicyc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlVHJhbnNsYXRpb24gfSBmcm9tICdyZWFjdC1pMThuZXh0JztcblxuaW1wb3J0IHsgVGhlbWUgfSBmcm9tICcuLi8uLi9UaGVtZSc7XG5cbmludGVyZmFjZSBQcm9wcyB7XG4gIG9uQ2hhbmdlOiAoZXZlbnQ6IFJlYWN0LkNoYW5nZUV2ZW50PHt9PiwgbmV3VmFsdWU6IG51bWJlcikgPT4gdm9pZDtcbiAgdGFiUG9zaXRpb246IG51bWJlcjtcbn1cblxuY29uc3QgRGV0YWlsQ29udGFpbmVyVGFiczogUmVhY3QuRkM8UHJvcHM+ID0gKHsgdGFiUG9zaXRpb24sIG9uQ2hhbmdlIH0pID0+IHtcbiAgY29uc3QgeyB0IH0gPSB1c2VUcmFuc2xhdGlvbigpO1xuICByZXR1cm4gKFxuICAgIDxUYWJzIG9uQ2hhbmdlPXtvbkNoYW5nZX0gdmFsdWU9e3RhYlBvc2l0aW9ufSB2YXJpYW50PXsnZnVsbFdpZHRoJ30+XG4gICAgICA8VGFiIGRhdGEtdGVzdGlkPXsncmVhZG1lLXRhYid9IGlkPXsncmVhZG1lLXRhYid9IGxhYmVsPXt0KCd0YWIucmVhZG1lJyl9IC8+XG4gICAgICA8VGFiIGRhdGEtdGVzdGlkPXsnZGVwZW5kZW5jaWVzLXRhYid9IGlkPXsnZGVwZW5kZW5jaWVzLXRhYid9IGxhYmVsPXt0KCd0YWIuZGVwZW5kZW5jaWVzJyl9IC8+XG4gICAgICA8VGFiIGRhdGEtdGVzdGlkPXsndmVyc2lvbnMtdGFiJ30gaWQ9eyd2ZXJzaW9ucy10YWInfSBsYWJlbD17dCgndGFiLnZlcnNpb25zJyl9IC8+XG4gICAgICA8VGFiIGRhdGEtdGVzdGlkPXsndXBsaW5rcy10YWInfSBpZD17J3VwbGlua3MtdGFiJ30gbGFiZWw9e3QoJ3RhYi51cGxpbmtzJyl9IC8+XG4gICAgPC9UYWJzPlxuICApO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgRGV0YWlsQ29udGFpbmVyVGFicztcblxuY29uc3QgVGFicyA9IHN0eWxlZChNdWlUYWJzKTx7IHRoZW1lPzogVGhlbWUgfT4oe1xuICBtYXJnaW5Cb3R0b206IDE2LFxufSk7XG4iXX0= */",
58
56
  toString: _EMOTION_STRINGIFIED_CSS_ERROR__
59
57
  });
60
58
  //# sourceMappingURL=Tabs.js.map
@@ -0,0 +1,8 @@
1
+ declare const _default: {
2
+ title: string;
3
+ };
4
+ export default _default;
5
+ export declare const ApplicationStoryBook: any;
6
+ export declare const ApplicationjQuery: any;
7
+ export declare const ApplicationForbidden: any;
8
+ export declare const ApplicationNotFound: any;
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ declare const AppRoute: React.FC;
3
+ export default AppRoute;
@@ -0,0 +1,2 @@
1
+ import { Home } from '../../../index';
2
+ export default Home;
@@ -0,0 +1 @@
1
+ export { default } from './Home';
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ declare const Version: React.FC;
3
+ export default Version;
@@ -0,0 +1 @@
1
+ export { default } from './Version';
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ declare const Foebidden: React.FC;
3
+ export default Foebidden;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export { default } from './Forbidden';
@@ -22,6 +22,7 @@ export { default as Label } from './components/Label';
22
22
  export { default as Logo } from './components/Logo';
23
23
  export { default as MenuItem } from './components/MenuItem';
24
24
  export { default as NotFound } from './components/NotFound';
25
+ export { default as Forbidden } from './components/Forbidden';
25
26
  export { default as LoginDialog } from './components/LoginDialog';
26
27
  export { default as Search } from './components/Search';
27
28
  export { default as HeaderInfoDialog } from './components/HeaderInfoDialog';
@@ -4,3 +4,4 @@ declare const _default: {
4
4
  export default _default;
5
5
  export declare const DetailStorybook: any;
6
6
  export declare const DetailJquery: any;
7
+ export declare const DetailForbidden: any;
@@ -13,6 +13,15 @@ export declare const manifest: {
13
13
  } & {
14
14
  reducers: {
15
15
  notFound(state: {}): {
16
+ hasNotBeenFound: boolean;
17
+ forbidden: boolean;
18
+ manifest: undefined;
19
+ packageName: undefined;
20
+ packageVersion: undefined;
21
+ readme: undefined;
22
+ };
23
+ forbidden(state: {}): {
24
+ forbidden: boolean;
16
25
  hasNotBeenFound: boolean;
17
26
  manifest: undefined;
18
27
  packageName: undefined;
@@ -25,6 +34,7 @@ export declare const manifest: {
25
34
  isError(state: {}): {
26
35
  isError: boolean;
27
36
  hasNotBeenFound: boolean;
37
+ forbidden: boolean;
28
38
  manifest: undefined;
29
39
  packageName: undefined;
30
40
  packageVersion: undefined;
@@ -36,6 +46,7 @@ export declare const manifest: {
36
46
  packageVersion: any;
37
47
  readme: any;
38
48
  hasNotBeenFound: boolean;
49
+ forbidden: boolean;
39
50
  };
40
51
  };
41
52
  } & ({} | {
@@ -7,6 +7,8 @@ exports.default = void 0;
7
7
  exports.handleResponseType = handleResponseType;
8
8
  var _storage = _interopRequireDefault(require("./storage"));
9
9
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
10
+ class CustomError extends Error {}
11
+
10
12
  /**
11
13
  * Handles response according to content type
12
14
  * @param {object} response
@@ -31,7 +33,9 @@ function handleResponseType(response) {
31
33
  return Promise.all([response.ok, response.blob()]);
32
34
  }
33
35
  }
34
- return Promise.all([response.ok, response.text()]);
36
+
37
+ // error handling
38
+ return Promise.all([response.ok, response]);
35
39
  }
36
40
  const AuthHeader = 'Authorization';
37
41
  class API {
@@ -52,12 +56,14 @@ class API {
52
56
  signal: options.signal,
53
57
  ...options
54
58
  }).then(handleResponseType).then(response => {
55
- if (response[0]) {
56
- resolve(response[1]);
59
+ const [ok, data] = response;
60
+ if (ok === true) {
61
+ resolve(data);
57
62
  } else {
58
- // eslint-disable-next-line no-console
59
- console.error(response);
60
- reject(new Error('something went wrong'));
63
+ var _data$statusText, _data$status;
64
+ const error = new CustomError((_data$statusText = data === null || data === void 0 ? void 0 : data.statusText) !== null && _data$statusText !== void 0 ? _data$statusText : 'Unknown error');
65
+ error.code = (_data$status = data === null || data === void 0 ? void 0 : data.status) !== null && _data$status !== void 0 ? _data$status : 500;
66
+ reject(error);
61
67
  }
62
68
  }).catch(error => {
63
69
  reject(error);
@@ -29,6 +29,18 @@ const manifest = exports.manifest = (0, _core.createModel)()({
29
29
  return {
30
30
  ...state,
31
31
  hasNotBeenFound: true,
32
+ forbidden: false,
33
+ manifest: undefined,
34
+ packageName: undefined,
35
+ packageVersion: undefined,
36
+ readme: undefined
37
+ };
38
+ },
39
+ forbidden(state) {
40
+ return {
41
+ ...state,
42
+ forbidden: true,
43
+ hasNotBeenFound: false,
32
44
  manifest: undefined,
33
45
  packageName: undefined,
34
46
  packageVersion: undefined,
@@ -46,6 +58,7 @@ const manifest = exports.manifest = (0, _core.createModel)()({
46
58
  ...state,
47
59
  isError: true,
48
60
  hasNotBeenFound: false,
61
+ forbidden: false,
49
62
  manifest: undefined,
50
63
  packageName: undefined,
51
64
  packageVersion: undefined,
@@ -64,7 +77,8 @@ const manifest = exports.manifest = (0, _core.createModel)()({
64
77
  packageName,
65
78
  packageVersion,
66
79
  readme,
67
- hasNotBeenFound: false
80
+ hasNotBeenFound: false,
81
+ forbidden: false
68
82
  };
69
83
  }
70
84
  },
@@ -90,7 +104,11 @@ const manifest = exports.manifest = (0, _core.createModel)()({
90
104
  readme
91
105
  });
92
106
  } catch (error) {
93
- dispatch.manifest.notFound();
107
+ if (error.code === 404) {
108
+ dispatch.manifest.notFound();
109
+ } else {
110
+ dispatch.manifest.forbidden();
111
+ }
94
112
  }
95
113
  }
96
114
  })
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@verdaccio/ui-components",
3
- "version": "3.0.0-next-7.4",
3
+ "version": "3.0.0-next-7.6",
4
4
  "description": "theme ui component",
5
5
  "author": "Juan Picado <juanpicado19@gmail.com>",
6
6
  "license": "MIT",
@@ -40,6 +40,7 @@
40
40
  "react-redux": "8.1.3",
41
41
  "react-router": "5.3.4",
42
42
  "react-router-dom": "5.3.4",
43
+ "semver": "7.6.0",
43
44
  "react-virtualized": "9.22.5",
44
45
  "redux": "4.2.1",
45
46
  "validator": "13.11.0"
@@ -80,6 +81,7 @@
80
81
  "build:js": "babel src/ --out-dir build/ --copy-files --no-copy-ignored --extensions \".ts,.tsx\" --source-maps --ignore \"src/**/*.stories.tsx\" --ignore \"src/**/*.test.tsx\" --ignore \"src/**/*.test.ts\"",
81
82
  "watch": "babel src/ --out-dir build/ --watch --copy-files --no-copy-ignored --extensions \".ts,.tsx\" --source-maps --ignore \"src/**/*.stories.tsx\" --ignore \"src/**/*.test.tsx\" --ignore \"src/**/*.test.ts\"",
82
83
  "build": "pnpm run build:js && pnpm run build:types",
84
+ "netlify:ui:deploy": "npx netlify-cli deploy --dir=./packages/ui-components/storybook-static --prod",
83
85
  "start": "start-storybook -p 6006 -s ./public",
84
86
  "build-storybook": "build-storybook"
85
87
  }
@@ -0,0 +1,32 @@
1
+ import React from 'react';
2
+ import { MemoryRouter } from 'react-router';
3
+
4
+ import AppRoute from './AppRoute';
5
+
6
+ export default {
7
+ title: 'App/Main',
8
+ };
9
+
10
+ export const ApplicationStoryBook: any = () => (
11
+ <MemoryRouter initialEntries={[`/-/web/detail/storybook`]}>
12
+ <AppRoute />
13
+ </MemoryRouter>
14
+ );
15
+
16
+ export const ApplicationjQuery: any = () => (
17
+ <MemoryRouter initialEntries={[`/-/web/detail/jquery`]}>
18
+ <AppRoute />
19
+ </MemoryRouter>
20
+ );
21
+
22
+ export const ApplicationForbidden: any = () => (
23
+ <MemoryRouter initialEntries={[`/-/web/detail/JSONStream`]}>
24
+ <AppRoute />
25
+ </MemoryRouter>
26
+ );
27
+
28
+ export const ApplicationNotFound: any = () => (
29
+ <MemoryRouter initialEntries={[`/-/web/detail/kleur`]}>
30
+ <AppRoute />
31
+ </MemoryRouter>
32
+ );
@@ -0,0 +1,42 @@
1
+ import React from 'react';
2
+ import { Route as ReactRouterDomRoute, Switch } from 'react-router-dom';
3
+
4
+ import { NotFound, Route, VersionProvider, loadable } from '../index';
5
+
6
+ const VersionPage = loadable(() => import(/* webpackChunkName: "Version" */ './pages/Version'));
7
+ const Front = loadable(() => import(/* webpackChunkName: "Home" */ './pages/Front'));
8
+
9
+ const AppRoute: React.FC = () => {
10
+ return (
11
+ <Switch>
12
+ <ReactRouterDomRoute exact={true} path={Route.ROOT}>
13
+ <Front />
14
+ </ReactRouterDomRoute>
15
+ <ReactRouterDomRoute exact={true} path={Route.PACKAGE}>
16
+ <VersionProvider>
17
+ <VersionPage />
18
+ </VersionProvider>
19
+ </ReactRouterDomRoute>
20
+ <ReactRouterDomRoute exact={true} path={Route.PACKAGE_VERSION}>
21
+ <VersionProvider>
22
+ <VersionPage />
23
+ </VersionProvider>
24
+ </ReactRouterDomRoute>
25
+ <ReactRouterDomRoute exact={true} path={Route.SCOPE_PACKAGE_VERSION}>
26
+ <VersionProvider>
27
+ <VersionPage />
28
+ </VersionProvider>
29
+ </ReactRouterDomRoute>
30
+ <ReactRouterDomRoute exact={true} path={Route.SCOPE_PACKAGE}>
31
+ <VersionProvider>
32
+ <VersionPage />
33
+ </VersionProvider>
34
+ </ReactRouterDomRoute>
35
+ <ReactRouterDomRoute>
36
+ <NotFound />
37
+ </ReactRouterDomRoute>
38
+ </Switch>
39
+ );
40
+ };
41
+
42
+ export default AppRoute;
@@ -0,0 +1,3 @@
1
+ import { Home } from '../../../index';
2
+
3
+ export default Home;
@@ -0,0 +1 @@
1
+ export { default } from './Home';
@@ -0,0 +1,28 @@
1
+ import React from 'react';
2
+ import { useSelector } from 'react-redux';
3
+
4
+ import Forbidden from '../../../components/Forbidden';
5
+ import { Loading, NotFound, RootState, VersionLayout } from '../../../index';
6
+
7
+ const Version: React.FC = () => {
8
+ const manifestStore = useSelector((state: RootState) => state.manifest);
9
+ const isLoading = useSelector((state: RootState) => state?.loading?.models.manifest);
10
+
11
+ if (isLoading) {
12
+ return <Loading />;
13
+ }
14
+
15
+ // @ts-expect-error
16
+ if (manifestStore.forbidden) {
17
+ return <Forbidden />;
18
+ }
19
+
20
+ // @ts-expect-error
21
+ if (manifestStore.hasNotBeenFound) {
22
+ return <NotFound />;
23
+ }
24
+
25
+ return <VersionLayout />;
26
+ };
27
+
28
+ export default Version;
@@ -0,0 +1 @@
1
+ export { default } from './Version';
@@ -36,7 +36,7 @@ const themeModes = {
36
36
  },
37
37
  dark: {
38
38
  ...colors,
39
- primary: '#24394e',
39
+ primary: '#ffffff',
40
40
  secondary: '#424242',
41
41
  background: '#1A202C',
42
42
  },
@@ -23,7 +23,7 @@ const EngineItem: FC<EngineItemProps> = ({ title, element, engineText }) => (
23
23
  <Grid item={true} xs={6}>
24
24
  <List subheader={<StyledText variant={'subtitle1'}>{title}</StyledText>}>
25
25
  <EngineListItem>
26
- <Avatar sx={{ bgcolor: '#FFF' }}>{element}</Avatar>
26
+ <Avatar sx={{ bgcolor: 'transparent' }}>{element}</Avatar>
27
27
  <Typography variant="subtitle2">{engineText}</Typography>
28
28
  </EngineListItem>
29
29
  </List>
@@ -0,0 +1,38 @@
1
+ import React from 'react';
2
+ import { MemoryRouter } from 'react-router';
3
+
4
+ import { fireEvent, render, screen } from '../../test/test-react-testing-library';
5
+ import Forbidden from './Forbidden';
6
+
7
+ const mockHistory = jest.fn();
8
+
9
+ jest.mock('react-router-dom', () => ({
10
+ useHistory: () => ({
11
+ push: mockHistory,
12
+ }),
13
+ }));
14
+
15
+ describe('<Forbidden /> component', () => {
16
+ test('should load the component in default state', () => {
17
+ render(
18
+ <MemoryRouter>
19
+ <Forbidden />
20
+ </MemoryRouter>
21
+ );
22
+ expect(screen.getByTestId('LockIcon')).toBeInTheDocument();
23
+ expect(screen.getByText('error.401.sorry-no-access')).toBeInTheDocument();
24
+ expect(screen.getByText('button.go-to-the-home-page')).toBeInTheDocument();
25
+ });
26
+
27
+ test('go to Home Page button click', async () => {
28
+ const { getByTestId } = render(
29
+ <MemoryRouter>
30
+ <Forbidden />
31
+ </MemoryRouter>
32
+ );
33
+
34
+ const node = getByTestId('not-found-go-to-home-button');
35
+ fireEvent.click(node);
36
+ expect(mockHistory).toHaveBeenCalled();
37
+ });
38
+ });
@@ -0,0 +1,56 @@
1
+ /* eslint-disable react/forbid-component-props */
2
+
3
+ /* eslint-disable verdaccio/jsx-no-style */
4
+ import styled from '@emotion/styled';
5
+ import LockIcon from '@mui/icons-material/Lock';
6
+ import Box from '@mui/material/Box';
7
+ import Button from '@mui/material/Button';
8
+ import React, { useCallback } from 'react';
9
+ import { useTranslation } from 'react-i18next';
10
+ import { useHistory } from 'react-router-dom';
11
+
12
+ import { Theme } from '../..';
13
+ import Heading from '../Heading';
14
+
15
+ const Foebidden: React.FC = () => {
16
+ const history = useHistory();
17
+
18
+ const { t } = useTranslation();
19
+
20
+ const handleGoHome = useCallback(() => {
21
+ history.push('/');
22
+ }, [history]);
23
+
24
+ return (
25
+ <Box
26
+ alignItems="center"
27
+ data-testid="404"
28
+ display="flex"
29
+ flexDirection="column"
30
+ flexGrow={1}
31
+ justifyContent="center"
32
+ p={2}
33
+ >
34
+ <Container>
35
+ <LockIcon color="primary" style={{ fontSize: 236 }} />
36
+ </Container>
37
+ <StyledHeading className="not-found-text" variant="h4">
38
+ {t('error.401.sorry-no-access')}
39
+ </StyledHeading>
40
+ <Button data-testid="not-found-go-to-home-button" onClick={handleGoHome} variant="contained">
41
+ {t('button.go-to-the-home-page')}
42
+ </Button>
43
+ </Box>
44
+ );
45
+ };
46
+
47
+ export default Foebidden;
48
+
49
+ const Container = styled('div')({
50
+ margin: '0 auto',
51
+ });
52
+
53
+ const StyledHeading = styled(Heading)<{ theme?: Theme }>(({ theme }) => ({
54
+ color: theme?.palette.mode === 'light' ? theme?.palette.primary.main : theme?.palette.white,
55
+ marginBottom: 16,
56
+ }));
@@ -0,0 +1 @@
1
+ export { default } from './Forbidden';
@@ -23,6 +23,7 @@ const InstallListItemText = styled(ListItemText)({
23
23
 
24
24
  const PackageMangerAvatar = styled(Avatar)({
25
25
  borderRadius: '0px',
26
+ backgroundColor: 'transparent',
26
27
  padding: 0,
27
28
  });
28
29