@se-studio/core-ui 1.0.35 → 1.0.37
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/dist/components/StructuredData.d.ts +20 -0
- package/dist/components/StructuredData.d.ts.map +1 -0
- package/dist/components/StructuredData.js +63 -0
- package/dist/components/StructuredData.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/utils/structuredDataUtils.d.ts +66 -0
- package/dist/utils/structuredDataUtils.d.ts.map +1 -0
- package/dist/utils/structuredDataUtils.js +99 -0
- package/dist/utils/structuredDataUtils.js.map +1 -0
- package/package.json +7 -5
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { ISchema } from '@se-studio/core-data-types';
|
|
2
|
+
import type React from 'react';
|
|
3
|
+
import type { StructuredDataContext } from '../utils/structuredDataUtils';
|
|
4
|
+
export interface StructuredDataProps {
|
|
5
|
+
/** The schemas to render */
|
|
6
|
+
schemas?: ReadonlyArray<ISchema>;
|
|
7
|
+
/** The context data to populate the templates */
|
|
8
|
+
context: StructuredDataContext;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Renders JSON-LD structured data by processing Mustache templates.
|
|
12
|
+
*
|
|
13
|
+
* Implements the "String-First" architecture:
|
|
14
|
+
* 1. Takes raw template strings from CMS
|
|
15
|
+
* 2. Renders them with Mustache using the provided context
|
|
16
|
+
* 3. Parses them to ensure valid JSON
|
|
17
|
+
* 4. Outputs a script tag with the final JSON-LD
|
|
18
|
+
*/
|
|
19
|
+
export declare const StructuredData: React.FC<StructuredDataProps>;
|
|
20
|
+
//# sourceMappingURL=StructuredData.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StructuredData.d.ts","sourceRoot":"","sources":["../../src/components/StructuredData.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAE1D,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAE1E,MAAM,WAAW,mBAAmB;IAClC,4BAA4B;IAC5B,OAAO,CAAC,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;IACjC,iDAAiD;IACjD,OAAO,EAAE,qBAAqB,CAAC;CAChC;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,cAAc,EAAE,KAAK,CAAC,EAAE,CAAC,mBAAmB,CAiExD,CAAC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import Mustache from 'mustache';
|
|
3
|
+
/**
|
|
4
|
+
* Renders JSON-LD structured data by processing Mustache templates.
|
|
5
|
+
*
|
|
6
|
+
* Implements the "String-First" architecture:
|
|
7
|
+
* 1. Takes raw template strings from CMS
|
|
8
|
+
* 2. Renders them with Mustache using the provided context
|
|
9
|
+
* 3. Parses them to ensure valid JSON
|
|
10
|
+
* 4. Outputs a script tag with the final JSON-LD
|
|
11
|
+
*/
|
|
12
|
+
export const StructuredData = ({ schemas, context }) => {
|
|
13
|
+
if (!schemas || schemas.length === 0) {
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
// Deduplicate schemas by ID
|
|
17
|
+
const uniqueSchemas = new Map();
|
|
18
|
+
schemas.forEach((schema) => {
|
|
19
|
+
if (schema.id) {
|
|
20
|
+
uniqueSchemas.set(schema.id, schema);
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
const validObjects = [];
|
|
24
|
+
const errors = [];
|
|
25
|
+
uniqueSchemas.forEach((schema) => {
|
|
26
|
+
try {
|
|
27
|
+
// 1. Render the template string with context
|
|
28
|
+
// Disable HTML escaping for triple braces {{{var}}} which is standard in Mustache
|
|
29
|
+
// but we need to ensure double braces {{var}} ARE escaped to prevent breaking JSON quotes
|
|
30
|
+
const renderedString = Mustache.render(schema.markup, context);
|
|
31
|
+
// 2. Parse the rendered string into a JSON object
|
|
32
|
+
// This validates that the template produced valid JSON
|
|
33
|
+
const jsonObject = JSON.parse(renderedString);
|
|
34
|
+
if (jsonObject) {
|
|
35
|
+
validObjects.push(jsonObject);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
// If parsing fails, we skip this schema but continue with others
|
|
40
|
+
// In development, this would be a good place to log or show a warning
|
|
41
|
+
if (process.env.NODE_ENV === 'development') {
|
|
42
|
+
console.warn(`[StructuredData] Failed to parse schema "${schema.name}" (${schema.id}):`, error instanceof Error ? error.message : error);
|
|
43
|
+
}
|
|
44
|
+
errors.push(schema.name);
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
if (validObjects.length === 0) {
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
// 3. Construct the final output
|
|
51
|
+
// If we have multiple objects, we can wrap them in a @graph or just an array
|
|
52
|
+
// Schema.org recommends using @graph for connectivity
|
|
53
|
+
const finalJson = validObjects.length === 1
|
|
54
|
+
? validObjects[0]
|
|
55
|
+
: {
|
|
56
|
+
'@context': 'https://schema.org',
|
|
57
|
+
'@graph': validObjects,
|
|
58
|
+
};
|
|
59
|
+
return (_jsx("script", { type: "application/ld+json",
|
|
60
|
+
// biome-ignore lint/security/noDangerouslySetInnerHtml: We need to set the inner HTML for the script tag
|
|
61
|
+
dangerouslySetInnerHTML: { __html: JSON.stringify(finalJson) } }));
|
|
62
|
+
};
|
|
63
|
+
//# sourceMappingURL=StructuredData.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StructuredData.js","sourceRoot":"","sources":["../../src/components/StructuredData.tsx"],"names":[],"mappings":";AACA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAWhC;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,cAAc,GAAkC,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE;IACpF,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,4BAA4B;IAC5B,MAAM,aAAa,GAAG,IAAI,GAAG,EAAmB,CAAC;IACjD,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;QACzB,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;YACd,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QACvC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,YAAY,GAA8B,EAAE,CAAC;IACnD,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,aAAa,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;QAC/B,IAAI,CAAC;YACH,6CAA6C;YAC7C,kFAAkF;YAClF,0FAA0F;YAC1F,MAAM,cAAc,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YAE/D,kDAAkD;YAClD,uDAAuD;YACvD,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;YAE9C,IAAI,UAAU,EAAE,CAAC;gBACf,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,iEAAiE;YACjE,sEAAsE;YACtE,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,aAAa,EAAE,CAAC;gBAC3C,OAAO,CAAC,IAAI,CACV,4CAA4C,MAAM,CAAC,IAAI,MAAM,MAAM,CAAC,EAAE,IAAI,EAC1E,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAC/C,CAAC;YACJ,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,gCAAgC;IAChC,6EAA6E;IAC7E,sDAAsD;IACtD,MAAM,SAAS,GACb,YAAY,CAAC,MAAM,KAAK,CAAC;QACvB,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC;QACjB,CAAC,CAAC;YACE,UAAU,EAAE,oBAAoB;YAChC,QAAQ,EAAE,YAAY;SACvB,CAAC;IAER,OAAO,CACL,iBACE,IAAI,EAAC,qBAAqB;QAC1B,yGAAyG;QACzG,uBAAuB,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,GAC9D,CACH,CAAC;AACJ,CAAC,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -49,6 +49,8 @@ export { CmsConversionErrors } from './components/CmsConversionErrors';
|
|
|
49
49
|
export { CmsEmbeddedContent } from './components/CmsEmbeddedContent';
|
|
50
50
|
export type { EmbeddedExternalComponentMap, EmbeddedExternalComponentRenderer, ExternalComponentMap, ExternalComponentRenderer, ExternalComponentRendererProps, } from './components/CmsExternalComponent';
|
|
51
51
|
export { Preview } from './components/Preview.js';
|
|
52
|
+
export type { StructuredDataProps } from './components/StructuredData';
|
|
53
|
+
export { StructuredData } from './components/StructuredData';
|
|
52
54
|
export { SvgSpriteSheet } from './components/SvgSpriteSheet';
|
|
53
55
|
export type { IVisualProps } from './components/Visual';
|
|
54
56
|
export { calculateCropDetails, calculateImagePriority, calculateImageWidthStyleVariable, } from './components/Visual';
|
|
@@ -76,6 +78,8 @@ export type { IContent } from './utils/previewUtils';
|
|
|
76
78
|
export { coreGetPreviewAssetIdProps, coreGetPreviewFieldIdProps, coreGetPreviewParentProps, coreGetPreviewProps, } from './utils/previewUtils';
|
|
77
79
|
export type { GenerateSitemapOptions, SitemapChangeFrequency, SitemapEntry, } from './utils/sitemap';
|
|
78
80
|
export { deduplicateSitemapEntries, generateNextSitemap, sortSitemapEntries, } from './utils/sitemap';
|
|
81
|
+
export type { StructuredDataConfig, StructuredDataContext } from './utils/structuredDataUtils';
|
|
82
|
+
export { buildStructuredDataContext } from './utils/structuredDataUtils';
|
|
79
83
|
export { UnsupportedWarning } from './utils/UnsupportedWarning';
|
|
80
84
|
export { DEFAULT_ALLOWED_UNUSED, UnusedChecker } from './utils/UnusedChecker';
|
|
81
85
|
export { isAbsoluteUrl } from './utils/urlUtils';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAKH,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AAEvF,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,YAAY,EACV,gBAAgB,EAChB,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,YAAY,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC/E,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAE9D,YAAY,EACV,aAAa,EACb,kBAAkB,EAClB,uBAAuB,EACvB,qBAAqB,EACrB,0BAA0B,GAC3B,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,YAAY,EACV,YAAY,EACZ,iBAAiB,EACjB,sBAAsB,EACtB,oBAAoB,EACpB,yBAAyB,GAC1B,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,YAAY,EACV,oBAAoB,EACpB,uBAAuB,GACxB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,YAAY,EACV,4BAA4B,EAC5B,iCAAiC,EACjC,oBAAoB,EACpB,yBAAyB,EACzB,8BAA8B,GAC/B,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -46,6 +46,7 @@ export { CmsContent } from './components/CmsContent';
|
|
|
46
46
|
export { CmsConversionErrors } from './components/CmsConversionErrors';
|
|
47
47
|
export { CmsEmbeddedContent } from './components/CmsEmbeddedContent';
|
|
48
48
|
export { Preview } from './components/Preview.js';
|
|
49
|
+
export { StructuredData } from './components/StructuredData';
|
|
49
50
|
// SVG Sprite System
|
|
50
51
|
export { SvgSpriteSheet } from './components/SvgSpriteSheet';
|
|
51
52
|
// Visual Components
|
|
@@ -72,6 +73,7 @@ export { handleCmsError } from './utils/errorHandling';
|
|
|
72
73
|
export { validatePreviewSecret } from './utils/previewPageUtils';
|
|
73
74
|
export { coreGetPreviewAssetIdProps, coreGetPreviewFieldIdProps, coreGetPreviewParentProps, coreGetPreviewProps, } from './utils/previewUtils';
|
|
74
75
|
export { deduplicateSitemapEntries, generateNextSitemap, sortSitemapEntries, } from './utils/sitemap';
|
|
76
|
+
export { buildStructuredDataContext } from './utils/structuredDataUtils';
|
|
75
77
|
export { UnsupportedWarning } from './utils/UnsupportedWarning';
|
|
76
78
|
// Development Utilities
|
|
77
79
|
export { DEFAULT_ALLOWED_UNUSED, UnusedChecker } from './utils/UnusedChecker';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,kDAAkD;AAElD,YAAY;AACZ,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACvF,qBAAqB;AACrB,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAM/D,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAExD,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAS9D,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAQ3D,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAKzD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAQrE,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,kDAAkD;AAElD,YAAY;AACZ,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACvF,qBAAqB;AACrB,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAM/D,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAExD,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAS9D,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAQ3D,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAKzD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAQrE,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAElD,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,oBAAoB;AACpB,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAE7D,oBAAoB;AACpB,OAAO,EACL,oBAAoB,EACpB,sBAAsB,EACtB,gCAAgC,GACjC,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,MAAM,EAAE,MAAM,8BAA8B,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAErD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,WAAW;AACX,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,uBAAuB;AACvB,OAAO,EAAE,uBAAuB,EAAE,MAAM,qCAAqC,CAAC;AAC9E,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAClF,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAC3E,eAAe;AACf,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAEhC,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,mBAAmB;AACnB,OAAO,EAAE,EAAE,EAAE,MAAM,YAAY,CAAC;AAYhC,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,qBAAqB,EACrB,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAGvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAEjE,OAAO,EACL,0BAA0B,EAC1B,0BAA0B,EAC1B,yBAAyB,EACzB,mBAAmB,GACpB,MAAM,sBAAsB,CAAC;AAO9B,OAAO,EACL,yBAAyB,EACzB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAC;AACzE,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,wBAAwB;AACxB,OAAO,EAAE,sBAAsB,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC9E,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,oCAAoC,EAAE,MAAM,yBAAyB,CAAC;AAC/E,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import type { IBaseModel } from '@se-studio/core-data-types';
|
|
2
|
+
import type { IBuildInformation } from './buildPageMetadata';
|
|
3
|
+
/**
|
|
4
|
+
* Standardized context object for Mustache templates.
|
|
5
|
+
* This structure is consistent across all pages to ensure templates are reusable.
|
|
6
|
+
*/
|
|
7
|
+
export interface StructuredDataContext {
|
|
8
|
+
baseUrl: string;
|
|
9
|
+
logoUrl: string;
|
|
10
|
+
currentUrl: string;
|
|
11
|
+
organization?: {
|
|
12
|
+
name: string;
|
|
13
|
+
url: string;
|
|
14
|
+
logo: string;
|
|
15
|
+
};
|
|
16
|
+
page: {
|
|
17
|
+
title: string;
|
|
18
|
+
description: string;
|
|
19
|
+
slug: string;
|
|
20
|
+
imageUrl?: string;
|
|
21
|
+
breadcrumbs: Array<{
|
|
22
|
+
position: number;
|
|
23
|
+
name: string;
|
|
24
|
+
url: string;
|
|
25
|
+
last: boolean;
|
|
26
|
+
}>;
|
|
27
|
+
};
|
|
28
|
+
information?: {
|
|
29
|
+
title: string;
|
|
30
|
+
slug: string;
|
|
31
|
+
description: string;
|
|
32
|
+
date: string;
|
|
33
|
+
lastUpdated: string;
|
|
34
|
+
author?: {
|
|
35
|
+
title: string;
|
|
36
|
+
slug: string;
|
|
37
|
+
image?: string;
|
|
38
|
+
};
|
|
39
|
+
};
|
|
40
|
+
person?: {
|
|
41
|
+
name: string;
|
|
42
|
+
title: string;
|
|
43
|
+
bio: string;
|
|
44
|
+
linkedinUrl?: string;
|
|
45
|
+
twitterUrl?: string;
|
|
46
|
+
image?: string;
|
|
47
|
+
};
|
|
48
|
+
[key: string]: unknown;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Configuration options for building the structured data context.
|
|
52
|
+
*/
|
|
53
|
+
export interface StructuredDataConfig extends IBuildInformation {
|
|
54
|
+
/** Logo URL for the organization */
|
|
55
|
+
logoUrl: string;
|
|
56
|
+
/** Current absolute path (e.g., /about-us) */
|
|
57
|
+
path: string;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Builds the comprehensive context object for structured data templates.
|
|
61
|
+
*
|
|
62
|
+
* @param model - The CMS content model (Page, Article, Person, etc.)
|
|
63
|
+
* @param config - Configuration including global URLs and paths
|
|
64
|
+
*/
|
|
65
|
+
export declare function buildStructuredDataContext(model: IBaseModel, config: StructuredDataConfig): StructuredDataContext;
|
|
66
|
+
//# sourceMappingURL=structuredDataUtils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"structuredDataUtils.d.ts","sourceRoot":"","sources":["../../src/utils/structuredDataUtils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAgB,UAAU,EAAe,MAAM,4BAA4B,CAAC;AACxF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAE7D;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IAEpC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE;QACb,IAAI,EAAE,MAAM,CAAC;QACb,GAAG,EAAE,MAAM,CAAC;QACZ,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IAGF,IAAI,EAAE;QACJ,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,EAAE,MAAM,CAAC;QACpB,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,WAAW,EAAE,KAAK,CAAC;YAAE,QAAQ,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAC;YAAC,GAAG,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,OAAO,CAAA;SAAE,CAAC,CAAC;KACpF,CAAC;IAGF,WAAW,CAAC,EAAE;QACZ,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,MAAM,CAAC,EAAE;YACP,KAAK,EAAE,MAAM,CAAC;YACd,IAAI,EAAE,MAAM,CAAC;YACb,KAAK,CAAC,EAAE,MAAM,CAAC;SAChB,CAAC;KACH,CAAC;IAEF,MAAM,CAAC,EAAE;QACP,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,GAAG,EAAE,MAAM,CAAC;QACZ,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;IAGF,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAqB,SAAQ,iBAAiB;IAC7D,oCAAoC;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,8CAA8C;IAC9C,IAAI,EAAE,MAAM,CAAC;CACd;AAyDD;;;;;GAKG;AACH,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,UAAU,EACjB,MAAM,EAAE,oBAAoB,GAC3B,qBAAqB,CA8DvB"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Helper to build the breadcrumbs array.
|
|
3
|
+
* This is a simplified implementation that splits the path.
|
|
4
|
+
* In a real app, you might want to look up titles for each segment.
|
|
5
|
+
*/
|
|
6
|
+
function buildBreadcrumbs(path, baseUrl, currentTitle, breadcrumbTitleOverride) {
|
|
7
|
+
const segments = path.split('/').filter(Boolean);
|
|
8
|
+
const breadcrumbs = [];
|
|
9
|
+
// Home
|
|
10
|
+
breadcrumbs.push({
|
|
11
|
+
position: 1,
|
|
12
|
+
name: 'Home',
|
|
13
|
+
url: baseUrl,
|
|
14
|
+
last: segments.length === 0,
|
|
15
|
+
});
|
|
16
|
+
let currentPath = '';
|
|
17
|
+
segments.forEach((segment, index) => {
|
|
18
|
+
currentPath += `/${segment}`;
|
|
19
|
+
const isLast = index === segments.length - 1;
|
|
20
|
+
// For intermediate segments, we might not have the title easily available
|
|
21
|
+
// without a lookup map. For now, we capitalize the slug.
|
|
22
|
+
// The last segment uses the page title or override.
|
|
23
|
+
let name = segment.charAt(0).toUpperCase() + segment.slice(1).replace(/-/g, ' ');
|
|
24
|
+
if (isLast) {
|
|
25
|
+
name = breadcrumbTitleOverride || currentTitle;
|
|
26
|
+
}
|
|
27
|
+
breadcrumbs.push({
|
|
28
|
+
position: index + 2,
|
|
29
|
+
name: name,
|
|
30
|
+
url: `${baseUrl}${currentPath}`,
|
|
31
|
+
last: isLast,
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
return breadcrumbs;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Builds the comprehensive context object for structured data templates.
|
|
38
|
+
*
|
|
39
|
+
* @param model - The CMS content model (Page, Article, Person, etc.)
|
|
40
|
+
* @param config - Configuration including global URLs and paths
|
|
41
|
+
*/
|
|
42
|
+
export function buildStructuredDataContext(model, config) {
|
|
43
|
+
const { baseUrl, logoUrl, path, customerName } = config;
|
|
44
|
+
const currentUrl = `${baseUrl}${path}`;
|
|
45
|
+
const featuredImageId = model.featuredImage?.id;
|
|
46
|
+
const imageUrl = featuredImageId ? `${baseUrl}/og/${featuredImageId}.jpg` : undefined;
|
|
47
|
+
// 1. Base Context
|
|
48
|
+
const context = {
|
|
49
|
+
baseUrl,
|
|
50
|
+
logoUrl,
|
|
51
|
+
currentUrl,
|
|
52
|
+
organization: {
|
|
53
|
+
name: customerName,
|
|
54
|
+
url: baseUrl,
|
|
55
|
+
logo: logoUrl,
|
|
56
|
+
},
|
|
57
|
+
page: {
|
|
58
|
+
title: model.title,
|
|
59
|
+
description: model.description,
|
|
60
|
+
slug: model.slug,
|
|
61
|
+
imageUrl,
|
|
62
|
+
breadcrumbs: buildBreadcrumbs(path, baseUrl, model.title, model.breadcrumbTitle),
|
|
63
|
+
},
|
|
64
|
+
};
|
|
65
|
+
// 2. Article Specific Context (mapped to 'information')
|
|
66
|
+
if (model.type === 'Article') {
|
|
67
|
+
const article = model;
|
|
68
|
+
// Note: We need to handle authors. Assuming standard relation pattern if it existed.
|
|
69
|
+
// Since IBaseArticle doesn't have explicit author field in the provided type definition,
|
|
70
|
+
// we will check if it exists or needs to be extended.
|
|
71
|
+
// For now, we map available fields.
|
|
72
|
+
context.information = {
|
|
73
|
+
title: article.title,
|
|
74
|
+
slug: article.slug,
|
|
75
|
+
description: article.description,
|
|
76
|
+
date: article.lastUpdated
|
|
77
|
+
? new Date(article.lastUpdated).toISOString()
|
|
78
|
+
: new Date().toISOString(), // Fallback
|
|
79
|
+
lastUpdated: article.lastUpdated
|
|
80
|
+
? new Date(article.lastUpdated).toISOString()
|
|
81
|
+
: new Date().toISOString(),
|
|
82
|
+
// author: ... // Add author mapping if available in model
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
// 3. Person Specific Context
|
|
86
|
+
if (model.type === 'Person') {
|
|
87
|
+
const person = model;
|
|
88
|
+
context.person = {
|
|
89
|
+
name: person.title, // Title is usually the name in Contentful
|
|
90
|
+
title: person.jobTitle || '',
|
|
91
|
+
bio: person.description, // Mapping description to bio
|
|
92
|
+
linkedinUrl: person.linkedIn || undefined,
|
|
93
|
+
// twitterUrl: person.twitter || undefined, // If available
|
|
94
|
+
image: imageUrl,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
return context;
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=structuredDataUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"structuredDataUtils.js","sourceRoot":"","sources":["../../src/utils/structuredDataUtils.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@se-studio/core-ui",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.37",
|
|
4
4
|
"description": "Shared React UI component library with Tailwind CSS v4 for SE Studio applications",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -52,23 +52,25 @@
|
|
|
52
52
|
"@contentful/rich-text-types": "^17.2.5",
|
|
53
53
|
"@extractus/oembed-extractor": "^4.0.9",
|
|
54
54
|
"@radix-ui/react-slot": "^1.2.4",
|
|
55
|
+
"@types/mustache": "4.2.6",
|
|
55
56
|
"change-case": "^5.4.4",
|
|
56
57
|
"clsx": "^2.1.1",
|
|
57
58
|
"html-entities": "^2.6.0",
|
|
59
|
+
"mustache": "4.2.0",
|
|
58
60
|
"tailwind-merge": "^3.4.0",
|
|
59
|
-
"@se-studio/contentful-rest-api": "1.0.
|
|
60
|
-
"@se-studio/core-data-types": "1.0.
|
|
61
|
+
"@se-studio/contentful-rest-api": "1.0.37",
|
|
62
|
+
"@se-studio/core-data-types": "1.0.37"
|
|
61
63
|
},
|
|
62
64
|
"devDependencies": {
|
|
63
65
|
"@biomejs/biome": "^2.3.8",
|
|
64
66
|
"@testing-library/jest-dom": "^6.9.1",
|
|
65
67
|
"@testing-library/react": "^16.3.0",
|
|
66
|
-
"@types/node": "^24.10.
|
|
68
|
+
"@types/node": "^24.10.4",
|
|
67
69
|
"@types/react": "^19.2.7",
|
|
68
70
|
"@types/react-dom": "^19.2.3",
|
|
69
71
|
"@vitejs/plugin-react": "^5.1.2",
|
|
70
72
|
"jsdom": "^27.3.0",
|
|
71
|
-
"next": "^15.5.
|
|
73
|
+
"next": "^15.5.9",
|
|
72
74
|
"typescript": "^5.9.3",
|
|
73
75
|
"vitest": "^4.0.15"
|
|
74
76
|
},
|