diff --git a/package.json b/package.json index d688f1e5d..8d352eedd 100644 --- a/package.json +++ b/package.json @@ -118,7 +118,7 @@ "stylelint-webpack-plugin": "1.1.2", "supertest": "4.0.2", "typeface-roboto": "0.0.75", - "typescript": "3.7.4", + "typescript": "3.9.6", "uglifyjs-webpack-plugin": "2.2.0", "url-loader": "3.0.0", "validator": "12.1.0", @@ -169,7 +169,6 @@ "scripts": { "type-check": "tsc --noEmit --pretty", "type-check:watch": "npm run type-check -- --watch", - "type-check-strict:watch": "tsc --project ./tsconfig.strict.json --noEmit --pretty --watch", "release": "standard-version -a", "test:clean": "npx jest --clearCache", "test:acceptance": "codeceptjs run --steps", diff --git a/src/App/Header/Header.tsx b/src/App/Header/Header.tsx index 30045c926..8e6664b2e 100644 --- a/src/App/Header/Header.tsx +++ b/src/App/Header/Header.tsx @@ -22,9 +22,9 @@ interface Props { const Header: React.FC = ({ withoutSearch }) => { const { t } = useTranslation(); const appContext = useContext(AppContext); - const [isInfoDialogOpen, setOpenInfoDialog] = useState(); - const [showMobileNavBar, setShowMobileNavBar] = useState(); - const [showLoginModal, setShowLoginModal] = useState(false); + const [isInfoDialogOpen, setOpenInfoDialog] = useState(false); + const [showMobileNavBar, setShowMobileNavBar] = useState(false); + const [showLoginModal, setShowLoginModal] = useState(false); if (!appContext) { throw Error(t('app-context-not-correct-used')); diff --git a/src/App/Header/HeaderRight.tsx b/src/App/Header/HeaderRight.tsx index ece4ff643..3265b344a 100644 --- a/src/App/Header/HeaderRight.tsx +++ b/src/App/Header/HeaderRight.tsx @@ -27,8 +27,8 @@ const HeaderRight: React.FC = ({ onOpenRegistryInfoDialog, }) => { const themeContext = useContext(ThemeContext); - const [anchorEl, setAnchorEl] = useState(); - const [isMenuOpen, setIsMenuOpen] = useState(); + const [anchorEl, setAnchorEl] = useState(null); + const [isMenuOpen, setIsMenuOpen] = useState(false); const { t } = useTranslation(); diff --git a/src/App/Header/LoginDialog/LoginDialog.tsx b/src/App/Header/LoginDialog/LoginDialog.tsx index bf6916aee..4b78ee060 100644 --- a/src/App/Header/LoginDialog/LoginDialog.tsx +++ b/src/App/Header/LoginDialog/LoginDialog.tsx @@ -3,7 +3,7 @@ import { useTranslation } from 'react-i18next'; import Dialog from 'verdaccio-ui/components/Dialog'; import DialogContent from 'verdaccio-ui/components/DialogContent'; -import { makeLogin } from 'verdaccio-ui/utils/login'; +import { makeLogin, LoginError } from 'verdaccio-ui/utils/login'; import storage from 'verdaccio-ui/utils/storage'; import AppContext from '../../../App/AppContext'; @@ -25,7 +25,7 @@ const LoginDialog: React.FC = ({ onClose, open = false }) => { throw Error(t('app-context-not-correct-used')); } - const [error, setError] = useState(); + const [error, setError] = useState(); const handleDoLogin = useCallback( async (data: FormValues) => { diff --git a/src/pages/Version/VersionContextProvider.tsx b/src/pages/Version/VersionContextProvider.tsx index 8ec31066d..755ef2f75 100644 --- a/src/pages/Version/VersionContextProvider.tsx +++ b/src/pages/Version/VersionContextProvider.tsx @@ -1,5 +1,6 @@ import React, { useEffect, useState } from 'react'; import { useParams } from 'react-router-dom'; +import { PackageMetaInterface } from 'types/packageMeta'; import { callDetailPage, callReadme } from 'verdaccio-ui/utils/calls'; @@ -17,10 +18,10 @@ const VersionContextProvider: React.FC = ({ children }) => { const { version, package: pkgName, scope } = useParams(); const [packageName, setPackageName] = useState(getRouterPackageName(pkgName, scope)); const [packageVersion, setPackageVersion] = useState(version); - const [packageMeta, setPackageMeta] = useState(); - const [readMe, setReadme] = useState(); - const [isLoading, setIsLoading] = useState(true); - const [hasNotBeenFound, setHasNotBeenFound] = useState(); + const [packageMeta, setPackageMeta] = useState(); + const [readMe, setReadme] = useState(); + const [isLoading, setIsLoading] = useState(true); + const [hasNotBeenFound, setHasNotBeenFound] = useState(); useEffect(() => { const updatedPackageName = getRouterPackageName(pkgName, scope); diff --git a/src/utils/api.test.ts b/src/utils/api.test.ts index 1f5e4d75e..1c9ba8703 100644 --- a/src/utils/api.test.ts +++ b/src/utils/api.test.ts @@ -3,16 +3,18 @@ import api, { handleResponseType } from '../../src/utils/api'; describe('api', () => { describe('handleResponseType', () => { test('should handle missing Content-Type', async () => { + const responseText = `responseText`; + const ok = false; const response: Response = { url: 'http://localhost:8080/-/packages', - ok: false, + ok, headers: new Headers(), + text: async () => responseText, } as Response; const handled = await handleResponseType(response); - // Should this actually return [false, null] ? - expect(handled).toBeUndefined(); + expect(handled).toEqual([ok, responseText]); }); test('should test tgz scenario', async () => { @@ -94,9 +96,9 @@ describe('api', () => { expect(fetchSpy).toHaveBeenCalledWith('https://verdaccio.tld/resource', { credentials: 'same-origin', - headers: { + headers: new Headers({ Authorization: 'Bearer token-xx-xx-xx', - }, + }), method: 'GET', }); expect(response).toEqual({ c: 3 }); diff --git a/src/utils/api.ts b/src/utils/api.ts index 255db79b2..21b83d57d 100644 --- a/src/utils/api.ts +++ b/src/utils/api.ts @@ -6,7 +6,7 @@ import '../../types'; * @param {object} response * @returns {promise} */ -export function handleResponseType(response: Response): Promise<[boolean, Blob | string] | void> { +export function handleResponseType(response: Response): Promise<[boolean, any]> { if (response.headers) { const contentType = response.headers.get('Content-Type'); if (contentType && contentType.includes('application/pdf')) { @@ -26,7 +26,7 @@ export function handleResponseType(response: Response): Promise<[boolean, Blob | } } - return Promise.resolve(); + return Promise.all([response.ok, response.text()]); } class API { @@ -36,10 +36,11 @@ class API { } const token = storage.getItem('token'); - if (token && options.headers && typeof options.headers['Authorization'] === 'undefined') { - options.headers = Object.assign({}, options.headers, { - ['Authorization']: `Bearer ${token}`, - }); + const headers = new Headers(options.headers); + + if (token && headers.has('Authorization') === false) { + headers.set('Authorization', `Bearer ${token}`); + options.headers = headers; } if (!['http://', 'https://', '//'].some(prefix => url.startsWith(prefix))) { diff --git a/src/utils/calls.ts b/src/utils/calls.ts index fb2bb713a..9a372f45a 100644 --- a/src/utils/calls.ts +++ b/src/utils/calls.ts @@ -2,15 +2,15 @@ import { PackageMetaInterface } from '../../types/packageMeta'; import API from './api'; -export async function callReadme(packageName: string, packageVersion?: string): Promise { - return await API.request( +export async function callReadme(packageName: string, packageVersion?: string): Promise { + return await API.request( `package/readme/${packageName}${packageVersion ? `?v=${packageVersion}` : ''}`, 'GET' ); } -export async function callDetailPage(packageName: string, packageVersion?: string): Promise { - const packageMeta = await API.request( +export async function callDetailPage(packageName: string, packageVersion?: string): Promise { + const packageMeta = await API.request( `sidebar/${packageName}${packageVersion ? `?v=${packageVersion}` : ''}`, 'GET' ); diff --git a/tsconfig.json b/tsconfig.json index f497a7b38..1b08469bf 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -4,7 +4,6 @@ "target": "esnext", "module": "commonjs", "moduleResolution": "node", - "noImplicitAny": false, "strict": true, "outDir": "build", "allowSyntheticDefaultImports": true, diff --git a/tsconfig.strict.json b/tsconfig.strict.json deleted file mode 100644 index 69bad499a..000000000 --- a/tsconfig.strict.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "noImplicitAny": true - } -} \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index d0a526315..e8da54bf9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -14803,10 +14803,10 @@ typeface-roboto@0.0.75: resolved "https://registry.verdaccio.org/typeface-roboto/-/typeface-roboto-0.0.75.tgz#98d5ba35ec234bbc7172374c8297277099cc712b" integrity sha512-VrR/IiH00Z1tFP4vDGfwZ1esNqTiDMchBEXYY9kilT6wRGgFoCAlgkEUMHb1E3mB0FsfZhv756IF0+R+SFPfdg== -typescript@3.7.4: - version "3.7.4" - resolved "https://registry.verdaccio.org/typescript/-/typescript-3.7.4.tgz#1743a5ec5fef6a1fa9f3e4708e33c81c73876c19" - integrity sha512-A25xv5XCtarLwXpcDNZzCGvW2D1S3/bACratYBx2sax8PefsFhlYmkQicKHvpYflFS8if4zne5zT5kpJ7pzuvw== +typescript@3.9.6: + version "3.9.6" + resolved "https://registry.npmjs.org/typescript/-/typescript-3.9.6.tgz#8f3e0198a34c3ae17091b35571d3afd31999365a" + integrity sha512-Pspx3oKAPJtjNwE92YS05HQoY7z2SFyOpHo9MqJor3BXAGNaPUs83CuVp9VISFkSjyRfiTpmKuAYGJB7S7hOxw== uglify-js@3.4.x: version "3.4.10"