diff --git a/packages/optimizely-cms-sdk/src/graph/__test__/convertProperty.test.ts b/packages/optimizely-cms-sdk/src/graph/__test__/convertProperty.test.ts index d02605ac..5e52e3b0 100644 --- a/packages/optimizely-cms-sdk/src/graph/__test__/convertProperty.test.ts +++ b/packages/optimizely-cms-sdk/src/graph/__test__/convertProperty.test.ts @@ -68,7 +68,7 @@ describe('createFragment > Fragment threshold warning', () => { expect(result).toBeInstanceOf(Array); expect(warnSpy).toHaveBeenCalledOnce(); expect(warnSpy.mock.calls[0][0]).toMatch( - String.raw`generated 101 inner fragments` + String.raw`generated 105 inner fragments` ); expect(warnSpy.mock.calls[0][0]).toMatch( /Excessive fragment depth may breach GraphQL limits or degrade performance./ diff --git a/packages/optimizely-cms-sdk/src/graph/__test__/createQuery.test.ts b/packages/optimizely-cms-sdk/src/graph/__test__/createQuery.test.ts index 8e356fdb..cfbed229 100644 --- a/packages/optimizely-cms-sdk/src/graph/__test__/createQuery.test.ts +++ b/packages/optimizely-cms-sdk/src/graph/__test__/createQuery.test.ts @@ -21,7 +21,11 @@ describe('createFragment() simple cases', () => { const result = await createFragment('ct1'); expect(result).toMatchInlineSnapshot(` [ - "fragment ct1 on ct1 { __typename str bin boo flo int dat }", + "fragment MediaMetadata on MediaMetadata { mimeType thumbnail content }", + "fragment ContentUrl on ContentUrl { type default hierarchical internal graph base }", + "fragment IContentMetadata on IContentMetadata { key locale fallbackForLocale version displayName url {...ContentUrl} types published status created lastModified sortOrder variation ...MediaMetadata }", + "fragment _IContent on _IContent { _deleted _fulltext _modified _score _id _track _metadata {...IContentMetadata} }", + "fragment ct1 on ct1 { __typename str bin boo flo int dat ..._IContent }", ] `); }); @@ -44,7 +48,11 @@ describe('createFragment() simple cases', () => { const result = await createFragment('ct1'); expect(result).toMatchInlineSnapshot(` [ - "fragment ct1 on ct1 { __typename str bin boo flo int dat }", + "fragment MediaMetadata on MediaMetadata { mimeType thumbnail content }", + "fragment ContentUrl on ContentUrl { type default hierarchical internal graph base }", + "fragment IContentMetadata on IContentMetadata { key locale fallbackForLocale version displayName url {...ContentUrl} types published status created lastModified sortOrder variation ...MediaMetadata }", + "fragment _IContent on _IContent { _deleted _fulltext _modified _score _id _track _metadata {...IContentMetadata} }", + "fragment ct1 on ct1 { __typename str bin boo flo int dat ..._IContent }", ] `); }); @@ -65,7 +73,11 @@ describe('createFragment() simple cases', () => { const result = await createFragment('ct1'); expect(result).toMatchInlineSnapshot(` [ - "fragment ct1 on ct1 { __typename lin { url { type, default }} ric { html, json } lin2 { url { type, default }} ric2 { html, json } }", + "fragment MediaMetadata on MediaMetadata { mimeType thumbnail content }", + "fragment ContentUrl on ContentUrl { type default hierarchical internal graph base }", + "fragment IContentMetadata on IContentMetadata { key locale fallbackForLocale version displayName url {...ContentUrl} types published status created lastModified sortOrder variation ...MediaMetadata }", + "fragment _IContent on _IContent { _deleted _fulltext _modified _score _id _track _metadata {...IContentMetadata} }", + "fragment ct1 on ct1 { __typename lin { url { ...ContentUrl }} ric { html, json } lin2 { url { ...ContentUrl }} ric2 { html, json } ..._IContent }", ] `); }); @@ -77,7 +89,11 @@ describe('createFragment() simple cases', () => { const result = await createFragment('ct1'); expect(result).toMatchInlineSnapshot(` [ - "fragment ct1 on ct1 { __typename }", + "fragment MediaMetadata on MediaMetadata { mimeType thumbnail content }", + "fragment ContentUrl on ContentUrl { type default hierarchical internal graph base }", + "fragment IContentMetadata on IContentMetadata { key locale fallbackForLocale version displayName url {...ContentUrl} types published status created lastModified sortOrder variation ...MediaMetadata }", + "fragment _IContent on _IContent { _deleted _fulltext _modified _score _id _track _metadata {...IContentMetadata} }", + "fragment ct1 on ct1 { __typename ..._IContent }", ] `); }); @@ -95,8 +111,12 @@ describe('createFragment() with `content` properties. Explicit reference via `al const result = await createFragment('ct1'); expect(result).toMatchInlineSnapshot(` [ - "fragment r1 on r1 { __typename }", - "fragment ct1 on ct1 { __typename p1 { __typename ...r1 } }", + "fragment MediaMetadata on MediaMetadata { mimeType thumbnail content }", + "fragment ContentUrl on ContentUrl { type default hierarchical internal graph base }", + "fragment IContentMetadata on IContentMetadata { key locale fallbackForLocale version displayName url {...ContentUrl} types published status created lastModified sortOrder variation ...MediaMetadata }", + "fragment _IContent on _IContent { _deleted _fulltext _modified _score _id _track _metadata {...IContentMetadata} }", + "fragment r1 on r1 { __typename ..._IContent }", + "fragment ct1 on ct1 { __typename p1 { __typename ...r1 } ..._IContent }", ] `); }); @@ -117,9 +137,13 @@ describe('createFragment() with `content` properties. Explicit reference via `al const result = await createFragment('ct1'); expect(result).toMatchInlineSnapshot(` [ - "fragment r1 on r1 { __typename }", - "fragment r2 on r2 { __typename p1 { __typename ...r1 } }", - "fragment ct1 on ct1 { __typename p1 { __typename ...r2 } }", + "fragment MediaMetadata on MediaMetadata { mimeType thumbnail content }", + "fragment ContentUrl on ContentUrl { type default hierarchical internal graph base }", + "fragment IContentMetadata on IContentMetadata { key locale fallbackForLocale version displayName url {...ContentUrl} types published status created lastModified sortOrder variation ...MediaMetadata }", + "fragment _IContent on _IContent { _deleted _fulltext _modified _score _id _track _metadata {...IContentMetadata} }", + "fragment r1 on r1 { __typename ..._IContent }", + "fragment r2 on r2 { __typename p1 { __typename ...r1 } ..._IContent }", + "fragment ct1 on ct1 { __typename p1 { __typename ...r2 } ..._IContent }", ] `); }); @@ -143,9 +167,13 @@ describe('createFragment() with `content` properties. Explicit reference via `al const result = await createFragment('ct2'); expect(result).toMatchInlineSnapshot(` [ - "fragment r1 on r1 { __typename }", - "fragment r2 on r2 { __typename p1 { __typename ...r1 } }", - "fragment ct2 on ct2 { __typename p1 { __typename ...r1 } pct1 { __typename ...r2 } }", + "fragment MediaMetadata on MediaMetadata { mimeType thumbnail content }", + "fragment ContentUrl on ContentUrl { type default hierarchical internal graph base }", + "fragment IContentMetadata on IContentMetadata { key locale fallbackForLocale version displayName url {...ContentUrl} types published status created lastModified sortOrder variation ...MediaMetadata }", + "fragment _IContent on _IContent { _deleted _fulltext _modified _score _id _track _metadata {...IContentMetadata} }", + "fragment r1 on r1 { __typename ..._IContent }", + "fragment r2 on r2 { __typename p1 { __typename ...r1 } ..._IContent }", + "fragment ct2 on ct2 { __typename p1 { __typename ...r1 } pct1 { __typename ...r2 } ..._IContent }", ] `); }); @@ -163,8 +191,12 @@ describe('createFragment() with `content` properties. Base types', () => { const result = await createFragment('ct1'); expect(result).toMatchInlineSnapshot(` [ - "fragment r1 on r1 { __typename }", - "fragment ct1 on ct1 { __typename p1 { __typename ...r1 } }", + "fragment MediaMetadata on MediaMetadata { mimeType thumbnail content }", + "fragment ContentUrl on ContentUrl { type default hierarchical internal graph base }", + "fragment IContentMetadata on IContentMetadata { key locale fallbackForLocale version displayName url {...ContentUrl} types published status created lastModified sortOrder variation ...MediaMetadata }", + "fragment _IContent on _IContent { _deleted _fulltext _modified _score _id _track _metadata {...IContentMetadata} }", + "fragment r1 on r1 { __typename ..._IContent }", + "fragment ct1 on ct1 { __typename p1 { __typename ...r1 } ..._IContent }", ] `); }); @@ -185,9 +217,13 @@ describe('createFragment() with `content` properties. Base types', () => { const result = await createFragment('ct1'); expect(result).toMatchInlineSnapshot(` [ - "fragment r1 on r1 { __typename }", - "fragment r2 on r2 { __typename p1 { __typename ...r1 ...r2 } }", - "fragment ct1 on ct1 { __typename p1 { __typename ...r1 ...r2 } }", + "fragment MediaMetadata on MediaMetadata { mimeType thumbnail content }", + "fragment ContentUrl on ContentUrl { type default hierarchical internal graph base }", + "fragment IContentMetadata on IContentMetadata { key locale fallbackForLocale version displayName url {...ContentUrl} types published status created lastModified sortOrder variation ...MediaMetadata }", + "fragment _IContent on _IContent { _deleted _fulltext _modified _score _id _track _metadata {...IContentMetadata} }", + "fragment r1 on r1 { __typename ..._IContent }", + "fragment r2 on r2 { __typename p1 { __typename ...r1 ...r2 } ..._IContent }", + "fragment ct1 on ct1 { __typename p1 { __typename ...r1 ...r2 } ..._IContent }", ] `); }); @@ -211,10 +247,14 @@ describe('createFragment() with `content` properties. Base types', () => { const result = await createFragment('ct1'); expect(result).toMatchInlineSnapshot(` [ - "fragment r1 on r1 { __typename }", - "fragment r2 on r2 { __typename }", - "fragment r3 on r3 { __typename }", - "fragment ct1 on ct1 { __typename p1 { __typename ...r1 ...r2 ...r3 } }", + "fragment MediaMetadata on MediaMetadata { mimeType thumbnail content }", + "fragment ContentUrl on ContentUrl { type default hierarchical internal graph base }", + "fragment IContentMetadata on IContentMetadata { key locale fallbackForLocale version displayName url {...ContentUrl} types published status created lastModified sortOrder variation ...MediaMetadata }", + "fragment _IContent on _IContent { _deleted _fulltext _modified _score _id _track _metadata {...IContentMetadata} }", + "fragment r1 on r1 { __typename ..._IContent }", + "fragment r2 on r2 { __typename ..._IContent }", + "fragment r3 on r3 { __typename ..._IContent }", + "fragment ct1 on ct1 { __typename p1 { __typename ...r1 ...r2 ...r3 } ..._IContent }", ] `); }); @@ -238,9 +278,13 @@ describe('createFragment() with `content` properties. Base types', () => { const result = await createFragment('ct2'); expect(result).toMatchInlineSnapshot(` [ - "fragment r1 on r1 { __typename }", - "fragment r2 on r2 { __typename p1 { __typename ...r1 } }", - "fragment ct2 on ct2 { __typename p1 { __typename ...r1 } p2 { __typename ...r1 ...r2 } }", + "fragment MediaMetadata on MediaMetadata { mimeType thumbnail content }", + "fragment ContentUrl on ContentUrl { type default hierarchical internal graph base }", + "fragment IContentMetadata on IContentMetadata { key locale fallbackForLocale version displayName url {...ContentUrl} types published status created lastModified sortOrder variation ...MediaMetadata }", + "fragment _IContent on _IContent { _deleted _fulltext _modified _score _id _track _metadata {...IContentMetadata} }", + "fragment r1 on r1 { __typename ..._IContent }", + "fragment r2 on r2 { __typename p1 { __typename ...r1 } ..._IContent }", + "fragment ct2 on ct2 { __typename p1 { __typename ...r1 } p2 { __typename ...r1 ...r2 } ..._IContent }", ] `); }); @@ -266,9 +310,13 @@ describe('createFragment() with `content` properties. Allowed and restricted typ const result = await createFragment('ct1'); expect(result).toMatchInlineSnapshot(` [ - "fragment r1 on r1 { __typename }", - "fragment r3 on r3 { __typename }", - "fragment ct1 on ct1 { __typename p1 { __typename ...r1 ...r3 ...ct1 } }", + "fragment MediaMetadata on MediaMetadata { mimeType thumbnail content }", + "fragment ContentUrl on ContentUrl { type default hierarchical internal graph base }", + "fragment IContentMetadata on IContentMetadata { key locale fallbackForLocale version displayName url {...ContentUrl} types published status created lastModified sortOrder variation ...MediaMetadata }", + "fragment _IContent on _IContent { _deleted _fulltext _modified _score _id _track _metadata {...IContentMetadata} }", + "fragment r1 on r1 { __typename ..._IContent }", + "fragment r3 on r3 { __typename ..._IContent }", + "fragment ct1 on ct1 { __typename p1 { __typename ...r1 ...r3 ...ct1 } ..._IContent }", ] `); }); @@ -293,9 +341,13 @@ describe('createFragment() with `content` properties. Allowed and restricted typ const result = await createFragment('ct1'); expect(result).toMatchInlineSnapshot(` [ - "fragment r1 on r1 { __typename }", - "fragment r3 on r3 { __typename }", - "fragment ct1 on ct1 { __typename p1 { __typename ...r1 ...r3 } }", + "fragment MediaMetadata on MediaMetadata { mimeType thumbnail content }", + "fragment ContentUrl on ContentUrl { type default hierarchical internal graph base }", + "fragment IContentMetadata on IContentMetadata { key locale fallbackForLocale version displayName url {...ContentUrl} types published status created lastModified sortOrder variation ...MediaMetadata }", + "fragment _IContent on _IContent { _deleted _fulltext _modified _score _id _track _metadata {...IContentMetadata} }", + "fragment r1 on r1 { __typename ..._IContent }", + "fragment r3 on r3 { __typename ..._IContent }", + "fragment ct1 on ct1 { __typename p1 { __typename ...r1 ...r3 } ..._IContent }", ] `); }); @@ -313,7 +365,11 @@ describe('createFragment() with self references', () => { const result = await createFragment('r1'); expect(result).toMatchInlineSnapshot(` [ - "fragment r1 on r1 { __typename p1 { __typename ...r1 } }", + "fragment MediaMetadata on MediaMetadata { mimeType thumbnail content }", + "fragment ContentUrl on ContentUrl { type default hierarchical internal graph base }", + "fragment IContentMetadata on IContentMetadata { key locale fallbackForLocale version displayName url {...ContentUrl} types published status created lastModified sortOrder variation ...MediaMetadata }", + "fragment _IContent on _IContent { _deleted _fulltext _modified _score _id _track _metadata {...IContentMetadata} }", + "fragment r1 on r1 { __typename p1 { __typename ...r1 } ..._IContent }", ] `); }); @@ -329,7 +385,11 @@ describe('createFragment() with self references', () => { const result = await createFragment('r1'); expect(result).toMatchInlineSnapshot(` [ - "fragment r1 on r1 { __typename p1 { __typename ...r1 } }", + "fragment MediaMetadata on MediaMetadata { mimeType thumbnail content }", + "fragment ContentUrl on ContentUrl { type default hierarchical internal graph base }", + "fragment IContentMetadata on IContentMetadata { key locale fallbackForLocale version displayName url {...ContentUrl} types published status created lastModified sortOrder variation ...MediaMetadata }", + "fragment _IContent on _IContent { _deleted _fulltext _modified _score _id _track _metadata {...IContentMetadata} }", + "fragment r1 on r1 { __typename p1 { __typename ...r1 } ..._IContent }", ] `); }); @@ -345,7 +405,11 @@ describe('createFragment() with self references', () => { const result = await createFragment('r1'); expect(result).toMatchInlineSnapshot(` [ - "fragment r1 on r1 { __typename p1 { __typename ...r1 } }", + "fragment MediaMetadata on MediaMetadata { mimeType thumbnail content }", + "fragment ContentUrl on ContentUrl { type default hierarchical internal graph base }", + "fragment IContentMetadata on IContentMetadata { key locale fallbackForLocale version displayName url {...ContentUrl} types published status created lastModified sortOrder variation ...MediaMetadata }", + "fragment _IContent on _IContent { _deleted _fulltext _modified _score _id _track _metadata {...IContentMetadata} }", + "fragment r1 on r1 { __typename p1 { __typename ...r1 } ..._IContent }", ] `); }); @@ -368,7 +432,11 @@ describe('createFragment() with self references', () => { const result = await createFragment('r1'); expect(result).toMatchInlineSnapshot(` [ - "fragment r1 on r1 { __typename p1 { __typename ...r1 } }", + "fragment MediaMetadata on MediaMetadata { mimeType thumbnail content }", + "fragment ContentUrl on ContentUrl { type default hierarchical internal graph base }", + "fragment IContentMetadata on IContentMetadata { key locale fallbackForLocale version displayName url {...ContentUrl} types published status created lastModified sortOrder variation ...MediaMetadata }", + "fragment _IContent on _IContent { _deleted _fulltext _modified _score _id _track _metadata {...IContentMetadata} }", + "fragment r1 on r1 { __typename p1 { __typename ...r1 } ..._IContent }", ] `); }); @@ -389,7 +457,11 @@ describe('createFragment() empty objects', () => { const result = await createFragment('ct1'); expect(result).toMatchInlineSnapshot(` [ - "fragment ct1 on ct1 { __typename p2 p3 }", + "fragment MediaMetadata on MediaMetadata { mimeType thumbnail content }", + "fragment ContentUrl on ContentUrl { type default hierarchical internal graph base }", + "fragment IContentMetadata on IContentMetadata { key locale fallbackForLocale version displayName url {...ContentUrl} types published status created lastModified sortOrder variation ...MediaMetadata }", + "fragment _IContent on _IContent { _deleted _fulltext _modified _score _id _track _metadata {...IContentMetadata} }", + "fragment ct1 on ct1 { __typename p2 p3 ..._IContent }", ] `); }); @@ -407,7 +479,11 @@ describe('createFragment() empty objects', () => { const result = await createFragment('ct1'); expect(result).toMatchInlineSnapshot(` [ - "fragment ct1 on ct1 { __typename }", + "fragment MediaMetadata on MediaMetadata { mimeType thumbnail content }", + "fragment ContentUrl on ContentUrl { type default hierarchical internal graph base }", + "fragment IContentMetadata on IContentMetadata { key locale fallbackForLocale version displayName url {...ContentUrl} types published status created lastModified sortOrder variation ...MediaMetadata }", + "fragment _IContent on _IContent { _deleted _fulltext _modified _score _id _track _metadata {...IContentMetadata} }", + "fragment ct1 on ct1 { __typename ..._IContent }", ] `); }); @@ -428,7 +504,11 @@ describe('createFragment() empty objects', () => { // Make sure that the query is correct. The `p1 {}` part should have something between the curly braces expect(result).toMatchInlineSnapshot(` [ - "fragment ct1 on ct1 { __typename p1 { __typename } }", + "fragment MediaMetadata on MediaMetadata { mimeType thumbnail content }", + "fragment ContentUrl on ContentUrl { type default hierarchical internal graph base }", + "fragment IContentMetadata on IContentMetadata { key locale fallbackForLocale version displayName url {...ContentUrl} types published status created lastModified sortOrder variation ...MediaMetadata }", + "fragment _IContent on _IContent { _deleted _fulltext _modified _score _id _track _metadata {...IContentMetadata} }", + "fragment ct1 on ct1 { __typename p1 { __typename } ..._IContent }", ] `); }); diff --git a/packages/optimizely-cms-sdk/src/graph/__test__/createQueryExperiences.test.ts b/packages/optimizely-cms-sdk/src/graph/__test__/createQueryExperiences.test.ts index 9431c44f..39a217dc 100644 --- a/packages/optimizely-cms-sdk/src/graph/__test__/createQueryExperiences.test.ts +++ b/packages/optimizely-cms-sdk/src/graph/__test__/createQueryExperiences.test.ts @@ -15,12 +15,16 @@ describe('createFragment()', () => { const result = await createFragment(MyExperience.key); expect(result).toMatchInlineSnapshot(` [ + "fragment MediaMetadata on MediaMetadata { mimeType thumbnail content }", + "fragment ContentUrl on ContentUrl { type default hierarchical internal graph base }", + "fragment IContentMetadata on IContentMetadata { key locale fallbackForLocale version displayName url {...ContentUrl} types published status created lastModified sortOrder variation ...MediaMetadata }", + "fragment _IContent on _IContent { _deleted _fulltext _modified _score _id _track _metadata {...IContentMetadata} }", "fragment _IExperience on _IExperience { composition {...ICompositionNode }}", "fragment ICompositionNode on ICompositionNode { __typename key type nodeType displayName displayTemplateKey displaySettings {key value} ...on CompositionStructureNode { nodes @recursive } ...on CompositionComponentNode { nodeType component { ..._IComponent } } }", - "fragment CallToAction on CallToAction { __typename label link }", - "fragment ExpSection on ExpSection { __typename heading }", + "fragment CallToAction on CallToAction { __typename label link ..._IContent }", + "fragment ExpSection on ExpSection { __typename heading ..._IContent }", "fragment _IComponent on _IComponent { __typename ...CallToAction ...ExpSection }", - "fragment MyExperience on MyExperience { __typename ..._IExperience }", + "fragment MyExperience on MyExperience { __typename ..._IContent ..._IExperience }", ] `); }); diff --git a/packages/optimizely-cms-sdk/src/graph/createQuery.ts b/packages/optimizely-cms-sdk/src/graph/createQuery.ts index ca663a1e..7b184a6d 100644 --- a/packages/optimizely-cms-sdk/src/graph/createQuery.ts +++ b/packages/optimizely-cms-sdk/src/graph/createQuery.ts @@ -13,12 +13,10 @@ import { } from '../model/contentTypeRegistry.js'; import { getKeyName, - isBaseMediaType, buildBaseTypeFragments, - MEDIA_METADATA_FRAGMENT, - COMMON_MEDIA_METADATA_BLOCK, isBaseType, toBaseTypeFragmentKey, + CONTENT_URL_FRAGMENT, } from '../util/baseTypeUtil.js'; import { checkTypeConstraintIssues } from '../util/fragmentConstraintChecks.js'; import { GraphMissingContentTypeError } from './error.js'; @@ -138,11 +136,14 @@ function convertPropertyField( } else if (property.type === 'richText') { fields.push(`${name} { html, json }`); } else if (property.type === 'url') { - fields.push(`${name} { type, default }`); + extraFragments.push(CONTENT_URL_FRAGMENT); + fields.push(`${name} { ...ContentUrl }`); } else if (property.type === 'link') { - fields.push(`${name} { url { type, default }}`); + extraFragments.push(CONTENT_URL_FRAGMENT); + fields.push(`${name} { url { ...ContentUrl }}`); } else if (property.type === 'contentReference') { - fields.push(`${name} { url { type default }}`); + extraFragments.push(CONTENT_URL_FRAGMENT); + fields.push(`${name} { key url { ...ContentUrl }}`); } else if (property.type === 'array') { const f = convertProperty(name, property.items, rootName, visited); fields.push(...f.fields); @@ -214,14 +215,11 @@ export function createFragment( // Built‑in CMS baseTypes ("_image", "_video", "_media" etc.) if (isBaseType(contentTypeName)) { - const { fields: f, extraFragments: e } = buildBaseTypeFragments( - contentTypeName as MediaStringTypes - ); + const { fields: f, extraFragments: e } = buildBaseTypeFragments(); fields.push(...f); extraFragments.push(...e); - - // Handle User defined contentType } else { + // User-defined content type const ct = getContentType(contentTypeName); if (!ct) { throw new GraphMissingContentTypeError(contentTypeName); @@ -243,11 +241,10 @@ export function createFragment( extraFragments.push(...e); } - // Custom contentTypes which implements baseTypes (media/image/video): we append fragments for metadata - if (isBaseMediaType(ct.baseType)) { - extraFragments.unshift(MEDIA_METADATA_FRAGMENT); // maintain order - fields.push(COMMON_MEDIA_METADATA_BLOCK); - } + // Add fragments for the base type of the user-defined content type + const baseFragments = buildBaseTypeFragments(); + extraFragments.unshift(...baseFragments.extraFragments); // maintain order + fields.push(...baseFragments.fields); if (ct.baseType === '_experience') { fields.push('..._IExperience'); diff --git a/packages/optimizely-cms-sdk/src/infer.ts b/packages/optimizely-cms-sdk/src/infer.ts index e0902556..153fc85a 100644 --- a/packages/optimizely-cms-sdk/src/infer.ts +++ b/packages/optimizely-cms-sdk/src/infer.ts @@ -37,6 +37,26 @@ export type Prettify = { export type InferredUrl = { type: string | null; default: string | null; + hierarchical: string | null; + internal: string | null; + graph: string | null; + base: string | null; +}; + +type InferredMetadata = { + key: string; + locale: string; + fallbackForLocale: string; + version: string; + displayName: string; + url: InferredUrl; + types: string[]; + published: string; + status: string; + created: string; + lastModified: string; + sortOrder: number; + variation: string; }; type InferredRichText = { @@ -65,9 +85,13 @@ export type InferFromProperty = /** Attributes included in the response from Graph in every content type */ export type InferredBase = { - _metadata: { - url: InferredUrl; - }; + _deleted: boolean; + _fulltext: string[]; + _modified: string; + _score: number; + _id: string; + _track: string; + _metadata: InferredMetadata; __typename: string; __context?: { edit: boolean; preview_token: string }; }; diff --git a/packages/optimizely-cms-sdk/src/util/baseTypeUtil.ts b/packages/optimizely-cms-sdk/src/util/baseTypeUtil.ts index 3dcded46..2ac10f3a 100644 --- a/packages/optimizely-cms-sdk/src/util/baseTypeUtil.ts +++ b/packages/optimizely-cms-sdk/src/util/baseTypeUtil.ts @@ -46,27 +46,26 @@ export function isBaseMediaType(key: string): key is MediaStringTypes { return (MEDIA_BASE_TYPES as readonly string[]).includes(key); } -/** Common media meta‑data fragment */ -export const MEDIA_METADATA_FRAGMENT = - 'fragment mediaMetaData on IContentMetadata { displayName url { default } ... on MediaMetadata { mimeType thumbnail content } }'; +export const CONTENT_URL_FRAGMENT = + 'fragment ContentUrl on ContentUrl { type default hierarchical internal graph base }'; -/** Common media meta‑data block */ -export const COMMON_MEDIA_METADATA_BLOCK = '_metadata { ...mediaMetaData }'; +const COMMON_FRAGMENTS = [ + 'fragment MediaMetadata on MediaMetadata { mimeType thumbnail content }', + CONTENT_URL_FRAGMENT, + 'fragment IContentMetadata on IContentMetadata { key locale fallbackForLocale version displayName url {...ContentUrl} types published status created lastModified sortOrder variation ...MediaMetadata }', + 'fragment _IContent on _IContent { _deleted _fulltext _modified _score _id _track _metadata {...IContentMetadata} }', +]; +const COMMON_FIELDS = '..._IContent'; /** - * Generates and adds framents for base types - * @param baseTypeName name of the base content type + * Generates and adds fragments for base types * @returns { fields, extraFragments } */ -export function buildBaseTypeFragments(baseType: MediaStringTypes) { - // note: Will add more support for other baseTypes later. For now its only media types - if (isBaseMediaType(baseType)) { - return { - fields: [COMMON_MEDIA_METADATA_BLOCK], - extraFragments: [MEDIA_METADATA_FRAGMENT], - }; - } - return { fields: [], extraFragments: [] }; +export function buildBaseTypeFragments() { + return { + fields: [COMMON_FIELDS], + extraFragments: COMMON_FRAGMENTS, + }; } export function isComponentNode(