@treely/strapi-slices 3.2.1 → 4.0.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@treely/strapi-slices",
3
- "version": "3.2.1",
3
+ "version": "4.0.0",
4
4
  "license": "MIT",
5
5
  "author": "Tree.ly GmbH",
6
6
  "description": "@treely/strapi-slices is a open source library maintained by Tree.ly.",
@@ -9,12 +9,9 @@ export const DARK_THEME_HEADER_SECTIONS = [
9
9
  'sections.hero',
10
10
  'sections.small-hero',
11
11
  ];
12
- export const SECTIONS_WITH_BLOG_POSTS = [
13
- 'sections.blog',
14
- 'sections.blog-cards',
15
- ];
16
- export const SECTIONS_WITH_CUSTOMER_STORIES = ['sections.customer-stories'];
17
- export const SECTIONS_WITH_PROJECTS = [
12
+ export const SLICES_WITH_BLOG_POSTS = ['sections.blog', 'sections.blog-cards'];
13
+ export const SLICES_WITH_CUSTOMER_STORIES = ['sections.customer-stories'];
14
+ export const SLICES_WITH_PROJECTS = [
18
15
  'sections.projects-grid',
19
16
  'sections.projects-map',
20
17
  'sections.project-facts',
package/src/index.tsx CHANGED
@@ -52,12 +52,6 @@ import mergeGlobalAndStrapiProjectData from './utils/mergeGlobalAndStrapiProject
52
52
  import strapiLinkUrl from './utils/strapiLinkUrl';
53
53
  import strapiMediaUrl from './utils/strapiMediaUrl';
54
54
 
55
- import {
56
- SECTIONS_WITH_BLOG_POSTS,
57
- SECTIONS_WITH_CUSTOMER_STORIES,
58
- SECTIONS_WITH_PROJECTS,
59
- } from './constants/sectionsConfig';
60
-
61
55
  export * from './components/SEOTags';
62
56
  export * from './components/SliceRenderer';
63
57
 
@@ -69,11 +63,6 @@ export {
69
63
  mergeGlobalAndStrapiProjectData,
70
64
  strapiLinkUrl,
71
65
  strapiMediaUrl,
72
-
73
- // Constants
74
- SECTIONS_WITH_BLOG_POSTS,
75
- SECTIONS_WITH_CUSTOMER_STORIES,
76
- SECTIONS_WITH_PROJECTS,
77
66
  };
78
67
 
79
68
  export type {
@@ -3,6 +3,7 @@ import { strapiBlogPostMock } from '../test/strapiMocks/strapiBlogPost';
3
3
  import minimalGlobalData from '../test/strapiMocks/minimalGlobalData';
4
4
  import getStaticPropsContextMock from '../test/mocks/getStaticPropsContext';
5
5
  import { strapiMetadataMock } from '../test/strapiMocks/strapiMetadata';
6
+ import portfolioProjectMock from '../test/integrationMocks/portfolioProjectMock';
6
7
 
7
8
  describe('The mergeGlobalAndStrapiBlogPostData util', () => {
8
9
  it('returns the global metadata if there is no page metadata', () => {
@@ -151,4 +152,50 @@ describe('The mergeGlobalAndStrapiBlogPostData util', () => {
151
152
  { id: Infinity, title: 'Title', links: [] },
152
153
  ]);
153
154
  });
155
+
156
+ it('returns the blog posts if the page includes slices which need blog posts', () => {
157
+ const result = mergeGlobalAndStrapiBlogPostData(
158
+ getStaticPropsContextMock,
159
+ minimalGlobalData,
160
+ {
161
+ ...strapiBlogPostMock,
162
+ attributes: {
163
+ ...strapiBlogPostMock.attributes,
164
+ slices: [
165
+ {
166
+ __component: 'sections.blog',
167
+ },
168
+ ],
169
+ },
170
+ },
171
+ [strapiBlogPostMock],
172
+ []
173
+ );
174
+
175
+ expect(result.blogPosts).toStrictEqual([strapiBlogPostMock]);
176
+ expect(result.projects).toStrictEqual([]);
177
+ });
178
+
179
+ it('returns the projects if the page includes slices which need projects', () => {
180
+ const result = mergeGlobalAndStrapiBlogPostData(
181
+ getStaticPropsContextMock,
182
+ minimalGlobalData,
183
+ {
184
+ ...strapiBlogPostMock,
185
+ attributes: {
186
+ ...strapiBlogPostMock.attributes,
187
+ slices: [
188
+ {
189
+ __component: 'sections.projects-grid',
190
+ },
191
+ ],
192
+ },
193
+ },
194
+ [],
195
+ [portfolioProjectMock]
196
+ );
197
+
198
+ expect(result.blogPosts).toStrictEqual([]);
199
+ expect(result.projects).toStrictEqual([portfolioProjectMock]);
200
+ });
154
201
  });
@@ -8,6 +8,10 @@ import {
8
8
  } from '..';
9
9
  import PortfolioProject from '../models/PortfolioProject';
10
10
  import { DEFAULT_SHARE_ALT, DEFAULT_SHARE_IMAGE } from '../constants/metadata';
11
+ import {
12
+ SLICES_WITH_BLOG_POSTS,
13
+ SLICES_WITH_PROJECTS,
14
+ } from '../constants/slicesConfig';
11
15
 
12
16
  const mergeGlobalAndStrapiBlogPostData = (
13
17
  context: GetStaticPropsContext,
@@ -24,10 +28,17 @@ const mergeGlobalAndStrapiBlogPostData = (
24
28
  )
25
29
  : DEFAULT_SHARE_IMAGE;
26
30
 
31
+ const returnBlog = post.attributes.slices.some((slice) =>
32
+ SLICES_WITH_BLOG_POSTS.includes(slice.__component)
33
+ );
34
+ const returnProjects = post.attributes.slices.some((slice) =>
35
+ SLICES_WITH_PROJECTS.includes(slice.__component)
36
+ );
37
+
27
38
  return {
28
39
  ...post,
29
40
  // Portfolio Projects
30
- projects,
41
+ projects: returnProjects ? projects : [],
31
42
  // StrapiBlogPost
32
43
  attributes: {
33
44
  ...post?.attributes,
@@ -58,7 +69,7 @@ const mergeGlobalAndStrapiBlogPostData = (
58
69
  favicon: strapiMediaUrl(global.attributes.favicon, 'thumbnail'),
59
70
  },
60
71
  slices: post?.attributes.slices,
61
- blogPosts: blog,
72
+ blogPosts: returnBlog ? blog : [],
62
73
  banner: global.attributes.banner,
63
74
  topBanner: post?.attributes.topBanner || global.attributes.topBanner,
64
75
  customerStories: [],
@@ -146,4 +146,25 @@ describe('The mergeGlobalAndStrapiCustomerStoryData util', () => {
146
146
  { id: Infinity, title: 'Title', links: [] },
147
147
  ]);
148
148
  });
149
+
150
+ it('returns the customer stories if the page includes slices which need customer stories', () => {
151
+ const result = mergeGlobalAndStrapiCustomerStoryData(
152
+ getStaticPropsContextMock,
153
+ minimalGlobalData,
154
+ {
155
+ ...strapiCustomerStoryMock,
156
+ attributes: {
157
+ ...strapiCustomerStoryMock.attributes,
158
+ slices: [
159
+ {
160
+ __component: 'sections.customer-stories',
161
+ },
162
+ ],
163
+ },
164
+ },
165
+ [strapiCustomerStoryMock]
166
+ );
167
+
168
+ expect(result.customerStories).toStrictEqual([strapiCustomerStoryMock]);
169
+ });
149
170
  });
@@ -7,6 +7,7 @@ import {
7
7
  StrapiGlobal,
8
8
  } from '..';
9
9
  import { DEFAULT_SHARE_ALT, DEFAULT_SHARE_IMAGE } from '../constants/metadata';
10
+ import { SLICES_WITH_CUSTOMER_STORIES } from '../constants/slicesConfig';
10
11
 
11
12
  const mergeGlobalAndStrapiCustomerStoryData = (
12
13
  context: GetStaticPropsContext,
@@ -22,6 +23,10 @@ const mergeGlobalAndStrapiCustomerStoryData = (
22
23
  )
23
24
  : DEFAULT_SHARE_IMAGE;
24
25
 
26
+ const returnCustomerStories = customerStory.attributes.slices.some((slice) =>
27
+ SLICES_WITH_CUSTOMER_STORIES.includes(slice.__component)
28
+ );
29
+
25
30
  return {
26
31
  ...customerStory,
27
32
  // Portfolio Projects
@@ -57,7 +62,7 @@ const mergeGlobalAndStrapiCustomerStoryData = (
57
62
  favicon: strapiMediaUrl(global.attributes.favicon, 'thumbnail'),
58
63
  },
59
64
  slices: customerStory?.attributes.slices,
60
- customerStories,
65
+ customerStories: returnCustomerStories ? customerStories : [],
61
66
  banner: global.attributes.banner,
62
67
  topBanner:
63
68
  customerStory?.attributes.topBanner || global.attributes.topBanner,
@@ -3,6 +3,9 @@ import mergeGlobalAndStrapiPageData from './mergeGlobalAndStrapiPageData';
3
3
  import { strapiPageMock } from '../test/strapiMocks/strapiPage';
4
4
  import getStaticPropsContextMock from '../test/mocks/getStaticPropsContext';
5
5
  import { strapiMetadataMock } from '../test/strapiMocks/strapiMetadata';
6
+ import { strapiBlogPostMock } from '../test/strapiMocks/strapiBlogPost';
7
+ import { strapiCustomerStoryMock } from '../test/strapiMocks/strapiCustomerStory';
8
+ import portfolioProjectMock from '../test/integrationMocks/portfolioProjectMock';
6
9
 
7
10
  describe('The mergeGlobalAndStrapiPageData util', () => {
8
11
  it('returns the global metadata if there is no page metadata', () => {
@@ -251,4 +254,67 @@ describe('The mergeGlobalAndStrapiPageData util', () => {
251
254
  { id: Infinity, title: 'Text', links: [] },
252
255
  ]);
253
256
  });
257
+
258
+ it('returns the blog posts if the page includes slices which need blog posts', () => {
259
+ const result = mergeGlobalAndStrapiPageData(
260
+ getStaticPropsContextMock,
261
+ minimalGlobalData,
262
+ {
263
+ ...strapiPageMock,
264
+ attributes: {
265
+ ...strapiPageMock.attributes,
266
+ slices: [{ __component: 'sections.blog-cards' }],
267
+ },
268
+ },
269
+ [strapiBlogPostMock],
270
+ [],
271
+ []
272
+ );
273
+
274
+ expect(result.blogPosts).toStrictEqual([strapiBlogPostMock]);
275
+ expect(result.customerStories).toStrictEqual([]);
276
+ expect(result.projects).toStrictEqual([]);
277
+ });
278
+
279
+ it('returns the customer stories if the page includes slices which need customer stories', () => {
280
+ const result = mergeGlobalAndStrapiPageData(
281
+ getStaticPropsContextMock,
282
+ minimalGlobalData,
283
+ {
284
+ ...strapiPageMock,
285
+ attributes: {
286
+ ...strapiPageMock.attributes,
287
+ slices: [{ __component: 'sections.customer-stories' }],
288
+ },
289
+ },
290
+ [],
291
+ [strapiCustomerStoryMock],
292
+ []
293
+ );
294
+
295
+ expect(result.customerStories).toStrictEqual([strapiCustomerStoryMock]);
296
+ expect(result.blogPosts).toStrictEqual([]);
297
+ expect(result.projects).toStrictEqual([]);
298
+ });
299
+
300
+ it('returns the projects if the page includes slices which need projects', () => {
301
+ const result = mergeGlobalAndStrapiPageData(
302
+ getStaticPropsContextMock,
303
+ minimalGlobalData,
304
+ {
305
+ ...strapiPageMock,
306
+ attributes: {
307
+ ...strapiPageMock.attributes,
308
+ slices: [{ __component: 'sections.projects-grid' }],
309
+ },
310
+ },
311
+ [],
312
+ [],
313
+ [portfolioProjectMock]
314
+ );
315
+
316
+ expect(result.projects).toStrictEqual([portfolioProjectMock]);
317
+ expect(result.blogPosts).toStrictEqual([]);
318
+ expect(result.customerStories).toStrictEqual([]);
319
+ });
254
320
  });
@@ -12,7 +12,10 @@ import PortfolioProject from '../models/PortfolioProject';
12
12
  import {
13
13
  DARK_THEME_HEADER_SECTIONS,
14
14
  EXTENDABLE_HEADER_SECTIONS,
15
- } from '../constants/sectionsConfig';
15
+ SLICES_WITH_BLOG_POSTS,
16
+ SLICES_WITH_CUSTOMER_STORIES,
17
+ SLICES_WITH_PROJECTS,
18
+ } from '../constants/slicesConfig';
16
19
  import { DEFAULT_SHARE_ALT, DEFAULT_SHARE_IMAGE } from '../constants/metadata';
17
20
 
18
21
  const mergeGlobalAndStrapiPageData = (
@@ -31,10 +34,20 @@ const mergeGlobalAndStrapiPageData = (
31
34
  )
32
35
  : DEFAULT_SHARE_IMAGE;
33
36
 
37
+ const returnBlogPosts = page.attributes.slices.some((slice) =>
38
+ SLICES_WITH_BLOG_POSTS.includes(slice.__component)
39
+ );
40
+ const returnCustomerStories = page.attributes.slices.some((slice) =>
41
+ SLICES_WITH_CUSTOMER_STORIES.includes(slice.__component)
42
+ );
43
+ const returnProjects = page.attributes.slices.some((slice) =>
44
+ SLICES_WITH_PROJECTS.includes(slice.__component)
45
+ );
46
+
34
47
  return {
35
48
  ...page,
36
49
  // Portfolio Projects
37
- projects,
50
+ projects: returnProjects ? projects : [],
38
51
  // StrapiPage
39
52
  attributes: {
40
53
  ...page?.attributes,
@@ -71,10 +84,10 @@ const mergeGlobalAndStrapiPageData = (
71
84
  favicon: strapiMediaUrl(global.attributes.favicon, 'thumbnail'),
72
85
  },
73
86
  slices: page?.attributes.slices,
74
- blogPosts,
87
+ blogPosts: returnBlogPosts ? blogPosts : [],
75
88
  banner: global.attributes.banner,
76
89
  topBanner: page?.attributes.topBanner || global.attributes.topBanner,
77
- customerStories,
90
+ customerStories: returnCustomerStories ? customerStories : [],
78
91
  };
79
92
  };
80
93
 
@@ -1,5 +1,7 @@
1
+ import portfolioProjectMock from '../test/integrationMocks/portfolioProjectMock';
1
2
  import getStaticPropsContextMock from '../test/mocks/getStaticPropsContext';
2
3
  import minimalGlobalData from '../test/strapiMocks/minimalGlobalData';
4
+ import { strapiBlogPostMock } from '../test/strapiMocks/strapiBlogPost';
3
5
  import { strapiMetadataMock } from '../test/strapiMocks/strapiMetadata';
4
6
  import { strapiProjectMock } from '../test/strapiMocks/strapiProject';
5
7
  import mergeGlobalAndStrapiProjectData from './mergeGlobalAndStrapiProjectData';
@@ -240,4 +242,42 @@ describe('The mergeGlobalAndStrapiProjectData util', () => {
240
242
 
241
243
  expect(result.headerType?.extendable).toBe(true);
242
244
  });
245
+
246
+ it('returns the blog posts if the page includes slices which need blog posts', () => {
247
+ const result = mergeGlobalAndStrapiProjectData(
248
+ getStaticPropsContextMock,
249
+ minimalGlobalData,
250
+ {
251
+ ...strapiProjectMock,
252
+ attributes: {
253
+ ...strapiProjectMock.attributes,
254
+ slices: [{ __component: 'sections.blog-cards' }],
255
+ },
256
+ },
257
+ [strapiBlogPostMock],
258
+ []
259
+ );
260
+
261
+ expect(result.blogPosts).toStrictEqual([strapiBlogPostMock]);
262
+ expect(result.projects).toStrictEqual([]);
263
+ });
264
+
265
+ it('returns the projects if the page includes slices which need projects', () => {
266
+ const result = mergeGlobalAndStrapiProjectData(
267
+ getStaticPropsContextMock,
268
+ minimalGlobalData,
269
+ {
270
+ ...strapiProjectMock,
271
+ attributes: {
272
+ ...strapiProjectMock.attributes,
273
+ slices: [{ __component: 'sections.projects-grid' }],
274
+ },
275
+ },
276
+ [],
277
+ [portfolioProjectMock]
278
+ );
279
+
280
+ expect(result.blogPosts).toStrictEqual([]);
281
+ expect(result.projects).toStrictEqual([portfolioProjectMock]);
282
+ });
243
283
  });
@@ -11,7 +11,9 @@ import PortfolioProject from '../models/PortfolioProject';
11
11
  import {
12
12
  DARK_THEME_HEADER_SECTIONS,
13
13
  EXTENDABLE_HEADER_SECTIONS,
14
- } from '../constants/sectionsConfig';
14
+ SLICES_WITH_BLOG_POSTS,
15
+ SLICES_WITH_PROJECTS,
16
+ } from '../constants/slicesConfig';
15
17
  import { DEFAULT_SHARE_ALT, DEFAULT_SHARE_IMAGE } from '../constants/metadata';
16
18
 
17
19
  const mergeGlobalAndStrapiProject = (
@@ -29,10 +31,17 @@ const mergeGlobalAndStrapiProject = (
29
31
  )
30
32
  : DEFAULT_SHARE_IMAGE;
31
33
 
34
+ const returnBlogPosts = project.attributes.slices.some((slice) =>
35
+ SLICES_WITH_BLOG_POSTS.includes(slice.__component)
36
+ );
37
+ const returnProjects = project.attributes.slices.some((slice) =>
38
+ SLICES_WITH_PROJECTS.includes(slice.__component)
39
+ );
40
+
32
41
  return {
33
42
  ...project,
34
43
  // Portfolio Projects
35
- projects,
44
+ projects: returnProjects ? projects : [],
36
45
  // StrapiProject
37
46
  attributes: {
38
47
  ...project.attributes,
@@ -69,7 +78,7 @@ const mergeGlobalAndStrapiProject = (
69
78
  favicon: strapiMediaUrl(global.attributes.favicon, 'thumbnail'),
70
79
  },
71
80
  slices: project.attributes.slices,
72
- blogPosts,
81
+ blogPosts: returnBlogPosts ? blogPosts : [],
73
82
  banner: global.attributes.banner,
74
83
  topBanner: project?.attributes.topBanner || global.attributes.topBanner,
75
84
  customerStories: [],
@@ -1,5 +0,0 @@
1
- export declare const EXTENDABLE_HEADER_SECTIONS: string[];
2
- export declare const DARK_THEME_HEADER_SECTIONS: string[];
3
- export declare const SECTIONS_WITH_BLOG_POSTS: string[];
4
- export declare const SECTIONS_WITH_CUSTOMER_STORIES: string[];
5
- export declare const SECTIONS_WITH_PROJECTS: string[];