@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/README.md +11 -2
- package/dist/slices/TextWithCard/TextWithCard.d.ts +4 -2
- package/dist/strapi-slices.cjs.development.js +34 -10
- package/dist/strapi-slices.cjs.development.js.map +1 -1
- package/dist/strapi-slices.cjs.production.min.js +1 -1
- package/dist/strapi-slices.cjs.production.min.js.map +1 -1
- package/dist/strapi-slices.esm.js +34 -10
- package/dist/strapi-slices.esm.js.map +1 -1
- package/package.json +1 -1
- package/src/slices/TextWithCard/TextWithCard.tsx +4 -4
- package/src/utils/mergeGlobalAndStrapiBlogPostData.test.ts +47 -0
- package/src/utils/mergeGlobalAndStrapiBlogPostData.ts +11 -2
- package/src/utils/mergeGlobalAndStrapiCustomerStoryData.test.ts +21 -0
- package/src/utils/mergeGlobalAndStrapiCustomerStoryData.ts +6 -1
- package/src/utils/mergeGlobalAndStrapiPageData.test.ts +66 -0
- package/src/utils/mergeGlobalAndStrapiPageData.ts +16 -3
- package/src/utils/mergeGlobalAndStrapiProjectData.test.ts +40 -0
- package/src/utils/mergeGlobalAndStrapiProjectData.ts +11 -2
package/package.json
CHANGED
|
@@ -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 {
|
|
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?:
|
|
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
|
|
46
|
-
p.id === slice.project
|
|
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: [],
|