diff --git a/packages/core/src/data_sources/config/config.ts b/packages/core/src/data_sources/config/config.ts index 76bcd8c2f..0825bf6b3 100644 --- a/packages/core/src/data_sources/config/config.ts +++ b/packages/core/src/data_sources/config/config.ts @@ -1,4 +1,4 @@ -import type { DataSourcePropertyHandler } from '../types'; +import type { DataBindingImportPolicy } from '../types'; export interface DataSourcesConfig { /** @@ -11,12 +11,12 @@ export interface DataSourcesConfig { * Controls how parsed static HTML/CSS updates interact with existing data source bindings. * @default 'overwrite' */ - onDataSourceProperty?: DataSourcePropertyHandler; + dataBindingImportPolicy?: DataBindingImportPolicy; } const config: () => DataSourcesConfig = () => ({ autoloadProviders: false, - onDataSourceProperty: 'overwrite', + dataBindingImportPolicy: 'overwrite', }); export default config; diff --git a/packages/core/src/data_sources/types.ts b/packages/core/src/data_sources/types.ts index 9c271bf2c..bc0d47aba 100644 --- a/packages/core/src/data_sources/types.ts +++ b/packages/core/src/data_sources/types.ts @@ -168,16 +168,16 @@ export interface DataSourceTransformers { onRecordSetValue?: (args: { id: string | number; key: string; value: any }) => any; } -export type DataSourceImportSource = 'html' | 'css'; +export type DataBindingImportSource = 'html' | 'css'; -export type DataSourcePropertyKind = 'property' | 'attribute' | 'style'; +export type DataBindingKind = 'property' | 'attribute' | 'style'; -export type DataSourcePropertyAction = 'overwrite' | 'update' | 'skip'; +export type DataBindingImportAction = 'overwrite' | 'update' | 'skip'; -export interface DataSourcePropertyContext { +export interface DataBindingImportContext { target: StyleableModel; - kind: DataSourcePropertyKind; - source: DataSourceImportSource; + kind: DataBindingKind; + source: DataBindingImportSource; key: string; value: any; resolvedValue: any; @@ -185,9 +185,9 @@ export interface DataSourcePropertyContext { path?: string; } -export type DataSourcePropertyHandler = - | DataSourcePropertyAction - | ((context: DataSourcePropertyContext) => DataSourcePropertyAction); +export type DataBindingImportPolicy = + | DataBindingImportAction + | ((context: DataBindingImportContext) => DataBindingImportAction); type DotSeparatedKeys = T extends object ? { diff --git a/packages/core/src/dom_components/model/ModelResolverWatcher.ts b/packages/core/src/dom_components/model/ModelResolverWatcher.ts index 349bf11d6..4251b8405 100644 --- a/packages/core/src/dom_components/model/ModelResolverWatcher.ts +++ b/packages/core/src/dom_components/model/ModelResolverWatcher.ts @@ -1,10 +1,10 @@ import { ObjectAny, ObjectHash } from '../../common'; import DataResolverListener from '../../data_sources/model/DataResolverListener'; import { - DataSourceImportSource, - DataSourcePropertyContext, - DataSourcePropertyHandler, - DataSourcePropertyKind, + DataBindingImportContext, + DataBindingImportPolicy, + DataBindingImportSource, + DataBindingKind, } from '../../data_sources/types'; import { getDataResolverInstance, getDataResolverInstanceValue, isDataResolverProps } from '../../data_sources/utils'; import type StyleableModel from '../../domain_abstract/model/StyleableModel'; @@ -14,7 +14,7 @@ import { isFunction } from 'underscore'; export interface DataWatchersOptions { skipWatcherUpdates?: boolean; fromDataSource?: boolean; - parsedImportSource?: DataSourceImportSource; + parsedImportSource?: DataBindingImportSource; } export interface ModelResolverWatcherOptions { @@ -31,7 +31,7 @@ export class ModelResolverWatcher { constructor( private model: WatchableModel, private updateFn: UpdateFn, - private kind: DataSourcePropertyKind, + private kind: DataBindingKind, options: ModelResolverWatcherOptions, ) { this.em = options.em; @@ -125,7 +125,7 @@ export class ModelResolverWatcher { private applyImportPolicy(values: ObjectAny | undefined, options: DataWatchersOptions = {}) { const { parsedImportSource } = options; - const { onDataSourceProperty } = this.em.DataSources.config; + const { dataBindingImportPolicy } = this.em.DataSources.config; if (!values || !parsedImportSource) return values; @@ -142,7 +142,7 @@ export class ModelResolverWatcher { const resolver = resolverListener.resolver.toJSON(); const path = 'path' in resolver ? resolver.path : undefined; - const context: DataSourcePropertyContext = { + const context: DataBindingImportContext = { target: this.model as StyleableModel, kind: this.kind, source, @@ -152,7 +152,7 @@ export class ModelResolverWatcher { resolver, path, }; - const action = this.resolveImportAction(onDataSourceProperty, context); + const action = this.resolveImportAction(dataBindingImportPolicy, context); if (action === 'overwrite') { return; @@ -172,7 +172,7 @@ export class ModelResolverWatcher { return nextValues; } - private resolveImportAction(handler: DataSourcePropertyHandler | undefined, context: DataSourcePropertyContext) { + private resolveImportAction(handler: DataBindingImportPolicy | undefined, context: DataBindingImportContext) { const action = isFunction(handler) ? handler(context) : handler; return action === 'skip' || action === 'update' || action === 'overwrite' ? action : 'overwrite'; @@ -190,7 +190,7 @@ export class ModelResolverWatcher { } } - private warnImportFallback(key: string, source: DataSourceImportSource, path?: string) { + private warnImportFallback(key: string, source: DataBindingImportSource, path?: string) { this.em.logWarning( `[DataSources]: Failed to update the data source bound to "${key}" during ${source} import; keeping the existing binding.`, { key, source, path }, diff --git a/packages/core/src/dom_components/types.ts b/packages/core/src/dom_components/types.ts index 2aee68209..885426a2a 100644 --- a/packages/core/src/dom_components/types.ts +++ b/packages/core/src/dom_components/types.ts @@ -13,7 +13,7 @@ import type { ComponentResizeEventStartProps, ComponentResizeEventUpdateProps, } from '../commands/view/Resize'; -import type { DataSourceImportSource } from '../data_sources/types'; +import type { DataBindingImportSource } from '../data_sources/types'; import type { StyleProps } from '../domain_abstract/model/StyleableModel'; import type Selector from '../selector_manager/model/Selector'; import type Component from './model/Component'; @@ -40,7 +40,7 @@ export interface SymbolInfo { export interface ParseStringOptions extends AddOptions, OptionAsDocument, WithHTMLParserOptions { keepIds?: string[]; cloneRules?: boolean; - parsedImportSource?: DataSourceImportSource; + parsedImportSource?: DataBindingImportSource; } export enum ComponentsEvents { diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 33b09aa2d..49098d19b 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -160,11 +160,11 @@ export type { ExpressionProps, } from './data_sources/model/conditional_variables/DataCondition'; export type { - DataSourceImportSource, - DataSourcePropertyAction, - DataSourcePropertyContext, - DataSourcePropertyHandler, - DataSourcePropertyKind, + DataBindingImportAction, + DataBindingImportContext, + DataBindingImportPolicy, + DataBindingImportSource, + DataBindingKind, } from './data_sources/types'; export default grapesjs; diff --git a/packages/core/test/specs/data_sources/import_policy.ts b/packages/core/test/specs/data_sources/import_policy.ts index 9699056bb..d5d589a8b 100644 --- a/packages/core/test/specs/data_sources/import_policy.ts +++ b/packages/core/test/specs/data_sources/import_policy.ts @@ -1,4 +1,4 @@ -import type { CssRule, DataSourcePropertyContext, Editor } from '../../../src'; +import type { CssRule, DataBindingImportContext, Editor } from '../../../src'; import type DataSourceManager from '../../../src/data_sources'; import { DataConditionType } from '../../../src/data_sources/model/conditional_variables/DataCondition'; import { StringOperation } from '../../../src/data_sources/model/conditional_variables/operators/StringOperator'; @@ -110,7 +110,7 @@ describe('Data source import policy', () => { test('skips static HTML updates and preserves existing bindings', () => { init({ - dataSources: { onDataSourceProperty: 'skip' }, + dataSources: { dataBindingImportPolicy: 'skip' }, }); addBaseDataSource(); const component = createBoundComponent(); @@ -130,7 +130,7 @@ describe('Data source import policy', () => { test('updates datasource values and keeps bindings on parsed HTML import', () => { init({ - dataSources: { onDataSourceProperty: 'update' }, + dataSources: { dataBindingImportPolicy: 'update' }, }); addBaseDataSource(); const component = createBoundComponent(); @@ -164,7 +164,7 @@ describe('Data source import policy', () => { test('skips static CSS updates and preserves existing rule bindings', () => { init({ - dataSources: { onDataSourceProperty: 'skip' }, + dataSources: { dataBindingImportPolicy: 'skip' }, }); addBaseDataSource(); const rule = createBoundRule(); @@ -181,7 +181,7 @@ describe('Data source import policy', () => { test('applies policy to parsed CSS string imports for existing rules', () => { init({ - dataSources: { onDataSourceProperty: 'update' }, + dataSources: { dataBindingImportPolicy: 'update' }, }); addBaseDataSource(); const rule = createBoundRule(); @@ -199,7 +199,7 @@ describe('Data source import policy', () => { test('supports callback policies per key and kind', () => { init({ dataSources: { - onDataSourceProperty: ({ key, kind, source }: DataSourcePropertyContext) => { + dataBindingImportPolicy: ({ key, kind, source }: DataBindingImportContext) => { if (source === 'html' && kind === 'attribute' && key === 'data-attr') { return 'skip'; } @@ -221,7 +221,7 @@ describe('Data source import policy', () => { test('keeps bindings and warns when update cannot write data-condition values', () => { init({ - dataSources: { onDataSourceProperty: 'update' }, + dataSources: { dataBindingImportPolicy: 'update' }, }); addBaseDataSource(); const warningSpy = jest.spyOn(em, 'logWarning'); @@ -244,7 +244,7 @@ describe('Data source import policy', () => { test('keeps bindings and warns when datasource updates fail', () => { init({ - dataSources: { onDataSourceProperty: 'update' }, + dataSources: { dataBindingImportPolicy: 'update' }, }); addBaseDataSource({ id: 'rec1', title: 'Initial Title', color: 'red', content: 'Dynamic Content', mutable: false }); const warningSpy = jest.spyOn(em, 'logWarning'); @@ -259,7 +259,7 @@ describe('Data source import policy', () => { test('does not change direct setter overwrite behavior', () => { init({ - dataSources: { onDataSourceProperty: 'skip' }, + dataSources: { dataBindingImportPolicy: 'skip' }, }); addBaseDataSource(); const component = createBoundComponent();