@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 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.5.2",
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.1",
32
- "@newskit-render/auth": "^0.22.1",
33
- "@newskit-render/checkout": "^0.6.2",
34
- "@newskit-render/my-account": "^0.110.2",
35
- "@newskit-render/shared-components": "^0.14.0",
36
- "@newskit-render/sitemap": "^0.25.1",
37
- "@newskit-render/validation": "^0.26.1",
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
- })
@@ -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