diff --git a/apollo.config.js b/apollo.config.js
index ac6f8a0..dc86a90 100644
--- a/apollo.config.js
+++ b/apollo.config.js
@@ -2,10 +2,9 @@ module.exports = {
client: {
includes: ['src/**/*.{ts,tsx}'],
service: {
- name: 'unbody-graphql',
+ name: 'strapi-graphql',
localSchemaFile: [
- './src/lib/unbody/unbody.graphql',
- './src/lib/unbody/unbody.extend.graphql',
+ './src/lib/strapi/strapi.graphql',
], // how to configure to multiple schemas?
},
},
diff --git a/codegen.ts b/codegen.ts
index 093d429..be2bb61 100644
--- a/codegen.ts
+++ b/codegen.ts
@@ -1,8 +1,7 @@
import { CodegenConfig } from '@graphql-codegen/cli'
-const graphqlEndpoint = 'https://graphql.unbody.io'
-const projectId = process.env.UNBODY_PROJECT_ID || ''
-const authorization = process.env.UNBODY_API_KEY || ''
+const graphqlEndpoint = process.env.STRAPI_GRAPHQL_URL || ''
+const token = process.env.STRAPI_API_KEY || ''
const config: CodegenConfig = {
overwrite: true,
@@ -10,21 +9,19 @@ const config: CodegenConfig = {
{
[graphqlEndpoint]: {
headers: {
- authorization,
- 'x-project-id': projectId,
+ authorization: token,
'Content-Type': 'application/json',
Accept: 'application/json',
},
},
},
- 'src/lib/unbody/unbody.extend.graphql',
],
- documents: ['src/**/*.{ts,tsx}'],
+ documents: ['src/services/strapi/*.{ts,tsx}'],
generates: {
- 'src/lib/unbody/unbody.graphql': {
+ 'src/lib/strapi/strapi.graphql': {
plugins: ['schema-ast'],
},
- 'src/lib/unbody/unbody.generated.ts': {
+ 'src/lib/strapi/strapi.generated.ts': {
plugins: ['typescript', 'typescript-operations', 'typed-document-node'],
presetConfig: {
fragmentMasking: false,
diff --git a/next.config.js b/next.config.js
index ffcdf44..743b7a5 100644
--- a/next.config.js
+++ b/next.config.js
@@ -3,12 +3,11 @@ const nextConfig = {
reactStrictMode: true,
images: {
domains: [
- 'images.cdn.unbody.io',
+ 'localhost',
+ '127.0.0.1',
'image.simplecastcdn.com',
'img.youtube.com',
],
- // loader: 'imgix',
- // path: 'https://images.cdn.unbody.io',
},
}
diff --git a/package.json b/package.json
index 127d411..760a59c 100644
--- a/package.json
+++ b/package.json
@@ -51,6 +51,7 @@
"next": "13.3.0",
"next-query-params": "^4.2.3",
"nextjs-progressbar": "^0.0.16",
+ "node-html-parser": "^6.1.12",
"odoo-await": "^3.4.1",
"react": "18.2.0",
"react-blurhash": "^0.3.0",
@@ -59,6 +60,7 @@
"react-player": "^2.12.0",
"react-quick-pinch-zoom": "^4.9.0",
"react-use": "^17.4.0",
+ "slugify": "^1.6.6",
"typescript": "5.0.4",
"use-query-params": "^2.2.1",
"yup": "^1.3.2"
diff --git a/src/components/Article/Article.Block.tsx b/src/components/Article/Article.Block.tsx
index 051ce69..45d2fd6 100644
--- a/src/components/Article/Article.Block.tsx
+++ b/src/components/Article/Article.Block.tsx
@@ -39,6 +39,17 @@ export const RenderArticleBlock = ({
case 'h6': {
return
}
+ case 'blockquote':
+ return (
+
+
+
+ )
case 'p': {
const isIframe = block.embed && block.labels.includes('embed')
if (block.embed && isIframe) {
@@ -56,22 +67,6 @@ export const RenderArticleBlock = ({
)
}
- if (
- block.classNames.includes('subtitle') &&
- block.classNames.includes('u-with-margin-left')
- ) {
- return (
-
-
-
- )
- }
-
return (
{
return (
-
+
diff --git a/src/components/Article/Header/Article.Header.tsx b/src/components/Article/Header/Article.Header.tsx
index b6b3fec..2ba200e 100644
--- a/src/components/Article/Header/Article.Header.tsx
+++ b/src/components/Article/Header/Article.Header.tsx
@@ -15,6 +15,7 @@ import ArticleSummary from './Article.Summary'
export type ArticleHeaderProps = LPE.Article.Data
const ArticleHeader = ({
+ title,
summary,
subtitle,
authors,
@@ -33,19 +34,15 @@ const ArticleHeader = ({
date={modifiedAt ? new Date(modifiedAt) : null}
readingLength={readingTime}
/>
-
- block.labels.includes(LPE.Article.ContentBlockLabels.Title),
- ) as LPE.Article.TextBlock
- }
- typographyProps={{
- variant: 'h1',
- genericFontFamily: 'serif',
- component: 'h1',
+ {
+ headingElementsRef.current['h-0'] = ref as HTMLHeadingElement
}}
- headingElementsRef={headingElementsRef}
- />
+ >
+
+ {title}
+
{subtitle && (
)}
-
+ tag.name)}
+ className={'articleTags'}
+ />
@@ -65,7 +65,9 @@ const ArticleHeader = ({
order={ArticleBlocksOrders.cover}
/>
)}
-
+ {summary && summary.length > 0 && (
+
+ )}
)
}
diff --git a/src/components/Episode/Episode.Transcript.tsx b/src/components/Episode/Episode.Transcript.tsx
index 2c58238..85634d9 100644
--- a/src/components/Episode/Episode.Transcript.tsx
+++ b/src/components/Episode/Episode.Transcript.tsx
@@ -4,6 +4,8 @@ import { LPE } from '../../types/lpe.types'
import EpisodeBlocks from './Episode.Blocks'
const EpisodeTranscript = ({ episode }: { episode: LPE.Podcast.Document }) => {
+ if (episode.content.length === 0) return <>>
+
return (
diff --git a/src/components/Episode/Footer/Episode.Credits.tsx b/src/components/Episode/Footer/Episode.Credits.tsx
index 12f1064..021508b 100644
--- a/src/components/Episode/Footer/Episode.Credits.tsx
+++ b/src/components/Episode/Footer/Episode.Credits.tsx
@@ -24,9 +24,8 @@ const EpisodeCredits = ({
component="p"
variant="label1"
id={credit.id.replace('#', '')}
- >
- {credit.text}
-
+ dangerouslySetInnerHTML={{ __html: credit.html }}
+ />
))}
diff --git a/src/components/Episode/Footer/Episode.Footer.tsx b/src/components/Episode/Footer/Episode.Footer.tsx
index b0acc5e..531fd8f 100644
--- a/src/components/Episode/Footer/Episode.Footer.tsx
+++ b/src/components/Episode/Footer/Episode.Footer.tsx
@@ -26,7 +26,7 @@ const EpisodeFooter = ({ episode, relatedEpisodes }: Props) => {
{!!episode?.credits && }
{!!footnotes && }
- {!!relatedEpisodes && (
+ {!!relatedEpisodes && relatedEpisodes.length > 0 && (
)}
-
+ tag.name)} />
{channels && }
{description && (
diff --git a/src/components/GlobalAudioPlayer/episode.state.ts b/src/components/GlobalAudioPlayer/episode.state.ts
index 6d5799a..23f6ffb 100644
--- a/src/components/GlobalAudioPlayer/episode.state.ts
+++ b/src/components/GlobalAudioPlayer/episode.state.ts
@@ -5,7 +5,7 @@ export type EpisodeState = {
title: string
podcast: string
url: string
- coverImage: LPE.Post.ImageBlock | null
+ coverImage: LPE.Image.Document | null
path: string
}
diff --git a/src/components/PostCard/PostCard.tsx b/src/components/PostCard/PostCard.tsx
index be0b5cf..ca0e042 100644
--- a/src/components/PostCard/PostCard.tsx
+++ b/src/components/PostCard/PostCard.tsx
@@ -156,7 +156,7 @@ PostCard.toData = (post: LPE.Post.Document, shows: LPE.Podcast.Show[] = []) => {
authors: post.type === 'article' ? post.authors : [],
coverImage: post.coverImage,
subtitle: (post.type === 'article' && post.subtitle) || '',
- tags: post.tags,
+ tags: post.tags.map((tag) => tag.name),
...(post.type === 'podcast' && show
? {
podcastShowDetails: {
diff --git a/src/components/PostList/PostList.tsx b/src/components/PostList/PostList.tsx
index e030f53..581de95 100644
--- a/src/components/PostList/PostList.tsx
+++ b/src/components/PostList/PostList.tsx
@@ -67,7 +67,7 @@ export const PostsList = (props: Props) => {
title: post.title,
subtitle: post.subtitle,
coverImage: post.coverImage,
- tags: post.tags,
+ tags: post.tags.map((tag) => tag.name),
}}
contentType={PostTypes.Article}
/>
diff --git a/src/containers/HomePage/HomePage.tsx b/src/containers/HomePage/HomePage.tsx
index 550947c..deb1b4e 100644
--- a/src/containers/HomePage/HomePage.tsx
+++ b/src/containers/HomePage/HomePage.tsx
@@ -41,6 +41,7 @@ export const HomePage: React.FC = ({
{tags.map((tag) => (
-
+
))}
diff --git a/src/containers/StaticPage/StaticPage.tsx b/src/containers/StaticPage/StaticPage.tsx
index dc45cda..55b10bb 100644
--- a/src/containers/StaticPage/StaticPage.tsx
+++ b/src/containers/StaticPage/StaticPage.tsx
@@ -18,22 +18,12 @@ export const StaticPage: React.FC = ({
data: { page },
...props
}) => {
- const titleBlock = data.page.content.find((block) => {
- return (
- block.type === LPE.Post.ContentBlockTypes.Text &&
- block.classNames &&
- block.classNames.includes('title')
- )
- }) as LPE.Post.TextBlock | undefined
-
return (
- {titleBlock && (
-
- {titleBlock.text}
-
- )}
+
+ {page.title}
+
{data.page.content.map((block, idx) => (
))}
diff --git a/src/lib/TransformPipeline/TransformPipeline.ts b/src/lib/TransformPipeline/TransformPipeline.ts
new file mode 100644
index 0000000..6202f26
--- /dev/null
+++ b/src/lib/TransformPipeline/TransformPipeline.ts
@@ -0,0 +1,87 @@
+import { Helpers, Transformer } from './types'
+
+export class TransformPipeline {
+ private transformers: Transformer[] = []
+ private helpers: Helpers
+
+ constructor(transformers: Transformer[]) {
+ this.transformers = transformers
+
+ this.helpers = {
+ transformers: this,
+ }
+ }
+
+ getOne = ({
+ key,
+ classes,
+ objectType,
+ }: {
+ key?: string
+ classes?: string | string[]
+ objectType?: string
+ }) => {
+ let transformers = this.transformers
+
+ if (key) {
+ return transformers.find((doc) => doc.key === key)
+ }
+
+ return this.get({ classes, objectType })[0]
+ }
+
+ get = ({
+ classes: _classes,
+ objectType,
+ }: {
+ classes?: string | string[]
+ objectType?: string
+ }) => {
+ let transformers = this.transformers
+
+ if (objectType)
+ transformers = transformers.filter(
+ (dataType) => dataType.objectType === objectType,
+ )
+
+ const classes = !_classes
+ ? []
+ : Array.isArray(_classes)
+ ? _classes
+ : [_classes]
+ if (classes.length > 0)
+ transformers = transformers.filter((dataType) =>
+ classes.every((cls) => dataType.classes.includes(cls)),
+ )
+
+ return transformers
+ }
+
+ transform = async (
+ pipeline: Transformer[],
+ data: T,
+ root?: any,
+ context?: any,
+ ): Promise => {
+ let obj = data
+
+ for (const dataType of pipeline) {
+ if (dataType.isMatch(this.helpers, obj, data, root, context)) {
+ obj = await dataType.transform(this.helpers, obj, data, root, context)
+ }
+ }
+
+ return obj as O | Promise
+ }
+
+ transformMany = async (
+ pipeline: Transformer[],
+ data: T[],
+ root?: any,
+ context?: any,
+ ): Promise => {
+ return Promise.all(
+ data.map((d) => this.transform(pipeline, d, root, context)),
+ )
+ }
+}
diff --git a/src/lib/TransformPipeline/types.ts b/src/lib/TransformPipeline/types.ts
new file mode 100644
index 0000000..4920f97
--- /dev/null
+++ b/src/lib/TransformPipeline/types.ts
@@ -0,0 +1,27 @@
+import { TransformPipeline } from './TransformPipeline'
+
+export type Transformer = {
+ key: string
+ classes: string[]
+ objectType: string
+
+ isMatch: (
+ helpers: Helpers,
+ object: D,
+ original: O,
+ root: R | undefined,
+ context: C,
+ ) => boolean
+
+ transform: (
+ helpers: Helpers,
+ object: D,
+ original: O,
+ root: R | undefined,
+ context: C,
+ ) => T | Promise
+}
+
+export type Helpers = {
+ transformers: TransformPipeline
+}
diff --git a/src/lib/strapi/strapi.generated.ts b/src/lib/strapi/strapi.generated.ts
new file mode 100644
index 0000000..1b7d421
--- /dev/null
+++ b/src/lib/strapi/strapi.generated.ts
@@ -0,0 +1,3129 @@
+import { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core'
+export type Maybe = T
+export type InputMaybe = T
+export type Exact = {
+ [K in keyof T]: T[K]
+}
+export type MakeOptional = Omit & {
+ [SubKey in K]?: Maybe
+}
+export type MakeMaybe = Omit & {
+ [SubKey in K]: Maybe
+}
+export type MakeEmpty<
+ T extends { [key: string]: unknown },
+ K extends keyof T,
+> = { [_ in K]?: never }
+export type Incremental =
+ | T
+ | {
+ [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never
+ }
+/** All built-in and custom scalars, mapped to their actual values */
+export type Scalars = {
+ ID: { input: string; output: string }
+ String: { input: string; output: string }
+ Boolean: { input: boolean; output: boolean }
+ Int: { input: number; output: number }
+ Float: { input: number; output: number }
+ Date: { input: any; output: any }
+ DateTime: { input: any; output: any }
+ JSON: { input: any; output: any }
+ Upload: { input: any; output: any }
+}
+
+export type Author = {
+ __typename?: 'Author'
+ avatar: Maybe
+ createdAt: Maybe
+ email_address: Maybe
+ name: Scalars['String']['output']
+ updatedAt: Maybe
+}
+
+export type AuthorEntity = {
+ __typename?: 'AuthorEntity'
+ attributes: Maybe
+ id: Maybe
+}
+
+export type AuthorEntityResponse = {
+ __typename?: 'AuthorEntityResponse'
+ data: Maybe
+}
+
+export type AuthorEntityResponseCollection = {
+ __typename?: 'AuthorEntityResponseCollection'
+ data: Array
+ meta: ResponseCollectionMeta
+}
+
+export type AuthorFiltersInput = {
+ and?: InputMaybe>>
+ createdAt?: InputMaybe
+ email_address?: InputMaybe
+ id?: InputMaybe
+ name?: InputMaybe
+ not?: InputMaybe
+ or?: InputMaybe>>
+ updatedAt?: InputMaybe
+}
+
+export type AuthorInput = {
+ avatar?: InputMaybe
+ email_address?: InputMaybe
+ name?: InputMaybe
+}
+
+export type AuthorRelationResponseCollection = {
+ __typename?: 'AuthorRelationResponseCollection'
+ data: Array
+}
+
+export type BooleanFilterInput = {
+ and?: InputMaybe>>
+ between?: InputMaybe>>
+ contains?: InputMaybe
+ containsi?: InputMaybe
+ endsWith?: InputMaybe
+ eq?: InputMaybe
+ eqi?: InputMaybe
+ gt?: InputMaybe
+ gte?: InputMaybe
+ in?: InputMaybe>>
+ lt?: InputMaybe
+ lte?: InputMaybe
+ ne?: InputMaybe
+ nei?: InputMaybe
+ not?: InputMaybe
+ notContains?: InputMaybe
+ notContainsi?: InputMaybe
+ notIn?: InputMaybe>>
+ notNull?: InputMaybe
+ null?: InputMaybe
+ or?: InputMaybe>>
+ startsWith?: InputMaybe
+}
+
+export type ComponentCatChannel = {
+ __typename?: 'ComponentCatChannel'
+ channel: Maybe
+ id: Scalars['ID']['output']
+ link: Scalars['String']['output']
+}
+
+export type ComponentCatChannelFiltersInput = {
+ and?: InputMaybe>>
+ channel?: InputMaybe
+ link?: InputMaybe
+ not?: InputMaybe
+ or?: InputMaybe>>
+}
+
+export type ComponentCatChannelInput = {
+ channel?: InputMaybe
+ id?: InputMaybe
+ link?: InputMaybe
+}
+
+export type ContentReleasesRelease = {
+ __typename?: 'ContentReleasesRelease'
+ actions: Maybe
+ createdAt: Maybe
+ name: Scalars['String']['output']
+ releasedAt: Maybe
+ updatedAt: Maybe
+}
+
+export type ContentReleasesReleaseActionsArgs = {
+ filters?: InputMaybe
+ pagination?: InputMaybe
+ sort?: InputMaybe>>
+}
+
+export type ContentReleasesReleaseAction = {
+ __typename?: 'ContentReleasesReleaseAction'
+ contentType: Scalars['String']['output']
+ createdAt: Maybe
+ entry: Maybe
+ release: Maybe
+ type: Enum_Contentreleasesreleaseaction_Type
+ updatedAt: Maybe
+}
+
+export type ContentReleasesReleaseActionEntity = {
+ __typename?: 'ContentReleasesReleaseActionEntity'
+ attributes: Maybe
+ id: Maybe
+}
+
+export type ContentReleasesReleaseActionEntityResponse = {
+ __typename?: 'ContentReleasesReleaseActionEntityResponse'
+ data: Maybe
+}
+
+export type ContentReleasesReleaseActionEntityResponseCollection = {
+ __typename?: 'ContentReleasesReleaseActionEntityResponseCollection'
+ data: Array
+ meta: ResponseCollectionMeta
+}
+
+export type ContentReleasesReleaseActionFiltersInput = {
+ and?: InputMaybe>>
+ contentType?: InputMaybe
+ createdAt?: InputMaybe
+ id?: InputMaybe
+ not?: InputMaybe
+ or?: InputMaybe>>
+ release?: InputMaybe
+ type?: InputMaybe
+ updatedAt?: InputMaybe
+}
+
+export type ContentReleasesReleaseActionInput = {
+ contentType?: InputMaybe
+ release?: InputMaybe
+ type?: InputMaybe
+}
+
+export type ContentReleasesReleaseActionRelationResponseCollection = {
+ __typename?: 'ContentReleasesReleaseActionRelationResponseCollection'
+ data: Array
+}
+
+export type ContentReleasesReleaseEntity = {
+ __typename?: 'ContentReleasesReleaseEntity'
+ attributes: Maybe
+ id: Maybe
+}
+
+export type ContentReleasesReleaseEntityResponse = {
+ __typename?: 'ContentReleasesReleaseEntityResponse'
+ data: Maybe
+}
+
+export type ContentReleasesReleaseEntityResponseCollection = {
+ __typename?: 'ContentReleasesReleaseEntityResponseCollection'
+ data: Array
+ meta: ResponseCollectionMeta
+}
+
+export type ContentReleasesReleaseFiltersInput = {
+ actions?: InputMaybe
+ and?: InputMaybe>>
+ createdAt?: InputMaybe
+ id?: InputMaybe
+ name?: InputMaybe
+ not?: InputMaybe
+ or?: InputMaybe>>
+ releasedAt?: InputMaybe
+ updatedAt?: InputMaybe
+}
+
+export type ContentReleasesReleaseInput = {
+ actions?: InputMaybe>>
+ name?: InputMaybe
+ releasedAt?: InputMaybe
+}
+
+export type DateFilterInput = {
+ and?: InputMaybe>>
+ between?: InputMaybe>>
+ contains?: InputMaybe
+ containsi?: InputMaybe
+ endsWith?: InputMaybe
+ eq?: InputMaybe
+ eqi?: InputMaybe
+ gt?: InputMaybe
+ gte?: InputMaybe
+ in?: InputMaybe>>
+ lt?: InputMaybe
+ lte?: InputMaybe
+ ne?: InputMaybe
+ nei?: InputMaybe
+ not?: InputMaybe
+ notContains?: InputMaybe
+ notContainsi?: InputMaybe
+ notIn?: InputMaybe>>
+ notNull?: InputMaybe
+ null?: InputMaybe
+ or?: InputMaybe>>
+ startsWith?: InputMaybe
+}
+
+export type DateTimeFilterInput = {
+ and?: InputMaybe>>
+ between?: InputMaybe>>
+ contains?: InputMaybe
+ containsi?: InputMaybe
+ endsWith?: InputMaybe
+ eq?: InputMaybe
+ eqi?: InputMaybe
+ gt?: InputMaybe
+ gte?: InputMaybe
+ in?: InputMaybe>>
+ lt?: InputMaybe
+ lte?: InputMaybe
+ ne?: InputMaybe
+ nei?: InputMaybe
+ not?: InputMaybe
+ notContains?: InputMaybe
+ notContainsi?: InputMaybe
+ notIn?: InputMaybe>>
+ notNull?: InputMaybe
+ null?: InputMaybe
+ or?: InputMaybe>>
+ startsWith?: InputMaybe
+}
+
+export type Enum_Componentcatchannel_Channel =
+ | 'Apple_Podcasts'
+ | 'Google_Podcasts'
+ | 'Simplecast'
+ | 'Spotify'
+ | 'Youtube'
+
+export type Enum_Contentreleasesreleaseaction_Type = 'publish' | 'unpublish'
+
+export type Enum_Post_Type = 'Article' | 'Episode'
+
+export type FileInfoInput = {
+ alternativeText?: InputMaybe
+ caption?: InputMaybe
+ name?: InputMaybe
+}
+
+export type FloatFilterInput = {
+ and?: InputMaybe>>
+ between?: InputMaybe>>
+ contains?: InputMaybe
+ containsi?: InputMaybe
+ endsWith?: InputMaybe
+ eq?: InputMaybe
+ eqi?: InputMaybe
+ gt?: InputMaybe
+ gte?: InputMaybe
+ in?: InputMaybe>>
+ lt?: InputMaybe
+ lte?: InputMaybe
+ ne?: InputMaybe
+ nei?: InputMaybe
+ not?: InputMaybe
+ notContains?: InputMaybe
+ notContainsi?: InputMaybe
+ notIn?: InputMaybe>>
+ notNull?: InputMaybe
+ null?: InputMaybe
+ or?: InputMaybe>>
+ startsWith?: InputMaybe
+}
+
+export type GenericMorph =
+ | Author
+ | ComponentCatChannel
+ | ContentReleasesRelease
+ | ContentReleasesReleaseAction
+ | I18NLocale
+ | Page
+ | PodcastShow
+ | Post
+ | Tag
+ | UploadFile
+ | UploadFolder
+ | UsersPermissionsPermission
+ | UsersPermissionsRole
+ | UsersPermissionsUser
+
+export type I18NLocale = {
+ __typename?: 'I18NLocale'
+ code: Maybe
+ createdAt: Maybe
+ name: Maybe
+ updatedAt: Maybe
+}
+
+export type I18NLocaleEntity = {
+ __typename?: 'I18NLocaleEntity'
+ attributes: Maybe
+ id: Maybe
+}
+
+export type I18NLocaleEntityResponse = {
+ __typename?: 'I18NLocaleEntityResponse'
+ data: Maybe
+}
+
+export type I18NLocaleEntityResponseCollection = {
+ __typename?: 'I18NLocaleEntityResponseCollection'
+ data: Array
+ meta: ResponseCollectionMeta
+}
+
+export type I18NLocaleFiltersInput = {
+ and?: InputMaybe>>
+ code?: InputMaybe
+ createdAt?: InputMaybe
+ id?: InputMaybe
+ name?: InputMaybe
+ not?: InputMaybe
+ or?: InputMaybe>>
+ updatedAt?: InputMaybe
+}
+
+export type IdFilterInput = {
+ and?: InputMaybe>>
+ between?: InputMaybe>>
+ contains?: InputMaybe
+ containsi?: InputMaybe
+ endsWith?: InputMaybe
+ eq?: InputMaybe
+ eqi?: InputMaybe
+ gt?: InputMaybe
+ gte?: InputMaybe
+ in?: InputMaybe>>
+ lt?: InputMaybe
+ lte?: InputMaybe
+ ne?: InputMaybe
+ nei?: InputMaybe
+ not?: InputMaybe
+ notContains?: InputMaybe
+ notContainsi?: InputMaybe
+ notIn?: InputMaybe>>
+ notNull?: InputMaybe
+ null?: InputMaybe
+ or?: InputMaybe>>
+ startsWith?: InputMaybe
+}
+
+export type IntFilterInput = {
+ and?: InputMaybe>>
+ between?: InputMaybe>>
+ contains?: InputMaybe
+ containsi?: InputMaybe
+ endsWith?: InputMaybe
+ eq?: InputMaybe
+ eqi?: InputMaybe
+ gt?: InputMaybe
+ gte?: InputMaybe
+ in?: InputMaybe>>
+ lt?: InputMaybe
+ lte?: InputMaybe
+ ne?: InputMaybe
+ nei?: InputMaybe
+ not?: InputMaybe
+ notContains?: InputMaybe
+ notContainsi?: InputMaybe
+ notIn?: InputMaybe