@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.
- package/CHANGELOG.md +12 -0
- package/build/AppTest/AppRoute.js +34 -0
- package/build/AppTest/pages/Front/Home.js +9 -0
- package/build/AppTest/pages/Front/index.js +14 -0
- package/build/AppTest/pages/Version/Version.js +34 -0
- package/build/AppTest/pages/Version/index.js +14 -0
- package/build/Theme/theme.js +1 -1
- package/build/components/Engines/Engines.js +1 -1
- package/build/components/Forbidden/Forbidden.js +75 -0
- package/build/components/Forbidden/index.js +14 -0
- package/build/components/Install/InstallListItem.js +7 -7
- package/build/components/NotFound/NotFound.js +16 -14
- package/build/components/Repository/Repository.js +9 -9
- package/build/components/Versions/HistoryList.js +26 -22
- package/build/components/Versions/Versions.js +41 -10
- package/build/index.js +8 -0
- package/build/sections/Detail/Tabs.js +1 -3
- package/build/src/AppTest/App.stories.d.ts +8 -0
- package/build/src/AppTest/AppRoute.d.ts +3 -0
- package/build/src/AppTest/pages/Front/Home.d.ts +2 -0
- package/build/src/AppTest/pages/Front/index.d.ts +1 -0
- package/build/src/AppTest/pages/Version/Version.d.ts +3 -0
- package/build/src/AppTest/pages/Version/index.d.ts +1 -0
- package/build/src/components/Forbidden/Forbidden.d.ts +3 -0
- package/build/src/components/Forbidden/Forbidden.test.d.ts +1 -0
- package/build/src/components/Forbidden/index.d.ts +1 -0
- package/build/src/index.d.ts +1 -0
- package/build/src/sections/Detail/Detail.stories.d.ts +1 -0
- package/build/src/store/models/manifest.d.ts +11 -0
- package/build/store/api.js +12 -6
- package/build/store/models/manifest.js +20 -2
- package/package.json +3 -1
- package/src/AppTest/App.stories.tsx +32 -0
- package/src/AppTest/AppRoute.tsx +42 -0
- package/src/AppTest/pages/Front/Home.ts +3 -0
- package/src/AppTest/pages/Front/index.ts +1 -0
- package/src/AppTest/pages/Version/Version.tsx +28 -0
- package/src/AppTest/pages/Version/index.ts +1 -0
- package/src/Theme/theme.ts +1 -1
- package/src/components/Engines/Engines.tsx +1 -1
- package/src/components/Forbidden/Forbidden.test.tsx +38 -0
- package/src/components/Forbidden/Forbidden.tsx +56 -0
- package/src/components/Forbidden/index.ts +1 -0
- package/src/components/Install/InstallListItem.tsx +1 -0
- package/src/components/NotFound/NotFound.tsx +6 -5
- package/src/components/NotFound/Notfound.test.tsx +6 -3
- package/src/components/Repository/Repository.tsx +1 -3
- package/src/components/Versions/HistoryList.tsx +2 -2
- package/src/components/Versions/Versions.test.tsx +24 -8
- package/src/components/Versions/Versions.tsx +46 -18
- package/src/index.ts +1 -0
- package/src/sections/Detail/Detail.stories.tsx +10 -0
- package/src/sections/Detail/Tabs.tsx +1 -7
- package/src/store/api.test.ts +3 -2
- package/src/store/api.ts +13 -6
- 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 =>
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
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
|
|
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
|
|
36
|
-
|
|
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,
|
|
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(
|
|
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:
|
|
56
|
-
}))
|
|
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,
|
|
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 @@
|
|
|
1
|
+
export { default } from './Home';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default } from './Version';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default } from './Forbidden';
|
package/build/src/index.d.ts
CHANGED
|
@@ -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';
|
|
@@ -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
|
} & ({} | {
|
package/build/store/api.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
56
|
-
|
|
59
|
+
const [ok, data] = response;
|
|
60
|
+
if (ok === true) {
|
|
61
|
+
resolve(data);
|
|
57
62
|
} else {
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
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
|
-
|
|
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.
|
|
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 @@
|
|
|
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';
|
package/src/Theme/theme.ts
CHANGED
|
@@ -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: '
|
|
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';
|