diff --git a/src/components/Dist/Dist.test.tsx b/src/components/Dist/Dist.test.tsx new file mode 100644 index 0000000..5a3a10b --- /dev/null +++ b/src/components/Dist/Dist.test.tsx @@ -0,0 +1,80 @@ +import React from 'react'; +import { shallow } from 'enzyme'; + +describe(' component', () => { + beforeEach(() => { + jest.resetModules(); + }); + + test('should render the component in default state', () => { + const packageMeta = { + latest: { + name: 'verdaccio', + version: '4.0.0', + dist: { + fileCount: 7, + unpackedSize: 10, + }, + license: '', + }, + }; + jest.doMock('../../pages/version/Version', () => ({ + DetailContextConsumer: component => { + return component.children({ packageMeta }); + }, + })); + + const Dist = require('./Dist').default; + const wrapper = shallow(); + expect(wrapper.html()).toMatchSnapshot(); + }); + + test('should render the component with license as string', () => { + const packageMeta = { + latest: { + name: 'verdaccio', + version: '4.0.0', + dist: { + fileCount: 7, + unpackedSize: 10, + }, + license: 'MIT', + }, + }; + jest.doMock('../../pages/version/Version', () => ({ + DetailContextConsumer: component => { + return component.children({ packageMeta }); + }, + })); + + const Dist = require('./Dist').default; + const wrapper = shallow(); + expect(wrapper.html()).toMatchSnapshot(); + }); + + test('should render the component with license as object', () => { + const packageMeta = { + latest: { + name: 'verdaccio', + version: '4.0.0', + dist: { + fileCount: 7, + unpackedSize: 10, + }, + license: { + type: 'MIT', + url: 'https://www.opensource.org/licenses/mit-license.php', + }, + }, + }; + jest.doMock('../../pages/version/Version', () => ({ + DetailContextConsumer: component => { + return component.children({ packageMeta }); + }, + })); + + const Dist = require('./Dist').default; + const wrapper = shallow(); + expect(wrapper.html()).toMatchSnapshot(); + }); +}); diff --git a/src/components/Dist/Dist.tsx b/src/components/Dist/Dist.tsx index 3b05cf4..2edcfee 100644 --- a/src/components/Dist/Dist.tsx +++ b/src/components/Dist/Dist.tsx @@ -6,6 +6,7 @@ import { DetailContextConsumer, VersionPageConsumerProps } from '../../pages/ver import { Heading, DistListItem, DistChips } from './styles'; import fileSizeSI from '../../utils/file-size'; import { PackageMetaInterface } from 'types/packageMeta'; +import { formatLicense } from '../../utils/package'; class Dist extends Component { public render(): JSX.Element { @@ -18,28 +19,25 @@ class Dist extends Component { ); } - private renderChips(dist, license: string): JSX.Element | never[] { + private renderChips(dist, license: PackageMetaInterface['latest']['license']): (JSX.Element | undefined)[] { const distDict = { 'file-count': dist.fileCount, size: dist.unpackedSize && fileSizeSI(dist.unpackedSize), license, }; - const chipsList = Object.keys(distDict).reduce((componentList, title, key) => { - // @ts-ignore - const value = distDict[title]; - if (value) { - const label = ( - - {/* eslint-disable-next-line */} - {title.split('-').join(' ')}:{value} - - ); - // @ts-ignore is not assignable to parameter of type 'never' - componentList.push(); - } - return componentList; - }, []); + const chipsList = Object.keys(distDict).map((dist, key) => { + if (!distDict[dist]) return; + + const value = dist === 'license' ? formatLicense(distDict[dist]) : distDict[dist]; + const label = ( + <> + {/* eslint-disable-next-line */} + {dist.replace('-', ' ')}: {value} + + ); + return ; + }); return chipsList; } diff --git a/src/components/Dist/__snapshots__/Dist.test.tsx.snap b/src/components/Dist/__snapshots__/Dist.test.tsx.snap new file mode 100644 index 0000000..15ebd6c --- /dev/null +++ b/src/components/Dist/__snapshots__/Dist.test.tsx.snap @@ -0,0 +1,7 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[` component should render the component in default state 1`] = `"

    Latest Distribution

  • file count: 7
    size: 10.00 Bytes
"`; + +exports[` component should render the component with license as object 1`] = `"

    Latest Distribution

  • file count: 7
    size: 10.00 Bytes
    license: MIT
"`; + +exports[` component should render the component with license as string 1`] = `"

    Latest Distribution

  • file count: 7
    size: 10.00 Bytes
    license: MIT
"`; diff --git a/src/components/Package/Package.tsx b/src/components/Package/Package.tsx index 006d55f..8c76d66 100644 --- a/src/components/Package/Package.tsx +++ b/src/components/Package/Package.tsx @@ -6,10 +6,29 @@ import HomeIcon from '@material-ui/icons/Home'; import ListItem from '@material-ui/core/ListItem'; import Tooltip from '@material-ui/core/Tooltip'; +import { PackageMetaInterface } from 'types/packageMeta'; import Tag from '../Tag'; import fileSizeSI from '../../utils/file-size'; import { formatDate, formatDateDistance } from '../../utils/package'; - +import { + Author, + Avatar, + Description, + Details, + GridRightAligned, + Icon, + IconButton, + OverviewItem, + PackageList, + PackageListItem, + PackageListItemText, + PackageTitle, + Published, + TagContainer, + Text, + WrapperLink, +} from './styles'; +import { isURL } from '../../utils/url'; interface Author { name: string; avatar?: string; @@ -30,32 +49,11 @@ export interface PackageInterface { author: Author; description?: string; keywords?: string[]; - license?: string | null; + license?: PackageMetaInterface['latest']['license']; homepage?: string; bugs?: Bugs; dist?: Dist; } -// interface Props {} & PackageInterface; - -import { - Author, - Avatar, - Description, - Details, - GridRightAligned, - Icon, - IconButton, - OverviewItem, - PackageList, - PackageListItem, - PackageListItemText, - PackageTitle, - Published, - TagContainer, - Text, - WrapperLink, -} from './styles'; -import { isURL } from '../../utils/url'; const Package: React.FC = ({ author: { name: authorName, avatar: authorAvatar }, diff --git a/src/utils/package.test.ts b/src/utils/package.test.ts index 52de2f7..3674156 100644 --- a/src/utils/package.test.ts +++ b/src/utils/package.test.ts @@ -13,9 +13,9 @@ describe('formatLicense', (): void => { }); test('should check license field for other value', (): void => { - expect(formatLicense(null)).toBeNull(); - expect(formatLicense({})).toBeNull(); - expect(formatLicense([])).toBeNull(); + expect(formatLicense(null)).toBeUndefined(); + expect(formatLicense({})).toBeUndefined(); + expect(formatLicense([])).toBeUndefined(); }); }); diff --git a/src/utils/package.ts b/src/utils/package.ts index 8565e99..eacd5ab 100644 --- a/src/utils/package.ts +++ b/src/utils/package.ts @@ -6,18 +6,13 @@ import { isObject } from 'util'; export const TIMEFORMAT = 'DD.MM.YYYY, HH:mm:ss'; -export interface License { - type: string; - url: string; -} - /** * Formats license field for webui. * @see https://docs.npmjs.com/files/package.json#license */ // License should use type License defined above, but conflicts with the unit test that provide array or empty object /* eslint-disable @typescript-eslint/no-explicit-any */ -export function formatLicense(license: any): string | null { +export function formatLicense(license: any): string | undefined { if (isString(license)) { return license; } @@ -26,7 +21,7 @@ export function formatLicense(license: any): string | null { return license.type; } - return null; + return; } export interface Repository { diff --git a/types/packageMeta.ts b/types/packageMeta.ts index 473c331..171095d 100644 --- a/types/packageMeta.ts +++ b/types/packageMeta.ts @@ -5,7 +5,12 @@ export interface PackageMetaInterface { fileCount: number; unpackedSize: number; }; - license: string; + license?: Partial | string; }; _uplinks: {}; } + +interface LicenseInterface { + type: string; + url: string; +}