import type { PropsWithChildren, ComponentType as ReactComponentType } from "react"; import type { DocumentNode } from "graphql"; import type { TypedDocumentNode } from '@graphql-typed-document-node/core'; import type { ContentLinkWithLocale, ContentLink, InlineContentLinkWithLocale } from "@remkoj/optimizely-graph-client"; import type { GenericContext } from "./context/types.js"; import type { CmsEditableProps } from "./components/cms-editable/index.js"; export type ContentType = string[]; export type { /** * @deprecated Use the export from `@remkoj/optimizely-graph-client` directly */ ContentLink, /** * @deprecated Use the export from `@remkoj/optimizely-graph-client` directly */ ContentLinkWithLocale } from "@remkoj/optimizely-graph-client"; export type ComponentCmsEditableProps = Pick, 'cmsId' | 'ctx' | 'currentContent'>; export type CmsComponentProps = Record> = PropsWithChildren<{ /** * The identifier of the content item. */ contentLink: ContentLinkWithLocale | InlineContentLinkWithLocale; /** * The data already pre-fetched for the this component */ data: T; /** * Use the Server/Client context instead if you need this information * * @deprecated */ inEditMode?: boolean; /** * Contextual layout data from an Experience. This will be `undefined` if * there's no layout data attached. */ layoutProps?: L; /** * The minimal properties needed to render a CmsEditable inside the * component. */ editProps?: ComponentCmsEditableProps; /** * The context in which this component will be rendered */ ctx?: GenericContext; }>; export type ContentQueryProps = Omit & { locale?: Array | LocaleType | null; path?: string | null; domain?: string | null; changeset?: string | null; variant?: string | null; }; /** * Extract the data type from a GraphQL Query */ export type ResponseDataType = T extends TypedDocumentNode ? DataType : { [key: string]: any; }; export type GetDataQueryResponseTemplate = { __typename?: 'Query' | null; data?: { __typename?: string | null; item?: { __typename?: string | null; _metadata?: { key?: string | null; } | null; [key: string]: any; } | null; } | null; }; export type ProcessQueryResponse = T extends GetDataQueryResponseTemplate ? NonNullable['data']>['item']> : T; export type GetDataQuery = () => TypedDocumentNode> | DocumentNode; export type GetDataFragment = () => [string, TypedDocumentNode | DocumentNode | string]; export type WithGqlFragment = BaseComponent & { getDataFragment: GetDataFragment; validateFragment?: (data: any) => data is DataType; }; export type WithGqlQuery = B & { getDataQuery: GetDataQuery; }; export type BaseCmsComponent = Record> = T extends never | TypedDocumentNode | DocumentNode ? DynamicCmsComponent> : ReactComponentType, L>>; export type DynamicCmsComponent = Record> = ReactComponentType, L>>; export type GraphQLFragmentBase = { ' $fragmentName'?: string; }; export type GraphQLQueryBase = { __typename?: 'Query'; }; export type CmsComponentWithFragment = Record> = BaseCmsComponent & WithGqlFragment<{}, T>; export type CmsComponentWithQuery = Record> = BaseCmsComponent & WithGqlQuery<{}, T>; export type CmsComponentWithOptionalQuery = Record> = BaseCmsComponent & Partial>; /** * A generic Optimizely CMS Component that will change the static surface based upon the * provided data type for the component. It will detect automatically whether the component * requires a query or fragment to load the data and allows typechecking of the required * getDataFragement / getDataQuery methods are valid. * * When a type is provided that cannot be resolved to either the output of a Query or a Fragment, * it will assume an optional getDataQuery method. */ export type CmsComponent = Record> = T extends TypedDocumentNode ? CmsComponentWithQuery : T extends DocumentNode ? CmsComponentWithQuery<{ [key: string]: any; }, L> : T extends GraphQLFragmentBase ? CmsComponentWithFragment : T extends GraphQLQueryBase ? CmsComponentWithQuery : CmsComponentWithOptionalQuery; /** * A generic Optimizely CMS Component used to render a layout node from an experience, which cannot * be loaded directly as independent Content Item from Optimizely Graph */ export type CmsLayoutComponent = Record, T = never> = ReactComponentType>;