@verdaccio/ui-components 5.0.0-next-9.19 → 5.0.0-next-9.21

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 (312) hide show
  1. package/build/api/use-data-mutation.js +1 -4
  2. package/build/api/use-data-mutation.js.map +1 -1
  3. package/build/api/use-data-mutation.mjs +1 -4
  4. package/build/api/use-data-mutation.mjs.map +1 -1
  5. package/build/api/use-data.d.ts +1 -0
  6. package/build/api/use-data.js +3 -2
  7. package/build/api/use-data.js.map +1 -1
  8. package/build/api/use-data.mjs +3 -3
  9. package/build/api/use-data.mjs.map +1 -1
  10. package/build/components/ActionBar/ActionBar.js +4 -2
  11. package/build/components/ActionBar/ActionBar.js.map +1 -1
  12. package/build/components/ActionBar/ActionBar.mjs +4 -2
  13. package/build/components/ActionBar/ActionBar.mjs.map +1 -1
  14. package/build/components/ActionBar/ActionBarAction.js +1 -1
  15. package/build/components/ActionBar/ActionBarAction.mjs +1 -1
  16. package/build/components/AppRoute/AppRoute.js +13 -0
  17. package/build/components/AppRoute/AppRoute.js.map +1 -1
  18. package/build/components/AppRoute/AppRoute.mjs +13 -0
  19. package/build/components/AppRoute/AppRoute.mjs.map +1 -1
  20. package/build/components/Author/Author.js +1 -1
  21. package/build/components/Author/Author.mjs +1 -1
  22. package/build/components/CopyClipboard/CopyToClipBoard.js +5 -0
  23. package/build/components/CopyClipboard/CopyToClipBoard.js.map +1 -1
  24. package/build/components/CopyClipboard/CopyToClipBoard.mjs +5 -0
  25. package/build/components/CopyClipboard/CopyToClipBoard.mjs.map +1 -1
  26. package/build/components/CopyClipboard/utils.js +14 -1
  27. package/build/components/CopyClipboard/utils.js.map +1 -1
  28. package/build/components/CopyClipboard/utils.mjs +14 -1
  29. package/build/components/CopyClipboard/utils.mjs.map +1 -1
  30. package/build/components/Dependencies/Dependencies.js +2 -1
  31. package/build/components/Dependencies/Dependencies.js.map +1 -1
  32. package/build/components/Dependencies/Dependencies.mjs +2 -1
  33. package/build/components/Dependencies/Dependencies.mjs.map +1 -1
  34. package/build/components/Dependencies/DependencyBlock.js +1 -1
  35. package/build/components/Dependencies/DependencyBlock.mjs +1 -1
  36. package/build/components/Developers/Title.js +1 -1
  37. package/build/components/Developers/Title.mjs +1 -1
  38. package/build/components/Developers/get-unique-developer-values.js +2 -1
  39. package/build/components/Developers/get-unique-developer-values.js.map +1 -1
  40. package/build/components/Developers/get-unique-developer-values.mjs +2 -1
  41. package/build/components/Developers/get-unique-developer-values.mjs.map +1 -1
  42. package/build/components/Distribution/Dist.js +3 -3
  43. package/build/components/Distribution/Dist.js.map +1 -1
  44. package/build/components/Distribution/Dist.mjs +3 -3
  45. package/build/components/Distribution/Dist.mjs.map +1 -1
  46. package/build/components/Engines/Engines.js +1 -1
  47. package/build/components/Engines/Engines.mjs +1 -1
  48. package/build/components/Forbidden/Forbidden.js +1 -1
  49. package/build/components/Forbidden/Forbidden.mjs +1 -1
  50. package/build/components/FundButton/FundButton.js +4 -3
  51. package/build/components/FundButton/FundButton.js.map +1 -1
  52. package/build/components/FundButton/FundButton.mjs +4 -3
  53. package/build/components/FundButton/FundButton.mjs.map +1 -1
  54. package/build/components/GenericError/GenericError.d.ts +3 -0
  55. package/build/components/GenericError/GenericError.js +60 -0
  56. package/build/components/GenericError/GenericError.js.map +1 -0
  57. package/build/components/GenericError/GenericError.mjs +54 -0
  58. package/build/components/GenericError/GenericError.mjs.map +1 -0
  59. package/build/components/GenericError/index.d.ts +1 -0
  60. package/build/components/GenericError/index.js +2 -0
  61. package/build/components/GenericError/index.mjs +2 -0
  62. package/build/components/Help/Help.js +1 -1
  63. package/build/components/Help/Help.mjs +1 -1
  64. package/build/components/Install/Install.js +1 -1
  65. package/build/components/Install/Install.mjs +1 -1
  66. package/build/components/Install/InstallListItem.js +2 -2
  67. package/build/components/Install/InstallListItem.js.map +1 -1
  68. package/build/components/Install/InstallListItem.mjs +2 -2
  69. package/build/components/Install/InstallListItem.mjs.map +1 -1
  70. package/build/components/Keywords/KeywordListItems.js +1 -1
  71. package/build/components/Keywords/KeywordListItems.js.map +1 -1
  72. package/build/components/Keywords/KeywordListItems.mjs +1 -1
  73. package/build/components/Keywords/KeywordListItems.mjs.map +1 -1
  74. package/build/components/Keywords/Keywords.js +2 -2
  75. package/build/components/Keywords/Keywords.js.map +1 -1
  76. package/build/components/Keywords/Keywords.mjs +2 -2
  77. package/build/components/Keywords/Keywords.mjs.map +1 -1
  78. package/build/components/LoginDialog/LoginDialogCloseButton.js +1 -1
  79. package/build/components/LoginDialog/LoginDialogCloseButton.mjs +1 -1
  80. package/build/components/LoginDialog/LoginDialogForm.js +2 -1
  81. package/build/components/LoginDialog/LoginDialogForm.js.map +1 -1
  82. package/build/components/LoginDialog/LoginDialogForm.mjs +2 -1
  83. package/build/components/LoginDialog/LoginDialogForm.mjs.map +1 -1
  84. package/build/components/LoginForm/Login.d.ts +1 -0
  85. package/build/components/LoginForm/Login.js +6 -4
  86. package/build/components/LoginForm/Login.js.map +1 -1
  87. package/build/components/LoginForm/Login.mjs +9 -7
  88. package/build/components/LoginForm/Login.mjs.map +1 -1
  89. package/build/components/LoginForm/PasswordField.js +4 -6
  90. package/build/components/LoginForm/PasswordField.js.map +1 -1
  91. package/build/components/LoginForm/PasswordField.mjs +4 -6
  92. package/build/components/LoginForm/PasswordField.mjs.map +1 -1
  93. package/build/components/LoginForm/UsernameField.js +4 -6
  94. package/build/components/LoginForm/UsernameField.js.map +1 -1
  95. package/build/components/LoginForm/UsernameField.mjs +4 -6
  96. package/build/components/LoginForm/UsernameField.mjs.map +1 -1
  97. package/build/components/LoginForm/styles.js +1 -1
  98. package/build/components/LoginForm/styles.mjs +1 -1
  99. package/build/components/LoginForm/useLoginForm.js +13 -3
  100. package/build/components/LoginForm/useLoginForm.js.map +1 -1
  101. package/build/components/LoginForm/useLoginForm.mjs +14 -4
  102. package/build/components/LoginForm/useLoginForm.mjs.map +1 -1
  103. package/build/components/NoItems/NoItems.js +2 -2
  104. package/build/components/NoItems/NoItems.mjs +1 -1
  105. package/build/components/NotFound/NotFound.js +1 -1
  106. package/build/components/NotFound/NotFound.mjs +1 -1
  107. package/build/components/Package/Package.d.ts +1 -1
  108. package/build/components/Package/Package.js +28 -29
  109. package/build/components/Package/Package.js.map +1 -1
  110. package/build/components/Package/Package.mjs +29 -30
  111. package/build/components/Package/Package.mjs.map +1 -1
  112. package/build/components/Person/Person.js +1 -1
  113. package/build/components/Person/Person.js.map +1 -1
  114. package/build/components/Person/Person.mjs +1 -1
  115. package/build/components/Person/Person.mjs.map +1 -1
  116. package/build/components/RawViewer/RawViewer.js +1 -1
  117. package/build/components/RawViewer/RawViewer.mjs +1 -1
  118. package/build/components/RegistryInfoDialog/RegistryInfoDialog.js +1 -1
  119. package/build/components/RegistryInfoDialog/RegistryInfoDialog.mjs +1 -1
  120. package/build/components/Repository/Repository.js +5 -8
  121. package/build/components/Repository/Repository.js.map +1 -1
  122. package/build/components/Repository/Repository.mjs +5 -8
  123. package/build/components/Repository/Repository.mjs.map +1 -1
  124. package/build/components/Search/AutoComplete/AutoComplete.d.ts +1 -0
  125. package/build/components/Search/AutoComplete/AutoComplete.js +4 -4
  126. package/build/components/Search/AutoComplete/AutoComplete.js.map +1 -1
  127. package/build/components/Search/AutoComplete/AutoComplete.mjs +4 -4
  128. package/build/components/Search/AutoComplete/AutoComplete.mjs.map +1 -1
  129. package/build/components/Search/Search.js +12 -4
  130. package/build/components/Search/Search.js.map +1 -1
  131. package/build/components/Search/Search.mjs +13 -5
  132. package/build/components/Search/Search.mjs.map +1 -1
  133. package/build/components/Search/SearchItem.js +1 -1
  134. package/build/components/Search/SearchItem.mjs +1 -1
  135. package/build/components/SettingsMenu/SettingsMenu.js +1 -1
  136. package/build/components/SettingsMenu/SettingsMenu.mjs +1 -1
  137. package/build/components/SideBarTitle/SideBarTitle.js +2 -2
  138. package/build/components/SideBarTitle/SideBarTitle.js.map +1 -1
  139. package/build/components/SideBarTitle/SideBarTitle.mjs +2 -2
  140. package/build/components/SideBarTitle/SideBarTitle.mjs.map +1 -1
  141. package/build/components/UpLinks/UpLinks.js +1 -1
  142. package/build/components/UpLinks/UpLinks.mjs +1 -1
  143. package/build/components/Versions/HistoryList.js +2 -2
  144. package/build/components/Versions/HistoryList.js.map +1 -1
  145. package/build/components/Versions/HistoryList.mjs +2 -2
  146. package/build/components/Versions/HistoryList.mjs.map +1 -1
  147. package/build/components/Versions/Versions.js +22 -21
  148. package/build/components/Versions/Versions.js.map +1 -1
  149. package/build/components/Versions/Versions.mjs +22 -21
  150. package/build/components/Versions/Versions.mjs.map +1 -1
  151. package/build/index.d.ts +1 -0
  152. package/build/index.js +4 -0
  153. package/build/index.mjs +4 -2
  154. package/build/pages/Stage/StageDetail.d.ts +2 -0
  155. package/build/pages/Stage/StageDetail.js +8 -0
  156. package/build/pages/Stage/StageDetail.js.map +1 -0
  157. package/build/pages/Stage/StageDetail.mjs +8 -0
  158. package/build/pages/Stage/StageDetail.mjs.map +1 -0
  159. package/build/pages/Stage/StageList.d.ts +2 -0
  160. package/build/pages/Stage/StageList.js +8 -0
  161. package/build/pages/Stage/StageList.js.map +1 -0
  162. package/build/pages/Stage/StageList.mjs +8 -0
  163. package/build/pages/Stage/StageList.mjs.map +1 -0
  164. package/build/pages/Stage/index.d.ts +2 -0
  165. package/build/pages/Version/Version.js +4 -1
  166. package/build/pages/Version/Version.js.map +1 -1
  167. package/build/pages/Version/Version.mjs +4 -1
  168. package/build/pages/Version/Version.mjs.map +1 -1
  169. package/build/providers/AuthProvider/AuthProvider.js +9 -7
  170. package/build/providers/AuthProvider/AuthProvider.js.map +1 -1
  171. package/build/providers/AuthProvider/AuthProvider.mjs +10 -8
  172. package/build/providers/AuthProvider/AuthProvider.mjs.map +1 -1
  173. package/build/providers/AuthProvider/utils.d.ts +12 -0
  174. package/build/providers/AuthProvider/utils.js +22 -0
  175. package/build/providers/AuthProvider/utils.js.map +1 -1
  176. package/build/providers/AuthProvider/utils.mjs +21 -2
  177. package/build/providers/AuthProvider/utils.mjs.map +1 -1
  178. package/build/providers/DownloadProvider/DownloadProvider.d.ts +1 -0
  179. package/build/providers/DownloadProvider/DownloadProvider.js +27 -4
  180. package/build/providers/DownloadProvider/DownloadProvider.js.map +1 -1
  181. package/build/providers/DownloadProvider/DownloadProvider.mjs +27 -6
  182. package/build/providers/DownloadProvider/DownloadProvider.mjs.map +1 -1
  183. package/build/providers/ManifestsProvider/ManifestsProvider.js +1 -1
  184. package/build/providers/ManifestsProvider/ManifestsProvider.js.map +1 -1
  185. package/build/providers/ManifestsProvider/ManifestsProvider.mjs +1 -1
  186. package/build/providers/ManifestsProvider/ManifestsProvider.mjs.map +1 -1
  187. package/build/providers/SearchProvider/SearchProvider.d.ts +1 -0
  188. package/build/providers/SearchProvider/SearchProvider.js +8 -6
  189. package/build/providers/SearchProvider/SearchProvider.js.map +1 -1
  190. package/build/providers/SearchProvider/SearchProvider.mjs +8 -6
  191. package/build/providers/SearchProvider/SearchProvider.mjs.map +1 -1
  192. package/build/providers/TranslatorProvider/TranslatorProvider.js +5 -3
  193. package/build/providers/TranslatorProvider/TranslatorProvider.js.map +1 -1
  194. package/build/providers/TranslatorProvider/TranslatorProvider.mjs +5 -3
  195. package/build/providers/TranslatorProvider/TranslatorProvider.mjs.map +1 -1
  196. package/build/providers/VersionProvider/VersionProvider.js +3 -3
  197. package/build/providers/VersionProvider/VersionProvider.js.map +1 -1
  198. package/build/providers/VersionProvider/VersionProvider.mjs +3 -3
  199. package/build/providers/VersionProvider/VersionProvider.mjs.map +1 -1
  200. package/build/sections/Detail/Tabs.js +1 -1
  201. package/build/sections/Detail/Tabs.mjs +1 -1
  202. package/build/sections/Footer/Footer.js +1 -1
  203. package/build/sections/Footer/Footer.mjs +1 -1
  204. package/build/sections/Header/Header.d.ts +0 -1
  205. package/build/sections/Header/Header.js +16 -14
  206. package/build/sections/Header/Header.js.map +1 -1
  207. package/build/sections/Header/Header.mjs +17 -15
  208. package/build/sections/Header/Header.mjs.map +1 -1
  209. package/build/sections/Header/HeaderGreetings.js +1 -1
  210. package/build/sections/Header/HeaderGreetings.mjs +1 -1
  211. package/build/sections/Header/HeaderMenu.js +26 -7
  212. package/build/sections/Header/HeaderMenu.js.map +1 -1
  213. package/build/sections/Header/HeaderMenu.mjs +26 -7
  214. package/build/sections/Header/HeaderMenu.mjs.map +1 -1
  215. package/build/sections/Header/HeaderRight.js +1 -1
  216. package/build/sections/Header/HeaderRight.mjs +1 -1
  217. package/build/sections/Header/HeaderSettingsDialog.js +1 -1
  218. package/build/sections/Header/HeaderSettingsDialog.mjs +1 -1
  219. package/build/sections/Header/LanguageSwitch.js +1 -1
  220. package/build/sections/Header/LanguageSwitch.mjs +1 -1
  221. package/build/sections/Header/RegistryInfoContent/RegistryInfoContent.js +1 -1
  222. package/build/sections/Header/RegistryInfoContent/RegistryInfoContent.mjs +1 -1
  223. package/build/sections/Home/Home.js +4 -3
  224. package/build/sections/Home/Home.js.map +1 -1
  225. package/build/sections/Home/Home.mjs +5 -4
  226. package/build/sections/Home/Home.mjs.map +1 -1
  227. package/build/sections/Security/AddUser.js +33 -18
  228. package/build/sections/Security/AddUser.js.map +1 -1
  229. package/build/sections/Security/AddUser.mjs +37 -22
  230. package/build/sections/Security/AddUser.mjs.map +1 -1
  231. package/build/sections/Security/ChangePassword.js +17 -15
  232. package/build/sections/Security/ChangePassword.js.map +1 -1
  233. package/build/sections/Security/ChangePassword.mjs +19 -17
  234. package/build/sections/Security/ChangePassword.mjs.map +1 -1
  235. package/build/sections/Security/Login.js +51 -35
  236. package/build/sections/Security/Login.js.map +1 -1
  237. package/build/sections/Security/Login.mjs +54 -38
  238. package/build/sections/Security/Login.mjs.map +1 -1
  239. package/build/sections/Security/Success.js +28 -24
  240. package/build/sections/Security/Success.js.map +1 -1
  241. package/build/sections/Security/Success.mjs +29 -25
  242. package/build/sections/Security/Success.mjs.map +1 -1
  243. package/build/sections/Stage/StageActions.d.ts +15 -0
  244. package/build/sections/Stage/StageActions.js +101 -0
  245. package/build/sections/Stage/StageActions.js.map +1 -0
  246. package/build/sections/Stage/StageActions.mjs +99 -0
  247. package/build/sections/Stage/StageActions.mjs.map +1 -0
  248. package/build/sections/Stage/StageDetail.d.ts +3 -0
  249. package/build/sections/Stage/StageDetail.js +110 -0
  250. package/build/sections/Stage/StageDetail.js.map +1 -0
  251. package/build/sections/Stage/StageDetail.mjs +108 -0
  252. package/build/sections/Stage/StageDetail.mjs.map +1 -0
  253. package/build/sections/Stage/StageList.d.ts +3 -0
  254. package/build/sections/Stage/StageList.js +153 -0
  255. package/build/sections/Stage/StageList.js.map +1 -0
  256. package/build/sections/Stage/StageList.mjs +151 -0
  257. package/build/sections/Stage/StageList.mjs.map +1 -0
  258. package/build/sections/Stage/index.d.ts +6 -0
  259. package/build/sections/Stage/index.js +13 -0
  260. package/build/sections/Stage/index.mjs +6 -0
  261. package/build/sections/Stage/types.d.ts +22 -0
  262. package/build/sections/Stage/useRequireSession.d.ts +14 -0
  263. package/build/sections/Stage/useRequireSession.js +33 -0
  264. package/build/sections/Stage/useRequireSession.js.map +1 -0
  265. package/build/sections/Stage/useRequireSession.mjs +33 -0
  266. package/build/sections/Stage/useRequireSession.mjs.map +1 -0
  267. package/build/sections/Stage/useStage.d.ts +34 -0
  268. package/build/sections/Stage/useStage.js +71 -0
  269. package/build/sections/Stage/useStage.js.map +1 -0
  270. package/build/sections/Stage/useStage.mjs +65 -0
  271. package/build/sections/Stage/useStage.mjs.map +1 -0
  272. package/build/store/api.js +7 -4
  273. package/build/store/api.js.map +1 -1
  274. package/build/store/api.mjs +7 -4
  275. package/build/store/api.mjs.map +1 -1
  276. package/build/types/packageMeta.d.ts +3 -2
  277. package/build/utils/cli-utils.js +2 -2
  278. package/build/utils/cli-utils.js.map +1 -1
  279. package/build/utils/cli-utils.mjs +2 -2
  280. package/build/utils/cli-utils.mjs.map +1 -1
  281. package/build/utils/index.js +1 -0
  282. package/build/utils/index.mjs +2 -2
  283. package/build/utils/routes.d.ts +5 -1
  284. package/build/utils/routes.js +4 -0
  285. package/build/utils/routes.js.map +1 -1
  286. package/build/utils/routes.mjs +4 -0
  287. package/build/utils/routes.mjs.map +1 -1
  288. package/build/utils/schemas.d.ts +1 -0
  289. package/build/utils/schemas.js +4 -4
  290. package/build/utils/schemas.js.map +1 -1
  291. package/build/utils/schemas.mjs +4 -4
  292. package/build/utils/schemas.mjs.map +1 -1
  293. package/build/utils/session-id.d.ts +8 -0
  294. package/build/utils/session-id.js +26 -0
  295. package/build/utils/session-id.js.map +1 -0
  296. package/build/utils/session-id.mjs +26 -0
  297. package/build/utils/session-id.mjs.map +1 -0
  298. package/build/utils/token.d.ts +1 -0
  299. package/build/utils/token.js +12 -8
  300. package/build/utils/token.js.map +1 -1
  301. package/build/utils/token.mjs +12 -9
  302. package/build/utils/token.mjs.map +1 -1
  303. package/build/utils/url.js +1 -1
  304. package/build/utils/url.js.map +1 -1
  305. package/build/utils/url.mjs +1 -1
  306. package/build/utils/url.mjs.map +1 -1
  307. package/build/utils/utils.d.ts +10 -0
  308. package/build/utils/utils.js +26 -0
  309. package/build/utils/utils.js.map +1 -1
  310. package/build/utils/utils.mjs +25 -1
  311. package/build/utils/utils.mjs.map +1 -1
  312. package/package.json +6 -6
@@ -1 +1 @@
1
- {"version":3,"file":"api.mjs","names":[],"sources":["../../src/store/api.ts"],"sourcesContent":["import storage from './storage';\n\nexport class CustomError extends Error {\n code: number;\n\n constructor(message: string, code?: number) {\n super(message);\n this.name = 'CustomError';\n this.code = code ?? 500;\n }\n}\n\n/**\n * Handles response according to content type\n * @param {object} response\n * @returns {promise}\n */\nexport function handleResponseType(response: Response): Promise<[boolean, any, number]> {\n if (response.headers) {\n const contentType = response.headers.get('Content-Type');\n if (contentType?.includes('application/pdf')) {\n return Promise.all([response.ok, response.blob(), response.status]);\n }\n if (contentType?.includes('application/json')) {\n return Promise.all([response.ok, response.json(), response.status]);\n }\n // it includes all text types\n if (contentType?.includes('text/')) {\n return Promise.all([response.ok, response.text(), response.status]);\n }\n\n // unfortunately on download files there is no header available\n if (response.url && response.url.endsWith('.tgz') === true) {\n return Promise.all([response.ok, response.blob(), response.status]);\n }\n }\n\n // error handling\n return Promise.all([response.ok, response.text(), response.status]);\n}\n\nconst AuthHeader = 'Authorization';\n\nclass API {\n public request<T>(\n url: string,\n method = 'GET',\n options: RequestInit = { headers: {} }\n ): Promise<T> {\n const token = storage.getItem('token');\n const headers = new Headers(options.headers);\n\n if (token && headers.has(AuthHeader) === false) {\n headers.set(AuthHeader, `Bearer ${token}`);\n options.headers = headers;\n }\n\n headers.set('x-client', 'verdaccio-ui');\n\n return new Promise((resolve, reject) => {\n fetch(url, {\n method,\n credentials: 'same-origin',\n signal: options.signal,\n ...options,\n })\n .then(handleResponseType)\n .then((response) => {\n const [ok, data, status] = response;\n if (ok === true) {\n resolve(data);\n } else {\n const message =\n typeof data === 'string' ? data : (data?.error ?? data?.message ?? 'Unknown error');\n reject(new CustomError(message, status));\n }\n })\n .catch((error) => {\n reject(error);\n });\n });\n }\n}\n\nexport default new API();\n"],"mappings":";;AAEA,IAAa,cAAb,cAAiC,MAAM;CACrC;CAEA,YAAY,SAAiB,MAAe;EAC1C,MAAM,OAAO;EACb,KAAK,OAAO;EACZ,KAAK,OAAO,QAAQ;CACtB;AACF;;;;;;AAOA,SAAgB,mBAAmB,UAAqD;CACtF,IAAI,SAAS,SAAS;EACpB,MAAM,cAAc,SAAS,QAAQ,IAAI,cAAc;EACvD,IAAI,aAAa,SAAS,iBAAiB,GACzC,OAAO,QAAQ,IAAI;GAAC,SAAS;GAAI,SAAS,KAAK;GAAG,SAAS;EAAM,CAAC;EAEpE,IAAI,aAAa,SAAS,kBAAkB,GAC1C,OAAO,QAAQ,IAAI;GAAC,SAAS;GAAI,SAAS,KAAK;GAAG,SAAS;EAAM,CAAC;EAGpE,IAAI,aAAa,SAAS,OAAO,GAC/B,OAAO,QAAQ,IAAI;GAAC,SAAS;GAAI,SAAS,KAAK;GAAG,SAAS;EAAM,CAAC;EAIpE,IAAI,SAAS,OAAO,SAAS,IAAI,SAAS,MAAM,MAAM,MACpD,OAAO,QAAQ,IAAI;GAAC,SAAS;GAAI,SAAS,KAAK;GAAG,SAAS;EAAM,CAAC;CAEtE;CAGA,OAAO,QAAQ,IAAI;EAAC,SAAS;EAAI,SAAS,KAAK;EAAG,SAAS;CAAM,CAAC;AACpE;AAEA,IAAM,aAAa;AAEnB,IAAM,MAAN,MAAU;CACR,QACE,KACA,SAAS,OACT,UAAuB,EAAE,SAAS,CAAC,EAAE,GACzB;EACZ,MAAM,QAAQ,gBAAQ,QAAQ,OAAO;EACrC,MAAM,UAAU,IAAI,QAAQ,QAAQ,OAAO;EAE3C,IAAI,SAAS,QAAQ,IAAI,UAAU,MAAM,OAAO;GAC9C,QAAQ,IAAI,YAAY,UAAU,OAAO;GACzC,QAAQ,UAAU;EACpB;EAEA,QAAQ,IAAI,YAAY,cAAc;EAEtC,OAAO,IAAI,SAAS,SAAS,WAAW;GACtC,MAAM,KAAK;IACT;IACA,aAAa;IACb,QAAQ,QAAQ;IAChB,GAAG;GACL,CAAC,CAAC,CACC,KAAK,kBAAkB,CAAC,CACxB,MAAM,aAAa;IAClB,MAAM,CAAC,IAAI,MAAM,UAAU;IAC3B,IAAI,OAAO,MACT,QAAQ,IAAI;SAIZ,OAAO,IAAI,YADT,OAAO,SAAS,WAAW,OAAQ,MAAM,SAAS,MAAM,WAAW,iBACrC,MAAM,CAAC;GAE3C,CAAC,CAAC,CACD,OAAO,UAAU;IAChB,OAAO,KAAK;GACd,CAAC;EACL,CAAC;CACH;AACF;AAEA,IAAA,cAAe,IAAI,IAAI"}
1
+ {"version":3,"file":"api.mjs","names":[],"sources":["../../src/store/api.ts"],"sourcesContent":["import storage from './storage';\n\nexport class CustomError extends Error {\n code: number;\n\n constructor(message: string, code?: number) {\n super(message);\n this.name = 'CustomError';\n this.code = code ?? 500;\n }\n}\n\n/**\n * Handles response according to content type\n * @param {object} response\n * @returns {promise}\n */\nexport function handleResponseType(response: Response): Promise<[boolean, any, number]> {\n if (response.headers) {\n const contentType = response.headers.get('Content-Type');\n if (contentType?.includes('application/pdf')) {\n return Promise.all([response.ok, response.blob(), response.status]);\n }\n // binary payloads (e.g. staged tarballs, served without a .tgz url) must\n // never be decoded as text: invalid utf-8 bytes become U+FFFD and the\n // downloaded archive is corrupted\n if (\n contentType?.includes('application/octet-stream') ||\n contentType?.includes('application/gzip')\n ) {\n return Promise.all([response.ok, response.blob(), response.status]);\n }\n if (contentType?.includes('application/json')) {\n return Promise.all([response.ok, response.json(), response.status]);\n }\n // it includes all text types\n if (contentType?.includes('text/')) {\n return Promise.all([response.ok, response.text(), response.status]);\n }\n\n // unfortunately on download files there is no header available\n if (response.url && response.url.endsWith('.tgz') === true) {\n return Promise.all([response.ok, response.blob(), response.status]);\n }\n }\n\n // error handling\n return Promise.all([response.ok, response.text(), response.status]);\n}\n\nconst AuthHeader = 'Authorization';\n\nclass API {\n public request<T>(\n url: string,\n method = 'GET',\n options: RequestInit = { headers: {} }\n ): Promise<T> {\n const token = storage.getItem('token');\n const headers = new Headers(options.headers);\n\n if (token && headers.has(AuthHeader) === false) {\n headers.set(AuthHeader, `Bearer ${token}`);\n }\n\n headers.set('x-client', 'verdaccio-ui');\n // assign unconditionally: doing it only inside the token branch dropped\n // the x-client header for anonymous requests\n options.headers = headers;\n\n return new Promise((resolve, reject) => {\n fetch(url, {\n method,\n credentials: 'same-origin',\n signal: options.signal,\n ...options,\n })\n .then(handleResponseType)\n .then((response) => {\n const [ok, data, status] = response;\n if (ok === true) {\n resolve(data);\n } else {\n const message =\n typeof data === 'string' ? data : (data?.error ?? data?.message ?? 'Unknown error');\n reject(new CustomError(message, status));\n }\n })\n .catch((error) => {\n reject(error);\n });\n });\n }\n}\n\nexport default new API();\n"],"mappings":";;AAEA,IAAa,cAAb,cAAiC,MAAM;CACrC;CAEA,YAAY,SAAiB,MAAe;EAC1C,MAAM,OAAO;EACb,KAAK,OAAO;EACZ,KAAK,OAAO,QAAQ;CACtB;AACF;;;;;;AAOA,SAAgB,mBAAmB,UAAqD;CACtF,IAAI,SAAS,SAAS;EACpB,MAAM,cAAc,SAAS,QAAQ,IAAI,cAAc;EACvD,IAAI,aAAa,SAAS,iBAAiB,GACzC,OAAO,QAAQ,IAAI;GAAC,SAAS;GAAI,SAAS,KAAK;GAAG,SAAS;EAAM,CAAC;EAKpE,IACE,aAAa,SAAS,0BAA0B,KAChD,aAAa,SAAS,kBAAkB,GAExC,OAAO,QAAQ,IAAI;GAAC,SAAS;GAAI,SAAS,KAAK;GAAG,SAAS;EAAM,CAAC;EAEpE,IAAI,aAAa,SAAS,kBAAkB,GAC1C,OAAO,QAAQ,IAAI;GAAC,SAAS;GAAI,SAAS,KAAK;GAAG,SAAS;EAAM,CAAC;EAGpE,IAAI,aAAa,SAAS,OAAO,GAC/B,OAAO,QAAQ,IAAI;GAAC,SAAS;GAAI,SAAS,KAAK;GAAG,SAAS;EAAM,CAAC;EAIpE,IAAI,SAAS,OAAO,SAAS,IAAI,SAAS,MAAM,MAAM,MACpD,OAAO,QAAQ,IAAI;GAAC,SAAS;GAAI,SAAS,KAAK;GAAG,SAAS;EAAM,CAAC;CAEtE;CAGA,OAAO,QAAQ,IAAI;EAAC,SAAS;EAAI,SAAS,KAAK;EAAG,SAAS;CAAM,CAAC;AACpE;AAEA,IAAM,aAAa;AAEnB,IAAM,MAAN,MAAU;CACR,QACE,KACA,SAAS,OACT,UAAuB,EAAE,SAAS,CAAC,EAAE,GACzB;EACZ,MAAM,QAAQ,gBAAQ,QAAQ,OAAO;EACrC,MAAM,UAAU,IAAI,QAAQ,QAAQ,OAAO;EAE3C,IAAI,SAAS,QAAQ,IAAI,UAAU,MAAM,OACvC,QAAQ,IAAI,YAAY,UAAU,OAAO;EAG3C,QAAQ,IAAI,YAAY,cAAc;EAGtC,QAAQ,UAAU;EAElB,OAAO,IAAI,SAAS,SAAS,WAAW;GACtC,MAAM,KAAK;IACT;IACA,aAAa;IACb,QAAQ,QAAQ;IAChB,GAAG;GACL,CAAC,CAAC,CACC,KAAK,kBAAkB,CAAC,CACxB,MAAM,aAAa;IAClB,MAAM,CAAC,IAAI,MAAM,UAAU;IAC3B,IAAI,OAAO,MACT,QAAQ,IAAI;SAIZ,OAAO,IAAI,YADT,OAAO,SAAS,WAAW,OAAQ,MAAM,SAAS,MAAM,WAAW,iBACrC,MAAM,CAAC;GAE3C,CAAC,CAAC,CACD,OAAO,UAAU;IAChB,OAAO,KAAK;GACd,CAAC;EACL,CAAC;CACH;AACF;AAEA,IAAA,cAAe,IAAI,IAAI"}
@@ -18,10 +18,10 @@ export type Latest = {
18
18
  license?: string | LicenseInterface;
19
19
  version: string;
20
20
  homepage?: string;
21
- bugs?: {
21
+ bugs?: string | {
22
22
  url: string;
23
23
  };
24
- repository?: {
24
+ repository?: string | {
25
25
  type?: string;
26
26
  url?: string;
27
27
  };
@@ -48,6 +48,7 @@ export interface Developer {
48
48
  email?: string;
49
49
  url?: string;
50
50
  avatar?: string;
51
+ _avatar?: string;
51
52
  }
52
53
  interface Funding {
53
54
  type?: string;
@@ -9,11 +9,11 @@ function getCLIChangePassword(command, registryUrl) {
9
9
  return `${command} profile set password --registry ${registryUrl}`;
10
10
  }
11
11
  function getCLISBerryYamlRegistry(scope, registryUrl) {
12
- return !scope ? `// .yarnrc.yml
12
+ return !scope ? `# .yarnrc.yml
13
13
  npmRegistryServer: "${registryUrl}"
14
14
  unsafeHttpWhitelist:
15
15
  - ${new URL(registryUrl).host}` : `
16
- // .yarnrc.yml
16
+ # .yarnrc.yml
17
17
  npmRegistryServer: "${registryUrl}"
18
18
  npmScopes:
19
19
  ${scope.replace("@", "")}:
@@ -1 +1 @@
1
- {"version":3,"file":"cli-utils.js","names":[],"sources":["../../src/utils/cli-utils.ts"],"sourcesContent":["import type { SyntheticEvent } from 'react';\n\nexport const copyToClipBoardUtility =\n (str: string): ((e: SyntheticEvent<HTMLElement>) => void) =>\n (event: SyntheticEvent<HTMLElement>): void => {\n event.preventDefault();\n\n const node = document.createElement('div');\n node.innerText = str;\n if (document.body) {\n document.body.appendChild(node);\n\n const range = document.createRange();\n const selection = window.getSelection() as Selection;\n range.selectNodeContents(node);\n selection.removeAllRanges();\n selection.addRange(range);\n document.execCommand('copy');\n document.body.removeChild(node);\n }\n };\n\nexport function getCLISetConfigRegistry(\n command: string,\n scope: string | undefined,\n registryUrl: string\n): string {\n // if there is a scope defined there needs to be a \":\" separator between the scope and the registry\n return `${command} ${scope ? `${scope}:` : ''}registry ${registryUrl}`;\n}\n\nexport function getCLISetRegistry(command: string, registryUrl: string): string {\n return `${command} --registry ${registryUrl}`;\n}\n\nexport function getCLIChangePassword(command: string, registryUrl: string): string {\n return `${command} profile set password --registry ${registryUrl}`;\n}\n\nexport function getCLISBerryYamlRegistry(scope: string | undefined, registryUrl: string): string {\n return !scope\n ? `// .yarnrc.yml \nnpmRegistryServer: \"${registryUrl}\"\nunsafeHttpWhitelist:\n - ${new URL(registryUrl).host}`\n : `\n// .yarnrc.yml\nnpmRegistryServer: \"${registryUrl}\"\nnpmScopes:\n ${scope.replace('@', '')}:\n npmRegistryServer: ${registryUrl}\n npmPublishRegistry: ${registryUrl}`;\n}\n"],"mappings":";AAsBA,SAAgB,wBACd,SACA,OACA,aACQ;CAER,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,KAAK,GAAG,WAAW;AAC3D;AAEA,SAAgB,kBAAkB,SAAiB,aAA6B;CAC9E,OAAO,GAAG,QAAQ,cAAc;AAClC;AAEA,SAAgB,qBAAqB,SAAiB,aAA6B;CACjF,OAAO,GAAG,QAAQ,mCAAmC;AACvD;AAEA,SAAgB,yBAAyB,OAA2B,aAA6B;CAC/F,OAAO,CAAC,QACJ;sBACgB,YAAY;;MAE5B,IAAI,IAAI,WAAW,CAAC,CAAC,SACrB;;sBAEgB,YAAY;;IAE9B,MAAM,QAAQ,KAAK,EAAE,EAAE;yBACF,YAAY;0BACX;AAC1B"}
1
+ {"version":3,"file":"cli-utils.js","names":[],"sources":["../../src/utils/cli-utils.ts"],"sourcesContent":["import type { SyntheticEvent } from 'react';\n\nexport const copyToClipBoardUtility =\n (str: string): ((e: SyntheticEvent<HTMLElement>) => void) =>\n (event: SyntheticEvent<HTMLElement>): void => {\n event.preventDefault();\n\n const node = document.createElement('div');\n node.innerText = str;\n if (document.body) {\n document.body.appendChild(node);\n\n const range = document.createRange();\n const selection = window.getSelection() as Selection;\n range.selectNodeContents(node);\n selection.removeAllRanges();\n selection.addRange(range);\n document.execCommand('copy');\n document.body.removeChild(node);\n }\n };\n\nexport function getCLISetConfigRegistry(\n command: string,\n scope: string | undefined,\n registryUrl: string\n): string {\n // if there is a scope defined there needs to be a \":\" separator between the scope and the registry\n return `${command} ${scope ? `${scope}:` : ''}registry ${registryUrl}`;\n}\n\nexport function getCLISetRegistry(command: string, registryUrl: string): string {\n return `${command} --registry ${registryUrl}`;\n}\n\nexport function getCLIChangePassword(command: string, registryUrl: string): string {\n return `${command} profile set password --registry ${registryUrl}`;\n}\n\nexport function getCLISBerryYamlRegistry(scope: string | undefined, registryUrl: string): string {\n return !scope\n ? `# .yarnrc.yml\nnpmRegistryServer: \"${registryUrl}\"\nunsafeHttpWhitelist:\n - ${new URL(registryUrl).host}`\n : `\n# .yarnrc.yml\nnpmRegistryServer: \"${registryUrl}\"\nnpmScopes:\n ${scope.replace('@', '')}:\n npmRegistryServer: ${registryUrl}\n npmPublishRegistry: ${registryUrl}`;\n}\n"],"mappings":";AAsBA,SAAgB,wBACd,SACA,OACA,aACQ;CAER,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,KAAK,GAAG,WAAW;AAC3D;AAEA,SAAgB,kBAAkB,SAAiB,aAA6B;CAC9E,OAAO,GAAG,QAAQ,cAAc;AAClC;AAEA,SAAgB,qBAAqB,SAAiB,aAA6B;CACjF,OAAO,GAAG,QAAQ,mCAAmC;AACvD;AAEA,SAAgB,yBAAyB,OAA2B,aAA6B;CAC/F,OAAO,CAAC,QACJ;sBACgB,YAAY;;MAE5B,IAAI,IAAI,WAAW,CAAC,CAAC,SACrB;;sBAEgB,YAAY;;IAE9B,MAAM,QAAQ,KAAK,EAAE,EAAE;yBACF,YAAY;0BACX;AAC1B"}
@@ -9,11 +9,11 @@ function getCLIChangePassword(command, registryUrl) {
9
9
  return `${command} profile set password --registry ${registryUrl}`;
10
10
  }
11
11
  function getCLISBerryYamlRegistry(scope, registryUrl) {
12
- return !scope ? `// .yarnrc.yml
12
+ return !scope ? `# .yarnrc.yml
13
13
  npmRegistryServer: "${registryUrl}"
14
14
  unsafeHttpWhitelist:
15
15
  - ${new URL(registryUrl).host}` : `
16
- // .yarnrc.yml
16
+ # .yarnrc.yml
17
17
  npmRegistryServer: "${registryUrl}"
18
18
  npmScopes:
19
19
  ${scope.replace("@", "")}:
@@ -1 +1 @@
1
- {"version":3,"file":"cli-utils.mjs","names":[],"sources":["../../src/utils/cli-utils.ts"],"sourcesContent":["import type { SyntheticEvent } from 'react';\n\nexport const copyToClipBoardUtility =\n (str: string): ((e: SyntheticEvent<HTMLElement>) => void) =>\n (event: SyntheticEvent<HTMLElement>): void => {\n event.preventDefault();\n\n const node = document.createElement('div');\n node.innerText = str;\n if (document.body) {\n document.body.appendChild(node);\n\n const range = document.createRange();\n const selection = window.getSelection() as Selection;\n range.selectNodeContents(node);\n selection.removeAllRanges();\n selection.addRange(range);\n document.execCommand('copy');\n document.body.removeChild(node);\n }\n };\n\nexport function getCLISetConfigRegistry(\n command: string,\n scope: string | undefined,\n registryUrl: string\n): string {\n // if there is a scope defined there needs to be a \":\" separator between the scope and the registry\n return `${command} ${scope ? `${scope}:` : ''}registry ${registryUrl}`;\n}\n\nexport function getCLISetRegistry(command: string, registryUrl: string): string {\n return `${command} --registry ${registryUrl}`;\n}\n\nexport function getCLIChangePassword(command: string, registryUrl: string): string {\n return `${command} profile set password --registry ${registryUrl}`;\n}\n\nexport function getCLISBerryYamlRegistry(scope: string | undefined, registryUrl: string): string {\n return !scope\n ? `// .yarnrc.yml \nnpmRegistryServer: \"${registryUrl}\"\nunsafeHttpWhitelist:\n - ${new URL(registryUrl).host}`\n : `\n// .yarnrc.yml\nnpmRegistryServer: \"${registryUrl}\"\nnpmScopes:\n ${scope.replace('@', '')}:\n npmRegistryServer: ${registryUrl}\n npmPublishRegistry: ${registryUrl}`;\n}\n"],"mappings":";AAsBA,SAAgB,wBACd,SACA,OACA,aACQ;CAER,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,KAAK,GAAG,WAAW;AAC3D;AAEA,SAAgB,kBAAkB,SAAiB,aAA6B;CAC9E,OAAO,GAAG,QAAQ,cAAc;AAClC;AAEA,SAAgB,qBAAqB,SAAiB,aAA6B;CACjF,OAAO,GAAG,QAAQ,mCAAmC;AACvD;AAEA,SAAgB,yBAAyB,OAA2B,aAA6B;CAC/F,OAAO,CAAC,QACJ;sBACgB,YAAY;;MAE5B,IAAI,IAAI,WAAW,CAAC,CAAC,SACrB;;sBAEgB,YAAY;;IAE9B,MAAM,QAAQ,KAAK,EAAE,EAAE;yBACF,YAAY;0BACX;AAC1B"}
1
+ {"version":3,"file":"cli-utils.mjs","names":[],"sources":["../../src/utils/cli-utils.ts"],"sourcesContent":["import type { SyntheticEvent } from 'react';\n\nexport const copyToClipBoardUtility =\n (str: string): ((e: SyntheticEvent<HTMLElement>) => void) =>\n (event: SyntheticEvent<HTMLElement>): void => {\n event.preventDefault();\n\n const node = document.createElement('div');\n node.innerText = str;\n if (document.body) {\n document.body.appendChild(node);\n\n const range = document.createRange();\n const selection = window.getSelection() as Selection;\n range.selectNodeContents(node);\n selection.removeAllRanges();\n selection.addRange(range);\n document.execCommand('copy');\n document.body.removeChild(node);\n }\n };\n\nexport function getCLISetConfigRegistry(\n command: string,\n scope: string | undefined,\n registryUrl: string\n): string {\n // if there is a scope defined there needs to be a \":\" separator between the scope and the registry\n return `${command} ${scope ? `${scope}:` : ''}registry ${registryUrl}`;\n}\n\nexport function getCLISetRegistry(command: string, registryUrl: string): string {\n return `${command} --registry ${registryUrl}`;\n}\n\nexport function getCLIChangePassword(command: string, registryUrl: string): string {\n return `${command} profile set password --registry ${registryUrl}`;\n}\n\nexport function getCLISBerryYamlRegistry(scope: string | undefined, registryUrl: string): string {\n return !scope\n ? `# .yarnrc.yml\nnpmRegistryServer: \"${registryUrl}\"\nunsafeHttpWhitelist:\n - ${new URL(registryUrl).host}`\n : `\n# .yarnrc.yml\nnpmRegistryServer: \"${registryUrl}\"\nnpmScopes:\n ${scope.replace('@', '')}:\n npmRegistryServer: ${registryUrl}\n npmPublishRegistry: ${registryUrl}`;\n}\n"],"mappings":";AAsBA,SAAgB,wBACd,SACA,OACA,aACQ;CAER,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,KAAK,GAAG,WAAW;AAC3D;AAEA,SAAgB,kBAAkB,SAAiB,aAA6B;CAC9E,OAAO,GAAG,QAAQ,cAAc;AAClC;AAEA,SAAgB,qBAAqB,SAAiB,aAA6B;CACjF,OAAO,GAAG,QAAQ,mCAAmC;AACvD;AAEA,SAAgB,yBAAyB,OAA2B,aAA6B;CAC/F,OAAO,CAAC,QACJ;sBACgB,YAAY;;MAE5B,IAAI,IAAI,WAAW,CAAC,CAAC,SACrB;;sBAEgB,YAAY;;IAE9B,MAAM,QAAQ,KAAK,EAAE,EAAE;yBACF,YAAY;0BACX;AAC1B"}
@@ -11,6 +11,7 @@ exports.getCLISetConfigRegistry = require_cli_utils.getCLISetConfigRegistry;
11
11
  exports.getCLISetRegistry = require_cli_utils.getCLISetRegistry;
12
12
  exports.isTokenExpire = require_token.isTokenExpire;
13
13
  exports.loadable = require_loadable.default;
14
+ exports.tokenExpireInMs = require_token.tokenExpireInMs;
14
15
  Object.defineProperty(exports, "url", {
15
16
  enumerable: true,
16
17
  get: function() {
@@ -3,5 +3,5 @@ import { utils_exports } from "./utils.mjs";
3
3
  import { getCLIChangePassword, getCLISBerryYamlRegistry, getCLISetConfigRegistry, getCLISetRegistry } from "./cli-utils.mjs";
4
4
  import loadable_default from "./loadable.mjs";
5
5
  import { Route } from "./routes.mjs";
6
- import { isTokenExpire } from "./token.mjs";
7
- export { Route, getCLIChangePassword, getCLISBerryYamlRegistry, getCLISetConfigRegistry, getCLISetRegistry, isTokenExpire, loadable_default as loadable, url_exports as url, utils_exports as utils };
6
+ import { isTokenExpire, tokenExpireInMs } from "./token.mjs";
7
+ export { Route, getCLIChangePassword, getCLISBerryYamlRegistry, getCLISetConfigRegistry, getCLISetRegistry, isTokenExpire, loadable_default as loadable, tokenExpireInMs, url_exports as url, utils_exports as utils };
@@ -9,15 +9,19 @@ export declare enum Route {
9
9
  SUCCESS = "/-/web/success",
10
10
  ADD_USER = "/-/web/add-user",
11
11
  CHANGE_PASSWORD = "/-/web/change-password",
12
+ STAGE = "/-/web/stage",
13
+ STAGE_DETAIL = "/-/web/stage/:stageId",
12
14
  LOGIN_API = "/-/v1/login_cli",
13
15
  CHANGE_PASSWORD_API = "/-/npm/v1/user"
14
16
  }
15
17
  export declare enum APIRoute {
16
18
  LOGIN = "/-/verdaccio/sec/login",
19
+ SIGNUP = "/-/verdaccio/sec/signup",
17
20
  RESET_PASSWORD = "/-/verdaccio/sec/reset_password",
18
21
  CONFIG = "/-/verdaccio/packages",
19
22
  PACKAGES = "/-/verdaccio/data/packages",
20
23
  SEARCH = "/-/verdaccio/data/search/",// :value
21
24
  SIDEBAR = "/-/verdaccio/data/sidebar/",// :packageName?v=version
22
- README = "/-/verdaccio/data/package/readme/"
25
+ README = "/-/verdaccio/data/package/readme/",// :packageName?v=version
26
+ STAGE = "/-/stage"
23
27
  }
@@ -10,18 +10,22 @@ var Route = /* @__PURE__ */ function(Route) {
10
10
  Route["SUCCESS"] = "/-/web/success";
11
11
  Route["ADD_USER"] = "/-/web/add-user";
12
12
  Route["CHANGE_PASSWORD"] = "/-/web/change-password";
13
+ Route["STAGE"] = "/-/web/stage";
14
+ Route["STAGE_DETAIL"] = "/-/web/stage/:stageId";
13
15
  Route["LOGIN_API"] = "/-/v1/login_cli";
14
16
  Route["CHANGE_PASSWORD_API"] = "/-/npm/v1/user";
15
17
  return Route;
16
18
  }({});
17
19
  var APIRoute = /* @__PURE__ */ function(APIRoute) {
18
20
  APIRoute["LOGIN"] = "/-/verdaccio/sec/login";
21
+ APIRoute["SIGNUP"] = "/-/verdaccio/sec/signup";
19
22
  APIRoute["RESET_PASSWORD"] = "/-/verdaccio/sec/reset_password";
20
23
  APIRoute["CONFIG"] = "/-/verdaccio/packages";
21
24
  APIRoute["PACKAGES"] = "/-/verdaccio/data/packages";
22
25
  APIRoute["SEARCH"] = "/-/verdaccio/data/search/";
23
26
  APIRoute["SIDEBAR"] = "/-/verdaccio/data/sidebar/";
24
27
  APIRoute["README"] = "/-/verdaccio/data/package/readme/";
28
+ APIRoute["STAGE"] = "/-/stage";
25
29
  return APIRoute;
26
30
  }({});
27
31
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"routes.js","names":[],"sources":["../../src/utils/routes.ts"],"sourcesContent":["export enum Route {\n ROOT = '/',\n DETAIL = '/-/web/detail/',\n SCOPE_PACKAGE = '/-/web/detail/:scope/:package',\n SCOPE_PACKAGE_VERSION = '/-/web/detail/:scope/:package/v/:version',\n PACKAGE = '/-/web/detail/:package',\n PACKAGE_VERSION = '/-/web/detail/:package/v/:version',\n // Security UI routes\n LOGIN = '/-/web/login',\n SUCCESS = '/-/web/success',\n ADD_USER = '/-/web/add-user',\n CHANGE_PASSWORD = '/-/web/change-password',\n // Security API routes\n LOGIN_API = '/-/v1/login_cli',\n CHANGE_PASSWORD_API = '/-/npm/v1/user',\n}\n\n// Example API request:\n// http://localhost:8000/-/verdaccio/data/package/readme/jquery\nexport enum APIRoute {\n LOGIN = '/-/verdaccio/sec/login',\n RESET_PASSWORD = '/-/verdaccio/sec/reset_password',\n CONFIG = '/-/verdaccio/packages',\n PACKAGES = '/-/verdaccio/data/packages',\n SEARCH = '/-/verdaccio/data/search/', // :value\n SIDEBAR = '/-/verdaccio/data/sidebar/', // :packageName?v=version\n README = '/-/verdaccio/data/package/readme/', // :packageName?v=version\n}\n"],"mappings":";AAAA,IAAY,QAAL,yBAAA,OAAA;CACL,MAAA,UAAA;CACA,MAAA,YAAA;CACA,MAAA,mBAAA;CACA,MAAA,2BAAA;CACA,MAAA,aAAA;CACA,MAAA,qBAAA;CAEA,MAAA,WAAA;CACA,MAAA,aAAA;CACA,MAAA,cAAA;CACA,MAAA,qBAAA;CAEA,MAAA,eAAA;CACA,MAAA,yBAAA;;AACF,EAAA,CAAA,CAAA;AAIA,IAAY,WAAL,yBAAA,UAAA;CACL,SAAA,WAAA;CACA,SAAA,oBAAA;CACA,SAAA,YAAA;CACA,SAAA,cAAA;CACA,SAAA,YAAA;CACA,SAAA,aAAA;CACA,SAAA,YAAA;;AACF,EAAA,CAAA,CAAA"}
1
+ {"version":3,"file":"routes.js","names":[],"sources":["../../src/utils/routes.ts"],"sourcesContent":["export enum Route {\n ROOT = '/',\n DETAIL = '/-/web/detail/',\n SCOPE_PACKAGE = '/-/web/detail/:scope/:package',\n SCOPE_PACKAGE_VERSION = '/-/web/detail/:scope/:package/v/:version',\n PACKAGE = '/-/web/detail/:package',\n PACKAGE_VERSION = '/-/web/detail/:package/v/:version',\n // Security UI routes\n LOGIN = '/-/web/login',\n SUCCESS = '/-/web/success',\n ADD_USER = '/-/web/add-user',\n CHANGE_PASSWORD = '/-/web/change-password',\n // Staged publish workflow (`npm stage`), behind the `stage` flag\n STAGE = '/-/web/stage',\n STAGE_DETAIL = '/-/web/stage/:stageId',\n // Security API routes\n LOGIN_API = '/-/v1/login_cli',\n CHANGE_PASSWORD_API = '/-/npm/v1/user',\n}\n\n// Example API request:\n// http://localhost:8000/-/verdaccio/data/package/readme/jquery\nexport enum APIRoute {\n LOGIN = '/-/verdaccio/sec/login',\n SIGNUP = '/-/verdaccio/sec/signup',\n RESET_PASSWORD = '/-/verdaccio/sec/reset_password',\n CONFIG = '/-/verdaccio/packages',\n PACKAGES = '/-/verdaccio/data/packages',\n SEARCH = '/-/verdaccio/data/search/', // :value\n SIDEBAR = '/-/verdaccio/data/sidebar/', // :packageName?v=version\n README = '/-/verdaccio/data/package/readme/', // :packageName?v=version\n // served by the registry router, not the web one, like CHANGE_PASSWORD_API\n STAGE = '/-/stage',\n}\n"],"mappings":";AAAA,IAAY,QAAL,yBAAA,OAAA;CACL,MAAA,UAAA;CACA,MAAA,YAAA;CACA,MAAA,mBAAA;CACA,MAAA,2BAAA;CACA,MAAA,aAAA;CACA,MAAA,qBAAA;CAEA,MAAA,WAAA;CACA,MAAA,aAAA;CACA,MAAA,cAAA;CACA,MAAA,qBAAA;CAEA,MAAA,WAAA;CACA,MAAA,kBAAA;CAEA,MAAA,eAAA;CACA,MAAA,yBAAA;;AACF,EAAA,CAAA,CAAA;AAIA,IAAY,WAAL,yBAAA,UAAA;CACL,SAAA,WAAA;CACA,SAAA,YAAA;CACA,SAAA,oBAAA;CACA,SAAA,YAAA;CACA,SAAA,cAAA;CACA,SAAA,YAAA;CACA,SAAA,aAAA;CACA,SAAA,YAAA;CAEA,SAAA,WAAA;;AACF,EAAA,CAAA,CAAA"}
@@ -10,18 +10,22 @@ var Route = /* @__PURE__ */ function(Route) {
10
10
  Route["SUCCESS"] = "/-/web/success";
11
11
  Route["ADD_USER"] = "/-/web/add-user";
12
12
  Route["CHANGE_PASSWORD"] = "/-/web/change-password";
13
+ Route["STAGE"] = "/-/web/stage";
14
+ Route["STAGE_DETAIL"] = "/-/web/stage/:stageId";
13
15
  Route["LOGIN_API"] = "/-/v1/login_cli";
14
16
  Route["CHANGE_PASSWORD_API"] = "/-/npm/v1/user";
15
17
  return Route;
16
18
  }({});
17
19
  var APIRoute = /* @__PURE__ */ function(APIRoute) {
18
20
  APIRoute["LOGIN"] = "/-/verdaccio/sec/login";
21
+ APIRoute["SIGNUP"] = "/-/verdaccio/sec/signup";
19
22
  APIRoute["RESET_PASSWORD"] = "/-/verdaccio/sec/reset_password";
20
23
  APIRoute["CONFIG"] = "/-/verdaccio/packages";
21
24
  APIRoute["PACKAGES"] = "/-/verdaccio/data/packages";
22
25
  APIRoute["SEARCH"] = "/-/verdaccio/data/search/";
23
26
  APIRoute["SIDEBAR"] = "/-/verdaccio/data/sidebar/";
24
27
  APIRoute["README"] = "/-/verdaccio/data/package/readme/";
28
+ APIRoute["STAGE"] = "/-/stage";
25
29
  return APIRoute;
26
30
  }({});
27
31
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"routes.mjs","names":[],"sources":["../../src/utils/routes.ts"],"sourcesContent":["export enum Route {\n ROOT = '/',\n DETAIL = '/-/web/detail/',\n SCOPE_PACKAGE = '/-/web/detail/:scope/:package',\n SCOPE_PACKAGE_VERSION = '/-/web/detail/:scope/:package/v/:version',\n PACKAGE = '/-/web/detail/:package',\n PACKAGE_VERSION = '/-/web/detail/:package/v/:version',\n // Security UI routes\n LOGIN = '/-/web/login',\n SUCCESS = '/-/web/success',\n ADD_USER = '/-/web/add-user',\n CHANGE_PASSWORD = '/-/web/change-password',\n // Security API routes\n LOGIN_API = '/-/v1/login_cli',\n CHANGE_PASSWORD_API = '/-/npm/v1/user',\n}\n\n// Example API request:\n// http://localhost:8000/-/verdaccio/data/package/readme/jquery\nexport enum APIRoute {\n LOGIN = '/-/verdaccio/sec/login',\n RESET_PASSWORD = '/-/verdaccio/sec/reset_password',\n CONFIG = '/-/verdaccio/packages',\n PACKAGES = '/-/verdaccio/data/packages',\n SEARCH = '/-/verdaccio/data/search/', // :value\n SIDEBAR = '/-/verdaccio/data/sidebar/', // :packageName?v=version\n README = '/-/verdaccio/data/package/readme/', // :packageName?v=version\n}\n"],"mappings":";AAAA,IAAY,QAAL,yBAAA,OAAA;CACL,MAAA,UAAA;CACA,MAAA,YAAA;CACA,MAAA,mBAAA;CACA,MAAA,2BAAA;CACA,MAAA,aAAA;CACA,MAAA,qBAAA;CAEA,MAAA,WAAA;CACA,MAAA,aAAA;CACA,MAAA,cAAA;CACA,MAAA,qBAAA;CAEA,MAAA,eAAA;CACA,MAAA,yBAAA;;AACF,EAAA,CAAA,CAAA;AAIA,IAAY,WAAL,yBAAA,UAAA;CACL,SAAA,WAAA;CACA,SAAA,oBAAA;CACA,SAAA,YAAA;CACA,SAAA,cAAA;CACA,SAAA,YAAA;CACA,SAAA,aAAA;CACA,SAAA,YAAA;;AACF,EAAA,CAAA,CAAA"}
1
+ {"version":3,"file":"routes.mjs","names":[],"sources":["../../src/utils/routes.ts"],"sourcesContent":["export enum Route {\n ROOT = '/',\n DETAIL = '/-/web/detail/',\n SCOPE_PACKAGE = '/-/web/detail/:scope/:package',\n SCOPE_PACKAGE_VERSION = '/-/web/detail/:scope/:package/v/:version',\n PACKAGE = '/-/web/detail/:package',\n PACKAGE_VERSION = '/-/web/detail/:package/v/:version',\n // Security UI routes\n LOGIN = '/-/web/login',\n SUCCESS = '/-/web/success',\n ADD_USER = '/-/web/add-user',\n CHANGE_PASSWORD = '/-/web/change-password',\n // Staged publish workflow (`npm stage`), behind the `stage` flag\n STAGE = '/-/web/stage',\n STAGE_DETAIL = '/-/web/stage/:stageId',\n // Security API routes\n LOGIN_API = '/-/v1/login_cli',\n CHANGE_PASSWORD_API = '/-/npm/v1/user',\n}\n\n// Example API request:\n// http://localhost:8000/-/verdaccio/data/package/readme/jquery\nexport enum APIRoute {\n LOGIN = '/-/verdaccio/sec/login',\n SIGNUP = '/-/verdaccio/sec/signup',\n RESET_PASSWORD = '/-/verdaccio/sec/reset_password',\n CONFIG = '/-/verdaccio/packages',\n PACKAGES = '/-/verdaccio/data/packages',\n SEARCH = '/-/verdaccio/data/search/', // :value\n SIDEBAR = '/-/verdaccio/data/sidebar/', // :packageName?v=version\n README = '/-/verdaccio/data/package/readme/', // :packageName?v=version\n // served by the registry router, not the web one, like CHANGE_PASSWORD_API\n STAGE = '/-/stage',\n}\n"],"mappings":";AAAA,IAAY,QAAL,yBAAA,OAAA;CACL,MAAA,UAAA;CACA,MAAA,YAAA;CACA,MAAA,mBAAA;CACA,MAAA,2BAAA;CACA,MAAA,aAAA;CACA,MAAA,qBAAA;CAEA,MAAA,WAAA;CACA,MAAA,aAAA;CACA,MAAA,cAAA;CACA,MAAA,qBAAA;CAEA,MAAA,WAAA;CACA,MAAA,kBAAA;CAEA,MAAA,eAAA;CACA,MAAA,yBAAA;;AACF,EAAA,CAAA,CAAA;AAIA,IAAY,WAAL,yBAAA,UAAA;CACL,SAAA,WAAA;CACA,SAAA,YAAA;CACA,SAAA,oBAAA;CACA,SAAA,YAAA;CACA,SAAA,cAAA;CACA,SAAA,YAAA;CACA,SAAA,aAAA;CACA,SAAA,YAAA;CAEA,SAAA,WAAA;;AACF,EAAA,CAAA,CAAA"}
@@ -1,5 +1,6 @@
1
1
  import * as yup from 'yup';
2
2
  export declare const USERNAME_MIN_LENGTH = 2;
3
+ export declare const PASSWORD_MIN_LENGTH = 2;
3
4
  export declare const usernameSchema: yup.StringSchema<string, yup.AnyObject, undefined, "">;
4
5
  export declare const passwordSchema: yup.StringSchema<string, yup.AnyObject, undefined, "">;
5
6
  export declare const loginSchema: yup.ObjectSchema<{
@@ -1,8 +1,8 @@
1
1
  const require_runtime = require("../_virtual/_rolldown/runtime.js");
2
2
  let yup = require("yup");
3
3
  yup = require_runtime.__toESM(yup);
4
- var usernameSchema = yup.string().required().min(2).matches(/^[-a-zA-Z0-9_.!~*'()@]+$/, "security.error.username-must-be-url-safe");
5
- var passwordSchema = yup.string().required().min(2);
4
+ var usernameSchema = yup.string().required("form-validation.required-field").min(2, "security.error.username-min-length").matches(/^[-a-zA-Z0-9_.!~*'()@]+$/, "security.error.username-must-be-url-safe");
5
+ var passwordSchema = yup.string().required("form-validation.required-field").min(2, "form-validation.required-min-length");
6
6
  var loginSchema = yup.object({
7
7
  username: usernameSchema,
8
8
  password: passwordSchema
@@ -10,13 +10,13 @@ var loginSchema = yup.object({
10
10
  var addUserSchema = yup.object({
11
11
  username: usernameSchema,
12
12
  password: passwordSchema,
13
- email: yup.string().email().required()
13
+ email: yup.string().email("form-validation.invalid-email").required("form-validation.required-field")
14
14
  });
15
15
  var changePasswordSchema = yup.object({
16
16
  username: usernameSchema,
17
17
  oldPassword: passwordSchema,
18
18
  newPassword: passwordSchema,
19
- confirmPassword: yup.string().required().oneOf([yup.ref("newPassword")], "security.error.password-mismatch")
19
+ confirmPassword: yup.string().required("form-validation.required-field").oneOf([yup.ref("newPassword")], "security.error.password-mismatch")
20
20
  });
21
21
  //#endregion
22
22
  exports.addUserSchema = addUserSchema;
@@ -1 +1 @@
1
- {"version":3,"file":"schemas.js","names":[],"sources":["../../src/utils/schemas.ts"],"sourcesContent":["import * as yup from 'yup';\n\nexport const USERNAME_MIN_LENGTH = 2;\n\n// Matches your current logic\nexport const usernameSchema = yup\n .string()\n .required()\n .min(USERNAME_MIN_LENGTH)\n .matches(/^[-a-zA-Z0-9_.!~*'()@]+$/, 'security.error.username-must-be-url-safe');\n\nexport const passwordSchema = yup.string().required().min(2);\n\nexport const loginSchema = yup.object({\n username: usernameSchema,\n password: passwordSchema,\n});\n\nexport type LoginFormValues = yup.InferType<typeof loginSchema>;\n\nexport const addUserSchema = yup.object({\n username: usernameSchema,\n password: passwordSchema,\n email: yup.string().email().required(),\n});\n\nexport type AddUserFormValues = yup.InferType<typeof addUserSchema>;\n\nexport const changePasswordSchema = yup.object({\n username: usernameSchema,\n oldPassword: passwordSchema,\n newPassword: passwordSchema,\n confirmPassword: yup\n .string()\n .required()\n .oneOf([yup.ref('newPassword')], 'security.error.password-mismatch'),\n});\n\nexport type ChangePasswordFormValues = yup.InferType<typeof changePasswordSchema>;\n"],"mappings":";;;AAKA,IAAa,iBAAiB,IAC3B,OAAO,CAAC,CACR,SAAS,CAAC,CACV,IAAA,CAAuB,CAAC,CACxB,QAAQ,4BAA4B,0CAA0C;AAEjF,IAAa,iBAAiB,IAAI,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC;AAE3D,IAAa,cAAc,IAAI,OAAO;CACpC,UAAU;CACV,UAAU;AACZ,CAAC;AAID,IAAa,gBAAgB,IAAI,OAAO;CACtC,UAAU;CACV,UAAU;CACV,OAAO,IAAI,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,SAAS;AACvC,CAAC;AAID,IAAa,uBAAuB,IAAI,OAAO;CAC7C,UAAU;CACV,aAAa;CACb,aAAa;CACb,iBAAiB,IACd,OAAO,CAAC,CACR,SAAS,CAAC,CACV,MAAM,CAAC,IAAI,IAAI,aAAa,CAAC,GAAG,kCAAkC;AACvE,CAAC"}
1
+ {"version":3,"file":"schemas.js","names":[],"sources":["../../src/utils/schemas.ts"],"sourcesContent":["import * as yup from 'yup';\n\nexport const USERNAME_MIN_LENGTH = 2;\nexport const PASSWORD_MIN_LENGTH = 2;\n\n// All messages are i18n keys; the form fields translate them on render with\n// t(message, { length }) so they follow the selected language.\nexport const usernameSchema = yup\n .string()\n .required('form-validation.required-field')\n .min(USERNAME_MIN_LENGTH, 'security.error.username-min-length')\n .matches(/^[-a-zA-Z0-9_.!~*'()@]+$/, 'security.error.username-must-be-url-safe');\n\nexport const passwordSchema = yup\n .string()\n .required('form-validation.required-field')\n .min(PASSWORD_MIN_LENGTH, 'form-validation.required-min-length');\n\nexport const loginSchema = yup.object({\n username: usernameSchema,\n password: passwordSchema,\n});\n\nexport type LoginFormValues = yup.InferType<typeof loginSchema>;\n\nexport const addUserSchema = yup.object({\n username: usernameSchema,\n password: passwordSchema,\n email: yup\n .string()\n .email('form-validation.invalid-email')\n .required('form-validation.required-field'),\n});\n\nexport type AddUserFormValues = yup.InferType<typeof addUserSchema>;\n\nexport const changePasswordSchema = yup.object({\n username: usernameSchema,\n oldPassword: passwordSchema,\n newPassword: passwordSchema,\n confirmPassword: yup\n .string()\n .required('form-validation.required-field')\n .oneOf([yup.ref('newPassword')], 'security.error.password-mismatch'),\n});\n\nexport type ChangePasswordFormValues = yup.InferType<typeof changePasswordSchema>;\n"],"mappings":";;;AAOA,IAAa,iBAAiB,IAC3B,OAAO,CAAC,CACR,SAAS,gCAAgC,CAAC,CAC1C,IAAA,GAAyB,oCAAoC,CAAC,CAC9D,QAAQ,4BAA4B,0CAA0C;AAEjF,IAAa,iBAAiB,IAC3B,OAAO,CAAC,CACR,SAAS,gCAAgC,CAAC,CAC1C,IAAA,GAAyB,qCAAqC;AAEjE,IAAa,cAAc,IAAI,OAAO;CACpC,UAAU;CACV,UAAU;AACZ,CAAC;AAID,IAAa,gBAAgB,IAAI,OAAO;CACtC,UAAU;CACV,UAAU;CACV,OAAO,IACJ,OAAO,CAAC,CACR,MAAM,+BAA+B,CAAC,CACtC,SAAS,gCAAgC;AAC9C,CAAC;AAID,IAAa,uBAAuB,IAAI,OAAO;CAC7C,UAAU;CACV,aAAa;CACb,aAAa;CACb,iBAAiB,IACd,OAAO,CAAC,CACR,SAAS,gCAAgC,CAAC,CAC1C,MAAM,CAAC,IAAI,IAAI,aAAa,CAAC,GAAG,kCAAkC;AACvE,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import * as yup from "yup";
2
- var usernameSchema = yup.string().required().min(2).matches(/^[-a-zA-Z0-9_.!~*'()@]+$/, "security.error.username-must-be-url-safe");
3
- var passwordSchema = yup.string().required().min(2);
2
+ var usernameSchema = yup.string().required("form-validation.required-field").min(2, "security.error.username-min-length").matches(/^[-a-zA-Z0-9_.!~*'()@]+$/, "security.error.username-must-be-url-safe");
3
+ var passwordSchema = yup.string().required("form-validation.required-field").min(2, "form-validation.required-min-length");
4
4
  var loginSchema = yup.object({
5
5
  username: usernameSchema,
6
6
  password: passwordSchema
@@ -8,13 +8,13 @@ var loginSchema = yup.object({
8
8
  var addUserSchema = yup.object({
9
9
  username: usernameSchema,
10
10
  password: passwordSchema,
11
- email: yup.string().email().required()
11
+ email: yup.string().email("form-validation.invalid-email").required("form-validation.required-field")
12
12
  });
13
13
  var changePasswordSchema = yup.object({
14
14
  username: usernameSchema,
15
15
  oldPassword: passwordSchema,
16
16
  newPassword: passwordSchema,
17
- confirmPassword: yup.string().required().oneOf([yup.ref("newPassword")], "security.error.password-mismatch")
17
+ confirmPassword: yup.string().required("form-validation.required-field").oneOf([yup.ref("newPassword")], "security.error.password-mismatch")
18
18
  });
19
19
  //#endregion
20
20
  export { addUserSchema, changePasswordSchema, loginSchema, passwordSchema, usernameSchema };
@@ -1 +1 @@
1
- {"version":3,"file":"schemas.mjs","names":[],"sources":["../../src/utils/schemas.ts"],"sourcesContent":["import * as yup from 'yup';\n\nexport const USERNAME_MIN_LENGTH = 2;\n\n// Matches your current logic\nexport const usernameSchema = yup\n .string()\n .required()\n .min(USERNAME_MIN_LENGTH)\n .matches(/^[-a-zA-Z0-9_.!~*'()@]+$/, 'security.error.username-must-be-url-safe');\n\nexport const passwordSchema = yup.string().required().min(2);\n\nexport const loginSchema = yup.object({\n username: usernameSchema,\n password: passwordSchema,\n});\n\nexport type LoginFormValues = yup.InferType<typeof loginSchema>;\n\nexport const addUserSchema = yup.object({\n username: usernameSchema,\n password: passwordSchema,\n email: yup.string().email().required(),\n});\n\nexport type AddUserFormValues = yup.InferType<typeof addUserSchema>;\n\nexport const changePasswordSchema = yup.object({\n username: usernameSchema,\n oldPassword: passwordSchema,\n newPassword: passwordSchema,\n confirmPassword: yup\n .string()\n .required()\n .oneOf([yup.ref('newPassword')], 'security.error.password-mismatch'),\n});\n\nexport type ChangePasswordFormValues = yup.InferType<typeof changePasswordSchema>;\n"],"mappings":";AAKA,IAAa,iBAAiB,IAC3B,OAAO,CAAC,CACR,SAAS,CAAC,CACV,IAAA,CAAuB,CAAC,CACxB,QAAQ,4BAA4B,0CAA0C;AAEjF,IAAa,iBAAiB,IAAI,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC;AAE3D,IAAa,cAAc,IAAI,OAAO;CACpC,UAAU;CACV,UAAU;AACZ,CAAC;AAID,IAAa,gBAAgB,IAAI,OAAO;CACtC,UAAU;CACV,UAAU;CACV,OAAO,IAAI,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,SAAS;AACvC,CAAC;AAID,IAAa,uBAAuB,IAAI,OAAO;CAC7C,UAAU;CACV,aAAa;CACb,aAAa;CACb,iBAAiB,IACd,OAAO,CAAC,CACR,SAAS,CAAC,CACV,MAAM,CAAC,IAAI,IAAI,aAAa,CAAC,GAAG,kCAAkC;AACvE,CAAC"}
1
+ {"version":3,"file":"schemas.mjs","names":[],"sources":["../../src/utils/schemas.ts"],"sourcesContent":["import * as yup from 'yup';\n\nexport const USERNAME_MIN_LENGTH = 2;\nexport const PASSWORD_MIN_LENGTH = 2;\n\n// All messages are i18n keys; the form fields translate them on render with\n// t(message, { length }) so they follow the selected language.\nexport const usernameSchema = yup\n .string()\n .required('form-validation.required-field')\n .min(USERNAME_MIN_LENGTH, 'security.error.username-min-length')\n .matches(/^[-a-zA-Z0-9_.!~*'()@]+$/, 'security.error.username-must-be-url-safe');\n\nexport const passwordSchema = yup\n .string()\n .required('form-validation.required-field')\n .min(PASSWORD_MIN_LENGTH, 'form-validation.required-min-length');\n\nexport const loginSchema = yup.object({\n username: usernameSchema,\n password: passwordSchema,\n});\n\nexport type LoginFormValues = yup.InferType<typeof loginSchema>;\n\nexport const addUserSchema = yup.object({\n username: usernameSchema,\n password: passwordSchema,\n email: yup\n .string()\n .email('form-validation.invalid-email')\n .required('form-validation.required-field'),\n});\n\nexport type AddUserFormValues = yup.InferType<typeof addUserSchema>;\n\nexport const changePasswordSchema = yup.object({\n username: usernameSchema,\n oldPassword: passwordSchema,\n newPassword: passwordSchema,\n confirmPassword: yup\n .string()\n .required('form-validation.required-field')\n .oneOf([yup.ref('newPassword')], 'security.error.password-mismatch'),\n});\n\nexport type ChangePasswordFormValues = yup.InferType<typeof changePasswordSchema>;\n"],"mappings":";AAOA,IAAa,iBAAiB,IAC3B,OAAO,CAAC,CACR,SAAS,gCAAgC,CAAC,CAC1C,IAAA,GAAyB,oCAAoC,CAAC,CAC9D,QAAQ,4BAA4B,0CAA0C;AAEjF,IAAa,iBAAiB,IAC3B,OAAO,CAAC,CACR,SAAS,gCAAgC,CAAC,CAC1C,IAAA,GAAyB,qCAAqC;AAEjE,IAAa,cAAc,IAAI,OAAO;CACpC,UAAU;CACV,UAAU;AACZ,CAAC;AAID,IAAa,gBAAgB,IAAI,OAAO;CACtC,UAAU;CACV,UAAU;CACV,OAAO,IACJ,OAAO,CAAC,CACR,MAAM,+BAA+B,CAAC,CACtC,SAAS,gCAAgC;AAC9C,CAAC;AAID,IAAa,uBAAuB,IAAI,OAAO;CAC7C,UAAU;CACV,aAAa;CACb,aAAa;CACb,iBAAiB,IACd,OAAO,CAAC,CACR,SAAS,gCAAgC,CAAC,CAC1C,MAAM,CAAC,IAAI,IAAI,aAAa,CAAC,GAAG,kCAAkC;AACvE,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Random 36-char session id (uuid v4 format) for the signup endpoint.
3
+ *
4
+ * `crypto.randomUUID` only exists in secure contexts (https / localhost);
5
+ * plain-http LAN registries — a very common deployment — need the
6
+ * `getRandomValues` fallback, which is available everywhere.
7
+ */
8
+ export declare function generateSessionId(): string;
@@ -0,0 +1,26 @@
1
+ //#region src/utils/session-id.ts
2
+ /**
3
+ * Random 36-char session id (uuid v4 format) for the signup endpoint.
4
+ *
5
+ * `crypto.randomUUID` only exists in secure contexts (https / localhost);
6
+ * plain-http LAN registries — a very common deployment — need the
7
+ * `getRandomValues` fallback, which is available everywhere.
8
+ */
9
+ function generateSessionId() {
10
+ if (typeof crypto.randomUUID === "function") return crypto.randomUUID();
11
+ const bytes = crypto.getRandomValues(/* @__PURE__ */ new Uint8Array(16));
12
+ bytes[6] = bytes[6] & 15 | 64;
13
+ bytes[8] = bytes[8] & 63 | 128;
14
+ const hex = Array.from(bytes, (byte) => byte.toString(16).padStart(2, "0")).join("");
15
+ return [
16
+ hex.slice(0, 8),
17
+ hex.slice(8, 12),
18
+ hex.slice(12, 16),
19
+ hex.slice(16, 20),
20
+ hex.slice(20)
21
+ ].join("-");
22
+ }
23
+ //#endregion
24
+ exports.generateSessionId = generateSessionId;
25
+
26
+ //# sourceMappingURL=session-id.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-id.js","names":[],"sources":["../../src/utils/session-id.ts"],"sourcesContent":["/**\n * Random 36-char session id (uuid v4 format) for the signup endpoint.\n *\n * `crypto.randomUUID` only exists in secure contexts (https / localhost);\n * plain-http LAN registries — a very common deployment — need the\n * `getRandomValues` fallback, which is available everywhere.\n */\nexport function generateSessionId(): string {\n if (typeof crypto.randomUUID === 'function') {\n return crypto.randomUUID();\n }\n\n const bytes = crypto.getRandomValues(new Uint8Array(16));\n // eslint-disable-next-line no-bitwise\n bytes[6] = (bytes[6] & 0x0f) | 0x40; // version 4\n // eslint-disable-next-line no-bitwise\n bytes[8] = (bytes[8] & 0x3f) | 0x80; // variant 10xx\n const hex = Array.from(bytes, (byte) => byte.toString(16).padStart(2, '0')).join('');\n return [\n hex.slice(0, 8),\n hex.slice(8, 12),\n hex.slice(12, 16),\n hex.slice(16, 20),\n hex.slice(20),\n ].join('-');\n}\n"],"mappings":";;;;;;;;AAOA,SAAgB,oBAA4B;CAC1C,IAAI,OAAO,OAAO,eAAe,YAC/B,OAAO,OAAO,WAAW;CAG3B,MAAM,QAAQ,OAAO,gCAAgB,IAAI,WAAW,EAAE,CAAC;CAEvD,MAAM,KAAM,MAAM,KAAK,KAAQ;CAE/B,MAAM,KAAM,MAAM,KAAK,KAAQ;CAC/B,MAAM,MAAM,MAAM,KAAK,QAAQ,SAAS,KAAK,SAAS,EAAE,CAAC,CAAC,SAAS,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE;CACnF,OAAO;EACL,IAAI,MAAM,GAAG,CAAC;EACd,IAAI,MAAM,GAAG,EAAE;EACf,IAAI,MAAM,IAAI,EAAE;EAChB,IAAI,MAAM,IAAI,EAAE;EAChB,IAAI,MAAM,EAAE;CACd,CAAC,CAAC,KAAK,GAAG;AACZ"}
@@ -0,0 +1,26 @@
1
+ //#region src/utils/session-id.ts
2
+ /**
3
+ * Random 36-char session id (uuid v4 format) for the signup endpoint.
4
+ *
5
+ * `crypto.randomUUID` only exists in secure contexts (https / localhost);
6
+ * plain-http LAN registries — a very common deployment — need the
7
+ * `getRandomValues` fallback, which is available everywhere.
8
+ */
9
+ function generateSessionId() {
10
+ if (typeof crypto.randomUUID === "function") return crypto.randomUUID();
11
+ const bytes = crypto.getRandomValues(/* @__PURE__ */ new Uint8Array(16));
12
+ bytes[6] = bytes[6] & 15 | 64;
13
+ bytes[8] = bytes[8] & 63 | 128;
14
+ const hex = Array.from(bytes, (byte) => byte.toString(16).padStart(2, "0")).join("");
15
+ return [
16
+ hex.slice(0, 8),
17
+ hex.slice(8, 12),
18
+ hex.slice(12, 16),
19
+ hex.slice(16, 20),
20
+ hex.slice(20)
21
+ ].join("-");
22
+ }
23
+ //#endregion
24
+ export { generateSessionId };
25
+
26
+ //# sourceMappingURL=session-id.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-id.mjs","names":[],"sources":["../../src/utils/session-id.ts"],"sourcesContent":["/**\n * Random 36-char session id (uuid v4 format) for the signup endpoint.\n *\n * `crypto.randomUUID` only exists in secure contexts (https / localhost);\n * plain-http LAN registries — a very common deployment — need the\n * `getRandomValues` fallback, which is available everywhere.\n */\nexport function generateSessionId(): string {\n if (typeof crypto.randomUUID === 'function') {\n return crypto.randomUUID();\n }\n\n const bytes = crypto.getRandomValues(new Uint8Array(16));\n // eslint-disable-next-line no-bitwise\n bytes[6] = (bytes[6] & 0x0f) | 0x40; // version 4\n // eslint-disable-next-line no-bitwise\n bytes[8] = (bytes[8] & 0x3f) | 0x80; // variant 10xx\n const hex = Array.from(bytes, (byte) => byte.toString(16).padStart(2, '0')).join('');\n return [\n hex.slice(0, 8),\n hex.slice(8, 12),\n hex.slice(12, 16),\n hex.slice(16, 20),\n hex.slice(20),\n ].join('-');\n}\n"],"mappings":";;;;;;;;AAOA,SAAgB,oBAA4B;CAC1C,IAAI,OAAO,OAAO,eAAe,YAC/B,OAAO,OAAO,WAAW;CAG3B,MAAM,QAAQ,OAAO,gCAAgB,IAAI,WAAW,EAAE,CAAC;CAEvD,MAAM,KAAM,MAAM,KAAK,KAAQ;CAE/B,MAAM,KAAM,MAAM,KAAK,KAAQ;CAC/B,MAAM,MAAM,MAAM,KAAK,QAAQ,SAAS,KAAK,SAAS,EAAE,CAAC,CAAC,SAAS,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE;CACnF,OAAO;EACL,IAAI,MAAM,GAAG,CAAC;EACd,IAAI,MAAM,GAAG,EAAE;EACf,IAAI,MAAM,IAAI,EAAE;EAChB,IAAI,MAAM,IAAI,EAAE;EAChB,IAAI,MAAM,EAAE;CACd,CAAC,CAAC,KAAK,GAAG;AACZ"}
@@ -1 +1,2 @@
1
+ export declare function tokenExpireInMs(token: string | null): number | null;
1
2
  export declare function isTokenExpire(token: string | null): boolean;
@@ -1,22 +1,26 @@
1
1
  let js_base64 = require("js-base64");
2
2
  let lodash_es = require("lodash-es");
3
3
  //#region src/utils/token.ts
4
- function isTokenExpire(token) {
5
- if (typeof token !== "string") return true;
4
+ function tokenExpireInMs(token) {
5
+ if (typeof token !== "string") return null;
6
6
  const [, payload] = token.split(".");
7
- if (!payload) return true;
7
+ if (!payload) return null;
8
8
  let exp;
9
9
  try {
10
10
  exp = JSON.parse(js_base64.Base64.decode(payload)).exp;
11
11
  } catch (error) {
12
- console.error("Invalid token:", error, token);
13
- return true;
12
+ console.error("Invalid token:", error);
13
+ return null;
14
14
  }
15
- if (!exp || !(0, lodash_es.isNumber)(exp)) return true;
16
- const jsTimestamp = exp * 1e3 - 3e4;
17
- return Date.now() >= jsTimestamp;
15
+ if (!exp || !(0, lodash_es.isNumber)(exp)) return null;
16
+ return exp * 1e3 - 3e4 - Date.now();
17
+ }
18
+ function isTokenExpire(token) {
19
+ const remaining = tokenExpireInMs(token);
20
+ return remaining === null || remaining <= 0;
18
21
  }
19
22
  //#endregion
20
23
  exports.isTokenExpire = isTokenExpire;
24
+ exports.tokenExpireInMs = tokenExpireInMs;
21
25
 
22
26
  //# sourceMappingURL=token.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"token.js","names":[],"sources":["../../src/utils/token.ts"],"sourcesContent":["import { Base64 } from 'js-base64';\nimport { isNumber } from 'lodash-es';\n\nexport function isTokenExpire(token: string | null): boolean {\n if (typeof token !== 'string') {\n return true;\n }\n\n const [, payload] = token.split('.');\n\n if (!payload) {\n return true;\n }\n\n let exp: number;\n try {\n exp = JSON.parse(Base64.decode(payload)).exp;\n } catch (error: unknown) {\n console.error('Invalid token:', error, token);\n return true;\n }\n\n if (!exp || !isNumber(exp)) {\n return true;\n }\n // Report as expire before (real expire time - 30s)\n const jsTimestamp = exp * 1000 - 30000;\n const expired = Date.now() >= jsTimestamp;\n\n return expired;\n}\n"],"mappings":";;;AAGA,SAAgB,cAAc,OAA+B;CAC3D,IAAI,OAAO,UAAU,UACnB,OAAO;CAGT,MAAM,GAAG,WAAW,MAAM,MAAM,GAAG;CAEnC,IAAI,CAAC,SACH,OAAO;CAGT,IAAI;CACJ,IAAI;EACF,MAAM,KAAK,MAAM,UAAA,OAAO,OAAO,OAAO,CAAC,CAAC,CAAC;CAC3C,SAAS,OAAgB;EACvB,QAAQ,MAAM,kBAAkB,OAAO,KAAK;EAC5C,OAAO;CACT;CAEA,IAAI,CAAC,OAAO,EAAA,GAAC,UAAA,SAAA,CAAS,GAAG,GACvB,OAAO;CAGT,MAAM,cAAc,MAAM,MAAO;CAGjC,OAFgB,KAAK,IAAI,KAAK;AAGhC"}
1
+ {"version":3,"file":"token.js","names":[],"sources":["../../src/utils/token.ts"],"sourcesContent":["import { Base64 } from 'js-base64';\nimport { isNumber } from 'lodash-es';\n\n// ms until the token reports as expired (30s guard included); null when undecodable\nexport function tokenExpireInMs(token: string | null): number | null {\n if (typeof token !== 'string') {\n return null;\n }\n\n const [, payload] = token.split('.');\n\n if (!payload) {\n return null;\n }\n\n let exp: number;\n try {\n exp = JSON.parse(Base64.decode(payload)).exp;\n } catch (error: unknown) {\n // never log the token itself: even a malformed one is credential material\n console.error('Invalid token:', error);\n return null;\n }\n\n if (!exp || !isNumber(exp)) {\n return null;\n }\n // Report as expired before (real expire time - 30s)\n return exp * 1000 - 30000 - Date.now();\n}\n\nexport function isTokenExpire(token: string | null): boolean {\n const remaining = tokenExpireInMs(token);\n return remaining === null || remaining <= 0;\n}\n"],"mappings":";;;AAIA,SAAgB,gBAAgB,OAAqC;CACnE,IAAI,OAAO,UAAU,UACnB,OAAO;CAGT,MAAM,GAAG,WAAW,MAAM,MAAM,GAAG;CAEnC,IAAI,CAAC,SACH,OAAO;CAGT,IAAI;CACJ,IAAI;EACF,MAAM,KAAK,MAAM,UAAA,OAAO,OAAO,OAAO,CAAC,CAAC,CAAC;CAC3C,SAAS,OAAgB;EAEvB,QAAQ,MAAM,kBAAkB,KAAK;EACrC,OAAO;CACT;CAEA,IAAI,CAAC,OAAO,EAAA,GAAC,UAAA,SAAA,CAAS,GAAG,GACvB,OAAO;CAGT,OAAO,MAAM,MAAO,MAAQ,KAAK,IAAI;AACvC;AAEA,SAAgB,cAAc,OAA+B;CAC3D,MAAM,YAAY,gBAAgB,KAAK;CACvC,OAAO,cAAc,QAAQ,aAAa;AAC5C"}
@@ -1,22 +1,25 @@
1
1
  import { Base64 } from "js-base64";
2
2
  import { isNumber } from "lodash-es";
3
3
  //#region src/utils/token.ts
4
- function isTokenExpire(token) {
5
- if (typeof token !== "string") return true;
4
+ function tokenExpireInMs(token) {
5
+ if (typeof token !== "string") return null;
6
6
  const [, payload] = token.split(".");
7
- if (!payload) return true;
7
+ if (!payload) return null;
8
8
  let exp;
9
9
  try {
10
10
  exp = JSON.parse(Base64.decode(payload)).exp;
11
11
  } catch (error) {
12
- console.error("Invalid token:", error, token);
13
- return true;
12
+ console.error("Invalid token:", error);
13
+ return null;
14
14
  }
15
- if (!exp || !isNumber(exp)) return true;
16
- const jsTimestamp = exp * 1e3 - 3e4;
17
- return Date.now() >= jsTimestamp;
15
+ if (!exp || !isNumber(exp)) return null;
16
+ return exp * 1e3 - 3e4 - Date.now();
17
+ }
18
+ function isTokenExpire(token) {
19
+ const remaining = tokenExpireInMs(token);
20
+ return remaining === null || remaining <= 0;
18
21
  }
19
22
  //#endregion
20
- export { isTokenExpire };
23
+ export { isTokenExpire, tokenExpireInMs };
21
24
 
22
25
  //# sourceMappingURL=token.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"token.mjs","names":[],"sources":["../../src/utils/token.ts"],"sourcesContent":["import { Base64 } from 'js-base64';\nimport { isNumber } from 'lodash-es';\n\nexport function isTokenExpire(token: string | null): boolean {\n if (typeof token !== 'string') {\n return true;\n }\n\n const [, payload] = token.split('.');\n\n if (!payload) {\n return true;\n }\n\n let exp: number;\n try {\n exp = JSON.parse(Base64.decode(payload)).exp;\n } catch (error: unknown) {\n console.error('Invalid token:', error, token);\n return true;\n }\n\n if (!exp || !isNumber(exp)) {\n return true;\n }\n // Report as expire before (real expire time - 30s)\n const jsTimestamp = exp * 1000 - 30000;\n const expired = Date.now() >= jsTimestamp;\n\n return expired;\n}\n"],"mappings":";;;AAGA,SAAgB,cAAc,OAA+B;CAC3D,IAAI,OAAO,UAAU,UACnB,OAAO;CAGT,MAAM,GAAG,WAAW,MAAM,MAAM,GAAG;CAEnC,IAAI,CAAC,SACH,OAAO;CAGT,IAAI;CACJ,IAAI;EACF,MAAM,KAAK,MAAM,OAAO,OAAO,OAAO,CAAC,CAAC,CAAC;CAC3C,SAAS,OAAgB;EACvB,QAAQ,MAAM,kBAAkB,OAAO,KAAK;EAC5C,OAAO;CACT;CAEA,IAAI,CAAC,OAAO,CAAC,SAAS,GAAG,GACvB,OAAO;CAGT,MAAM,cAAc,MAAM,MAAO;CAGjC,OAFgB,KAAK,IAAI,KAAK;AAGhC"}
1
+ {"version":3,"file":"token.mjs","names":[],"sources":["../../src/utils/token.ts"],"sourcesContent":["import { Base64 } from 'js-base64';\nimport { isNumber } from 'lodash-es';\n\n// ms until the token reports as expired (30s guard included); null when undecodable\nexport function tokenExpireInMs(token: string | null): number | null {\n if (typeof token !== 'string') {\n return null;\n }\n\n const [, payload] = token.split('.');\n\n if (!payload) {\n return null;\n }\n\n let exp: number;\n try {\n exp = JSON.parse(Base64.decode(payload)).exp;\n } catch (error: unknown) {\n // never log the token itself: even a malformed one is credential material\n console.error('Invalid token:', error);\n return null;\n }\n\n if (!exp || !isNumber(exp)) {\n return null;\n }\n // Report as expired before (real expire time - 30s)\n return exp * 1000 - 30000 - Date.now();\n}\n\nexport function isTokenExpire(token: string | null): boolean {\n const remaining = tokenExpireInMs(token);\n return remaining === null || remaining <= 0;\n}\n"],"mappings":";;;AAIA,SAAgB,gBAAgB,OAAqC;CACnE,IAAI,OAAO,UAAU,UACnB,OAAO;CAGT,MAAM,GAAG,WAAW,MAAM,MAAM,GAAG;CAEnC,IAAI,CAAC,SACH,OAAO;CAGT,IAAI;CACJ,IAAI;EACF,MAAM,KAAK,MAAM,OAAO,OAAO,OAAO,CAAC,CAAC,CAAC;CAC3C,SAAS,OAAgB;EAEvB,QAAQ,MAAM,kBAAkB,KAAK;EACrC,OAAO;CACT;CAEA,IAAI,CAAC,OAAO,CAAC,SAAS,GAAG,GACvB,OAAO;CAGT,OAAO,MAAM,MAAO,MAAQ,KAAK,IAAI;AACvC;AAEA,SAAgB,cAAc,OAA+B;CAC3D,MAAM,YAAY,gBAAgB,KAAK;CACvC,OAAO,cAAc,QAAQ,aAAa;AAC5C"}
@@ -11,7 +11,7 @@ var url_exports = /* @__PURE__ */ require_runtime.__exportAll({
11
11
  isURL: () => isURL
12
12
  });
13
13
  function isURL(url) {
14
- return (0, validator_lib_isURL.default)(url || "", {
14
+ return (0, validator_lib_isURL.default)(typeof url === "string" ? url : "", {
15
15
  protocols: [
16
16
  "http",
17
17
  "https",
@@ -1 +1 @@
1
- {"version":3,"file":"url.js","names":[],"sources":["../../src/utils/url.ts"],"sourcesContent":["import isEmailValidator from 'validator/lib/isEmail';\nimport isURLValidator from 'validator/lib/isURL';\n\nexport function isURL(url: string): boolean {\n return isURLValidator(url || '', {\n protocols: ['http', 'https', 'git+https', 'git'],\n require_protocol: true,\n require_tld: false,\n });\n}\n\nexport function isEmail(email: string): boolean {\n return isEmailValidator(email || '');\n}\n\nexport function extractFileName(url: string): string {\n return url.substring(url.lastIndexOf('/') + 1);\n}\n\n// Legacy Edge support for file downloads\ninterface NavigatorWithMSSaveBlob extends Navigator {\n msSaveBlob?: (blob: Blob, fileName: string) => boolean;\n}\n\nfunction blobToFile(blob: Blob, fileName: string): File {\n // Create a proper File object by extending the Blob with File properties\n const fileProperties = {\n lastModified: Date.now(),\n name: fileName,\n };\n\n // Use Object.assign to copy properties while maintaining the Blob prototype\n return Object.assign(blob, fileProperties) as File;\n}\n\nexport function downloadFile(fileStream: Blob, fileName: string): void {\n let file: File;\n // File constructor is not supported by Edge\n // https://developer.mozilla.org/en-US/docs/Web/API/File#Browser_compatibility\n const nav = navigator as NavigatorWithMSSaveBlob;\n if (nav.msSaveBlob) {\n // Detect if Edge\n file = blobToFile(new Blob([fileStream], { type: 'application/octet-stream' }), fileName);\n } else {\n file = new File([fileStream], fileName, {\n type: 'application/octet-stream',\n lastModified: Date.now(),\n });\n }\n\n const objectURL = URL.createObjectURL(file);\n const fileLink = document.createElement('a');\n fileLink.href = objectURL;\n fileLink.download = fileName;\n\n // Skip actual download in test environment to avoid JSDOM navigation error\n // Check if we're in a test environment (JSDOM)\n const isTestEnvironment =\n (typeof window !== 'undefined' &&\n window.navigator &&\n window.navigator.userAgent &&\n window.navigator.userAgent.includes('Node.js')) ||\n window.navigator.userAgent.includes('jsdom');\n\n if (!isTestEnvironment) {\n // Without appending to an HTML Element, download dialog does not show up on Firefox\n // https://github.com/verdaccio/ui/issues/119\n document.documentElement.appendChild(fileLink);\n fileLink.click();\n // firefox requires remove the object url\n setTimeout(() => {\n URL.revokeObjectURL(objectURL);\n document.documentElement.removeChild(fileLink);\n }, 150);\n } else {\n // In test environment, just clean up without triggering navigation\n setTimeout(() => {\n URL.revokeObjectURL(objectURL);\n }, 150);\n }\n}\n"],"mappings":";;;;;;;;;;;;AAGA,SAAgB,MAAM,KAAsB;CAC1C,QAAA,GAAO,oBAAA,QAAA,CAAe,OAAO,IAAI;EAC/B,WAAW;GAAC;GAAQ;GAAS;GAAa;EAAK;EAC/C,kBAAkB;EAClB,aAAa;CACf,CAAC;AACH;AAEA,SAAgB,QAAQ,OAAwB;CAC9C,QAAA,GAAO,sBAAA,QAAA,CAAiB,SAAS,EAAE;AACrC;AAEA,SAAgB,gBAAgB,KAAqB;CACnD,OAAO,IAAI,UAAU,IAAI,YAAY,GAAG,IAAI,CAAC;AAC/C;AAOA,SAAS,WAAW,MAAY,UAAwB;CAQtD,OAAO,OAAO,OAAO,MAAM;EALzB,cAAc,KAAK,IAAI;EACvB,MAAM;CAImB,CAAc;AAC3C;AAEA,SAAgB,aAAa,YAAkB,UAAwB;CACrE,IAAI;CAIJ,IAAI,UAAI,YAEN,OAAO,WAAW,IAAI,KAAK,CAAC,UAAU,GAAG,EAAE,MAAM,2BAA2B,CAAC,GAAG,QAAQ;MAExF,OAAO,IAAI,KAAK,CAAC,UAAU,GAAG,UAAU;EACtC,MAAM;EACN,cAAc,KAAK,IAAI;CACzB,CAAC;CAGH,MAAM,YAAY,IAAI,gBAAgB,IAAI;CAC1C,MAAM,WAAW,SAAS,cAAc,GAAG;CAC3C,SAAS,OAAO;CAChB,SAAS,WAAW;CAWpB,IAAI,EAND,OAAO,WAAW,eACjB,OAAO,aACP,OAAO,UAAU,aACjB,OAAO,UAAU,UAAU,SAAS,SAAS,KAC/C,OAAO,UAAU,UAAU,SAAS,OAAO,IAErB;EAGtB,SAAS,gBAAgB,YAAY,QAAQ;EAC7C,SAAS,MAAM;EAEf,iBAAiB;GACf,IAAI,gBAAgB,SAAS;GAC7B,SAAS,gBAAgB,YAAY,QAAQ;EAC/C,GAAG,GAAG;CACR,OAEE,iBAAiB;EACf,IAAI,gBAAgB,SAAS;CAC/B,GAAG,GAAG;AAEV"}
1
+ {"version":3,"file":"url.js","names":[],"sources":["../../src/utils/url.ts"],"sourcesContent":["import isEmailValidator from 'validator/lib/isEmail';\nimport isURLValidator from 'validator/lib/isURL';\n\nexport function isURL(url: string): boolean {\n // npm does not validate these fields on publish: a non-string truthy value\n // (e.g. `homepage: 123`) would make the validator throw and crash the page\n return isURLValidator(typeof url === 'string' ? url : '', {\n protocols: ['http', 'https', 'git+https', 'git'],\n require_protocol: true,\n require_tld: false,\n });\n}\n\nexport function isEmail(email: string): boolean {\n return isEmailValidator(email || '');\n}\n\nexport function extractFileName(url: string): string {\n return url.substring(url.lastIndexOf('/') + 1);\n}\n\n// Legacy Edge support for file downloads\ninterface NavigatorWithMSSaveBlob extends Navigator {\n msSaveBlob?: (blob: Blob, fileName: string) => boolean;\n}\n\nfunction blobToFile(blob: Blob, fileName: string): File {\n // Create a proper File object by extending the Blob with File properties\n const fileProperties = {\n lastModified: Date.now(),\n name: fileName,\n };\n\n // Use Object.assign to copy properties while maintaining the Blob prototype\n return Object.assign(blob, fileProperties) as File;\n}\n\nexport function downloadFile(fileStream: Blob, fileName: string): void {\n let file: File;\n // File constructor is not supported by Edge\n // https://developer.mozilla.org/en-US/docs/Web/API/File#Browser_compatibility\n const nav = navigator as NavigatorWithMSSaveBlob;\n if (nav.msSaveBlob) {\n // Detect if Edge\n file = blobToFile(new Blob([fileStream], { type: 'application/octet-stream' }), fileName);\n } else {\n file = new File([fileStream], fileName, {\n type: 'application/octet-stream',\n lastModified: Date.now(),\n });\n }\n\n const objectURL = URL.createObjectURL(file);\n const fileLink = document.createElement('a');\n fileLink.href = objectURL;\n fileLink.download = fileName;\n\n // Skip actual download in test environment to avoid JSDOM navigation error\n // Check if we're in a test environment (JSDOM)\n const isTestEnvironment =\n (typeof window !== 'undefined' &&\n window.navigator &&\n window.navigator.userAgent &&\n window.navigator.userAgent.includes('Node.js')) ||\n window.navigator.userAgent.includes('jsdom');\n\n if (!isTestEnvironment) {\n // Without appending to an HTML Element, download dialog does not show up on Firefox\n // https://github.com/verdaccio/ui/issues/119\n document.documentElement.appendChild(fileLink);\n fileLink.click();\n // firefox requires remove the object url\n setTimeout(() => {\n URL.revokeObjectURL(objectURL);\n document.documentElement.removeChild(fileLink);\n }, 150);\n } else {\n // In test environment, just clean up without triggering navigation\n setTimeout(() => {\n URL.revokeObjectURL(objectURL);\n }, 150);\n }\n}\n"],"mappings":";;;;;;;;;;;;AAGA,SAAgB,MAAM,KAAsB;CAG1C,QAAA,GAAO,oBAAA,QAAA,CAAe,OAAO,QAAQ,WAAW,MAAM,IAAI;EACxD,WAAW;GAAC;GAAQ;GAAS;GAAa;EAAK;EAC/C,kBAAkB;EAClB,aAAa;CACf,CAAC;AACH;AAEA,SAAgB,QAAQ,OAAwB;CAC9C,QAAA,GAAO,sBAAA,QAAA,CAAiB,SAAS,EAAE;AACrC;AAEA,SAAgB,gBAAgB,KAAqB;CACnD,OAAO,IAAI,UAAU,IAAI,YAAY,GAAG,IAAI,CAAC;AAC/C;AAOA,SAAS,WAAW,MAAY,UAAwB;CAQtD,OAAO,OAAO,OAAO,MAAM;EALzB,cAAc,KAAK,IAAI;EACvB,MAAM;CAImB,CAAc;AAC3C;AAEA,SAAgB,aAAa,YAAkB,UAAwB;CACrE,IAAI;CAIJ,IAAI,UAAI,YAEN,OAAO,WAAW,IAAI,KAAK,CAAC,UAAU,GAAG,EAAE,MAAM,2BAA2B,CAAC,GAAG,QAAQ;MAExF,OAAO,IAAI,KAAK,CAAC,UAAU,GAAG,UAAU;EACtC,MAAM;EACN,cAAc,KAAK,IAAI;CACzB,CAAC;CAGH,MAAM,YAAY,IAAI,gBAAgB,IAAI;CAC1C,MAAM,WAAW,SAAS,cAAc,GAAG;CAC3C,SAAS,OAAO;CAChB,SAAS,WAAW;CAWpB,IAAI,EAND,OAAO,WAAW,eACjB,OAAO,aACP,OAAO,UAAU,aACjB,OAAO,UAAU,UAAU,SAAS,SAAS,KAC/C,OAAO,UAAU,UAAU,SAAS,OAAO,IAErB;EAGtB,SAAS,gBAAgB,YAAY,QAAQ;EAC7C,SAAS,MAAM;EAEf,iBAAiB;GACf,IAAI,gBAAgB,SAAS;GAC7B,SAAS,gBAAgB,YAAY,QAAQ;EAC/C,GAAG,GAAG;CACR,OAEE,iBAAiB;EACf,IAAI,gBAAgB,SAAS;CAC/B,GAAG,GAAG;AAEV"}
@@ -9,7 +9,7 @@ var url_exports = /* @__PURE__ */ __exportAll({
9
9
  isURL: () => isURL
10
10
  });
11
11
  function isURL(url) {
12
- return isURLValidator(url || "", {
12
+ return isURLValidator(typeof url === "string" ? url : "", {
13
13
  protocols: [
14
14
  "http",
15
15
  "https",
@@ -1 +1 @@
1
- {"version":3,"file":"url.mjs","names":[],"sources":["../../src/utils/url.ts"],"sourcesContent":["import isEmailValidator from 'validator/lib/isEmail';\nimport isURLValidator from 'validator/lib/isURL';\n\nexport function isURL(url: string): boolean {\n return isURLValidator(url || '', {\n protocols: ['http', 'https', 'git+https', 'git'],\n require_protocol: true,\n require_tld: false,\n });\n}\n\nexport function isEmail(email: string): boolean {\n return isEmailValidator(email || '');\n}\n\nexport function extractFileName(url: string): string {\n return url.substring(url.lastIndexOf('/') + 1);\n}\n\n// Legacy Edge support for file downloads\ninterface NavigatorWithMSSaveBlob extends Navigator {\n msSaveBlob?: (blob: Blob, fileName: string) => boolean;\n}\n\nfunction blobToFile(blob: Blob, fileName: string): File {\n // Create a proper File object by extending the Blob with File properties\n const fileProperties = {\n lastModified: Date.now(),\n name: fileName,\n };\n\n // Use Object.assign to copy properties while maintaining the Blob prototype\n return Object.assign(blob, fileProperties) as File;\n}\n\nexport function downloadFile(fileStream: Blob, fileName: string): void {\n let file: File;\n // File constructor is not supported by Edge\n // https://developer.mozilla.org/en-US/docs/Web/API/File#Browser_compatibility\n const nav = navigator as NavigatorWithMSSaveBlob;\n if (nav.msSaveBlob) {\n // Detect if Edge\n file = blobToFile(new Blob([fileStream], { type: 'application/octet-stream' }), fileName);\n } else {\n file = new File([fileStream], fileName, {\n type: 'application/octet-stream',\n lastModified: Date.now(),\n });\n }\n\n const objectURL = URL.createObjectURL(file);\n const fileLink = document.createElement('a');\n fileLink.href = objectURL;\n fileLink.download = fileName;\n\n // Skip actual download in test environment to avoid JSDOM navigation error\n // Check if we're in a test environment (JSDOM)\n const isTestEnvironment =\n (typeof window !== 'undefined' &&\n window.navigator &&\n window.navigator.userAgent &&\n window.navigator.userAgent.includes('Node.js')) ||\n window.navigator.userAgent.includes('jsdom');\n\n if (!isTestEnvironment) {\n // Without appending to an HTML Element, download dialog does not show up on Firefox\n // https://github.com/verdaccio/ui/issues/119\n document.documentElement.appendChild(fileLink);\n fileLink.click();\n // firefox requires remove the object url\n setTimeout(() => {\n URL.revokeObjectURL(objectURL);\n document.documentElement.removeChild(fileLink);\n }, 150);\n } else {\n // In test environment, just clean up without triggering navigation\n setTimeout(() => {\n URL.revokeObjectURL(objectURL);\n }, 150);\n }\n}\n"],"mappings":";;;;;;;;;;AAGA,SAAgB,MAAM,KAAsB;CAC1C,OAAO,eAAe,OAAO,IAAI;EAC/B,WAAW;GAAC;GAAQ;GAAS;GAAa;EAAK;EAC/C,kBAAkB;EAClB,aAAa;CACf,CAAC;AACH;AAEA,SAAgB,QAAQ,OAAwB;CAC9C,OAAO,iBAAiB,SAAS,EAAE;AACrC;AAEA,SAAgB,gBAAgB,KAAqB;CACnD,OAAO,IAAI,UAAU,IAAI,YAAY,GAAG,IAAI,CAAC;AAC/C;AAOA,SAAS,WAAW,MAAY,UAAwB;CAQtD,OAAO,OAAO,OAAO,MAAM;EALzB,cAAc,KAAK,IAAI;EACvB,MAAM;CAImB,CAAc;AAC3C;AAEA,SAAgB,aAAa,YAAkB,UAAwB;CACrE,IAAI;CAIJ,IAAI,UAAI,YAEN,OAAO,WAAW,IAAI,KAAK,CAAC,UAAU,GAAG,EAAE,MAAM,2BAA2B,CAAC,GAAG,QAAQ;MAExF,OAAO,IAAI,KAAK,CAAC,UAAU,GAAG,UAAU;EACtC,MAAM;EACN,cAAc,KAAK,IAAI;CACzB,CAAC;CAGH,MAAM,YAAY,IAAI,gBAAgB,IAAI;CAC1C,MAAM,WAAW,SAAS,cAAc,GAAG;CAC3C,SAAS,OAAO;CAChB,SAAS,WAAW;CAWpB,IAAI,EAND,OAAO,WAAW,eACjB,OAAO,aACP,OAAO,UAAU,aACjB,OAAO,UAAU,UAAU,SAAS,SAAS,KAC/C,OAAO,UAAU,UAAU,SAAS,OAAO,IAErB;EAGtB,SAAS,gBAAgB,YAAY,QAAQ;EAC7C,SAAS,MAAM;EAEf,iBAAiB;GACf,IAAI,gBAAgB,SAAS;GAC7B,SAAS,gBAAgB,YAAY,QAAQ;EAC/C,GAAG,GAAG;CACR,OAEE,iBAAiB;EACf,IAAI,gBAAgB,SAAS;CAC/B,GAAG,GAAG;AAEV"}
1
+ {"version":3,"file":"url.mjs","names":[],"sources":["../../src/utils/url.ts"],"sourcesContent":["import isEmailValidator from 'validator/lib/isEmail';\nimport isURLValidator from 'validator/lib/isURL';\n\nexport function isURL(url: string): boolean {\n // npm does not validate these fields on publish: a non-string truthy value\n // (e.g. `homepage: 123`) would make the validator throw and crash the page\n return isURLValidator(typeof url === 'string' ? url : '', {\n protocols: ['http', 'https', 'git+https', 'git'],\n require_protocol: true,\n require_tld: false,\n });\n}\n\nexport function isEmail(email: string): boolean {\n return isEmailValidator(email || '');\n}\n\nexport function extractFileName(url: string): string {\n return url.substring(url.lastIndexOf('/') + 1);\n}\n\n// Legacy Edge support for file downloads\ninterface NavigatorWithMSSaveBlob extends Navigator {\n msSaveBlob?: (blob: Blob, fileName: string) => boolean;\n}\n\nfunction blobToFile(blob: Blob, fileName: string): File {\n // Create a proper File object by extending the Blob with File properties\n const fileProperties = {\n lastModified: Date.now(),\n name: fileName,\n };\n\n // Use Object.assign to copy properties while maintaining the Blob prototype\n return Object.assign(blob, fileProperties) as File;\n}\n\nexport function downloadFile(fileStream: Blob, fileName: string): void {\n let file: File;\n // File constructor is not supported by Edge\n // https://developer.mozilla.org/en-US/docs/Web/API/File#Browser_compatibility\n const nav = navigator as NavigatorWithMSSaveBlob;\n if (nav.msSaveBlob) {\n // Detect if Edge\n file = blobToFile(new Blob([fileStream], { type: 'application/octet-stream' }), fileName);\n } else {\n file = new File([fileStream], fileName, {\n type: 'application/octet-stream',\n lastModified: Date.now(),\n });\n }\n\n const objectURL = URL.createObjectURL(file);\n const fileLink = document.createElement('a');\n fileLink.href = objectURL;\n fileLink.download = fileName;\n\n // Skip actual download in test environment to avoid JSDOM navigation error\n // Check if we're in a test environment (JSDOM)\n const isTestEnvironment =\n (typeof window !== 'undefined' &&\n window.navigator &&\n window.navigator.userAgent &&\n window.navigator.userAgent.includes('Node.js')) ||\n window.navigator.userAgent.includes('jsdom');\n\n if (!isTestEnvironment) {\n // Without appending to an HTML Element, download dialog does not show up on Firefox\n // https://github.com/verdaccio/ui/issues/119\n document.documentElement.appendChild(fileLink);\n fileLink.click();\n // firefox requires remove the object url\n setTimeout(() => {\n URL.revokeObjectURL(objectURL);\n document.documentElement.removeChild(fileLink);\n }, 150);\n } else {\n // In test environment, just clean up without triggering navigation\n setTimeout(() => {\n URL.revokeObjectURL(objectURL);\n }, 150);\n }\n}\n"],"mappings":";;;;;;;;;;AAGA,SAAgB,MAAM,KAAsB;CAG1C,OAAO,eAAe,OAAO,QAAQ,WAAW,MAAM,IAAI;EACxD,WAAW;GAAC;GAAQ;GAAS;GAAa;EAAK;EAC/C,kBAAkB;EAClB,aAAa;CACf,CAAC;AACH;AAEA,SAAgB,QAAQ,OAAwB;CAC9C,OAAO,iBAAiB,SAAS,EAAE;AACrC;AAEA,SAAgB,gBAAgB,KAAqB;CACnD,OAAO,IAAI,UAAU,IAAI,YAAY,GAAG,IAAI,CAAC;AAC/C;AAOA,SAAS,WAAW,MAAY,UAAwB;CAQtD,OAAO,OAAO,OAAO,MAAM;EALzB,cAAc,KAAK,IAAI;EACvB,MAAM;CAImB,CAAc;AAC3C;AAEA,SAAgB,aAAa,YAAkB,UAAwB;CACrE,IAAI;CAIJ,IAAI,UAAI,YAEN,OAAO,WAAW,IAAI,KAAK,CAAC,UAAU,GAAG,EAAE,MAAM,2BAA2B,CAAC,GAAG,QAAQ;MAExF,OAAO,IAAI,KAAK,CAAC,UAAU,GAAG,UAAU;EACtC,MAAM;EACN,cAAc,KAAK,IAAI;CACzB,CAAC;CAGH,MAAM,YAAY,IAAI,gBAAgB,IAAI;CAC1C,MAAM,WAAW,SAAS,cAAc,GAAG;CAC3C,SAAS,OAAO;CAChB,SAAS,WAAW;CAWpB,IAAI,EAND,OAAO,WAAW,eACjB,OAAO,aACP,OAAO,UAAU,aACjB,OAAO,UAAU,UAAU,SAAS,SAAS,KAC/C,OAAO,UAAU,UAAU,SAAS,OAAO,IAErB;EAGtB,SAAS,gBAAgB,YAAY,QAAQ;EAC7C,SAAS,MAAM;EAEf,iBAAiB;GACf,IAAI,gBAAgB,SAAS;GAC7B,SAAS,gBAAgB,YAAY,QAAQ;EAC/C,GAAG,GAAG;CACR,OAEE,iBAAiB;EACf,IAAI,gBAAgB,SAAS;CAC/B,GAAG,GAAG;AAEV"}
@@ -19,6 +19,16 @@ export interface Repository {
19
19
  export declare function formatRepository(repository: string | {
20
20
  url?: string;
21
21
  } | unknown): string | null;
22
+ /**
23
+ * Normalizes the `bugs` field to its url.
24
+ * @see https://docs.npmjs.com/cli/configuring-npm/package-json#bugs
25
+ */
26
+ export declare function getBugsUrl(bugs: unknown): string | null;
27
+ /**
28
+ * Normalizes the `funding` field (string, object or array of both) to a url.
29
+ * @see https://docs.npmjs.com/cli/configuring-npm/package-json#funding
30
+ */
31
+ export declare function getFundingUrl(funding: unknown): string | null;
22
32
  export declare function formatDate(lastUpdate: string | number): string;
23
33
  export declare function formatDateDistance(lastUpdate: Date | string | number): string;
24
34
  /**