@newskit-render/core 1.5.2 → 1.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +51 -0
- package/components/article/index.tsx +1 -1
- package/package.json +9 -10
- package/components/seo/index.test.tsx +0 -106
- package/components/seo/index.tsx +0 -89
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,57 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
# [1.6.0](https://github.com/newscorp-ghfb/ncu-newskit-render/compare/@newskit-render/core@1.5.7...@newskit-render/core@1.6.0) (2021-12-15)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
### Features
|
|
10
|
+
|
|
11
|
+
* **PPDSR-520:** Add SEO Component ([#539](https://github.com/newscorp-ghfb/ncu-newskit-render/issues/539)) ([f9a7103](https://github.com/newscorp-ghfb/ncu-newskit-render/commit/f9a71034e9e7224975d785fb47c68b907b4e5935))
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
## [1.5.7](https://github.com/newscorp-ghfb/ncu-newskit-render/compare/@newskit-render/core@1.5.6...@newskit-render/core@1.5.7) (2021-12-14)
|
|
18
|
+
|
|
19
|
+
**Note:** Version bump only for package @newskit-render/core
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
## [1.5.6](https://github.com/newscorp-ghfb/ncu-newskit-render/compare/@newskit-render/core@1.5.5...@newskit-render/core@1.5.6) (2021-12-13)
|
|
26
|
+
|
|
27
|
+
**Note:** Version bump only for package @newskit-render/core
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
## [1.5.5](https://github.com/newscorp-ghfb/ncu-newskit-render/compare/@newskit-render/core@1.5.4...@newskit-render/core@1.5.5) (2021-12-13)
|
|
34
|
+
|
|
35
|
+
**Note:** Version bump only for package @newskit-render/core
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
## [1.5.4](https://github.com/newscorp-ghfb/ncu-newskit-render/compare/@newskit-render/core@1.5.3...@newskit-render/core@1.5.4) (2021-12-10)
|
|
42
|
+
|
|
43
|
+
**Note:** Version bump only for package @newskit-render/core
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
## [1.5.3](https://github.com/newscorp-ghfb/ncu-newskit-render/compare/@newskit-render/core@1.5.2...@newskit-render/core@1.5.3) (2021-12-08)
|
|
50
|
+
|
|
51
|
+
**Note:** Version bump only for package @newskit-render/core
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
|
|
6
57
|
## [1.5.2](https://github.com/newscorp-ghfb/ncu-newskit-render/compare/@newskit-render/core@1.5.1...@newskit-render/core@1.5.2) (2021-12-03)
|
|
7
58
|
|
|
8
59
|
**Note:** Version bump only for package @newskit-render/core
|
|
@@ -13,13 +13,13 @@ import {
|
|
|
13
13
|
TextBlock,
|
|
14
14
|
Divider,
|
|
15
15
|
} from 'newskit'
|
|
16
|
+
import { SEOComponent } from '@newskit-render/shared-components'
|
|
16
17
|
import MetaBoxComponent from './MetaBox'
|
|
17
18
|
import Ad from '../ad'
|
|
18
19
|
import Highlights from './Highlights'
|
|
19
20
|
import RelatedArticles from './RelatedArticles'
|
|
20
21
|
import RelatedTopics from './RelatedTopics'
|
|
21
22
|
import ShareBarComponent from './ShareBarComponent'
|
|
22
|
-
import SEOComponent from '../seo'
|
|
23
23
|
import {
|
|
24
24
|
URL,
|
|
25
25
|
Slug,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@newskit-render/core",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.6.0",
|
|
4
4
|
"description": "Newskit Render - Core package",
|
|
5
5
|
"author": "",
|
|
6
6
|
"license": "UNLICENSED",
|
|
@@ -28,13 +28,13 @@
|
|
|
28
28
|
},
|
|
29
29
|
"dependencies": {
|
|
30
30
|
"@apollo/client": "^3.4.16",
|
|
31
|
-
"@newskit-render/api": "^0.4.
|
|
32
|
-
"@newskit-render/auth": "^0.22.
|
|
33
|
-
"@newskit-render/checkout": "^0.
|
|
34
|
-
"@newskit-render/my-account": "^0.
|
|
35
|
-
"@newskit-render/shared-components": "^0.
|
|
36
|
-
"@newskit-render/sitemap": "^0.25.
|
|
37
|
-
"@newskit-render/validation": "^0.26.
|
|
31
|
+
"@newskit-render/api": "^0.4.2",
|
|
32
|
+
"@newskit-render/auth": "^0.22.2",
|
|
33
|
+
"@newskit-render/checkout": "^0.7.0",
|
|
34
|
+
"@newskit-render/my-account": "^0.114.2",
|
|
35
|
+
"@newskit-render/shared-components": "^0.18.0",
|
|
36
|
+
"@newskit-render/sitemap": "^0.25.2",
|
|
37
|
+
"@newskit-render/validation": "^0.26.2",
|
|
38
38
|
"cross-fetch": "^3.1.4",
|
|
39
39
|
"graphql": "^15.6.0",
|
|
40
40
|
"newrelic": "^7.1.0",
|
|
@@ -43,8 +43,7 @@
|
|
|
43
43
|
"react": "^17.0.1",
|
|
44
44
|
"react-dom": "^17.0.2",
|
|
45
45
|
"react-helmet": "^6.1.0",
|
|
46
|
-
"react-hook-form": "7.8.4"
|
|
47
|
-
"striptags": "^3.1.1"
|
|
46
|
+
"react-hook-form": "7.8.4"
|
|
48
47
|
},
|
|
49
48
|
"devDependencies": {
|
|
50
49
|
"@apollo/react-testing": "^4.0.0",
|
|
@@ -1,106 +0,0 @@
|
|
|
1
|
-
import React from 'react'
|
|
2
|
-
import { render } from '@testing-library/react'
|
|
3
|
-
import SEOComponent, { limitString } from './index'
|
|
4
|
-
|
|
5
|
-
const getMeta = (metaName: string) => {
|
|
6
|
-
const metas = document.getElementsByTagName('meta')
|
|
7
|
-
for (let i = 0; i < metas.length; i += 1) {
|
|
8
|
-
if (
|
|
9
|
-
metas[i].getAttribute('name') === metaName ||
|
|
10
|
-
metas[i].getAttribute('property') === metaName
|
|
11
|
-
) {
|
|
12
|
-
return metas[i].getAttribute('content')
|
|
13
|
-
}
|
|
14
|
-
}
|
|
15
|
-
return false
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
const getLink = (linkRel: string, attr: string) => {
|
|
19
|
-
const link = document.getElementsByTagName('link')
|
|
20
|
-
for (let i = 0; i < link.length; i += 1) {
|
|
21
|
-
if (link[i].getAttribute('rel') === linkRel) {
|
|
22
|
-
return link[i].getAttribute(attr)
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
return false
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
jest.mock('next/head', () => {
|
|
29
|
-
return {
|
|
30
|
-
__esModule: true,
|
|
31
|
-
default: ({ children }: { children: Array<React.ReactElement> }) => {
|
|
32
|
-
return <>{children}</>
|
|
33
|
-
},
|
|
34
|
-
}
|
|
35
|
-
})
|
|
36
|
-
|
|
37
|
-
describe('SEOComponent tests', () => {
|
|
38
|
-
const Props = {
|
|
39
|
-
title: 'test title for SEOComponent',
|
|
40
|
-
description:
|
|
41
|
-
'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed tincidunt blandit orci vel elementum. Integer malesuada quam in ullamcorper condimentum. Integer sollicitudin non enim sed posuere.',
|
|
42
|
-
url: 'https://test-url/test',
|
|
43
|
-
siteHost: 'https://siteHost.co.uk',
|
|
44
|
-
fbType: 'article',
|
|
45
|
-
fbImageUrl: 'https://test-uri/image',
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
test('SEOComponent with mandatory props', () => {
|
|
49
|
-
render(<SEOComponent {...Props} />, {
|
|
50
|
-
container: document.head,
|
|
51
|
-
})
|
|
52
|
-
expect(document.title).toBe(Props.title)
|
|
53
|
-
expect(getMeta('description')).toBe(limitString(Props.description, 155))
|
|
54
|
-
expect(getMeta('robots')).toBe('max-image-preview:large')
|
|
55
|
-
expect(getMeta('og:title')).toBe(Props.title)
|
|
56
|
-
expect(getMeta('og:type')).toBe(Props.fbType)
|
|
57
|
-
expect(getMeta('og:url')).toBe(Props.url)
|
|
58
|
-
expect(getMeta('twitter:card')).toBe('summary')
|
|
59
|
-
expect(getMeta('twitter:title')).toBe(Props.title)
|
|
60
|
-
expect(getMeta('twitter:site')).toBe(false)
|
|
61
|
-
expect(getMeta('twitter:description')).toBe(false)
|
|
62
|
-
expect(getMeta('twitter:image')).toBe(false)
|
|
63
|
-
expect(getMeta('twitter:image:alt')).toBe(false)
|
|
64
|
-
expect(getLink('canonical', 'href')).toBe(Props.url)
|
|
65
|
-
expect(getLink('alternate', 'href')).toBe(Props.siteHost)
|
|
66
|
-
expect(getLink('alternate', 'hreflang')).toBe('en')
|
|
67
|
-
})
|
|
68
|
-
|
|
69
|
-
test('SEOComponent with optional props', () => {
|
|
70
|
-
const extraProps = {
|
|
71
|
-
...Props,
|
|
72
|
-
gscId: 'asfdrtsdvs',
|
|
73
|
-
fbTitle: 'test facebook title',
|
|
74
|
-
twUsername: '@username',
|
|
75
|
-
twTitle: 'test twitter title',
|
|
76
|
-
twDescription:
|
|
77
|
-
'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed tincidunt blandit orci vel elementum. Integer malesuada quam in ullamcorper condimentum.',
|
|
78
|
-
twImageUrl: 'https://test-uri/image-twitter',
|
|
79
|
-
twImageAlt: 'test alt',
|
|
80
|
-
hrefLang: 'en-GB',
|
|
81
|
-
maxImagePreview: 'standard' as 'none' | 'standard' | 'large',
|
|
82
|
-
}
|
|
83
|
-
render(<SEOComponent {...extraProps} />, {
|
|
84
|
-
container: document.head,
|
|
85
|
-
})
|
|
86
|
-
expect(document.title).toBe(extraProps.title)
|
|
87
|
-
expect(getMeta('description')).toBe(
|
|
88
|
-
limitString(extraProps.description, 155)
|
|
89
|
-
)
|
|
90
|
-
expect(getMeta('robots')).toBe(
|
|
91
|
-
`max-image-preview:${extraProps.maxImagePreview}`
|
|
92
|
-
)
|
|
93
|
-
expect(getMeta('og:title')).toBe(extraProps.fbTitle)
|
|
94
|
-
expect(getMeta('og:type')).toBe(extraProps.fbType)
|
|
95
|
-
expect(getMeta('og:url')).toBe(extraProps.url)
|
|
96
|
-
expect(getMeta('twitter:card')).toBe('summary')
|
|
97
|
-
expect(getMeta('twitter:title')).toBe(extraProps.twTitle)
|
|
98
|
-
expect(getMeta('twitter:site')).toBe(extraProps.twUsername)
|
|
99
|
-
expect(getMeta('twitter:description')).toBe(extraProps.twDescription)
|
|
100
|
-
expect(getMeta('twitter:image')).toBe(extraProps.twImageUrl)
|
|
101
|
-
expect(getMeta('twitter:image:alt')).toBe(extraProps.twImageAlt)
|
|
102
|
-
expect(getLink('canonical', 'href')).toBe(extraProps.url)
|
|
103
|
-
expect(getLink('alternate', 'href')).toBe(extraProps.siteHost)
|
|
104
|
-
expect(getLink('alternate', 'hreflang')).toBe(extraProps.hrefLang)
|
|
105
|
-
})
|
|
106
|
-
})
|
package/components/seo/index.tsx
DELETED
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
import React from 'react'
|
|
2
|
-
import Head from 'next/head'
|
|
3
|
-
import striptags from 'striptags'
|
|
4
|
-
|
|
5
|
-
export const limitString = (text: string, limit: number) =>
|
|
6
|
-
text.length > limit ? text.substr(0, limit) : text
|
|
7
|
-
|
|
8
|
-
type Props = {
|
|
9
|
-
title: string
|
|
10
|
-
description: string
|
|
11
|
-
url: string
|
|
12
|
-
siteHost: string
|
|
13
|
-
hrefLang?: string
|
|
14
|
-
maxImagePreview?: 'none' | 'standard' | 'large'
|
|
15
|
-
gscId?: string
|
|
16
|
-
fbTitle?: string
|
|
17
|
-
fbType: string
|
|
18
|
-
fbImageUrl: string
|
|
19
|
-
twUsername?: string
|
|
20
|
-
twTitle?: string
|
|
21
|
-
twDescription?: string
|
|
22
|
-
twImageUrl?: string
|
|
23
|
-
twImageAlt?: string
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
const SEOComponent: React.FC<Props> = ({
|
|
27
|
-
title,
|
|
28
|
-
description,
|
|
29
|
-
url,
|
|
30
|
-
siteHost,
|
|
31
|
-
hrefLang = 'en',
|
|
32
|
-
maxImagePreview = 'large',
|
|
33
|
-
gscId,
|
|
34
|
-
fbTitle,
|
|
35
|
-
fbType,
|
|
36
|
-
fbImageUrl,
|
|
37
|
-
twUsername,
|
|
38
|
-
twTitle,
|
|
39
|
-
twDescription,
|
|
40
|
-
twImageUrl,
|
|
41
|
-
twImageAlt,
|
|
42
|
-
}) => (
|
|
43
|
-
<Head>
|
|
44
|
-
<title>{title}</title>
|
|
45
|
-
<meta
|
|
46
|
-
name="description"
|
|
47
|
-
content={limitString(striptags(description), 155)}
|
|
48
|
-
key="description"
|
|
49
|
-
/>
|
|
50
|
-
<link rel="canonical" href={url} />
|
|
51
|
-
<link rel="alternate" href={siteHost} hrefLang={hrefLang} />
|
|
52
|
-
<meta
|
|
53
|
-
name="robots"
|
|
54
|
-
content={`max-image-preview:${maxImagePreview}`}
|
|
55
|
-
key="max-image-preview"
|
|
56
|
-
/>
|
|
57
|
-
{gscId && <meta name="google-site-verification" content={gscId} />}
|
|
58
|
-
|
|
59
|
-
<meta property="og:title" content={fbTitle || title} key="ogtitle" />
|
|
60
|
-
<meta property="og:type" content={fbType} key="ogtype" />
|
|
61
|
-
<meta property="og:url" content={url} key="ogurl" />
|
|
62
|
-
<meta property="og:image" content={fbImageUrl} key="ogimage" />
|
|
63
|
-
|
|
64
|
-
<meta name="twitter:card" content="summary" key="twcard" />
|
|
65
|
-
<meta
|
|
66
|
-
name="twitter:title"
|
|
67
|
-
content={limitString(twTitle || title, 70)}
|
|
68
|
-
key="twtitle"
|
|
69
|
-
/>
|
|
70
|
-
{twUsername && (
|
|
71
|
-
<meta name="twitter:site" content={twUsername} key="twsite" />
|
|
72
|
-
)}
|
|
73
|
-
{twDescription && (
|
|
74
|
-
<meta
|
|
75
|
-
name="twitter:description"
|
|
76
|
-
content={limitString(striptags(twDescription), 200)}
|
|
77
|
-
key="twdescription"
|
|
78
|
-
/>
|
|
79
|
-
)}
|
|
80
|
-
{twImageUrl && (
|
|
81
|
-
<meta name="twitter:image" content={twImageUrl} key="twImage" />
|
|
82
|
-
)}
|
|
83
|
-
{twImageAlt && (
|
|
84
|
-
<meta name="twitter:image:alt" content={twImageAlt} key="twImageAlt" />
|
|
85
|
-
)}
|
|
86
|
-
</Head>
|
|
87
|
-
)
|
|
88
|
-
|
|
89
|
-
export default SEOComponent
|