@treely/strapi-slices 3.2.0 → 3.3.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.0",
3
+ "version": "3.3.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.",
@@ -15,7 +15,7 @@ import strapiMediaUrl from '../../utils/strapiMediaUrl';
15
15
  import StrapiLink from '../../models/strapi/StrapiLink';
16
16
  import StrapiProjectCard from '../../models/strapi/StrapiProjectCard';
17
17
  import StrapiLinkButton from '../../components/StrapiLinkButton';
18
- import { IStrapi, IStrapiData, PortfolioProject, StrapiProject } from '../..';
18
+ import { IStrapiData, PortfolioProject, StrapiProject } from '../..';
19
19
  import PortfolioProjectCard from '../../components/portfolio/PortfolioProjectCard';
20
20
 
21
21
  interface TextWithCardSlice {
@@ -28,7 +28,7 @@ interface TextWithCardSlice {
28
28
  }[];
29
29
  button?: StrapiLink;
30
30
  card?: StrapiProjectCard;
31
- project?: IStrapi<IStrapiData<StrapiProject>>;
31
+ project?: { data?: IStrapiData<StrapiProject> };
32
32
  cardPosition: 'left' | 'right';
33
33
  }
34
34
  export interface TextWithCardProps {
@@ -42,8 +42,8 @@ export const TextWithCard: React.FC<TextWithCardProps> = ({
42
42
  }: TextWithCardProps) => {
43
43
  const portfolioProject = projects.find(
44
44
  (p) =>
45
- slice.project?.data.attributes.fpmProjectId &&
46
- p.id === slice.project?.data.attributes.fpmProjectId
45
+ slice.project?.data?.attributes.fpmProjectId &&
46
+ p.id === slice.project.data.attributes.fpmProjectId
47
47
  );
48
48
 
49
49
  const card = (
@@ -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
  });
@@ -2,6 +2,8 @@ import { GetStaticPropsContext } from 'next';
2
2
  import strapiMediaUrl from './strapiMediaUrl';
3
3
  import {
4
4
  IStrapiData,
5
+ SECTIONS_WITH_BLOG_POSTS,
6
+ SECTIONS_WITH_PROJECTS,
5
7
  StrapiBlogPost,
6
8
  StrapiBlogPostProps,
7
9
  StrapiGlobal,
@@ -24,10 +26,17 @@ const mergeGlobalAndStrapiBlogPostData = (
24
26
  )
25
27
  : DEFAULT_SHARE_IMAGE;
26
28
 
29
+ const returnBlog = post.attributes.slices.some((slice) =>
30
+ SECTIONS_WITH_BLOG_POSTS.includes(slice.__component)
31
+ );
32
+ const returnProjects = post.attributes.slices.some((slice) =>
33
+ SECTIONS_WITH_PROJECTS.includes(slice.__component)
34
+ );
35
+
27
36
  return {
28
37
  ...post,
29
38
  // Portfolio Projects
30
- projects,
39
+ projects: returnProjects ? projects : [],
31
40
  // StrapiBlogPost
32
41
  attributes: {
33
42
  ...post?.attributes,
@@ -58,7 +67,7 @@ const mergeGlobalAndStrapiBlogPostData = (
58
67
  favicon: strapiMediaUrl(global.attributes.favicon, 'thumbnail'),
59
68
  },
60
69
  slices: post?.attributes.slices,
61
- blogPosts: blog,
70
+ blogPosts: returnBlog ? blog : [],
62
71
  banner: global.attributes.banner,
63
72
  topBanner: post?.attributes.topBanner || global.attributes.topBanner,
64
73
  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
  });
@@ -2,6 +2,7 @@ import { GetStaticPropsContext } from 'next';
2
2
  import strapiMediaUrl from './strapiMediaUrl';
3
3
  import {
4
4
  IStrapiData,
5
+ SECTIONS_WITH_CUSTOMER_STORIES,
5
6
  StrapiCustomerStory,
6
7
  StrapiCustomerStoryProps,
7
8
  StrapiGlobal,
@@ -22,6 +23,10 @@ const mergeGlobalAndStrapiCustomerStoryData = (
22
23
  )
23
24
  : DEFAULT_SHARE_IMAGE;
24
25
 
26
+ const returnCustomerStories = customerStory.attributes.slices.some((slice) =>
27
+ SECTIONS_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,6 +12,9 @@ import PortfolioProject from '../models/PortfolioProject';
12
12
  import {
13
13
  DARK_THEME_HEADER_SECTIONS,
14
14
  EXTENDABLE_HEADER_SECTIONS,
15
+ SECTIONS_WITH_BLOG_POSTS,
16
+ SECTIONS_WITH_CUSTOMER_STORIES,
17
+ SECTIONS_WITH_PROJECTS,
15
18
  } from '../constants/sectionsConfig';
16
19
  import { DEFAULT_SHARE_ALT, DEFAULT_SHARE_IMAGE } from '../constants/metadata';
17
20
 
@@ -31,10 +34,20 @@ const mergeGlobalAndStrapiPageData = (
31
34
  )
32
35
  : DEFAULT_SHARE_IMAGE;
33
36
 
37
+ const returnBlogPosts = page.attributes.slices.some((slice) =>
38
+ SECTIONS_WITH_BLOG_POSTS.includes(slice.__component)
39
+ );
40
+ const returnCustomerStories = page.attributes.slices.some((slice) =>
41
+ SECTIONS_WITH_CUSTOMER_STORIES.includes(slice.__component)
42
+ );
43
+ const returnProjects = page.attributes.slices.some((slice) =>
44
+ SECTIONS_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,6 +11,8 @@ import PortfolioProject from '../models/PortfolioProject';
11
11
  import {
12
12
  DARK_THEME_HEADER_SECTIONS,
13
13
  EXTENDABLE_HEADER_SECTIONS,
14
+ SECTIONS_WITH_BLOG_POSTS,
15
+ SECTIONS_WITH_PROJECTS,
14
16
  } from '../constants/sectionsConfig';
15
17
  import { DEFAULT_SHARE_ALT, DEFAULT_SHARE_IMAGE } from '../constants/metadata';
16
18
 
@@ -29,10 +31,17 @@ const mergeGlobalAndStrapiProject = (
29
31
  )
30
32
  : DEFAULT_SHARE_IMAGE;
31
33
 
34
+ const returnBlogPosts = project.attributes.slices.some((slice) =>
35
+ SECTIONS_WITH_BLOG_POSTS.includes(slice.__component)
36
+ );
37
+ const returnProjects = project.attributes.slices.some((slice) =>
38
+ SECTIONS_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: [],