@se-studio/contentful-rest-api 1.0.46 → 1.0.48
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 +424 -0
- package/dist/api/article-type.d.ts +37 -0
- package/dist/api/article-type.d.ts.map +1 -0
- package/dist/api/article-type.js +134 -0
- package/dist/api/article-type.js.map +1 -0
- package/dist/api/article.d.ts +32 -0
- package/dist/api/article.d.ts.map +1 -0
- package/dist/api/article.js +43 -0
- package/dist/api/article.js.map +1 -0
- package/dist/api/asset.d.ts +28 -0
- package/dist/api/asset.d.ts.map +1 -0
- package/dist/api/asset.js +55 -0
- package/dist/api/asset.js.map +1 -0
- package/dist/api/context.d.ts +24 -0
- package/dist/api/context.d.ts.map +1 -0
- package/dist/api/context.js +62 -0
- package/dist/api/context.js.map +1 -0
- package/dist/api/custom-type.d.ts +37 -0
- package/dist/api/custom-type.d.ts.map +1 -0
- package/dist/api/custom-type.js +44 -0
- package/dist/api/custom-type.js.map +1 -0
- package/dist/api/helpers.d.ts +73 -0
- package/dist/api/helpers.d.ts.map +1 -0
- package/dist/api/helpers.js +296 -0
- package/dist/api/helpers.js.map +1 -0
- package/dist/api/index.d.ts +22 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +28 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/links.d.ts +109 -0
- package/dist/api/links.d.ts.map +1 -0
- package/dist/api/links.js +199 -0
- package/dist/api/links.js.map +1 -0
- package/dist/api/page.d.ts +33 -0
- package/dist/api/page.d.ts.map +1 -0
- package/dist/api/page.js +40 -0
- package/dist/api/page.js.map +1 -0
- package/dist/api/person.d.ts +37 -0
- package/dist/api/person.d.ts.map +1 -0
- package/dist/api/person.js +134 -0
- package/dist/api/person.js.map +1 -0
- package/dist/api/preview.d.ts +55 -0
- package/dist/api/preview.d.ts.map +1 -0
- package/dist/api/preview.js +160 -0
- package/dist/api/preview.js.map +1 -0
- package/dist/api/related-articles.d.ts +22 -0
- package/dist/api/related-articles.d.ts.map +1 -0
- package/dist/api/related-articles.js +82 -0
- package/dist/api/related-articles.js.map +1 -0
- package/dist/api/server-asset.d.ts +40 -0
- package/dist/api/server-asset.d.ts.map +1 -0
- package/dist/api/server-asset.js +65 -0
- package/dist/api/server-asset.js.map +1 -0
- package/dist/api/sitemap.d.ts +131 -0
- package/dist/api/sitemap.d.ts.map +1 -0
- package/dist/api/sitemap.js +199 -0
- package/dist/api/sitemap.js.map +1 -0
- package/dist/api/tag.d.ts +37 -0
- package/dist/api/tag.d.ts.map +1 -0
- package/dist/api/tag.js +131 -0
- package/dist/api/tag.js.map +1 -0
- package/dist/api/template.d.ts +49 -0
- package/dist/api/template.d.ts.map +1 -0
- package/dist/api/template.js +88 -0
- package/dist/api/template.js.map +1 -0
- package/dist/api/types.d.ts +98 -0
- package/dist/api/types.d.ts.map +1 -0
- package/dist/api/types.js +2 -0
- package/dist/api/types.js.map +1 -0
- package/dist/baseTypes/baseAlternatePageContent.d.ts +24 -0
- package/dist/baseTypes/baseAlternatePageContent.d.ts.map +1 -0
- package/dist/baseTypes/baseAlternatePageContent.js +2 -0
- package/dist/baseTypes/baseAlternatePageContent.js.map +1 -0
- package/dist/baseTypes/baseArticle.d.ts +179 -0
- package/dist/baseTypes/baseArticle.d.ts.map +1 -0
- package/dist/baseTypes/baseArticle.js +2 -0
- package/dist/baseTypes/baseArticle.js.map +1 -0
- package/dist/baseTypes/baseArticleType.d.ts +156 -0
- package/dist/baseTypes/baseArticleType.d.ts.map +1 -0
- package/dist/baseTypes/baseArticleType.js +2 -0
- package/dist/baseTypes/baseArticleType.js.map +1 -0
- package/dist/baseTypes/baseBanner.d.ts +76 -0
- package/dist/baseTypes/baseBanner.d.ts.map +1 -0
- package/dist/baseTypes/baseBanner.js +2 -0
- package/dist/baseTypes/baseBanner.js.map +1 -0
- package/dist/baseTypes/baseCollection.d.ts +132 -0
- package/dist/baseTypes/baseCollection.d.ts.map +1 -0
- package/dist/baseTypes/baseCollection.js +2 -0
- package/dist/baseTypes/baseCollection.js.map +1 -0
- package/dist/baseTypes/baseComponent.d.ts +130 -0
- package/dist/baseTypes/baseComponent.d.ts.map +1 -0
- package/dist/baseTypes/baseComponent.js +2 -0
- package/dist/baseTypes/baseComponent.js.map +1 -0
- package/dist/baseTypes/baseCustomType.d.ts +126 -0
- package/dist/baseTypes/baseCustomType.d.ts.map +1 -0
- package/dist/baseTypes/baseCustomType.js +2 -0
- package/dist/baseTypes/baseCustomType.js.map +1 -0
- package/dist/baseTypes/baseExternalComponent.d.ts +66 -0
- package/dist/baseTypes/baseExternalComponent.d.ts.map +1 -0
- package/dist/baseTypes/baseExternalComponent.js +2 -0
- package/dist/baseTypes/baseExternalComponent.js.map +1 -0
- package/dist/baseTypes/baseExternalVideo.d.ts +85 -0
- package/dist/baseTypes/baseExternalVideo.d.ts.map +1 -0
- package/dist/baseTypes/baseExternalVideo.js +2 -0
- package/dist/baseTypes/baseExternalVideo.js.map +1 -0
- package/dist/baseTypes/baseLink.d.ts +90 -0
- package/dist/baseTypes/baseLink.d.ts.map +1 -0
- package/dist/baseTypes/baseLink.js +2 -0
- package/dist/baseTypes/baseLink.js.map +1 -0
- package/dist/baseTypes/baseMedia.d.ts +92 -0
- package/dist/baseTypes/baseMedia.d.ts.map +1 -0
- package/dist/baseTypes/baseMedia.js +2 -0
- package/dist/baseTypes/baseMedia.js.map +1 -0
- package/dist/baseTypes/baseNavigation.d.ts +36 -0
- package/dist/baseTypes/baseNavigation.d.ts.map +1 -0
- package/dist/baseTypes/baseNavigation.js +2 -0
- package/dist/baseTypes/baseNavigation.js.map +1 -0
- package/dist/baseTypes/baseNavigationItem.d.ts +96 -0
- package/dist/baseTypes/baseNavigationItem.d.ts.map +1 -0
- package/dist/baseTypes/baseNavigationItem.js +2 -0
- package/dist/baseTypes/baseNavigationItem.js.map +1 -0
- package/dist/baseTypes/basePage.d.ts +120 -0
- package/dist/baseTypes/basePage.d.ts.map +1 -0
- package/dist/baseTypes/basePage.js +2 -0
- package/dist/baseTypes/basePage.js.map +1 -0
- package/dist/baseTypes/basePageTest.d.ts +66 -0
- package/dist/baseTypes/basePageTest.d.ts.map +1 -0
- package/dist/baseTypes/basePageTest.js +2 -0
- package/dist/baseTypes/basePageTest.js.map +1 -0
- package/dist/baseTypes/basePageVariant.d.ts +123 -0
- package/dist/baseTypes/basePageVariant.d.ts.map +1 -0
- package/dist/baseTypes/basePageVariant.js +2 -0
- package/dist/baseTypes/basePageVariant.js.map +1 -0
- package/dist/baseTypes/basePerson.d.ts +111 -0
- package/dist/baseTypes/basePerson.d.ts.map +1 -0
- package/dist/baseTypes/basePerson.js +2 -0
- package/dist/baseTypes/basePerson.js.map +1 -0
- package/dist/baseTypes/baseSchema.d.ts +18 -0
- package/dist/baseTypes/baseSchema.d.ts.map +1 -0
- package/dist/baseTypes/baseSchema.js +2 -0
- package/dist/baseTypes/baseSchema.js.map +1 -0
- package/dist/baseTypes/baseShared.d.ts +30 -0
- package/dist/baseTypes/baseShared.d.ts.map +1 -0
- package/dist/baseTypes/baseShared.js +2 -0
- package/dist/baseTypes/baseShared.js.map +1 -0
- package/dist/baseTypes/baseTag.d.ts +108 -0
- package/dist/baseTypes/baseTag.d.ts.map +1 -0
- package/dist/baseTypes/baseTag.js +2 -0
- package/dist/baseTypes/baseTag.js.map +1 -0
- package/dist/baseTypes/baseTagType.d.ts +11 -0
- package/dist/baseTypes/baseTagType.d.ts.map +1 -0
- package/dist/baseTypes/baseTagType.js +2 -0
- package/dist/baseTypes/baseTagType.js.map +1 -0
- package/dist/baseTypes/baseTemplate.d.ts +55 -0
- package/dist/baseTypes/baseTemplate.d.ts.map +1 -0
- package/dist/baseTypes/baseTemplate.js +2 -0
- package/dist/baseTypes/baseTemplate.js.map +1 -0
- package/dist/client.d.ts +143 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +268 -0
- package/dist/client.js.map +1 -0
- package/dist/converters/article.d.ts +42 -0
- package/dist/converters/article.d.ts.map +1 -0
- package/dist/converters/article.js +220 -0
- package/dist/converters/article.js.map +1 -0
- package/dist/converters/asset.d.ts +22 -0
- package/dist/converters/asset.d.ts.map +1 -0
- package/dist/converters/asset.js +282 -0
- package/dist/converters/asset.js.map +1 -0
- package/dist/converters/collection.d.ts +26 -0
- package/dist/converters/collection.d.ts.map +1 -0
- package/dist/converters/collection.js +50 -0
- package/dist/converters/collection.js.map +1 -0
- package/dist/converters/component.d.ts +26 -0
- package/dist/converters/component.d.ts.map +1 -0
- package/dist/converters/component.js +54 -0
- package/dist/converters/component.js.map +1 -0
- package/dist/converters/customType.d.ts +24 -0
- package/dist/converters/customType.d.ts.map +1 -0
- package/dist/converters/customType.js +71 -0
- package/dist/converters/customType.js.map +1 -0
- package/dist/converters/externalComponent.d.ts +22 -0
- package/dist/converters/externalComponent.d.ts.map +1 -0
- package/dist/converters/externalComponent.js +34 -0
- package/dist/converters/externalComponent.js.map +1 -0
- package/dist/converters/helpers.d.ts +116 -0
- package/dist/converters/helpers.d.ts.map +1 -0
- package/dist/converters/helpers.js +128 -0
- package/dist/converters/helpers.js.map +1 -0
- package/dist/converters/iconCollector.d.ts +65 -0
- package/dist/converters/iconCollector.d.ts.map +1 -0
- package/dist/converters/iconCollector.js +282 -0
- package/dist/converters/iconCollector.js.map +1 -0
- package/dist/converters/index.d.ts +18 -0
- package/dist/converters/index.d.ts.map +1 -0
- package/dist/converters/index.js +18 -0
- package/dist/converters/index.js.map +1 -0
- package/dist/converters/link.d.ts +11 -0
- package/dist/converters/link.d.ts.map +1 -0
- package/dist/converters/link.js +96 -0
- package/dist/converters/link.js.map +1 -0
- package/dist/converters/navigationItem.d.ts +11 -0
- package/dist/converters/navigationItem.d.ts.map +1 -0
- package/dist/converters/navigationItem.js +73 -0
- package/dist/converters/navigationItem.js.map +1 -0
- package/dist/converters/page.d.ts +44 -0
- package/dist/converters/page.d.ts.map +1 -0
- package/dist/converters/page.js +121 -0
- package/dist/converters/page.js.map +1 -0
- package/dist/converters/person.d.ts +40 -0
- package/dist/converters/person.d.ts.map +1 -0
- package/dist/converters/person.js +109 -0
- package/dist/converters/person.js.map +1 -0
- package/dist/converters/resolver.d.ts +29 -0
- package/dist/converters/resolver.d.ts.map +1 -0
- package/dist/converters/resolver.js +317 -0
- package/dist/converters/resolver.js.map +1 -0
- package/dist/converters/schema.d.ts +14 -0
- package/dist/converters/schema.d.ts.map +1 -0
- package/dist/converters/schema.js +18 -0
- package/dist/converters/schema.js.map +1 -0
- package/dist/converters/svgProcessor.d.ts +23 -0
- package/dist/converters/svgProcessor.d.ts.map +1 -0
- package/dist/converters/svgProcessor.js +47 -0
- package/dist/converters/svgProcessor.js.map +1 -0
- package/dist/converters/tag.d.ts +25 -0
- package/dist/converters/tag.d.ts.map +1 -0
- package/dist/converters/tag.js +98 -0
- package/dist/converters/tag.js.map +1 -0
- package/dist/converters/template.d.ts +26 -0
- package/dist/converters/template.d.ts.map +1 -0
- package/dist/converters/template.js +44 -0
- package/dist/converters/template.js.map +1 -0
- package/dist/index.d.ts +28 -721
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +37 -3634
- package/dist/index.js.map +1 -1
- package/dist/revalidation/handlers.d.ts +52 -0
- package/dist/revalidation/handlers.d.ts.map +1 -0
- package/dist/revalidation/handlers.js +130 -0
- package/dist/revalidation/handlers.js.map +1 -0
- package/dist/revalidation/index.d.ts +3 -0
- package/dist/revalidation/index.d.ts.map +1 -0
- package/dist/revalidation/index.js +4 -0
- package/dist/revalidation/index.js.map +1 -0
- package/dist/revalidation/nextjs-route.d.ts +31 -0
- package/dist/revalidation/nextjs-route.d.ts.map +1 -0
- package/dist/revalidation/nextjs-route.js +34 -0
- package/dist/revalidation/nextjs-route.js.map +1 -0
- package/dist/revalidation/route.d.ts +3 -0
- package/dist/revalidation/route.d.ts.map +1 -0
- package/dist/revalidation/route.js +97 -0
- package/dist/revalidation/route.js.map +1 -0
- package/dist/revalidation/server-utils.d.ts +22 -0
- package/dist/revalidation/server-utils.d.ts.map +1 -0
- package/dist/revalidation/server-utils.js +41 -0
- package/dist/revalidation/server-utils.js.map +1 -0
- package/dist/revalidation/tags.d.ts +81 -0
- package/dist/revalidation/tags.d.ts.map +1 -0
- package/dist/revalidation/tags.js +117 -0
- package/dist/revalidation/tags.js.map +1 -0
- package/dist/revalidation/utils.d.ts +21 -0
- package/dist/revalidation/utils.d.ts.map +1 -0
- package/dist/revalidation/utils.js +51 -0
- package/dist/revalidation/utils.js.map +1 -0
- package/dist/server.d.ts +7 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +10 -0
- package/dist/server.js.map +1 -0
- package/dist/types.d.ts +67 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/arrayUtils.d.ts +3 -0
- package/dist/utils/arrayUtils.d.ts.map +1 -0
- package/dist/utils/arrayUtils.js +12 -0
- package/dist/utils/arrayUtils.js.map +1 -0
- package/dist/utils/dateUtils.d.ts +9 -0
- package/dist/utils/dateUtils.d.ts.map +1 -0
- package/dist/utils/dateUtils.js +26 -0
- package/dist/utils/dateUtils.js.map +1 -0
- package/dist/utils/errors.d.ts +56 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +100 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/index.d.ts +8 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +8 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/json-utils.d.ts +17 -0
- package/dist/utils/json-utils.d.ts.map +1 -0
- package/dist/utils/json-utils.js +43 -0
- package/dist/utils/json-utils.js.map +1 -0
- package/dist/utils/retry.d.ts +112 -0
- package/dist/utils/retry.d.ts.map +1 -0
- package/dist/utils/retry.js +221 -0
- package/dist/utils/retry.js.map +1 -0
- package/package.json +12 -6
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { createResponsiveVisual, lookupMediaEntry } from './asset';
|
|
2
|
+
import { DEFAULT_POSITION_FIELDS, lookupAsset, lookupIconAsset, } from './helpers';
|
|
3
|
+
import { resolveCollectionContent, resolveLink, resolveRichTextDocument } from './resolver';
|
|
4
|
+
/**
|
|
5
|
+
* Base converter for Contentful Collection entries to ICollection type
|
|
6
|
+
*
|
|
7
|
+
* This is a minimal implementation that can be extended using
|
|
8
|
+
* the functional composition pattern.
|
|
9
|
+
*
|
|
10
|
+
* @param context - Converter context containing assets, includes, and resolvers
|
|
11
|
+
* @param entry - Contentful entry to convert
|
|
12
|
+
* @returns ICollection object
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```ts
|
|
16
|
+
* const collection = baseCollectionConverter(context, contentfulEntry);
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
export function baseCollectionConverter(context, entry) {
|
|
20
|
+
const { sys, fields } = entry;
|
|
21
|
+
const { id } = sys;
|
|
22
|
+
// Destructure to exclude fields that need special handling
|
|
23
|
+
const {
|
|
24
|
+
// Fields requiring transformation
|
|
25
|
+
backgroundVisual: bgVisual, mobileBackgroundVisual: mobileBgVisual, visual: visualField, mobileVisual: mobileVisualField, visualCustomSize, icon: iconField, links: linksField, contents: contentsField, body: bodyField, additionalCopy: additionalCopyField, showHeading, heading,
|
|
26
|
+
// Already handled elsewhere
|
|
27
|
+
cmsLabel, ...simpleFields // anchor, backgroundColour, textColour, preHeading, heading, postHeading, backgroundOverlayOpacity
|
|
28
|
+
} = fields;
|
|
29
|
+
// Convert background visuals to responsive visual
|
|
30
|
+
const backgroundVisual = createResponsiveVisual(lookupAsset(context, bgVisual), lookupAsset(context, mobileBgVisual));
|
|
31
|
+
const visual = createResponsiveVisual(lookupMediaEntry(context, visualField), lookupMediaEntry(context, mobileVisualField), visualCustomSize);
|
|
32
|
+
const collection = {
|
|
33
|
+
type: 'Collection',
|
|
34
|
+
id,
|
|
35
|
+
name: cmsLabel,
|
|
36
|
+
cmsLabel,
|
|
37
|
+
...DEFAULT_POSITION_FIELDS,
|
|
38
|
+
...simpleFields,
|
|
39
|
+
heading: showHeading ? heading : undefined,
|
|
40
|
+
body: resolveRichTextDocument(context, id, bodyField),
|
|
41
|
+
additionalCopy: resolveRichTextDocument(context, id, additionalCopyField),
|
|
42
|
+
icon: lookupIconAsset(context, iconField),
|
|
43
|
+
backgroundVisual,
|
|
44
|
+
visual,
|
|
45
|
+
links: linksField?.map((link) => resolveLink(context, id, link)),
|
|
46
|
+
contents: contentsField?.map((content) => resolveCollectionContent(context, id, content)),
|
|
47
|
+
};
|
|
48
|
+
return collection;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=collection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collection.js","sourceRoot":"","sources":["../../src/converters/collection.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AACnE,OAAO,EAEL,uBAAuB,EACvB,WAAW,EACX,eAAe,GAChB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,wBAAwB,EAAE,WAAW,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAQ5F;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,uBAAuB,CACrC,OAAyB,EACzB,KAAkE;IAElE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;IAC9B,MAAM,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC;IACnB,2DAA2D;IAC3D,MAAM;IACJ,kCAAkC;IAClC,gBAAgB,EAAE,QAAQ,EAC1B,sBAAsB,EAAE,cAAc,EACtC,MAAM,EAAE,WAAW,EACnB,YAAY,EAAE,iBAAiB,EAC/B,gBAAgB,EAChB,IAAI,EAAE,SAAS,EACf,KAAK,EAAE,UAAU,EACjB,QAAQ,EAAE,aAAa,EACvB,IAAI,EAAE,SAAS,EACf,cAAc,EAAE,mBAAmB,EACnC,WAAW,EACX,OAAO;IACP,4BAA4B;IAC5B,QAAQ,EACR,GAAG,YAAY,CAAC,mGAAmG;MACpH,GAAG,MAAM,CAAC;IAEX,kDAAkD;IAClD,MAAM,gBAAgB,GAAG,sBAAsB,CAC7C,WAAW,CAAC,OAAO,EAAE,QAAQ,CAAC,EAC9B,WAAW,CAAC,OAAO,EAAE,cAAc,CAAC,CACrC,CAAC;IAEF,MAAM,MAAM,GAAG,sBAAsB,CACnC,gBAAgB,CAAC,OAAO,EAAE,WAAW,CAAC,EACtC,gBAAgB,CAAC,OAAO,EAAE,iBAAiB,CAAC,EAC5C,gBAAgB,CACjB,CAAC;IAEF,MAAM,UAAU,GAA0B;QACxC,IAAI,EAAE,YAAY;QAClB,EAAE;QACF,IAAI,EAAE,QAAQ;QACd,QAAQ;QACR,GAAG,uBAAuB;QAC1B,GAAG,YAAY;QACf,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;QAC1C,IAAI,EAAE,uBAAuB,CAAC,OAAO,EAAE,EAAE,EAAE,SAAS,CAAC;QACrD,cAAc,EAAE,uBAAuB,CAAC,OAAO,EAAE,EAAE,EAAE,mBAAmB,CAAC;QACzE,IAAI,EAAE,eAAe,CAAC,OAAO,EAAE,SAAS,CAAC;QACzC,gBAAgB;QAChB,MAAM;QACN,KAAK,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,OAAO,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;QAChE,QAAQ,EAAE,aAAa,EAAE,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,wBAAwB,CAAC,OAAO,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;KAC1F,CAAC;IACF,OAAO,UAAU,CAAC;AACpB,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { IBaseComponent } from '@se-studio/core-data-types';
|
|
2
|
+
import type { Entry } from 'contentful';
|
|
3
|
+
import type { DefaultChainModifier, IContentfulRichText } from '../api';
|
|
4
|
+
import type { BaseComponentSkeleton } from '../baseTypes/baseComponent';
|
|
5
|
+
import { type ConverterContext } from './helpers';
|
|
6
|
+
export type IContentfulComponent = IBaseComponent & {
|
|
7
|
+
body?: IContentfulRichText | null;
|
|
8
|
+
additionalCopy?: IContentfulRichText | null;
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* Base converter for Contentful Component entries to IComponent type
|
|
12
|
+
*
|
|
13
|
+
* This is a minimal implementation that can be extended using
|
|
14
|
+
* the functional composition pattern.
|
|
15
|
+
*
|
|
16
|
+
* @param context - Converter context containing assets, includes, and resolvers
|
|
17
|
+
* @param entry - Contentful entry to convert
|
|
18
|
+
* @returns IComponent object
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```ts
|
|
22
|
+
* const component = baseComponentConverter(context, contentfulEntry);
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
export declare function baseComponentConverter(context: ConverterContext, entry: Entry<BaseComponentSkeleton, DefaultChainModifier, string>): IContentfulComponent;
|
|
26
|
+
//# sourceMappingURL=component.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"component.d.ts","sourceRoot":"","sources":["../../src/converters/component.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,KAAK,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,QAAQ,CAAC;AACxE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAGxE,OAAO,EACL,KAAK,gBAAgB,EAItB,MAAM,WAAW,CAAC;AAGnB,MAAM,MAAM,oBAAoB,GAAG,cAAc,GAAG;IAClD,IAAI,CAAC,EAAE,mBAAmB,GAAG,IAAI,CAAC;IAClC,cAAc,CAAC,EAAE,mBAAmB,GAAG,IAAI,CAAC;CAC7C,CAAC;AACF;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,gBAAgB,EACzB,KAAK,EAAE,KAAK,CAAC,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,CAAC,GAChE,oBAAoB,CAwDtB"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { arrayOrUndefined, notEmpty } from '../utils';
|
|
2
|
+
import { createResponsiveVisual, lookupMediaEntry } from './asset';
|
|
3
|
+
import { DEFAULT_POSITION_FIELDS, lookupAsset, lookupIconAsset, } from './helpers';
|
|
4
|
+
import { resolveLinks, resolveRichTextDocument } from './resolver';
|
|
5
|
+
/**
|
|
6
|
+
* Base converter for Contentful Component entries to IComponent type
|
|
7
|
+
*
|
|
8
|
+
* This is a minimal implementation that can be extended using
|
|
9
|
+
* the functional composition pattern.
|
|
10
|
+
*
|
|
11
|
+
* @param context - Converter context containing assets, includes, and resolvers
|
|
12
|
+
* @param entry - Contentful entry to convert
|
|
13
|
+
* @returns IComponent object
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```ts
|
|
17
|
+
* const component = baseComponentConverter(context, contentfulEntry);
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
export function baseComponentConverter(context, entry) {
|
|
21
|
+
const { sys, fields } = entry;
|
|
22
|
+
const { id } = sys;
|
|
23
|
+
// Destructure to exclude fields that need special handling
|
|
24
|
+
const {
|
|
25
|
+
// Fields requiring transformation
|
|
26
|
+
backgroundVisual: bgVisual, mobileBackgroundVisual: mobileBgVisual, visual: visualField, mobileVisual: mobileVisualField, visualCustomSize, icon: iconField, links: linksField, body: bodyField, additionalCopy: additionalCopyField,
|
|
27
|
+
// Field name change
|
|
28
|
+
showHeading, heading, otherMedia: otherMediaField,
|
|
29
|
+
// Already handled elsewhere
|
|
30
|
+
cmsLabel, ...simpleFields // anchor, backgroundColour, textColour, preHeading, heading, postHeading, backgroundOverlayOpacity
|
|
31
|
+
} = fields;
|
|
32
|
+
// Convert background visuals to responsive visual
|
|
33
|
+
const backgroundVisual = createResponsiveVisual(lookupAsset(context, bgVisual), lookupAsset(context, mobileBgVisual));
|
|
34
|
+
const visual = createResponsiveVisual(lookupMediaEntry(context, visualField), lookupMediaEntry(context, mobileVisualField), visualCustomSize);
|
|
35
|
+
const otherMedia = otherMediaField?.map((media) => lookupAsset(context, media));
|
|
36
|
+
const component = {
|
|
37
|
+
type: 'Component',
|
|
38
|
+
id,
|
|
39
|
+
name: cmsLabel,
|
|
40
|
+
cmsLabel,
|
|
41
|
+
...DEFAULT_POSITION_FIELDS,
|
|
42
|
+
...simpleFields,
|
|
43
|
+
heading: showHeading ? heading : undefined,
|
|
44
|
+
body: resolveRichTextDocument(context, id, bodyField),
|
|
45
|
+
additionalCopy: resolveRichTextDocument(context, id, additionalCopyField),
|
|
46
|
+
icon: lookupIconAsset(context, iconField),
|
|
47
|
+
backgroundVisual,
|
|
48
|
+
visual,
|
|
49
|
+
links: resolveLinks(context, id, linksField),
|
|
50
|
+
otherMedia: arrayOrUndefined(otherMedia?.filter(notEmpty)),
|
|
51
|
+
};
|
|
52
|
+
return component;
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=component.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"component.js","sourceRoot":"","sources":["../../src/converters/component.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACtD,OAAO,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AACnE,OAAO,EAEL,uBAAuB,EACvB,WAAW,EACX,eAAe,GAChB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,YAAY,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAMnE;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,sBAAsB,CACpC,OAAyB,EACzB,KAAiE;IAEjE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;IAC9B,MAAM,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC;IAEnB,2DAA2D;IAC3D,MAAM;IACJ,kCAAkC;IAClC,gBAAgB,EAAE,QAAQ,EAC1B,sBAAsB,EAAE,cAAc,EACtC,MAAM,EAAE,WAAW,EACnB,YAAY,EAAE,iBAAiB,EAC/B,gBAAgB,EAChB,IAAI,EAAE,SAAS,EACf,KAAK,EAAE,UAAU,EACjB,IAAI,EAAE,SAAS,EACf,cAAc,EAAE,mBAAmB;IACnC,oBAAoB;IACpB,WAAW,EACX,OAAO,EACP,UAAU,EAAE,eAAe;IAC3B,4BAA4B;IAC5B,QAAQ,EACR,GAAG,YAAY,CAAC,mGAAmG;MACpH,GAAG,MAAM,CAAC;IAEX,kDAAkD;IAClD,MAAM,gBAAgB,GAAG,sBAAsB,CAC7C,WAAW,CAAC,OAAO,EAAE,QAAQ,CAAC,EAC9B,WAAW,CAAC,OAAO,EAAE,cAAc,CAAC,CACrC,CAAC;IAEF,MAAM,MAAM,GAAG,sBAAsB,CACnC,gBAAgB,CAAC,OAAO,EAAE,WAAW,CAAC,EACtC,gBAAgB,CAAC,OAAO,EAAE,iBAAiB,CAAC,EAC5C,gBAAgB,CACjB,CAAC;IAEF,MAAM,UAAU,GAAG,eAAe,EAAE,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;IAEhF,MAAM,SAAS,GAAyB;QACtC,IAAI,EAAE,WAAW;QACjB,EAAE;QACF,IAAI,EAAE,QAAQ;QACd,QAAQ;QACR,GAAG,uBAAuB;QAC1B,GAAG,YAAY;QACf,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;QAC1C,IAAI,EAAE,uBAAuB,CAAC,OAAO,EAAE,EAAE,EAAE,SAAS,CAAC;QACrD,cAAc,EAAE,uBAAuB,CAAC,OAAO,EAAE,EAAE,EAAE,mBAAmB,CAAC;QACzE,IAAI,EAAE,eAAe,CAAC,OAAO,EAAE,SAAS,CAAC;QACzC,gBAAgB;QAChB,MAAM;QACN,KAAK,EAAE,YAAY,CAAC,OAAO,EAAE,EAAE,EAAE,UAAU,CAAC;QAC5C,UAAU,EAAE,gBAAgB,CAAC,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;KAC3D,CAAC;IACF,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { IBaseCustomType, IInternalLink } from '@se-studio/core-data-types';
|
|
2
|
+
import type { Entry } from 'contentful';
|
|
3
|
+
import type { DefaultChainModifier } from '../api';
|
|
4
|
+
import type { BaseCustomTypeSkeleton } from '../baseTypes/baseCustomType';
|
|
5
|
+
import { type ConverterContext } from './helpers';
|
|
6
|
+
/**
|
|
7
|
+
* Base converter for Contentful Custom Type entries to IBaseCustomType
|
|
8
|
+
*
|
|
9
|
+
* Custom types represent index pages for categories like Topics or Resources.
|
|
10
|
+
* They provide configuration for both the main index page and potentially
|
|
11
|
+
* individual entry pages.
|
|
12
|
+
*
|
|
13
|
+
* @param context - Converter context containing includes and assets
|
|
14
|
+
* @param entry - Contentful entry to convert
|
|
15
|
+
* @returns IBaseCustomType object
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```ts
|
|
19
|
+
* const customType = baseCustomTypeConverter(context, contentfulEntry);
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
export declare function baseCustomTypeConverter(context: ConverterContext, entry: Entry<BaseCustomTypeSkeleton, DefaultChainModifier, string>): IBaseCustomType;
|
|
23
|
+
export declare function baseCustomTypeLinkConverter(context: ConverterContext, entry: Entry<BaseCustomTypeSkeleton, DefaultChainModifier, string>): IInternalLink;
|
|
24
|
+
//# sourceMappingURL=customType.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"customType.d.ts","sourceRoot":"","sources":["../../src/converters/customType.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAmB,MAAM,4BAA4B,CAAC;AAClG,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,QAAQ,CAAC;AACnD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAC1E,OAAO,EAEL,KAAK,gBAAgB,EAKtB,MAAM,WAAW,CAAC;AAUnB;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,gBAAgB,EACzB,KAAK,EAAE,KAAK,CAAC,sBAAsB,EAAE,oBAAoB,EAAE,MAAM,CAAC,GACjE,eAAe,CAkEjB;AAED,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,gBAAgB,EACzB,KAAK,EAAE,KAAK,CAAC,sBAAsB,EAAE,oBAAoB,EAAE,MAAM,CAAC,GACjE,aAAa,CAgBf"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { addPositionMetadata, createInternalLink, lookupAsset, makeContentfulDescription, makeContentfulTitle, } from './helpers';
|
|
2
|
+
import { collectIconsFromContent, collectIconsFromNavigation, deduplicateIcons, } from './iconCollector';
|
|
3
|
+
import { resolveNavigation } from './navigationItem';
|
|
4
|
+
import { resolvePageContent, resolveSchema } from './resolver';
|
|
5
|
+
import { resolveTemplate } from './template';
|
|
6
|
+
/**
|
|
7
|
+
* Base converter for Contentful Custom Type entries to IBaseCustomType
|
|
8
|
+
*
|
|
9
|
+
* Custom types represent index pages for categories like Topics or Resources.
|
|
10
|
+
* They provide configuration for both the main index page and potentially
|
|
11
|
+
* individual entry pages.
|
|
12
|
+
*
|
|
13
|
+
* @param context - Converter context containing includes and assets
|
|
14
|
+
* @param entry - Contentful entry to convert
|
|
15
|
+
* @returns IBaseCustomType object
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```ts
|
|
19
|
+
* const customType = baseCustomTypeConverter(context, contentfulEntry);
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
export function baseCustomTypeConverter(context, entry) {
|
|
23
|
+
const { sys, fields } = entry;
|
|
24
|
+
const { id } = sys;
|
|
25
|
+
const { name, slug, indexPageTitle, indexPageDescription, featuredImage, menu: menuLink, footer: footerLink, indexPageTemplate: templateLink, indexPageTopContent: topContentLinks, structuredData, indexPageStructuredData, ...other } = fields;
|
|
26
|
+
// Resolve template (if exists)
|
|
27
|
+
const template = templateLink ? resolveTemplate(context, templateLink) : null;
|
|
28
|
+
// Resolve navigation
|
|
29
|
+
const menu = menuLink ? resolveNavigation(context, menuLink) : template?.menu;
|
|
30
|
+
const footer = footerLink ? resolveNavigation(context, footerLink) : template?.footer;
|
|
31
|
+
// Resolve all content sections
|
|
32
|
+
const topContent = topContentLinks
|
|
33
|
+
?.map((c) => resolvePageContent(context, id, c))
|
|
34
|
+
.filter((item) => item !== null) ?? [];
|
|
35
|
+
const preContent = template?.preContent ?? [];
|
|
36
|
+
const postContent = template?.postContent ?? [];
|
|
37
|
+
// Merge in correct order and add position metadata
|
|
38
|
+
const contents = addPositionMetadata([...topContent, ...preContent, ...postContent]);
|
|
39
|
+
// Collect and deduplicate all SVG icons from custom type content and navigation
|
|
40
|
+
const icons = deduplicateIcons(collectIconsFromContent(contents), collectIconsFromNavigation(menu), collectIconsFromNavigation(footer));
|
|
41
|
+
const title = makeContentfulTitle(indexPageTitle, sys.id);
|
|
42
|
+
const description = makeContentfulDescription(indexPageDescription, sys.id);
|
|
43
|
+
const customType = {
|
|
44
|
+
type: 'Custom type',
|
|
45
|
+
id,
|
|
46
|
+
slug,
|
|
47
|
+
name,
|
|
48
|
+
title,
|
|
49
|
+
description: description,
|
|
50
|
+
featuredImage: lookupAsset(context, featuredImage),
|
|
51
|
+
contentCount: 0,
|
|
52
|
+
contents,
|
|
53
|
+
icons,
|
|
54
|
+
structuredData: [
|
|
55
|
+
...(structuredData?.map((link) => resolveSchema(context, id, link)) ?? []),
|
|
56
|
+
...(indexPageStructuredData?.map((link) => resolveSchema(context, id, link)) ?? []),
|
|
57
|
+
].filter((item) => item !== null),
|
|
58
|
+
menu,
|
|
59
|
+
footer,
|
|
60
|
+
...other,
|
|
61
|
+
};
|
|
62
|
+
return customType;
|
|
63
|
+
}
|
|
64
|
+
export function baseCustomTypeLinkConverter(context, entry) {
|
|
65
|
+
const { sys: { id, contentType }, fields, } = entry;
|
|
66
|
+
if (contentType.sys.id !== 'customType') {
|
|
67
|
+
throw new Error(`Invalid content type: expected "customType", got "${contentType.sys.id}"`);
|
|
68
|
+
}
|
|
69
|
+
return createInternalLink(id, fields, context, context.urlCalculators.customType(fields.slug), 'CustomType');
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=customType.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"customType.js","sourceRoot":"","sources":["../../src/converters/customType.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,mBAAmB,EAEnB,kBAAkB,EAClB,WAAW,EACX,yBAAyB,EACzB,mBAAmB,GACpB,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,uBAAuB,EACvB,0BAA0B,EAC1B,gBAAgB,GACjB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE7C;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,uBAAuB,CACrC,OAAyB,EACzB,KAAkE;IAElE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;IAC9B,MAAM,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC;IACnB,MAAM,EACJ,IAAI,EACJ,IAAI,EACJ,cAAc,EACd,oBAAoB,EACpB,aAAa,EACb,IAAI,EAAE,QAAQ,EACd,MAAM,EAAE,UAAU,EAClB,iBAAiB,EAAE,YAAY,EAC/B,mBAAmB,EAAE,eAAe,EACpC,cAAc,EACd,uBAAuB,EACvB,GAAG,KAAK,EACT,GAAG,MAAM,CAAC;IAEX,+BAA+B;IAC/B,MAAM,QAAQ,GAAG,YAAY,CAAC,CAAC,CAAC,eAAe,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAE9E,qBAAqB;IACrB,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,iBAAiB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC;IAC9E,MAAM,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,iBAAiB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,MAAM,CAAC;IAEtF,+BAA+B;IAC/B,MAAM,UAAU,GACd,eAAe;QACb,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;SAC/C,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;IAC3D,MAAM,UAAU,GAAG,QAAQ,EAAE,UAAU,IAAI,EAAE,CAAC;IAC9C,MAAM,WAAW,GAAG,QAAQ,EAAE,WAAW,IAAI,EAAE,CAAC;IAEhD,mDAAmD;IACnD,MAAM,QAAQ,GAAG,mBAAmB,CAAC,CAAC,GAAG,UAAU,EAAE,GAAG,UAAU,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC;IAErF,gFAAgF;IAChF,MAAM,KAAK,GAAG,gBAAgB,CAC5B,uBAAuB,CAAC,QAAQ,CAAC,EACjC,0BAA0B,CAAC,IAAI,CAAC,EAChC,0BAA0B,CAAC,MAAM,CAAC,CACnC,CAAC;IAEF,MAAM,KAAK,GAAG,mBAAmB,CAAC,cAAc,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IAC1D,MAAM,WAAW,GAAG,yBAAyB,CAAC,oBAAoB,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IAC5E,MAAM,UAAU,GAAoB;QAClC,IAAI,EAAE,aAAa;QACnB,EAAE;QACF,IAAI;QACJ,IAAI;QACJ,KAAK;QACL,WAAW,EAAE,WAAW;QACxB,aAAa,EAAE,WAAW,CAAC,OAAO,EAAE,aAAa,CAAC;QAClD,YAAY,EAAE,CAAC;QACf,QAAQ;QACR,KAAK;QACL,cAAc,EAAE;YACd,GAAG,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;YAC1E,GAAG,CAAC,uBAAuB,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;SACpF,CAAC,MAAM,CAAC,CAAC,IAAI,EAAmB,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC;QAClD,IAAI;QACJ,MAAM;QACN,GAAG,KAAK;KACT,CAAC;IAEF,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,2BAA2B,CACzC,OAAyB,EACzB,KAAkE;IAElE,MAAM,EACJ,GAAG,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE,EACxB,MAAM,GACP,GAAG,KAAK,CAAC;IACV,IAAI,WAAW,CAAC,GAAG,CAAC,EAAE,KAAK,YAAY,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CAAC,qDAAqD,WAAW,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;IAC9F,CAAC;IAED,OAAO,kBAAkB,CACvB,EAAE,EACF,MAAM,EACN,OAAO,EACP,OAAO,CAAC,cAAc,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,EAC9C,YAAY,CACb,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { IBaseExternalComponent } from '@se-studio/core-data-types';
|
|
2
|
+
import type { Entry } from 'contentful';
|
|
3
|
+
import type { DefaultChainModifier } from '../api';
|
|
4
|
+
import type { BaseExternalComponentSkeleton } from '../baseTypes/baseExternalComponent';
|
|
5
|
+
import { type ConverterContext } from './helpers';
|
|
6
|
+
/**
|
|
7
|
+
* Base converter for Contentful ExternalComponent entries to IExternalComponent type
|
|
8
|
+
*
|
|
9
|
+
* This is a minimal implementation that can be extended using
|
|
10
|
+
* the functional composition pattern.
|
|
11
|
+
*
|
|
12
|
+
* @param context - Converter context containing assets, includes, and resolvers
|
|
13
|
+
* @param entry - Contentful entry to convert
|
|
14
|
+
* @returns IExternalComponent object
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```ts
|
|
18
|
+
* const externalComponent = baseExternalComponentConverter(context, contentfulEntry);
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
export declare function baseExternalComponentConverter(context: ConverterContext, entry: Entry<BaseExternalComponentSkeleton, DefaultChainModifier, string>): IBaseExternalComponent;
|
|
22
|
+
//# sourceMappingURL=externalComponent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"externalComponent.d.ts","sourceRoot":"","sources":["../../src/converters/externalComponent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACzE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,QAAQ,CAAC;AACnD,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,oCAAoC,CAAC;AAExF,OAAO,EACL,KAAK,gBAAgB,EAItB,MAAM,WAAW,CAAC;AAEnB;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,8BAA8B,CAC5C,OAAO,EAAE,gBAAgB,EACzB,KAAK,EAAE,KAAK,CAAC,6BAA6B,EAAE,oBAAoB,EAAE,MAAM,CAAC,GACxE,sBAAsB,CA0BxB"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { createResponsiveVisual } from './asset';
|
|
2
|
+
import { DEFAULT_POSITION_FIELDS, lookupAsset, makeContentfulTitle, } from './helpers';
|
|
3
|
+
/**
|
|
4
|
+
* Base converter for Contentful ExternalComponent entries to IExternalComponent type
|
|
5
|
+
*
|
|
6
|
+
* This is a minimal implementation that can be extended using
|
|
7
|
+
* the functional composition pattern.
|
|
8
|
+
*
|
|
9
|
+
* @param context - Converter context containing assets, includes, and resolvers
|
|
10
|
+
* @param entry - Contentful entry to convert
|
|
11
|
+
* @returns IExternalComponent object
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```ts
|
|
15
|
+
* const externalComponent = baseExternalComponentConverter(context, contentfulEntry);
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
export function baseExternalComponentConverter(context, entry) {
|
|
19
|
+
const { sys, fields } = entry;
|
|
20
|
+
const { cmsLabel, backgroundVisual: bgVisual, mobileBackgroundVisual: mobileBgVisual, ...simpleFields } = fields;
|
|
21
|
+
// Convert background visuals to responsive visual
|
|
22
|
+
const backgroundVisual = createResponsiveVisual(lookupAsset(context, bgVisual), lookupAsset(context, mobileBgVisual));
|
|
23
|
+
const externalComponent = {
|
|
24
|
+
type: 'External component',
|
|
25
|
+
id: sys.id,
|
|
26
|
+
name: makeContentfulTitle(cmsLabel, sys.id),
|
|
27
|
+
cmsLabel: cmsLabel,
|
|
28
|
+
...DEFAULT_POSITION_FIELDS,
|
|
29
|
+
...simpleFields,
|
|
30
|
+
backgroundVisual,
|
|
31
|
+
};
|
|
32
|
+
return externalComponent;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=externalComponent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"externalComponent.js","sourceRoot":"","sources":["../../src/converters/externalComponent.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAC;AACjD,OAAO,EAEL,uBAAuB,EACvB,WAAW,EACX,mBAAmB,GACpB,MAAM,WAAW,CAAC;AAEnB;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,8BAA8B,CAC5C,OAAyB,EACzB,KAAyE;IAEzE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;IAE9B,MAAM,EACJ,QAAQ,EACR,gBAAgB,EAAE,QAAQ,EAC1B,sBAAsB,EAAE,cAAc,EACtC,GAAG,YAAY,EAChB,GAAG,MAAM,CAAC;IAEX,kDAAkD;IAClD,MAAM,gBAAgB,GAAG,sBAAsB,CAC7C,WAAW,CAAC,OAAO,EAAE,QAAQ,CAAC,EAC9B,WAAW,CAAC,OAAO,EAAE,cAAc,CAAC,CACrC,CAAC;IAEF,MAAM,iBAAiB,GAA2B;QAChD,IAAI,EAAE,oBAAoB;QAC1B,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,IAAI,EAAE,mBAAmB,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE,CAAC;QAC3C,QAAQ,EAAE,QAAQ;QAClB,GAAG,uBAAuB;QAC1B,GAAG,YAAY;QACf,gBAAgB;KACjB,CAAC;IACF,OAAO,iBAAiB,CAAC;AAC3B,CAAC"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import type { IDownloadAsset, IInternalLink, InternalType, ITyped, IVisual } from '@se-studio/core-data-types';
|
|
2
|
+
import type { Asset, Entry, UnresolvedLink } from 'contentful';
|
|
3
|
+
import type { DefaultChainModifier, PossibleResolvedEntry } from '../api';
|
|
4
|
+
import type { BaseContent, BaseLink } from '../baseTypes/baseShared';
|
|
5
|
+
import type { CmsError } from '../types';
|
|
6
|
+
import type { baseArticleConverter, baseArticleTypeConverter } from './article';
|
|
7
|
+
import type { baseCollectionConverter } from './collection';
|
|
8
|
+
import type { baseComponentConverter } from './component';
|
|
9
|
+
import type { baseCustomTypeConverter } from './customType';
|
|
10
|
+
import type { baseNavigationItemConverter } from './navigationItem';
|
|
11
|
+
import type { basePageConverter } from './page';
|
|
12
|
+
import type { baseTagConverter } from './tag';
|
|
13
|
+
export declare function resolveBuildYear(value: string): string;
|
|
14
|
+
export declare function makeContentfulTitle(title: string | undefined | null, id: string, prefix?: string): string;
|
|
15
|
+
export declare function stringOrUndefined(value: string | null | undefined): string | undefined;
|
|
16
|
+
export declare function makeContentfulDescription(description: string | undefined | null, id: string): string;
|
|
17
|
+
export declare function lookupAsset(context: ConverterContext, asset: UnresolvedLink<'Asset'> | undefined): IVisual | undefined;
|
|
18
|
+
/**
|
|
19
|
+
* Looks up an asset that is used as an icon.
|
|
20
|
+
* If the asset is an SVG image, it marks it with isIcon: true so it uses the sprite system.
|
|
21
|
+
*/
|
|
22
|
+
export declare function lookupIconAsset(context: ConverterContext, asset: UnresolvedLink<'Asset'> | undefined): IVisual | undefined;
|
|
23
|
+
/**
|
|
24
|
+
* Looks up a raw asset and converts it to IDownloadAsset for download functionality.
|
|
25
|
+
* Returns undefined if the asset doesn't exist or doesn't have a valid file.
|
|
26
|
+
*/
|
|
27
|
+
export declare function lookupDownloadAsset(context: ConverterContext, asset: UnresolvedLink<'Asset'> | undefined): IDownloadAsset | undefined;
|
|
28
|
+
/**
|
|
29
|
+
* Default positioning fields for content items before they are processed
|
|
30
|
+
*/
|
|
31
|
+
export declare const DEFAULT_POSITION_FIELDS: {
|
|
32
|
+
readonly index: 0;
|
|
33
|
+
readonly isFirst: false;
|
|
34
|
+
readonly isLast: false;
|
|
35
|
+
readonly indexOfType: 0;
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* Creates an internal link object with common fields
|
|
39
|
+
* Used by multiple converters (tag, page, article, person) to reduce duplication
|
|
40
|
+
*/
|
|
41
|
+
export declare function createInternalLink(id: string, fields: {
|
|
42
|
+
cmsLabel?: string | null;
|
|
43
|
+
name: string | null;
|
|
44
|
+
useName?: boolean | null;
|
|
45
|
+
title?: string | null;
|
|
46
|
+
featuredImage?: UnresolvedLink<'Asset'>;
|
|
47
|
+
backgroundColour?: string | null;
|
|
48
|
+
textColour?: string | null;
|
|
49
|
+
indexed?: boolean | null;
|
|
50
|
+
hidden?: boolean | null;
|
|
51
|
+
slug: string;
|
|
52
|
+
description?: string | null;
|
|
53
|
+
}, context: ConverterContext, href: string, internalType: InternalType, additionalProps?: any): IInternalLink;
|
|
54
|
+
export type ContentResolverFunction = (context: ConverterContext, entry: Entry<BaseContent, DefaultChainModifier, string>) => unknown;
|
|
55
|
+
export type ContentResolverMap = Map<string, ContentResolverFunction>;
|
|
56
|
+
export type LinkResolverFunction<TResult extends IInternalLink = IInternalLink> = (context: ConverterContext, entry: Entry<BaseLink, DefaultChainModifier, string>) => TResult;
|
|
57
|
+
export type LinkResolverMap = Map<string, LinkResolverFunction>;
|
|
58
|
+
/**
|
|
59
|
+
* URL calculators for each content type.
|
|
60
|
+
* Apps can override these to customize URL patterns.
|
|
61
|
+
*/
|
|
62
|
+
export type UrlCalculators = {
|
|
63
|
+
page: (slug: string) => string;
|
|
64
|
+
pageVariant: (slug: string) => string;
|
|
65
|
+
article: (articleTypeSlug: string, slug: string, primaryTagSlug?: string) => string;
|
|
66
|
+
articleType: (slug: string) => string;
|
|
67
|
+
tag: (slug: string) => string;
|
|
68
|
+
person: (slug: string) => string;
|
|
69
|
+
customType: (slug: string) => string;
|
|
70
|
+
};
|
|
71
|
+
export type BaseConverterContext = {
|
|
72
|
+
videoPrefix: string;
|
|
73
|
+
/**
|
|
74
|
+
* Resolves a mask dropdown value (e.g., 'Rounded diamond') to a URL.
|
|
75
|
+
* Each project provides its own implementation with project-specific masks.
|
|
76
|
+
*/
|
|
77
|
+
maskResolver?: (maskName: string) => string | undefined;
|
|
78
|
+
/**
|
|
79
|
+
* URL calculators for each content type.
|
|
80
|
+
* Apps can override these to customize URL patterns for links, sitemaps, and preview.
|
|
81
|
+
*/
|
|
82
|
+
urlCalculators: UrlCalculators;
|
|
83
|
+
linkResolver: LinkResolverMap;
|
|
84
|
+
contentResolver: Map<string, (context: ConverterContext, entry: Entry<BaseContent, DefaultChainModifier, string>) => unknown>;
|
|
85
|
+
navigationItemResolver: typeof baseNavigationItemConverter;
|
|
86
|
+
pageResolver: typeof basePageConverter;
|
|
87
|
+
articleResolver: typeof baseArticleConverter;
|
|
88
|
+
articleTypeResolver: typeof baseArticleTypeConverter;
|
|
89
|
+
tagResolver: typeof baseTagConverter;
|
|
90
|
+
personResolver: typeof import('./person').basePersonConverter;
|
|
91
|
+
customTypeResolver: typeof baseCustomTypeConverter;
|
|
92
|
+
componentResolver: typeof baseComponentConverter;
|
|
93
|
+
collectionResolver: typeof baseCollectionConverter;
|
|
94
|
+
};
|
|
95
|
+
export type ConverterContext = BaseConverterContext & {
|
|
96
|
+
includes: Map<string, PossibleResolvedEntry>;
|
|
97
|
+
assets: Map<string, IVisual>;
|
|
98
|
+
rawAssets: Map<string, Asset>;
|
|
99
|
+
errors: CmsError[];
|
|
100
|
+
};
|
|
101
|
+
/**
|
|
102
|
+
* Adds position metadata to an array of content items
|
|
103
|
+
* Each item gets: index, isFirst, isLast, indexOfType
|
|
104
|
+
*
|
|
105
|
+
* @param items - Array of content items to add metadata to
|
|
106
|
+
* @returns New array with position metadata added to each item
|
|
107
|
+
*/
|
|
108
|
+
export declare function addPositionMetadata<T extends {
|
|
109
|
+
type: string;
|
|
110
|
+
index?: number;
|
|
111
|
+
isFirst?: boolean;
|
|
112
|
+
isLast?: boolean;
|
|
113
|
+
indexOfType?: number;
|
|
114
|
+
}>(items: T[]): T[];
|
|
115
|
+
export declare function calculateContentCount(...contents: ITyped[][]): number;
|
|
116
|
+
//# sourceMappingURL=helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/converters/helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
export function resolveBuildYear(value) {
|
|
2
|
+
const buildYear = new Date().getFullYear();
|
|
3
|
+
return value.replaceAll('#buildYear#', buildYear.toString());
|
|
4
|
+
}
|
|
5
|
+
export function makeContentfulTitle(title, id, prefix = 'Title for ') {
|
|
6
|
+
return title ?? `${prefix}${id}`;
|
|
7
|
+
}
|
|
8
|
+
export function stringOrUndefined(value) {
|
|
9
|
+
if (value && value.length > 0) {
|
|
10
|
+
return value;
|
|
11
|
+
}
|
|
12
|
+
return undefined;
|
|
13
|
+
}
|
|
14
|
+
export function makeContentfulDescription(description, id) {
|
|
15
|
+
return description ?? `Description for ${id}`;
|
|
16
|
+
}
|
|
17
|
+
export function lookupAsset(context, asset) {
|
|
18
|
+
if (!asset)
|
|
19
|
+
return undefined;
|
|
20
|
+
return context.assets.get(asset.sys.id);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Looks up an asset that is used as an icon.
|
|
24
|
+
* If the asset is an SVG image, it marks it with isIcon: true so it uses the sprite system.
|
|
25
|
+
*/
|
|
26
|
+
export function lookupIconAsset(context, asset) {
|
|
27
|
+
const visual = lookupAsset(context, asset);
|
|
28
|
+
if (!visual)
|
|
29
|
+
return undefined;
|
|
30
|
+
// Mark SVG images as icons
|
|
31
|
+
if (visual.image?.type === 'Svg image') {
|
|
32
|
+
return {
|
|
33
|
+
...visual,
|
|
34
|
+
image: {
|
|
35
|
+
...visual.image,
|
|
36
|
+
isIcon: true,
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
return visual;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Looks up a raw asset and converts it to IDownloadAsset for download functionality.
|
|
44
|
+
* Returns undefined if the asset doesn't exist or doesn't have a valid file.
|
|
45
|
+
*/
|
|
46
|
+
export function lookupDownloadAsset(context, asset) {
|
|
47
|
+
if (!asset)
|
|
48
|
+
return undefined;
|
|
49
|
+
const rawAsset = context.rawAssets.get(asset.sys.id);
|
|
50
|
+
if (!rawAsset?.fields?.file)
|
|
51
|
+
return undefined;
|
|
52
|
+
// Cast to AssetFile since we're working with resolved assets without link resolution
|
|
53
|
+
const file = rawAsset.fields.file;
|
|
54
|
+
if (!file.url || !file.fileName || !file.contentType)
|
|
55
|
+
return undefined;
|
|
56
|
+
return {
|
|
57
|
+
assetId: rawAsset.sys.id,
|
|
58
|
+
filename: file.fileName,
|
|
59
|
+
contentType: file.contentType,
|
|
60
|
+
size: file.details?.size,
|
|
61
|
+
url: `https:${file.url}`,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Default positioning fields for content items before they are processed
|
|
66
|
+
*/
|
|
67
|
+
export const DEFAULT_POSITION_FIELDS = {
|
|
68
|
+
index: 0,
|
|
69
|
+
isFirst: false,
|
|
70
|
+
isLast: false,
|
|
71
|
+
indexOfType: 0,
|
|
72
|
+
};
|
|
73
|
+
/**
|
|
74
|
+
* Creates an internal link object with common fields
|
|
75
|
+
* Used by multiple converters (tag, page, article, person) to reduce duplication
|
|
76
|
+
*/
|
|
77
|
+
export function createInternalLink(id, fields, context, href, internalType,
|
|
78
|
+
// biome-ignore lint/suspicious/noExplicitAny: Used for expanding
|
|
79
|
+
additionalProps) {
|
|
80
|
+
const { cmsLabel, title, name, useName, featuredImage, backgroundColour, textColour, indexed, hidden, slug, description, } = fields;
|
|
81
|
+
const text = makeContentfulTitle(title, id);
|
|
82
|
+
return {
|
|
83
|
+
type: 'Internal link',
|
|
84
|
+
internalType,
|
|
85
|
+
id,
|
|
86
|
+
name: name ?? cmsLabel ?? '',
|
|
87
|
+
useName,
|
|
88
|
+
text,
|
|
89
|
+
visual: lookupAsset(context, featuredImage),
|
|
90
|
+
backgroundColour,
|
|
91
|
+
textColour,
|
|
92
|
+
indexed,
|
|
93
|
+
hidden,
|
|
94
|
+
slug,
|
|
95
|
+
href,
|
|
96
|
+
title,
|
|
97
|
+
description,
|
|
98
|
+
...additionalProps,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Adds position metadata to an array of content items
|
|
103
|
+
* Each item gets: index, isFirst, isLast, indexOfType
|
|
104
|
+
*
|
|
105
|
+
* @param items - Array of content items to add metadata to
|
|
106
|
+
* @returns New array with position metadata added to each item
|
|
107
|
+
*/
|
|
108
|
+
export function addPositionMetadata(items) {
|
|
109
|
+
if (items.length === 0)
|
|
110
|
+
return items;
|
|
111
|
+
// Count items by type for indexOfType calculation
|
|
112
|
+
const typeCount = new Map();
|
|
113
|
+
return items.map((item, index) => {
|
|
114
|
+
const currentTypeIndex = typeCount.get(item.type) ?? 0;
|
|
115
|
+
typeCount.set(item.type, currentTypeIndex + 1);
|
|
116
|
+
return {
|
|
117
|
+
...item,
|
|
118
|
+
index,
|
|
119
|
+
isFirst: index === 0,
|
|
120
|
+
isLast: index === items.length - 1,
|
|
121
|
+
indexOfType: currentTypeIndex,
|
|
122
|
+
};
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
export function calculateContentCount(...contents) {
|
|
126
|
+
return contents.reduce((acc, content) => acc + content.length, 0);
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/converters/helpers.ts"],"names":[],"mappings":"AAmBA,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC5C,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC3C,OAAO,KAAK,CAAC,UAAU,CAAC,aAAa,EAAE,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC;AAC/D,CAAC;AACD,MAAM,UAAU,mBAAmB,CACjC,KAAgC,EAChC,EAAU,EACV,MAAM,GAAG,YAAY;IAErB,OAAO,KAAK,IAAI,GAAG,MAAM,GAAG,EAAE,EAAE,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAgC;IAChE,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AACD,MAAM,UAAU,yBAAyB,CAAC,WAAsC,EAAE,EAAU;IAC1F,OAAO,WAAW,IAAI,mBAAmB,EAAE,EAAE,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,OAAyB,EAAE,KAA0C;IAC/F,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,OAAO,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAC1C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAC7B,OAAyB,EACzB,KAA0C;IAE1C,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAC3C,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IAE9B,2BAA2B;IAC3B,IAAI,MAAM,CAAC,KAAK,EAAE,IAAI,KAAK,WAAW,EAAE,CAAC;QACvC,OAAO;YACL,GAAG,MAAM;YACT,KAAK,EAAE;gBACL,GAAG,MAAM,CAAC,KAAK;gBACf,MAAM,EAAE,IAAI;aACb;SACF,CAAC;IACJ,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CACjC,OAAyB,EACzB,KAA0C;IAE1C,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAE7B,MAAM,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACrD,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI;QAAE,OAAO,SAAS,CAAC;IAE9C,qFAAqF;IACrF,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,IAK5B,CAAC;IACF,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,WAAW;QAAE,OAAO,SAAS,CAAC;IAEvE,OAAO;QACL,OAAO,EAAE,QAAQ,CAAC,GAAG,CAAC,EAAE;QACxB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI;QACxB,GAAG,EAAE,SAAS,IAAI,CAAC,GAAG,EAAE;KACzB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACrC,KAAK,EAAE,CAAC;IACR,OAAO,EAAE,KAAK;IACd,MAAM,EAAE,KAAK;IACb,WAAW,EAAE,CAAC;CACN,CAAC;AAEX;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAChC,EAAU,EACV,MAYC,EACD,OAAyB,EACzB,IAAY,EACZ,YAA0B;AAC1B,iEAAiE;AACjE,eAAqB;IAErB,MAAM,EACJ,QAAQ,EACR,KAAK,EACL,IAAI,EACJ,OAAO,EACP,aAAa,EACb,gBAAgB,EAChB,UAAU,EACV,OAAO,EACP,MAAM,EACN,IAAI,EACJ,WAAW,GACZ,GAAG,MAAM,CAAC;IAEX,MAAM,IAAI,GAAG,mBAAmB,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC5C,OAAO;QACL,IAAI,EAAE,eAAe;QACrB,YAAY;QACZ,EAAE;QACF,IAAI,EAAE,IAAI,IAAI,QAAQ,IAAI,EAAE;QAC5B,OAAO;QACP,IAAI;QACJ,MAAM,EAAE,WAAW,CAAC,OAAO,EAAE,aAAa,CAAC;QAC3C,gBAAgB;QAChB,UAAU;QACV,OAAO;QACP,MAAM;QACN,IAAI;QACJ,IAAI;QACJ,KAAK;QACL,WAAW;QACX,GAAG,eAAe;KACnB,CAAC;AACJ,CAAC;AA8DD;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB,CAQjC,KAAU;IACV,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAErC,kDAAkD;IAClD,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;IAE5C,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QAC/B,MAAM,gBAAgB,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvD,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,gBAAgB,GAAG,CAAC,CAAC,CAAC;QAE/C,OAAO;YACL,GAAG,IAAI;YACP,KAAK;YACL,OAAO,EAAE,KAAK,KAAK,CAAC;YACpB,MAAM,EAAE,KAAK,KAAK,KAAK,CAAC,MAAM,GAAG,CAAC;YAClC,WAAW,EAAE,gBAAgB;SAC9B,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,GAAG,QAAoB;IAC3D,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,CAAC,GAAG,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;AACpE,CAAC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import type { IBaseCollection, IBaseComponent, INavigation, IResponsiveVisual, ISvgImage, ITyped, IVisual } from '@se-studio/core-data-types';
|
|
2
|
+
/**
|
|
3
|
+
* Extract SVG image from a visual if it's marked as an icon.
|
|
4
|
+
* Only returns SVG images that have isIcon: true (set during conversion from icon fields).
|
|
5
|
+
*
|
|
6
|
+
* @param visual - Visual to check
|
|
7
|
+
* @returns SVG image if visual contains an icon SVG, undefined otherwise
|
|
8
|
+
*/
|
|
9
|
+
export declare function extractIconFromVisual(visual: IVisual | undefined): ISvgImage | undefined;
|
|
10
|
+
/**
|
|
11
|
+
* Extract icon SVG images from a responsive visual (both desktop and mobile).
|
|
12
|
+
* Only returns SVG images that have isIcon: true.
|
|
13
|
+
*
|
|
14
|
+
* @param visual - Responsive visual to check
|
|
15
|
+
* @returns Array of icon SVG images found (may contain 0, 1, or 2 items)
|
|
16
|
+
*/
|
|
17
|
+
export declare function extractIconsFromResponsiveVisual(visual: IResponsiveVisual | undefined): ISvgImage[];
|
|
18
|
+
/**
|
|
19
|
+
* Collect icon SVG from a component's icon field.
|
|
20
|
+
*
|
|
21
|
+
* @param component - Component to check
|
|
22
|
+
* @returns Array of icon SVGs found
|
|
23
|
+
*/
|
|
24
|
+
export declare function collectIconsFromComponent(component: IBaseComponent | undefined): ISvgImage[];
|
|
25
|
+
/**
|
|
26
|
+
* Collect icon SVG from a collection's icon field.
|
|
27
|
+
*
|
|
28
|
+
* @param collection - Collection to check
|
|
29
|
+
* @returns Array of icon SVGs found
|
|
30
|
+
*/
|
|
31
|
+
export declare function collectIconsFromCollection(collection: IBaseCollection | undefined): ISvgImage[];
|
|
32
|
+
/**
|
|
33
|
+
* Recursively collect all SVG icons from navigation structures.
|
|
34
|
+
* This includes icons from navigation item links and nested navigation entries.
|
|
35
|
+
*
|
|
36
|
+
* @param navigation - Navigation structure to scan
|
|
37
|
+
* @returns Array of all SVG icons found
|
|
38
|
+
*/
|
|
39
|
+
export declare function collectIconsFromNavigation(navigation: INavigation | undefined): ISvgImage[];
|
|
40
|
+
/**
|
|
41
|
+
* Recursively collect all SVG icons from page content.
|
|
42
|
+
* This includes icons from components, collections, nested content,
|
|
43
|
+
* and embedded entries within rich text fields (body, additionalCopy).
|
|
44
|
+
*
|
|
45
|
+
* @param contents - Array of content items to scan
|
|
46
|
+
* @returns Array of all SVG icons found
|
|
47
|
+
*/
|
|
48
|
+
export declare function collectIconsFromContent(contents: ReadonlyArray<ITyped> | undefined): ISvgImage[];
|
|
49
|
+
/**
|
|
50
|
+
* Deduplicate icons by ID, preserving order of first occurrence.
|
|
51
|
+
* Takes any number of icon arrays and returns a single deduplicated array.
|
|
52
|
+
*
|
|
53
|
+
* @param iconArrays - Arrays of icons to merge and deduplicate
|
|
54
|
+
* @returns Deduplicated array of icons, or undefined if empty
|
|
55
|
+
*/
|
|
56
|
+
export declare function deduplicateIcons(...iconArrays: ReadonlyArray<ISvgImage>[]): ISvgImage[] | undefined;
|
|
57
|
+
/**
|
|
58
|
+
* Process icons by fetching SVG content and generating sprite symbols.
|
|
59
|
+
* This runs during data conversion to pre-process icons for the sprite sheet.
|
|
60
|
+
*
|
|
61
|
+
* @param icons - Array of icon SVG images to process
|
|
62
|
+
* @returns Array of icons with symbolContent populated
|
|
63
|
+
*/
|
|
64
|
+
export declare function processIconsForSprite(icons: ReadonlyArray<ISvgImage>): Promise<ISvgImage[]>;
|
|
65
|
+
//# sourceMappingURL=iconCollector.d.ts.map
|