UNPKG

@silexlabs/grapesjs-data-source

Version:
462 lines (458 loc) 15.2 kB
import { Button, Component, Editor, Page } from 'grapesjs'; import { TemplateResult } from 'lit'; export interface DataSourceEditorViewOptions { el?: HTMLElement | string | undefined | (() => HTMLElement); settingsEl?: HTMLElement | string | (() => HTMLElement); button?: Button | (() => Button); styles?: string; optionsStyles?: string; defaultFixed?: boolean; disableStates?: boolean; disableAttributes?: boolean; disableProperties?: boolean; previewDebounceDelay?: number; previewRefreshEvents?: string; } /** * Options for the DataSourceEditor plugin */ export interface DataSourceEditorOptions { dataSources: IDataSourceOptions[]; view: DataSourceEditorViewOptions; filters: Filter[] | string; previewActive: boolean; } export type PageId = string; export interface Query { expression: Expression; } /** * Tree structure for creating query from components states */ export interface Tree { token: Property; children: Tree[]; } export type DataSourceId = string | number; export interface IDataSource { id: DataSourceId; label: string; url: string; type: DataSourceType; method?: string; headers?: Record<string, string>; hidden?: boolean; readonly?: boolean; connect(): Promise<void>; isConnected(): boolean; getTypes(): Type[]; getQueryables(): Field[]; getQuery(trees: Tree[]): string; fetchValues(query: string): Promise<unknown>; on?(event: any, callback?: any, context?: any): any; off?(event?: any, callback?: any, context?: any): any; trigger?(event: any, ...args: unknown[]): any; } export declare const FIXED_TOKEN_ID = "fixed"; export declare const DATA_SOURCE_READY = "data-source:ready"; export declare const DATA_SOURCE_ERROR = "data-source:error"; export declare const DATA_SOURCE_CHANGED = "data-source:changed"; export declare const COMPONENT_STATE_CHANGED = "component:state:changed"; export declare const DATA_SOURCE_DATA_LOAD_START = "data-source:data-load:start"; export declare const DATA_SOURCE_DATA_LOAD_END = "data-source:data-load:end"; export declare const DATA_SOURCE_DATA_LOAD_CANCEL = "data-source:data-load:cancel"; export declare const PREVIEW_RENDER_START = "data-source:start:preview"; export declare const PREVIEW_RENDER_END = "data-source:start:end"; export declare const PREVIEW_RENDER_ERROR = "data-source:start:error"; export declare const PREVIEW_ACTIVATED = "data-source:preview:activated"; export declare const PREVIEW_DEACTIVATED = "data-source:preview:deactivated"; export declare const COMMAND_REFRESH = "data-source:refresh"; export declare const COMMAND_PREVIEW_ACTIVATE = "data-source:preview:activate"; export declare const COMMAND_PREVIEW_DEACTIVATE = "data-source:preview:deactivate"; export declare const COMMAND_PREVIEW_REFRESH = "data-source:preview:refresh"; export declare const COMMAND_PREVIEW_TOGGLE = "data-source:preview:toggle"; export declare const COMMAND_ADD_DATA_SOURCE = "data-source:add"; export type DataSourceType = "graphql"; export interface IDataSourceOptions { id: DataSourceId; label: string; type: DataSourceType; readonly?: boolean; } export type TypeId = string; export type Type = { id: TypeId; label: string; fields: Field[]; dataSourceId?: DataSourceId; }; export declare const builtinTypeIds: string[]; export declare const builtinTypes: Type[]; export type FieldId = string; export type FieldKind = "scalar" | "object" | "list" | "unknown"; export interface FieldArgument { name: string; typeId: TypeId; defaultValue?: unknown; } export interface Field { id: FieldId; label: string; typeIds: TypeId[]; kind: FieldKind; dataSourceId?: DataSourceId; arguments?: FieldArgument[]; previewIndex?: number; previewGroup?: number; } /** * A token can be a property or a filter */ export type Token = Property | Filter | State; /** * Stored tokens are how the tokens are stored in the component as JSON * Use DataTree#fromStored to convert them back to tokens */ export type StoredToken = StoredProperty | StoredFilter | State; export type Options = Record<string, unknown>; /** * A property is used to make expressions and access data from the data source */ export interface BaseProperty { type: "property"; propType: "field"; dataSourceId?: DataSourceId; } export type PropertyOptions = Record<string, unknown>; export interface StoredProperty extends BaseProperty { typeIds: TypeId[]; fieldId: FieldId; label: string; kind: FieldKind; options?: PropertyOptions; previewIndex?: number; previewGroup?: number; } export interface Property extends StoredProperty { optionsForm?: (selected: Component, input: Field | null, options: Options, stateName: string) => TemplateResult | null; } /** * A filter is used to alter data in an expression * It is provided in the options */ export type FilterId = string; export interface StoredFilter { type: "filter"; id: FilterId; filterName?: FilterId; label: string; options: Options; quotedOptions?: string[]; optionsKeys?: string[]; previewIndex?: number; previewGroup?: number; } export interface Filter extends StoredFilter { optionsForm?: (selected: Component, input: Field | null, options: Options, stateName: string) => TemplateResult | null; validate: (input: Field | null) => boolean; output: (input: Field | null, options: Options) => Field | null; apply: (input: unknown, options: Options) => unknown; } /** * A component state */ export type StateId = string; export interface State { type: "state"; storedStateId: StateId; previewIndex?: number; previewGroup?: number; label: string; componentId: string; exposed: boolean; forceKind?: FieldKind; } /** * A context is a list of available tokens for a component */ export type Context = Token[]; /** * An expression is a list of tokens which can be evaluated to a value * It is used to access data from the data source */ export type Expression = StoredToken[]; /** * Operators for condition in visibility property */ export declare enum UnariOperator { TRUTHY = "truthy", FALSY = "falsy", EMPTY_ARR = "empty array", NOT_EMPTY_ARR = "not empty array" } /** * Operators for condition in visibility property */ export declare enum BinaryOperator { EQUAL = "==", NOT_EQUAL = "!=", GREATER_THAN = ">", LESS_THAN = "<", GREATER_THAN_OR_EQUAL = ">=", LESS_THAN_OR_EQUAL = "<=" } /** * Properties of elements * What is not a property is an attribute or a state */ export declare enum Properties { innerHTML = "innerHTML", condition = "condition", condition2 = "condition2", __data = "__data" } export interface ComponentExpression { expression: Expression; component: Component; } /** * Types */ export interface StoredState { label?: string; hidden?: boolean; expression: Expression; } export type PersistantId = string; /** * @fileoverview GraphQL DataSource implementation */ /** * Backend type for GraphQL datasources * Determines default type selection behavior */ export type GraphQLBackendType = "gitlab" | "wordpress" | "strapi" | "supabase" | "generic"; /** * GraphQL Data source options */ export interface GraphQLQueryOptions { url: string; headers: Record<string, string>; method: "GET" | "POST"; queryable?: TypeId[]; readonly?: boolean; } /** * GraphQL Data source options with server to server options */ export interface GraphQLOptions extends GraphQLQueryOptions, IDataSourceOptions { serverToServer?: GraphQLQueryOptions; hidden?: boolean; /** * Backend type for this datasource (gitlab, wordpress, generic) * Determines default type selection behavior */ backendType?: GraphQLBackendType; /** * List of disabled type names for this datasource * Types in this list will be filtered out during introspection * If undefined or empty, all types are enabled * Using disabledTypes (instead of enabledTypes) ensures new types added to the schema are visible by default */ disabledTypes?: string[]; } /** * Generate GraphQL query for a single page * Used by both preview and production (11ty site generation) * * @param page - The GrapesJS page to generate query for * @param editor - The GrapesJS editor instance * @returns Record of data source ID to GraphQL query string */ export declare function getPageQuery(page: Page, editor: Editor): Record<DataSourceId, string>; /** * Generate queries for multiple pages * Useful for batch operations like static site generation * * @param pages - Array of GrapesJS pages * @param editor - The GrapesJS editor instance * @returns Record of page ID to data source queries */ export declare function buildPageQueries(pages: Page[], editor: Editor): Record<string, Record<DataSourceId, string>>; /** * Get all data sources * @returns Array of all registered data sources */ export declare function getAllDataSources(): IDataSource[]; /** * Get a specific data source by ID * @param id - The data source ID * @returns The data source or undefined if not found */ export declare function getDataSource(id: DataSourceId): IDataSource | undefined; /** * Add a new data source * @param dataSource - The data source to add */ export declare function addDataSource(dataSource: IDataSource): void; /** * Remove a data source * @param dataSource - The data source to remove */ export declare function removeDataSource(dataSource: IDataSource): void; /** * Refresh preview data from all data sources * Triggers data loading for the current page */ export declare function refreshDataSources(): void; /** * Load preview data for the current page * @param forceRefresh - If true, bypass query comparison and force refresh * @returns Promise that resolves when data is loaded */ export declare function loadPreviewData(forceRefresh?: boolean): Promise<void>; /** * Get current preview data * @returns Record of data source ID to preview data */ export declare function getPreviewData(): Record<DataSourceId, unknown>; /** * Set preview data for all data sources * @param data - Record mapping data source IDs to their preview data */ export declare function setPreviewData(data: Record<DataSourceId, unknown>): void; /** * Set preview index on an expression of a component */ export declare function setPreviewIndex(expression: StoredToken[], index: number, group?: number): void; /** * Clear all preview data */ export declare function clearPreviewData(): void; /** * Evaluate an expression with current preview data * @param expression - The expression to evaluate * @param component - The component context * @returns The evaluated result */ export declare function getValue(expression: Expression, component: Component, resolvePreviewIndex?: boolean): unknown; /** * Get all expressions used by components on a page * @param page - The page to analyze * @returns Array of component expressions */ export declare function getPageExpressions(page: Page): ComponentExpression[]; /** * Get auto-completion options for expressions * @param options - Completion options including component, expression, etc. * @returns Context with available tokens for completion */ export declare function getCompletion(options: { component: Component; expression: Expression; rootType?: TypeId; currentStateId?: StateId; hideLoopData?: boolean; }): Context; /** * Convert a stored token to its full form with methods and properties * @param token - The stored token to convert * @param componentId - The component ID for context (can be null) * @returns The full token with all properties and methods */ export declare function fromStored<T extends Token = Token>(token: StoredToken, componentId: string | null): T; /** * Get the result type of an expression * @param expression - The expression to analyze * @param component - The component context * @returns The field describing the result type, or null if invalid */ export declare function getExpressionResultType(expression: Expression, component: Component): Field | null; export declare function addFilters(filters: Filter | Filter[]): void; /** * Remove filters from the data tree. * Accepts a single Filter or an array of Filters. * Removes by reference. */ export declare function removeFilters(filters: Filter | Filter[]): void; /** * Get the persistent ID of a component * @param component - The component to get ID for * @returns The persistent ID or null if not set */ export declare function getPersistantId(component: Component): PersistantId | null; /** * Get or create the persistent ID of a component * @param component - The component to get/create ID for * @returns The persistent ID */ export declare function getOrCreatePersistantId(component: Component): PersistantId; /** * Get a state from a component * @param component - The component to get state from * @param id - The state ID * @param exported - Whether to get exported (public) or private state * @returns The state or null if not found */ export declare function getState(component: Component, id: StateId, exported?: boolean): StoredState | null; /** * Get all state IDs from a component * @param component - The component to get state IDs from * @param exported - Whether to get exported (public) or private state IDs * @param before - Optional state ID to get IDs before * @returns Array of state IDs */ export declare function getStateIds(component: Component, exported?: boolean, before?: StateId): StateId[]; /** * Set a state on a component * @param component - The component to set state on * @param id - The state ID * @param state - The state to set * @param exported - Whether to set as exported (public) or private state * @param index - Optional index to insert at */ export declare function setState(component: Component, id: StateId, state: StoredState, exported?: boolean, index?: number): void; /** * Remove a state from a component * @param component - The component to remove state from * @param id - The state ID to remove * @param exported - Whether to remove from exported (public) or private states */ export declare function removeState(component: Component, id: StateId, exported?: boolean): void; /** * Get the variable name for a state * @param componentId - The component ID * @param stateId - The state ID * @returns The variable name */ export declare function getStateVariableName(componentId: string, stateId: StateId): string; /** * Convert JSON or string to an Expression object * @param json - The JSON or string to convert * @returns The Expression object or null if invalid */ export declare function toExpression(json: unknown | string): Expression | null; /** * Create a data source instance * @param options - The data source configuration * @returns The created data source */ export declare function createDataSource(opts?: Partial<GraphQLOptions>): IDataSource; /** * Notification group name for data source notifications */ export declare const NOTIFICATION_GROUP = "Data source"; /** * Component name prefix for data source components */ export declare const COMPONENT_NAME_PREFIX = "nameForDataSource"; declare const _default: (editor: Editor, opts?: Partial<DataSourceEditorOptions>) => void; /** * Version of the plugin * This is replaced by the build script */ export declare const version = "__VERSION__"; export { _default as default, }; export {};