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

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 (302) hide show
  1. package/.eslintrc +1 -1
  2. package/CHANGELOG.md +12 -0
  3. package/build/Theme/theme.js +3 -3
  4. package/build/components/ActionBar/ActionBar.js +3 -1
  5. package/build/components/ActionBar/ActionBarAction.js +7 -6
  6. package/build/components/Author/Author.js +13 -42
  7. package/build/components/CopyClipboard/utils.js +3 -12
  8. package/build/components/Dependencies/Dependencies.js +27 -18
  9. package/build/components/Dependencies/DependencyBlock.js +34 -19
  10. package/build/components/Developers/DeveloperType.js +12 -0
  11. package/build/components/Developers/Developers.js +20 -22
  12. package/build/components/Developers/Title.js +5 -9
  13. package/build/components/Developers/index.js +4 -4
  14. package/build/components/Distribution/Dist.js +1 -1
  15. package/build/components/Distribution/styles.js +10 -23
  16. package/build/components/Engines/Engines.js +7 -1
  17. package/build/components/Engines/styles.js +6 -6
  18. package/build/components/FundButton/FundButton.js +7 -8
  19. package/build/components/HeaderInfoDialog/HeaderInfoDialog.js +2 -1
  20. package/build/components/Icons/DevsIcons/CommonJS.js +1 -12
  21. package/build/components/Icons/DevsIcons/ES6Module.js +2 -13
  22. package/build/components/Icons/DevsIcons/Git.js +1 -12
  23. package/build/components/Icons/DevsIcons/NodeJS.js +1 -12
  24. package/build/components/Icons/DevsIcons/TypeScript.js +1 -12
  25. package/build/components/Icons/FileBinary.js +11 -5
  26. package/build/components/Icons/Law.js +12 -6
  27. package/build/components/Icons/Managers/Npm.js +1 -12
  28. package/build/components/Icons/Managers/Pnpm.js +1 -12
  29. package/build/components/Icons/Managers/Yarn.js +1 -12
  30. package/build/components/Install/Install.js +23 -18
  31. package/build/components/Install/InstallListItem.js +19 -18
  32. package/build/components/Keywords/KeywordListItems.js +34 -0
  33. package/build/components/Keywords/Keywords.js +39 -0
  34. package/build/{sections/Header/RegistryInfoDialog → components/Keywords}/index.js +2 -2
  35. package/build/components/Link/Link.js +4 -16
  36. package/build/components/Link/index.js +1 -1
  37. package/build/components/LinkExternal/LinkExternal.js +32 -0
  38. package/build/components/LinkExternal/index.js +14 -0
  39. package/build/components/Loading/styles.js +3 -2
  40. package/build/components/LoginDialog/LoginDialog.js +12 -1
  41. package/build/components/LoginDialog/LoginDialogCloseButton.js +3 -2
  42. package/build/components/LoginDialog/LoginDialogForm.js +2 -14
  43. package/build/components/LoginDialog/LoginDialogFormError.js +3 -2
  44. package/build/components/Logo/Logo.js +13 -6
  45. package/build/components/Package/Package.js +43 -34
  46. package/build/components/Package/styles.js +46 -58
  47. package/build/components/Person/Person.js +48 -0
  48. package/build/components/Person/PersonTooltip.js +22 -0
  49. package/build/components/{Package/Tag → Person}/index.js +2 -2
  50. package/build/components/Person/utils.js +17 -0
  51. package/build/components/RawViewer/RawViewer.js +11 -5
  52. package/build/components/Readme/Readme.js +15 -6
  53. package/build/components/Readme/Readme.js.map +1 -1
  54. package/build/components/Readme/Readme.spec.js +19 -0
  55. package/build/components/Readme/Readme.spec.js.map +1 -1
  56. package/build/components/Readme/utils.js +2 -5
  57. package/build/components/RegistryInfoDialog/styles.js +9 -10
  58. package/build/components/Repository/Repository.js +19 -31
  59. package/build/components/Search/AutoComplete/styles.js +4 -41
  60. package/build/components/Search/Search.js +4 -2
  61. package/build/components/Search/SearchItem.js +51 -38
  62. package/build/components/Search/utils.js +23 -0
  63. package/build/components/SettingsMenu/SettingsMenu.js +35 -9
  64. package/build/components/SideBarTitle/SideBarTitle.js +16 -6
  65. package/build/components/UpLinks/UpLinks.js +35 -6
  66. package/build/components/UpLinks/UplinkLink.js +22 -0
  67. package/build/components/UpLinks/styles.js +5 -4
  68. package/build/components/Versions/HistoryList.js +8 -5
  69. package/build/components/Versions/TagList.js +8 -4
  70. package/build/components/Versions/Versions.js +30 -7
  71. package/build/index.js +27 -3
  72. package/build/providers/AppConfigurationProvider/AppConfigurationProvider.js +1 -0
  73. package/build/providers/PersistenceSettingProvider/PersistenceSettingProvider.js +1 -0
  74. package/build/sections/Detail/Detail.js +6 -2
  75. package/build/sections/Detail/Tabs.js +4 -3
  76. package/build/sections/Footer/Footer.js +17 -8
  77. package/build/sections/Footer/styles.js +13 -10
  78. package/build/sections/Header/HeaderLeft.js +14 -17
  79. package/build/sections/Header/HeaderMenu.js +1 -1
  80. package/build/sections/Header/HeaderRight.js +12 -3
  81. package/build/sections/Header/HeaderSettingsDialog.js +2 -2
  82. package/build/sections/Header/styles.js +43 -82
  83. package/build/sections/SideBar/Sidebar.js +10 -15
  84. package/build/src/Theme/ThemeProvider.test.d.ts +1 -0
  85. package/build/src/components/Author/Author.d.ts +0 -5
  86. package/build/src/components/CopyClipboard/CopyToClipBoard.test.d.ts +1 -0
  87. package/build/src/components/Dependencies/Dependencies.d.ts +0 -1
  88. package/build/src/components/Developers/DeveloperType.d.ts +4 -0
  89. package/build/src/components/Developers/Developers.d.ts +1 -4
  90. package/build/src/components/Developers/Title.d.ts +1 -4
  91. package/build/src/components/Developers/index.d.ts +2 -1
  92. package/build/src/components/Distribution/styles.d.ts +0 -1
  93. package/build/src/components/ErrorBoundary/ErrorBoundary.test.d.ts +1 -0
  94. package/build/src/components/HeaderInfoDialog/HeaderInfoDialog.test.d.ts +1 -0
  95. package/build/src/components/Heading/Heading.test.d.ts +1 -0
  96. package/build/src/components/Icons/Icons.test.d.ts +1 -0
  97. package/build/src/components/Install/InstallListItem.d.ts +1 -1
  98. package/build/src/components/Keywords/KeywordListItems.d.ts +5 -0
  99. package/build/src/components/Keywords/Keywords.d.ts +6 -0
  100. package/build/src/components/Keywords/Keywords.stories.d.ts +5 -0
  101. package/build/src/components/Keywords/Keywords.test.d.ts +1 -0
  102. package/build/src/components/Keywords/index.d.ts +1 -0
  103. package/build/src/components/Link/Link.d.ts +0 -3
  104. package/build/src/components/Link/Link.test.d.ts +1 -0
  105. package/build/src/components/Link/index.d.ts +1 -1
  106. package/build/src/components/LinkExternal/LinkExternal.d.ts +3 -0
  107. package/build/src/components/LinkExternal/LinkExternal.test.d.ts +1 -0
  108. package/build/src/components/LinkExternal/index.d.ts +1 -0
  109. package/build/src/components/Logo/Logo.d.ts +1 -0
  110. package/build/src/components/Logo/Logo.stories.d.ts +5 -0
  111. package/build/src/components/Package/Package.d.ts +1 -1
  112. package/build/src/components/Package/styles.d.ts +0 -8
  113. package/build/src/components/Person/Person.d.ts +9 -0
  114. package/build/src/components/Person/Person.test.d.ts +1 -0
  115. package/build/src/components/Person/PersonTooltip.d.ts +6 -0
  116. package/build/src/components/Person/index.d.ts +1 -0
  117. package/build/src/components/Person/utils.d.ts +3 -0
  118. package/build/src/components/Readme/Readme.d.ts +0 -1
  119. package/build/src/components/Search/AutoComplete/styles.d.ts +0 -8
  120. package/build/src/components/Search/utils.d.ts +1 -0
  121. package/build/src/components/SettingsMenu/SettingsMenu.d.ts +2 -2
  122. package/build/src/components/SettingsMenu/SettingsMenu.test.d.ts +1 -0
  123. package/build/src/components/UpLinks/UplinkLink.d.ts +6 -0
  124. package/build/src/components/Versions/Versions.d.ts +1 -0
  125. package/build/src/index.d.ts +4 -1
  126. package/build/src/sections/Detail/Tabs.d.ts +1 -0
  127. package/build/src/sections/Header/styles.d.ts +0 -7
  128. package/build/src/store/models/routes.d.ts +8 -0
  129. package/build/src/store/models/utils.d.ts +1 -0
  130. package/build/src/types/packageMeta.d.ts +7 -5
  131. package/build/src/utils/routes.d.ts +1 -0
  132. package/build/src/utils/utils.d.ts +1 -0
  133. package/build/store/models/configuration.js +2 -1
  134. package/build/store/models/login.js +4 -2
  135. package/build/store/models/manifest.js +5 -3
  136. package/build/store/models/packages.js +4 -2
  137. package/build/store/models/routes.js +18 -0
  138. package/build/store/models/search.js +4 -2
  139. package/build/store/models/utils.js +10 -0
  140. package/build/utils/routes.js +1 -0
  141. package/build/utils/utils.js +20 -1
  142. package/package.json +4 -4
  143. package/src/AppTest/AppRoute.test.tsx +65 -0
  144. package/src/Theme/ThemeProvider.test.tsx +27 -0
  145. package/src/Theme/theme.ts +3 -3
  146. package/src/components/ActionBar/ActionBar.test.tsx +36 -15
  147. package/src/components/ActionBar/ActionBar.tsx +1 -1
  148. package/src/components/ActionBar/ActionBarAction.tsx +8 -5
  149. package/src/components/Author/Author.test.tsx +7 -1
  150. package/src/components/Author/Author.tsx +3 -41
  151. package/src/components/CopyClipboard/CopyToClipBoard.test.tsx +23 -0
  152. package/src/components/CopyClipboard/utils.ts +2 -13
  153. package/src/components/Dependencies/Dependencies.stories.tsx +11 -11
  154. package/src/components/Dependencies/Dependencies.tsx +28 -25
  155. package/src/components/Dependencies/DependencyBlock.test.tsx +19 -6
  156. package/src/components/Dependencies/DependencyBlock.tsx +28 -14
  157. package/src/components/Developers/DeveloperType.tsx +4 -0
  158. package/src/components/Developers/Developers.test.tsx +37 -10
  159. package/src/components/Developers/Developers.tsx +13 -13
  160. package/src/components/Developers/Title.tsx +1 -5
  161. package/src/components/Developers/index.ts +2 -1
  162. package/src/components/Distribution/Dist.test.tsx +1 -1
  163. package/src/components/Distribution/Dist.tsx +2 -4
  164. package/src/components/Distribution/styles.ts +0 -6
  165. package/src/components/Engines/Engines.tsx +6 -2
  166. package/src/components/Engines/styles.ts +1 -1
  167. package/src/components/ErrorBoundary/ErrorBoundary.test.tsx +39 -0
  168. package/src/components/FundButton/FundButton.tsx +5 -5
  169. package/src/components/HeaderInfoDialog/HeaderInfoDialog.test.tsx +51 -0
  170. package/src/components/HeaderInfoDialog/HeaderInfoDialog.tsx +2 -2
  171. package/src/components/Heading/Heading.test.tsx +20 -0
  172. package/src/components/Icons/DevsIcons/CommonJS.tsx +1 -7
  173. package/src/components/Icons/DevsIcons/ES6Module.tsx +2 -8
  174. package/src/components/Icons/DevsIcons/Git.tsx +1 -7
  175. package/src/components/Icons/DevsIcons/NodeJS.tsx +1 -7
  176. package/src/components/Icons/DevsIcons/TypeScript.tsx +1 -7
  177. package/src/components/Icons/FileBinary.tsx +2 -1
  178. package/src/components/Icons/Icons.stories.tsx +21 -5
  179. package/src/components/Icons/Icons.test.tsx +70 -0
  180. package/src/components/Icons/Law.tsx +2 -1
  181. package/src/components/Icons/Managers/Npm.tsx +1 -7
  182. package/src/components/Icons/Managers/Pnpm.tsx +1 -7
  183. package/src/components/Icons/Managers/Yarn.tsx +1 -7
  184. package/src/components/Install/Install.test.tsx +54 -13
  185. package/src/components/Install/Install.tsx +12 -11
  186. package/src/components/Install/InstallListItem.tsx +12 -11
  187. package/src/components/Keywords/KeywordListItems.tsx +22 -0
  188. package/src/components/Keywords/Keywords.stories.tsx +19 -0
  189. package/src/components/Keywords/Keywords.test.tsx +57 -0
  190. package/src/components/Keywords/Keywords.tsx +35 -0
  191. package/src/components/Keywords/index.ts +1 -0
  192. package/src/components/Link/Link.test.tsx +25 -0
  193. package/src/components/Link/Link.tsx +4 -18
  194. package/src/components/Link/index.ts +1 -1
  195. package/src/components/LinkExternal/LinkExternal.test.tsx +18 -0
  196. package/src/components/LinkExternal/LinkExternal.tsx +22 -0
  197. package/src/components/LinkExternal/index.ts +1 -0
  198. package/src/components/Loading/Loading.test.tsx +8 -5
  199. package/src/components/Loading/styles.ts +1 -0
  200. package/src/components/LoginDialog/LoginDialog.test.tsx +1 -1
  201. package/src/components/LoginDialog/LoginDialog.tsx +10 -1
  202. package/src/components/LoginDialog/LoginDialogCloseButton.tsx +1 -0
  203. package/src/components/LoginDialog/LoginDialogForm.tsx +0 -2
  204. package/src/components/LoginDialog/LoginDialogFormError.tsx +1 -1
  205. package/src/components/Logo/Logo.stories.tsx +16 -0
  206. package/src/components/Logo/Logo.test.tsx +8 -1
  207. package/src/components/Logo/Logo.tsx +19 -3
  208. package/src/components/Package/Package.test.tsx +47 -14
  209. package/src/components/Package/Package.tsx +41 -44
  210. package/src/components/Package/styles.ts +7 -17
  211. package/src/components/PackageList/Packagelist.test.tsx +1 -0
  212. package/src/components/Person/Person.test.tsx +50 -0
  213. package/src/components/Person/Person.tsx +45 -0
  214. package/src/components/Person/PersonTooltip.tsx +26 -0
  215. package/src/components/Person/index.ts +1 -0
  216. package/src/components/Person/utils.ts +20 -0
  217. package/src/components/RawViewer/RawViewer.tsx +8 -4
  218. package/src/components/Readme/Readme.spec.tsx +17 -0
  219. package/src/components/Readme/Readme.tsx +10 -5
  220. package/src/components/Readme/utils.ts +2 -5
  221. package/src/components/RegistryInfoDialog/styles.ts +5 -4
  222. package/src/components/Repository/Repository.tsx +9 -14
  223. package/src/components/Search/AutoComplete/styles.ts +7 -0
  224. package/src/components/Search/Search.test.tsx +36 -9
  225. package/src/components/Search/Search.tsx +4 -2
  226. package/src/components/Search/SearchItem.tsx +19 -8
  227. package/src/components/Search/utils.ts +17 -0
  228. package/src/components/SettingsMenu/SettingsMenu.test.tsx +41 -0
  229. package/src/components/SettingsMenu/SettingsMenu.tsx +48 -10
  230. package/src/components/SideBarTitle/SideBarTitle.tsx +19 -3
  231. package/src/components/UpLinks/UpLinks.test.tsx +7 -0
  232. package/src/components/UpLinks/UpLinks.tsx +38 -15
  233. package/src/components/UpLinks/UplinkLink.tsx +20 -0
  234. package/src/components/UpLinks/styles.ts +1 -0
  235. package/src/components/Versions/HistoryList.tsx +9 -4
  236. package/src/components/Versions/TagList.tsx +4 -3
  237. package/src/components/Versions/Versions.test.tsx +2 -0
  238. package/src/components/Versions/Versions.tsx +57 -32
  239. package/src/index.ts +4 -1
  240. package/src/providers/AppConfigurationProvider/AppConfigurationProvider.tsx +1 -0
  241. package/src/providers/PersistenceSettingProvider/PersistenceSettingProvider.tsx +2 -0
  242. package/src/providers/VersionProvider/VersionProvider.test.tsx +3 -3
  243. package/src/sections/Detail/Detail.test.tsx +8 -1
  244. package/src/sections/Detail/Detail.tsx +11 -4
  245. package/src/sections/Detail/Tabs.tsx +5 -2
  246. package/src/sections/Footer/Footer.tsx +15 -4
  247. package/src/sections/Footer/styles.ts +4 -0
  248. package/src/sections/Header/Header.test.tsx +12 -10
  249. package/src/sections/Header/HeaderLeft.tsx +19 -11
  250. package/src/sections/Header/HeaderMenu.tsx +1 -1
  251. package/src/sections/Header/HeaderRight.tsx +14 -3
  252. package/src/sections/Header/HeaderSettingsDialog.tsx +1 -1
  253. package/src/sections/Header/RegistryInfoContent/RegistryInfoContent.test.tsx +1 -1
  254. package/src/sections/Header/styles.ts +4 -16
  255. package/src/sections/Home/Home.test.tsx +12 -4
  256. package/src/sections/SideBar/Sidebar.test.tsx +20 -13
  257. package/src/sections/SideBar/Sidebar.tsx +5 -9
  258. package/src/store/api.test.ts +16 -0
  259. package/src/store/models/configuration.ts +2 -1
  260. package/src/store/models/login.ts +10 -12
  261. package/src/store/models/manifest.ts +6 -5
  262. package/src/store/models/packages.ts +4 -5
  263. package/src/store/models/routes.ts +10 -0
  264. package/src/store/models/search.ts +4 -2
  265. package/src/store/models/utils.ts +3 -0
  266. package/src/types/packageMeta.ts +7 -5
  267. package/src/utils/routes.ts +1 -0
  268. package/src/utils/utils.test.ts +34 -0
  269. package/src/utils/utils.ts +20 -5
  270. package/tsconfig.json +1 -1
  271. package/build/components/Developers/styles.js +0 -65
  272. package/build/components/Distribution/utils.js +0 -25
  273. package/build/components/Distribution/utilts.spec.js +0 -18
  274. package/build/components/Package/Tag/Tag.js +0 -14
  275. package/build/components/Package/Tag/styles.js +0 -24
  276. package/build/sections/Header/RegistryInfoDialog/RegistryInfoDialog.js +0 -36
  277. package/build/sections/Header/RegistryInfoDialog/styles.js +0 -46
  278. package/build/sections/Header/RegistryInfoDialog/types.js +0 -6
  279. package/build/src/components/Developers/styles.d.ts +0 -11
  280. package/build/src/components/Distribution/utils.d.ts +0 -7
  281. package/build/src/components/Package/Tag/Tag.d.ts +0 -6
  282. package/build/src/components/Package/Tag/index.d.ts +0 -1
  283. package/build/src/components/Package/Tag/styles.d.ts +0 -5
  284. package/build/src/sections/Header/RegistryInfoDialog/RegistryInfoDialog.d.ts +0 -4
  285. package/build/src/sections/Header/RegistryInfoDialog/index.d.ts +0 -1
  286. package/build/src/sections/Header/RegistryInfoDialog/styles.d.ts +0 -13
  287. package/build/src/sections/Header/RegistryInfoDialog/types.d.ts +0 -7
  288. package/src/components/Developers/styles.ts +0 -31
  289. package/src/components/Distribution/utils.ts +0 -32
  290. package/src/components/Distribution/utilts.spec.ts +0 -17
  291. package/src/components/Package/Tag/Tag.test.tsx +0 -15
  292. package/src/components/Package/Tag/Tag.tsx +0 -11
  293. package/src/components/Package/Tag/index.ts +0 -1
  294. package/src/components/Package/Tag/styles.ts +0 -11
  295. package/src/components/Search/AutoComplete/styles.tsx +0 -42
  296. package/src/sections/Header/RegistryInfoDialog/RegistryInfoDialog.tsx +0 -31
  297. package/src/sections/Header/RegistryInfoDialog/index.ts +0 -1
  298. package/src/sections/Header/RegistryInfoDialog/styles.ts +0 -21
  299. package/src/sections/Header/RegistryInfoDialog/types.ts +0 -8
  300. /package/build/components/Icons/DevsIcons/{es6modules.svg → es6module.svg} +0 -0
  301. /package/build/src/{components/Package/Tag/Tag.test.d.ts → AppTest/AppRoute.test.d.ts} +0 -0
  302. /package/src/components/Icons/DevsIcons/{es6modules.svg → es6module.svg} +0 -0
@@ -1,11 +1,11 @@
1
1
  import Button from '@mui/material/Button';
2
+ import Toolbar from '@mui/material/Toolbar';
2
3
  import React, { MouseEvent, useEffect, useState } from 'react';
3
4
  import { useTranslation } from 'react-i18next';
4
5
 
5
6
  import { useCustomTheme } from '../../';
6
7
  import HeaderMenu from './HeaderMenu';
7
8
  import HeaderToolTip from './HeaderToolTip';
8
- import { RightSide } from './styles';
9
9
 
10
10
  interface Props {
11
11
  showSearch?: boolean;
@@ -75,7 +75,18 @@ const HeaderRight: React.FC<Props> = ({
75
75
  };
76
76
 
77
77
  return (
78
- <RightSide data-testid="header-right">
78
+ <Toolbar
79
+ data-testid="header-right"
80
+ sx={{
81
+ display: 'flex',
82
+ padding: 0,
83
+ marginRight: 0,
84
+ '@media (min-width: 600px)': {
85
+ padding: 0,
86
+ marginRight: 0,
87
+ },
88
+ }}
89
+ >
79
90
  {showSearch === true && (
80
91
  <HeaderToolTip
81
92
  onClick={onToggleMobileNav}
@@ -124,7 +135,7 @@ const HeaderRight: React.FC<Props> = ({
124
135
  )}
125
136
  </>
126
137
  )}
127
- </RightSide>
138
+ </Toolbar>
128
139
  );
129
140
  };
130
141
 
@@ -9,9 +9,9 @@ import ReactMarkdown from 'react-markdown';
9
9
  import { useSelector } from 'react-redux';
10
10
 
11
11
  import { RootState, Theme } from '../../';
12
+ import RegistryInfoDialog from '../../components/RegistryInfoDialog';
12
13
  import LanguageSwitch from './LanguageSwitch';
13
14
  import RegistryInfoContent from './RegistryInfoContent';
14
- import RegistryInfoDialog from './RegistryInfoDialog';
15
15
 
16
16
  interface Props {
17
17
  isOpen: boolean;
@@ -13,7 +13,7 @@ describe('<RegistryInfoContent /> component', () => {
13
13
  expect(screen.getByText('packageManagers.description')).toBeInTheDocument();
14
14
  });
15
15
 
16
- test('should load the appropiate tab content when the tab is clicked', () => {
16
+ test('should load the appropiate tab content when the tab is clicked', () => {
17
17
  const props = { registryUrl: 'http://localhost:4872', scope: '@' };
18
18
  render(<RegistryInfoContent registryUrl={props.registryUrl} scope={props.scope} />);
19
19
 
@@ -4,27 +4,18 @@ import AppBar from '@mui/material/AppBar';
4
4
  import IconButton from '@mui/material/IconButton';
5
5
  import Toolbar from '@mui/material/Toolbar';
6
6
 
7
- import { Link, Theme } from '../../';
7
+ import { Theme } from '../../Theme';
8
8
 
9
9
  export const InnerNavBar = styled(Toolbar)({
10
10
  justifyContent: 'space-between',
11
11
  alignItems: 'center',
12
- padding: '0 15px',
12
+ padding: 0,
13
13
  });
14
14
 
15
15
  export const Greetings = styled('span')({
16
16
  margin: '0 5px 0 0',
17
17
  });
18
18
 
19
- export const RightSide = styled(Toolbar)({
20
- display: 'flex',
21
- padding: 0,
22
- });
23
-
24
- export const LeftSide = styled(RightSide)({
25
- flex: 1,
26
- });
27
-
28
19
  export const MobileNavBar = styled('div')<{ theme?: Theme }>((props) => ({
29
20
  alignItems: 'center',
30
21
  display: 'flex',
@@ -50,6 +41,7 @@ export const SettingsButtom = styled(IconButton)({});
50
41
  export const SearchWrapper = styled('div')({
51
42
  display: 'none',
52
43
  width: '100%',
44
+ marginLeft: 20,
53
45
  });
54
46
 
55
47
  export const NavBar = styled(AppBar)<{ theme?: Theme }>(({ theme }) => ({
@@ -83,7 +75,7 @@ export const NavBar = styled(AppBar)<{ theme?: Theme }>(({ theme }) => ({
83
75
  `,
84
76
  [`@media (min-width: ${theme?.breakPoints.large}px)`]: css`
85
77
  ${InnerNavBar} {
86
- padding: 0 20px;
78
+ padding: 0 16px;
87
79
  }
88
80
  `,
89
81
  [`@media (min-width: ${theme?.breakPoints.xlarge}px)`]: css`
@@ -94,7 +86,3 @@ export const NavBar = styled(AppBar)<{ theme?: Theme }>(({ theme }) => ({
94
86
  }
95
87
  `,
96
88
  }));
97
-
98
- export const StyledLink = styled(Link)<{ theme?: Theme }>(({ theme }) => ({
99
- color: theme?.palette.white,
100
- }));
@@ -2,7 +2,7 @@ import React from 'react';
2
2
  import { MemoryRouter } from 'react-router';
3
3
 
4
4
  import { store } from '../../store';
5
- import { renderWithStore, screen, waitFor } from '../../test/test-react-testing-library';
5
+ import { act, renderWithStore, screen, waitFor } from '../../test/test-react-testing-library';
6
6
  import Home from './Home';
7
7
 
8
8
  // force the windows to expand to display items
@@ -10,20 +10,28 @@ import Home from './Home';
10
10
  jest.spyOn(HTMLElement.prototype, 'offsetHeight', 'get').mockReturnValue(600);
11
11
  jest.spyOn(HTMLElement.prototype, 'offsetWidth', 'get').mockReturnValue(600);
12
12
 
13
- const ComponentSideBar: React.FC = () => (
13
+ const ComponentHome: React.FC = () => (
14
14
  <MemoryRouter>
15
15
  <Home />
16
16
  </MemoryRouter>
17
17
  );
18
18
 
19
19
  describe('Home', () => {
20
+ afterEach(() => {
21
+ jest.clearAllMocks();
22
+ });
23
+
20
24
  test('should render titles', async () => {
21
- renderWithStore(<ComponentSideBar />, store);
25
+ act(() => {
26
+ renderWithStore(<ComponentHome />, store);
27
+ });
22
28
  await waitFor(() => expect(screen.getAllByTestId('package-item-list')).toHaveLength(5));
23
29
  });
24
30
 
25
31
  test('should render loading', async () => {
26
- renderWithStore(<ComponentSideBar />, store);
32
+ act(() => {
33
+ renderWithStore(<ComponentHome />, store);
34
+ });
27
35
  await waitFor(() => expect(screen.getByTestId('loading')).toBeInTheDocument());
28
36
  });
29
37
  });
@@ -3,7 +3,7 @@ import { MemoryRouter } from 'react-router';
3
3
 
4
4
  import { VersionProvider } from '../../providers';
5
5
  import { store } from '../../store';
6
- import { renderWithStore, screen, waitFor } from '../../test/test-react-testing-library';
6
+ import { act, renderWithStore, screen, waitFor } from '../../test/test-react-testing-library';
7
7
  import Sidebar from './Sidebar';
8
8
 
9
9
  jest.mock('marked');
@@ -31,37 +31,44 @@ describe('Sidebar', () => {
31
31
  jest.clearAllMocks();
32
32
  });
33
33
  test('should render titles', async () => {
34
- renderWithStore(<ComponentSideBar />, store);
35
- await waitFor(() => expect(screen.getByText('jquery')).toBeInTheDocument());
34
+ act(() => {
35
+ renderWithStore(<ComponentSideBar />, store);
36
+ });
37
+ await waitFor(() => expect(screen.getAllByText('jquery')).toHaveLength(2));
36
38
 
37
- expect(screen.getByText(`jquery`)).toBeInTheDocument();
38
39
  expect(screen.getByText(`sidebar.detail.latest-version`, { exact: false })).toBeInTheDocument();
39
40
  expect(
40
- screen.getByText(`sidebar.detail.published a year ago`, { exact: false })
41
+ screen.getByText(/sidebar.detail.published .*years? ago/i, { exact: false })
41
42
  ).toBeInTheDocument();
42
43
  expect(screen.getByText(`sidebar.installation.title`, { exact: false })).toBeInTheDocument();
43
44
  });
44
45
 
45
46
  test('should render commonJS', async () => {
46
- renderWithStore(<ComponentSideBar />, store);
47
-
48
- await waitFor(() => expect(screen.getByText('jquery')).toBeInTheDocument());
47
+ act(() => {
48
+ renderWithStore(<ComponentSideBar />, store);
49
+ });
50
+ // package name + keyword
51
+ await waitFor(() => expect(screen.getAllByText('jquery')).toHaveLength(2));
49
52
  expect(screen.getByAltText('commonjs')).toBeInTheDocument();
50
53
  });
51
54
 
52
55
  test('should render typescript', async () => {
53
56
  mockPkgName.mockReturnValue('glob');
54
- renderWithStore(<ComponentSideBar />, store);
55
-
57
+ act(() => {
58
+ renderWithStore(<ComponentSideBar />, store);
59
+ });
60
+ // just package name
56
61
  await waitFor(() => expect(screen.getByText('glob')).toBeInTheDocument());
57
62
  expect(screen.getByAltText('typescript')).toBeInTheDocument();
58
63
  });
59
64
 
60
65
  test('should render es modules', async () => {
61
66
  mockPkgName.mockReturnValue('got');
62
- renderWithStore(<ComponentSideBar />, store);
63
-
64
- await waitFor(() => expect(screen.getByText('got')).toBeInTheDocument());
67
+ act(() => {
68
+ renderWithStore(<ComponentSideBar />, store);
69
+ });
70
+ // package name + keyword
71
+ await waitFor(() => expect(screen.getAllByText('got')).toHaveLength(2));
65
72
  expect(screen.getByAltText('es6 modules')).toBeInTheDocument();
66
73
  });
67
74
  });
@@ -1,8 +1,6 @@
1
- import styled from '@emotion/styled';
2
1
  import Paper from '@mui/material/Paper';
3
2
  import React from 'react';
4
3
 
5
- import { Theme } from '../../Theme';
6
4
  import ActionBar from '../../components/ActionBar';
7
5
  import Author from '../../components/Author';
8
6
  import Developers, { DeveloperType } from '../../components/Developers';
@@ -10,6 +8,7 @@ import Dist from '../../components/Distribution';
10
8
  import Engines from '../../components/Engines';
11
9
  import FundButton from '../../components/FundButton';
12
10
  import Install from '../../components/Install';
11
+ import Keywords from '../../components/Keywords';
13
12
  import Repository from '../../components/Repository';
14
13
  import SideBarTitle from '../../components/SideBarTitle';
15
14
  import { useConfig } from '../../providers';
@@ -35,7 +34,7 @@ const DetailSidebar: React.FC = () => {
35
34
  }
36
35
 
37
36
  return (
38
- <StyledPaper sx={{ position: 'sticky', top: 0 }}>
37
+ <Paper data-testid="sidebar" sx={{ position: 'sticky', top: 0, p: 2, ml: 2 }}>
39
38
  <SideBarTitle
40
39
  description={packageMeta.latest?.description}
41
40
  hasTypes={typeof packageMeta.latest?.types === 'string'}
@@ -50,20 +49,17 @@ const DetailSidebar: React.FC = () => {
50
49
  showDownloadTarball={configOptions.showDownloadTarball}
51
50
  showRaw={configOptions.showRaw}
52
51
  />
53
- <Install configOptions={configOptions} packageMeta={packageMeta} packageName={packageName} />
54
52
  <FundButton packageMeta={packageMeta} />
53
+ <Install configOptions={configOptions} packageMeta={packageMeta} packageName={packageName} />
55
54
  <Repository packageMeta={packageMeta} />
56
55
  <Engines packageMeta={packageMeta} />
57
56
  <Dist packageMeta={packageMeta} />
57
+ <Keywords packageMeta={packageMeta} />
58
58
  <Author packageMeta={packageMeta} />
59
59
  <Developers packageMeta={packageMeta} type={DeveloperType.MAINTAINERS} />
60
60
  <Developers packageMeta={packageMeta} type={DeveloperType.CONTRIBUTORS} />
61
- </StyledPaper>
61
+ </Paper>
62
62
  );
63
63
  };
64
64
 
65
65
  export default DetailSidebar;
66
-
67
- const StyledPaper = styled(Paper)<{ theme?: Theme }>(({ theme }) => ({
68
- padding: theme?.spacing(3, 2),
69
- }));
@@ -31,6 +31,22 @@ describe('api', () => {
31
31
 
32
32
  expect(handled).toEqual([true, blob]);
33
33
  });
34
+
35
+ test('should test pdf scenario', async () => {
36
+ const blob = new Blob(['foo']);
37
+ const blobPromise = Promise.resolve<Blob>(blob);
38
+ const response: Response = {
39
+ url: 'http://localhost:8080/test.pdf',
40
+ blob: () => blobPromise,
41
+ ok: true,
42
+ headers: new Headers({
43
+ 'Content-Type': 'application/pdf',
44
+ }),
45
+ } as Response;
46
+ const handled = await handleResponseType(response);
47
+
48
+ expect(handled).toEqual([true, blob]);
49
+ });
34
50
  });
35
51
 
36
52
  describe('api client', () => {
@@ -7,6 +7,7 @@ import { Manifest, TemplateUIOptions } from '@verdaccio/types';
7
7
  import type { RootModel } from '.';
8
8
  import { colors } from '../../Theme';
9
9
  import API from '../api';
10
+ import { APIRoute } from './routes';
10
11
 
11
12
  const defaultValues: TemplateUIOptions = {
12
13
  primaryColor: colors.PRIMARY_COLOR,
@@ -39,7 +40,7 @@ export const configuration = createModel<RootModel>()({
39
40
  },
40
41
  effects: (dispatch) => ({
41
42
  async getPackages() {
42
- const payload: Manifest[] = await API.request(`/-/verdaccio/packages`, 'GET');
43
+ const payload: Manifest[] = await API.request(APIRoute.CONFIG, 'GET');
43
44
  dispatch.packages.savePackages(payload);
44
45
  },
45
46
  }),
@@ -5,6 +5,8 @@ import type { RootModel } from '.';
5
5
  import { isTokenExpire } from '../../utils';
6
6
  import API from '../api';
7
7
  import storage from '../storage';
8
+ import { APIRoute } from './routes';
9
+ import { stripTrailingSlash } from './utils';
8
10
 
9
11
  export const HEADERS = {
10
12
  JSON: 'application/json',
@@ -80,19 +82,15 @@ export const login = createModel<RootModel>()({
80
82
  },
81
83
  effects: (dispatch) => ({
82
84
  async getUser({ username, password }, state) {
83
- const basePath = state.configuration.config.base;
85
+ const basePath = stripTrailingSlash(state.configuration.config.base);
84
86
  try {
85
- const payload: LoginResponse = await API.request(
86
- `${basePath}-/verdaccio/sec/login`,
87
- 'POST',
88
- {
89
- body: JSON.stringify({ username, password }),
90
- headers: {
91
- Accept: HEADERS.JSON,
92
- 'Content-Type': HEADERS.JSON,
93
- },
94
- }
95
- );
87
+ const payload: LoginResponse = await API.request(`${basePath}${APIRoute.LOGIN}`, 'POST', {
88
+ body: JSON.stringify({ username, password }),
89
+ headers: {
90
+ Accept: HEADERS.JSON,
91
+ 'Content-Type': HEADERS.JSON,
92
+ },
93
+ });
96
94
  dispatch.login.logInUser(payload);
97
95
  dispatch.packages.getPackages(undefined);
98
96
  } catch (error: any) {
@@ -5,6 +5,8 @@ import { Manifest } from '@verdaccio/types';
5
5
  import type { RootModel } from '.';
6
6
  import { PackageMetaInterface } from '../../types/packageMeta';
7
7
  import API from '../api';
8
+ import { APIRoute } from './routes';
9
+ import { stripTrailingSlash } from './utils';
8
10
 
9
11
  function isPackageVersionValid(
10
12
  packageMeta: Partial<PackageMetaInterface>,
@@ -83,10 +85,10 @@ export const manifest = createModel<RootModel>()({
83
85
  },
84
86
  effects: (dispatch) => ({
85
87
  async getManifest({ packageName, packageVersion }, state) {
86
- const basePath = state.configuration.config.base;
88
+ const basePath = stripTrailingSlash(state.configuration.config.base);
87
89
  try {
88
90
  const manifest: Manifest = await API.request(
89
- `${basePath}-/verdaccio/data/sidebar/${packageName}${
91
+ `${basePath}${APIRoute.SIDEBAR}${packageName}${
90
92
  packageVersion ? `?v=${packageVersion}` : ''
91
93
  }`
92
94
  );
@@ -98,10 +100,9 @@ export const manifest = createModel<RootModel>()({
98
100
  }
99
101
 
100
102
  const readme: string = await API.request<string>(
101
- `${basePath}-/verdaccio/data/package/readme/${packageName}${
103
+ `${basePath}${APIRoute.README}${packageName}${
102
104
  packageVersion ? `?v=${packageVersion}` : ''
103
- }`,
104
- 'GET'
105
+ }`
105
106
  );
106
107
  dispatch.manifest.saveManifest({ packageName, packageVersion, manifest, readme });
107
108
  } catch (error: any) {
@@ -4,6 +4,8 @@ import { Manifest } from '@verdaccio/types';
4
4
 
5
5
  import type { RootModel } from '.';
6
6
  import API from '../api';
7
+ import { APIRoute } from './routes';
8
+ import { stripTrailingSlash } from './utils';
7
9
 
8
10
  /**
9
11
  *
@@ -23,12 +25,9 @@ export const packages = createModel<RootModel>()({
23
25
  },
24
26
  effects: (dispatch) => ({
25
27
  async getPackages(_payload, state) {
26
- const basePath = state.configuration.config.base;
28
+ const basePath = stripTrailingSlash(state.configuration.config.base);
27
29
  try {
28
- const payload: Manifest[] = await API.request(
29
- `${basePath}-/verdaccio/data/packages`,
30
- 'GET'
31
- );
30
+ const payload: Manifest[] = await API.request(`${basePath}${APIRoute.PACKAGES}`);
32
31
  dispatch.packages.savePackages(payload);
33
32
  } catch (error: any) {
34
33
  // eslint-disable-next-line no-console
@@ -0,0 +1,10 @@
1
+ // Example API request:
2
+ // http://localhost:8000/-/verdaccio/data/package/readme/jquery
3
+ export enum APIRoute {
4
+ LOGIN = '/-/verdaccio/sec/login',
5
+ CONFIG = '/-/verdaccio/packages',
6
+ PACKAGES = '/-/verdaccio/data/packages',
7
+ SEARCH = '/-/verdaccio/data/search/', // :value
8
+ SIDEBAR = '/-/verdaccio/data/sidebar/', // :packageName?v=version
9
+ README = '/-/verdaccio/data/package/readme/', // :packageName?v=version
10
+ }
@@ -5,6 +5,8 @@ import { SearchResultWeb } from '@verdaccio/types';
5
5
 
6
6
  import type { RootModel } from '.';
7
7
  import API from '../api';
8
+ import { APIRoute } from './routes';
9
+ import { stripTrailingSlash } from './utils';
8
10
 
9
11
  const CONSTANTS = {
10
12
  API_DELAY: 300,
@@ -55,7 +57,7 @@ export const search = createModel<RootModel>()({
55
57
  },
56
58
  effects: (dispatch) => ({
57
59
  async getSuggestions({ value }, state) {
58
- const basePath = state.configuration.config.base;
60
+ const basePath = stripTrailingSlash(state.configuration.config.base);
59
61
  try {
60
62
  const controller = new window.AbortController();
61
63
  dispatch.search.addControllerToQueue({ controller });
@@ -63,7 +65,7 @@ export const search = createModel<RootModel>()({
63
65
  // https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API#Browser_compatibility
64
66
  // FUTURE: signal is not well supported for IE and Samsung Browser
65
67
  const suggestions: SearchResultWeb[] = await API.request(
66
- `${basePath}-/verdaccio/data/search/${encodeURIComponent(value)}`,
68
+ `${basePath}${APIRoute.SEARCH}${encodeURIComponent(value)}`,
67
69
  'GET',
68
70
  {
69
71
  signal,
@@ -0,0 +1,3 @@
1
+ export function stripTrailingSlash(url: string): string {
2
+ return url.replace(/\/$/, '');
3
+ }
@@ -1,7 +1,7 @@
1
1
  export type ModuleType = 'commonjs' | 'module';
2
2
 
3
3
  export type Latest = {
4
- author?: Author;
4
+ author?: string | Author;
5
5
  deprecated?: string;
6
6
  name: string;
7
7
  dist?: {
@@ -15,7 +15,7 @@ export type Latest = {
15
15
  pnpm?: string;
16
16
  yarn?: string;
17
17
  };
18
- license?: undefined | LicenseInterface | string;
18
+ license?: string | LicenseInterface;
19
19
  version: string;
20
20
  homepage?: string;
21
21
  bugs?: {
@@ -32,6 +32,7 @@ export type Latest = {
32
32
  funding?: Funding;
33
33
  maintainers?: Developer[];
34
34
  contributors?: Developer[];
35
+ keywords?: string | string[];
35
36
  };
36
37
 
37
38
  export interface PackageMetaInterface {
@@ -44,8 +45,9 @@ export interface PackageMetaInterface {
44
45
 
45
46
  export interface Developer {
46
47
  name: string;
47
- email: string;
48
- avatar: string;
48
+ email?: string;
49
+ url?: string;
50
+ avatar?: string;
49
51
  }
50
52
 
51
53
  interface Funding {
@@ -75,7 +77,7 @@ export interface Version {
75
77
  version: string;
76
78
  author?: string | Author;
77
79
  description?: string;
78
- license?: string;
80
+ license?: string | LicenseInterface;
79
81
  main?: string;
80
82
  keywords?: string[];
81
83
  deprecated?: string;
@@ -1,5 +1,6 @@
1
1
  export enum Route {
2
2
  ROOT = '/',
3
+ DETAIL = '/-/web/detail/',
3
4
  SCOPE_PACKAGE = '/-/web/detail/@:scope/:package',
4
5
  SCOPE_PACKAGE_VERSION = '/-/web/detail/@:scope/:package/v/:version',
5
6
  PACKAGE = '/-/web/detail/:package',
@@ -2,12 +2,14 @@ import MockDate from 'mockdate';
2
2
 
3
3
  import { packageMeta } from './__partials__/packageMeta';
4
4
  import {
5
+ fileSizeSI,
5
6
  formatDate,
6
7
  formatDateDistance,
7
8
  formatLicense,
8
9
  formatRepository,
9
10
  getLastUpdatedPackageTime,
10
11
  getRecentReleases,
12
+ getUplink,
11
13
  } from './utils';
12
14
 
13
15
  // jest.useFakeTimers().setSystemTime(new Date('2020-01-01'));
@@ -111,3 +113,35 @@ describe('getRecentReleases', (): void => {
111
113
  expect(getRecentReleases()).toEqual([]);
112
114
  });
113
115
  });
116
+
117
+ describe('getUplink', (): void => {
118
+ test('getUplink for npmjs', () => {
119
+ expect(getUplink('npmjs', 'semver')).toEqual('https://www.npmjs.com/package/semver');
120
+ });
121
+
122
+ test('getUplink for server1', () => {
123
+ expect(getUplink('server1', 'semver')).toEqual(null);
124
+ });
125
+ });
126
+
127
+ describe('fileSizeSI', (): void => {
128
+ test('fileSizeSI as number 1234567', () => {
129
+ expect(fileSizeSI(1234567)).toEqual('1.2 MB');
130
+ });
131
+
132
+ test('fileSizeSI as number 9876', () => {
133
+ expect(fileSizeSI(9876)).toEqual('9.9 kB');
134
+ });
135
+
136
+ test('fileSizeSI as number 1000', () => {
137
+ expect(fileSizeSI(1000)).toEqual('1.0 kB');
138
+ });
139
+
140
+ test('fileSizeSI as number 123', () => {
141
+ expect(fileSizeSI(123)).toEqual('123 Bytes');
142
+ });
143
+
144
+ test('fileSizeSI as number 0', () => {
145
+ expect(fileSizeSI(0)).toEqual('0 Bytes');
146
+ });
147
+ });
@@ -105,6 +105,15 @@ export function getAuthorName(authorName?: string): string {
105
105
  return authorName;
106
106
  }
107
107
 
108
+ export function getUplink(upLinkName: string, packageName: string): string | null {
109
+ // TODO: make this a config like "uplinks: npmjs: web: https://www.npmjs.com/package/"
110
+ switch (upLinkName) {
111
+ case 'npmjs':
112
+ return `https://www.npmjs.com/package/${packageName}`;
113
+ }
114
+ return null;
115
+ }
116
+
108
117
  export function fileSizeSI(
109
118
  a: number,
110
119
  b?: typeof Math,
@@ -112,9 +121,15 @@ export function fileSizeSI(
112
121
  d?: number,
113
122
  e?: number
114
123
  ): string {
115
- return (
116
- ((b = Math), (c = b.log), (d = 1e3), (e = (c(a) / c(d)) | 0), a / b.pow(d, e)).toFixed(2) +
117
- ' ' +
118
- (e ? 'kMGTPEZY'[--e] + 'B' : 'Bytes')
119
- );
124
+ b = Math;
125
+ c = b.log;
126
+ d = 1e3;
127
+ e = (c(a) / c(d)) | 0;
128
+ let size = a / b.pow(d, e);
129
+ // no decimals for Bytes
130
+ if (e === 0) {
131
+ return Math.floor(size) + ' Bytes';
132
+ } else {
133
+ return size.toFixed(1) + ' ' + 'kMGTPEZY'[--e] + 'B';
134
+ }
120
135
  }
package/tsconfig.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "extends": "../../../tsconfig.reference.json",
2
+ "extends": "../../tsconfig.reference.json",
3
3
  "compilerOptions": {
4
4
  "module": "esnext",
5
5
  "moduleResolution": "node",