Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions eslint.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ export default defineConfig(
'**/android/**',
'**/build/**',
'**/coverage',
'**/contentful-generated.d.ts',
'**/dist',
'docs/media/**',
'**/ios/**',
Expand Down
165 changes: 165 additions & 0 deletions implementations/node-sdk+web-sdk/src/contentful-generated.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,165 @@
// THIS FILE IS AUTOMATICALLY GENERATED. DO NOT MODIFY IT.

import type {
ChainModifiers,
Entry,
EntryFieldTypes,
EntrySkeletonType,
LocaleCode,
} from 'contentful'

export interface TypeContentFields {
internalTitle: EntryFieldTypes.Symbol
text: EntryFieldTypes.Symbol
nt_experiences?: EntryFieldTypes.Array<EntryFieldTypes.EntryLink<TypeNt_experienceSkeleton>>
}

export type TypeContentSkeleton = EntrySkeletonType<TypeContentFields, 'content'>
export type TypeContent<
Modifiers extends ChainModifiers,
Locales extends LocaleCode = LocaleCode,
> = Entry<TypeContentSkeleton, Modifiers, Locales>
export type TypeContentWithoutLinkResolutionResponse = TypeContent<'WITHOUT_LINK_RESOLUTION'>
export type TypeContentWithoutUnresolvableLinksResponse = TypeContent<'WITHOUT_UNRESOLVABLE_LINKS'>
export type TypeContentWithAllLocalesResponse<Locales extends LocaleCode = LocaleCode> =
TypeContent<'WITH_ALL_LOCALES', Locales>
export type TypeContentWithAllLocalesAndWithoutLinkResolutionResponse<
Locales extends LocaleCode = LocaleCode,
> = TypeContent<'WITHOUT_LINK_RESOLUTION' | 'WITH_ALL_LOCALES', Locales>
export type TypeContentWithAllLocalesAndWithoutUnresolvableLinksResponse<
Locales extends LocaleCode = LocaleCode,
> = TypeContent<'WITHOUT_UNRESOLVABLE_LINKS' | 'WITH_ALL_LOCALES', Locales>

export interface TypeMergeTagContentFields {
internalTitle: EntryFieldTypes.Symbol
text?: EntryFieldTypes.RichText
}

export type TypeMergeTagContentSkeleton = EntrySkeletonType<
TypeMergeTagContentFields,
'mergeTagContent'
>
export type TypeMergeTagContent<
Modifiers extends ChainModifiers,
Locales extends LocaleCode = LocaleCode,
> = Entry<TypeMergeTagContentSkeleton, Modifiers, Locales>
export type TypeMergeTagContentWithoutLinkResolutionResponse =
TypeMergeTagContent<'WITHOUT_LINK_RESOLUTION'>
export type TypeMergeTagContentWithoutUnresolvableLinksResponse =
TypeMergeTagContent<'WITHOUT_UNRESOLVABLE_LINKS'>
export type TypeMergeTagContentWithAllLocalesResponse<Locales extends LocaleCode = LocaleCode> =
TypeMergeTagContent<'WITH_ALL_LOCALES', Locales>
export type TypeMergeTagContentWithAllLocalesAndWithoutLinkResolutionResponse<
Locales extends LocaleCode = LocaleCode,
> = TypeMergeTagContent<'WITHOUT_LINK_RESOLUTION' | 'WITH_ALL_LOCALES', Locales>
export type TypeMergeTagContentWithAllLocalesAndWithoutUnresolvableLinksResponse<
Locales extends LocaleCode = LocaleCode,
> = TypeMergeTagContent<'WITHOUT_UNRESOLVABLE_LINKS' | 'WITH_ALL_LOCALES', Locales>

export interface TypeNestedContentFields {
internalTitle: EntryFieldTypes.Symbol
text: EntryFieldTypes.Symbol
nested?: EntryFieldTypes.Array<
EntryFieldTypes.EntryLink<
TypeContentSkeleton | TypeNestedContentSkeleton | TypeNt_experienceSkeleton
>
>
nt_experiences?: EntryFieldTypes.Array<EntryFieldTypes.EntryLink<TypeNt_experienceSkeleton>>
}

export type TypeNestedContentSkeleton = EntrySkeletonType<TypeNestedContentFields, 'nestedContent'>
export type TypeNestedContent<
Modifiers extends ChainModifiers,
Locales extends LocaleCode = LocaleCode,
> = Entry<TypeNestedContentSkeleton, Modifiers, Locales>
export type TypeNestedContentWithoutLinkResolutionResponse =
TypeNestedContent<'WITHOUT_LINK_RESOLUTION'>
export type TypeNestedContentWithoutUnresolvableLinksResponse =
TypeNestedContent<'WITHOUT_UNRESOLVABLE_LINKS'>
export type TypeNestedContentWithAllLocalesResponse<Locales extends LocaleCode = LocaleCode> =
TypeNestedContent<'WITH_ALL_LOCALES', Locales>
export type TypeNestedContentWithAllLocalesAndWithoutLinkResolutionResponse<
Locales extends LocaleCode = LocaleCode,
> = TypeNestedContent<'WITHOUT_LINK_RESOLUTION' | 'WITH_ALL_LOCALES', Locales>
export type TypeNestedContentWithAllLocalesAndWithoutUnresolvableLinksResponse<
Locales extends LocaleCode = LocaleCode,
> = TypeNestedContent<'WITHOUT_UNRESOLVABLE_LINKS' | 'WITH_ALL_LOCALES', Locales>

export interface TypeNt_audienceFields {
nt_name: EntryFieldTypes.Symbol
nt_description?: EntryFieldTypes.Text
nt_rules: EntryFieldTypes.Object
nt_audience_id: EntryFieldTypes.Symbol
nt_metadata?: EntryFieldTypes.Object
}

export type TypeNt_audienceSkeleton = EntrySkeletonType<TypeNt_audienceFields, 'nt_audience'>
export type TypeNt_audience<
Modifiers extends ChainModifiers,
Locales extends LocaleCode = LocaleCode,
> = Entry<TypeNt_audienceSkeleton, Modifiers, Locales>
export type TypeNt_audienceWithoutLinkResolutionResponse =
TypeNt_audience<'WITHOUT_LINK_RESOLUTION'>
export type TypeNt_audienceWithoutUnresolvableLinksResponse =
TypeNt_audience<'WITHOUT_UNRESOLVABLE_LINKS'>
export type TypeNt_audienceWithAllLocalesResponse<Locales extends LocaleCode = LocaleCode> =
TypeNt_audience<'WITH_ALL_LOCALES', Locales>
export type TypeNt_audienceWithAllLocalesAndWithoutLinkResolutionResponse<
Locales extends LocaleCode = LocaleCode,
> = TypeNt_audience<'WITHOUT_LINK_RESOLUTION' | 'WITH_ALL_LOCALES', Locales>
export type TypeNt_audienceWithAllLocalesAndWithoutUnresolvableLinksResponse<
Locales extends LocaleCode = LocaleCode,
> = TypeNt_audience<'WITHOUT_UNRESOLVABLE_LINKS' | 'WITH_ALL_LOCALES', Locales>

export interface TypeNt_experienceFields {
nt_name: EntryFieldTypes.Symbol
nt_description?: EntryFieldTypes.Text
nt_type: EntryFieldTypes.Symbol<'nt_experiment' | 'nt_personalization'>
nt_config: EntryFieldTypes.Object
nt_audience?: EntryFieldTypes.EntryLink<TypeNt_audienceSkeleton>
nt_variants?: EntryFieldTypes.Array<EntryFieldTypes.EntryLink<EntrySkeletonType>>
nt_experience_id?: EntryFieldTypes.Symbol
nt_metadata?: EntryFieldTypes.Object
}

export type TypeNt_experienceSkeleton = EntrySkeletonType<TypeNt_experienceFields, 'nt_experience'>
export type TypeNt_experience<
Modifiers extends ChainModifiers,
Locales extends LocaleCode = LocaleCode,
> = Entry<TypeNt_experienceSkeleton, Modifiers, Locales>
export type TypeNt_experienceWithoutLinkResolutionResponse =
TypeNt_experience<'WITHOUT_LINK_RESOLUTION'>
export type TypeNt_experienceWithoutUnresolvableLinksResponse =
TypeNt_experience<'WITHOUT_UNRESOLVABLE_LINKS'>
export type TypeNt_experienceWithAllLocalesResponse<Locales extends LocaleCode = LocaleCode> =
TypeNt_experience<'WITH_ALL_LOCALES', Locales>
export type TypeNt_experienceWithAllLocalesAndWithoutLinkResolutionResponse<
Locales extends LocaleCode = LocaleCode,
> = TypeNt_experience<'WITHOUT_LINK_RESOLUTION' | 'WITH_ALL_LOCALES', Locales>
export type TypeNt_experienceWithAllLocalesAndWithoutUnresolvableLinksResponse<
Locales extends LocaleCode = LocaleCode,
> = TypeNt_experience<'WITHOUT_UNRESOLVABLE_LINKS' | 'WITH_ALL_LOCALES', Locales>

export interface TypeNt_mergetagFields {
nt_name: EntryFieldTypes.Symbol
nt_fallback?: EntryFieldTypes.Symbol
nt_mergetag_id: EntryFieldTypes.Symbol
}

export type TypeNt_mergetagSkeleton = EntrySkeletonType<TypeNt_mergetagFields, 'nt_mergetag'>
export type TypeNt_mergetag<
Modifiers extends ChainModifiers,
Locales extends LocaleCode = LocaleCode,
> = Entry<TypeNt_mergetagSkeleton, Modifiers, Locales>
export type TypeNt_mergetagWithoutLinkResolutionResponse =
TypeNt_mergetag<'WITHOUT_LINK_RESOLUTION'>
export type TypeNt_mergetagWithoutUnresolvableLinksResponse =
TypeNt_mergetag<'WITHOUT_UNRESOLVABLE_LINKS'>
export type TypeNt_mergetagWithAllLocalesResponse<Locales extends LocaleCode = LocaleCode> =
TypeNt_mergetag<'WITH_ALL_LOCALES', Locales>
export type TypeNt_mergetagWithAllLocalesAndWithoutLinkResolutionResponse<
Locales extends LocaleCode = LocaleCode,
> = TypeNt_mergetag<'WITHOUT_LINK_RESOLUTION' | 'WITH_ALL_LOCALES', Locales>
export type TypeNt_mergetagWithAllLocalesAndWithoutUnresolvableLinksResponse<
Locales extends LocaleCode = LocaleCode,
> = TypeNt_mergetag<'WITHOUT_UNRESOLVABLE_LINKS' | 'WITH_ALL_LOCALES', Locales>
26 changes: 14 additions & 12 deletions implementations/node-sdk/src/app.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,11 @@ import express, { type Express, type Request } from 'express'
import rateLimit from 'express-rate-limit'
import path from 'node:path'
import type { ParsedQs } from 'qs'
import type {
TypeContentSkeleton,
TypeMergeTagContentSkeleton,
TypeNestedContentSkeleton,
} from './contentful-generated'

const limiter = rateLimit({
windowMs: 30_000,
Expand Down Expand Up @@ -46,16 +51,13 @@ const ctflConfig: contentful.CreateClientParams = {

const ctfl = contentful.createClient(ctflConfig)

interface ContentEntrySkeleton {
contentTypeId: 'content'
fields: {
text: contentful.EntryFieldTypes.Text | contentful.EntryFieldTypes.RichText
}
}
type ContentEntrySkeleton =
| TypeContentSkeleton
| TypeMergeTagContentSkeleton
| TypeNestedContentSkeleton
type ContentEntry = Entry<ContentEntrySkeleton>

async function getContentfulEntry(
entryId: string,
): Promise<Entry<ContentEntrySkeleton> | undefined> {
async function getContentfulEntry(entryId: string): Promise<ContentEntry | undefined> {
try {
return await ctfl.getEntry<ContentEntrySkeleton>(entryId, {
include: 10,
Expand Down Expand Up @@ -86,7 +88,7 @@ const entryIds: string[] = [
'7pa5bOx8Z9NmNcr7mISvD',
]

const entries = new Map<string, Entry<ContentEntrySkeleton>>()
const entries = new Map<string, ContentEntry>()

Promise.all(
entryIds.map(async (entryId) => {
Expand Down Expand Up @@ -167,7 +169,7 @@ app.get('/', limiter, async (req, res) => {
const personalizedEntries = new Map<
string,
{
entry: Entry<ContentEntrySkeleton>
entry: ContentEntry
personalization?: SelectedPersonalization
}
>()
Expand All @@ -191,7 +193,7 @@ app.get('/', limiter, async (req, res) => {
})
}

const personalizedEntry = sdk.personalizeEntry(entry, personalizations)
const personalizedEntry = sdk.personalizeEntry<ContentEntrySkeleton>(entry, personalizations)

personalizedEntries.set(entryId, personalizedEntry)
})
Expand Down
Loading