Browse Source

Add support per-call dataBindingImportPolicy

data-source-import-policy
Artur Arseniev 7 months ago
parent
commit
99c3213889
  1. 11
      packages/core/src/css_composer/index.ts
  2. 2
      packages/core/src/dom_components/model/Components.ts
  3. 3
      packages/core/src/dom_components/model/ModelResolverWatcher.ts
  4. 3
      packages/core/src/dom_components/types.ts
  5. 40
      packages/core/test/specs/data_sources/dataBindingImportPolicy.ts

11
packages/core/src/css_composer/index.ts

@ -42,6 +42,7 @@ import { ObjectAny, PrevToNewIdMap } from '../common';
import { UpdateStyleOptions } from '../domain_abstract/model/StyleableModel'; import { UpdateStyleOptions } from '../domain_abstract/model/StyleableModel';
import { CssEvents } from './types'; import { CssEvents } from './types';
import CssRuleView from './view/CssRuleView'; import CssRuleView from './view/CssRuleView';
import type { DataBindingImportPolicy } from '../data_sources/types';
/** @private */ /** @private */
interface RuleOptions { interface RuleOptions {
@ -73,6 +74,12 @@ export interface GetSetRuleOptions extends UpdateStyleOptions {
type CssRuleStyle = Required<CssRuleProperties>['style']; type CssRuleStyle = Required<CssRuleProperties>['style'];
export interface AddCollectionOptions extends UpdateStyleOptions {
extend?: boolean | number;
avoidUpdateStyle?: boolean;
dataBindingImportPolicy?: DataBindingImportPolicy;
}
export default class CssComposer extends ItemManagerModule<CssComposerConfig & { pStylePrefix?: string }> { export default class CssComposer extends ItemManagerModule<CssComposerConfig & { pStylePrefix?: string }> {
classes = { classes = {
CssRule, CssRule,
@ -295,10 +302,10 @@ export default class CssComposer extends ItemManagerModule<CssComposerConfig & {
* @return {Array<Model>} * @return {Array<Model>}
* @private * @private
*/ */
addCollection(data: string | CssRuleJSON[], opts: Record<string, any> = {}, props = {}) { addCollection(data: string | CssRuleJSON[], opts: AddCollectionOptions = {}, props = {}) {
const { em } = this; const { em } = this;
const result: CssRule[] = []; const result: CssRule[] = [];
const parsedImportOpts = { parsedImportSource: 'css', ...opts }; const parsedImportOpts: AddCollectionOptions = { ...opts, parsedImportSource: 'css' as const };
if (isString(data)) { if (isString(data)) {
data = em.Parser.parseCss(data); data = em.Parser.parseCss(data);

2
packages/core/src/dom_components/model/Components.ts

@ -17,6 +17,7 @@ import ComponentText from './ComponentText';
import ComponentWrapper from './ComponentWrapper'; import ComponentWrapper from './ComponentWrapper';
import { ComponentsEvents, ParseStringOptions } from '../types'; import { ComponentsEvents, ParseStringOptions } from '../types';
import { isSymbolInstance, isSymbolRoot, updateSymbolComps } from './SymbolUtils'; import { isSymbolInstance, isSymbolRoot, updateSymbolComps } from './SymbolUtils';
import type { DataBindingImportPolicy } from '../../data_sources/types';
export interface ResetCommonUpdateProps { export interface ResetCommonUpdateProps {
component: Component; component: Component;
@ -27,6 +28,7 @@ export interface ResetCommonUpdateProps {
export interface ResetFromStringOptions { export interface ResetFromStringOptions {
visitedCmps?: Record<string, ComponentDefinitionDefined[]>; visitedCmps?: Record<string, ComponentDefinitionDefined[]>;
keepIds?: string[]; keepIds?: string[];
dataBindingImportPolicy?: DataBindingImportPolicy;
updateOptions?: { updateOptions?: {
onAttributes?: (props: ResetCommonUpdateProps & { attributes: Record<string, any> }) => void; onAttributes?: (props: ResetCommonUpdateProps & { attributes: Record<string, any> }) => void;
onStyle?: (props: ResetCommonUpdateProps & { style: Record<string, any> }) => void; onStyle?: (props: ResetCommonUpdateProps & { style: Record<string, any> }) => void;

3
packages/core/src/dom_components/model/ModelResolverWatcher.ts

@ -15,6 +15,7 @@ export interface DataWatchersOptions {
skipWatcherUpdates?: boolean; skipWatcherUpdates?: boolean;
fromDataSource?: boolean; fromDataSource?: boolean;
parsedImportSource?: DataBindingImportSource; parsedImportSource?: DataBindingImportSource;
dataBindingImportPolicy?: DataBindingImportPolicy;
} }
export interface ModelResolverWatcherOptions { export interface ModelResolverWatcherOptions {
@ -125,7 +126,7 @@ export class ModelResolverWatcher<T extends ObjectHash> {
private applyImportPolicy(values: ObjectAny | undefined, options: DataWatchersOptions = {}) { private applyImportPolicy(values: ObjectAny | undefined, options: DataWatchersOptions = {}) {
const { parsedImportSource } = options; const { parsedImportSource } = options;
const { dataBindingImportPolicy } = this.em.DataSources.config; const dataBindingImportPolicy = options.dataBindingImportPolicy ?? this.em.DataSources.config.dataBindingImportPolicy;
if (!values || !parsedImportSource || dataBindingImportPolicy === 'overwrite') return values; if (!values || !parsedImportSource || dataBindingImportPolicy === 'overwrite') return values;

3
packages/core/src/dom_components/types.ts

@ -13,7 +13,7 @@ import type {
ComponentResizeEventStartProps, ComponentResizeEventStartProps,
ComponentResizeEventUpdateProps, ComponentResizeEventUpdateProps,
} from '../commands/view/Resize'; } from '../commands/view/Resize';
import type { DataBindingImportSource } from '../data_sources/types'; import type { DataBindingImportPolicy, DataBindingImportSource } from '../data_sources/types';
import type { StyleProps } from '../domain_abstract/model/StyleableModel'; import type { StyleProps } from '../domain_abstract/model/StyleableModel';
import type Selector from '../selector_manager/model/Selector'; import type Selector from '../selector_manager/model/Selector';
import type Component from './model/Component'; import type Component from './model/Component';
@ -41,6 +41,7 @@ export interface ParseStringOptions extends AddOptions, OptionAsDocument, WithHT
keepIds?: string[]; keepIds?: string[];
cloneRules?: boolean; cloneRules?: boolean;
parsedImportSource?: DataBindingImportSource; parsedImportSource?: DataBindingImportSource;
dataBindingImportPolicy?: DataBindingImportPolicy;
} }
export enum ComponentsEvents { export enum ComponentsEvents {

40
packages/core/test/specs/data_sources/dataBindingImportPolicy.ts

@ -115,8 +115,9 @@ describe('Data source import policy', () => {
const importStaticHtml = ( const importStaticHtml = (
html = '<section id="bound-cmp" data-attr="Imported Title" style="color: green;">Imported</section>', html = '<section id="bound-cmp" data-attr="Imported Title" style="color: green;">Imported</section>',
opts = {},
) => { ) => {
cmpRoot.components().resetFromString(html); cmpRoot.components().resetFromString(html, opts);
}; };
const createBoundRule = () => { const createBoundRule = () => {
@ -132,8 +133,8 @@ describe('Data source import policy', () => {
])[0] as CssRule; ])[0] as CssRule;
}; };
const importStaticCss = (css = '.bound-rule { color: green; }') => { const importStaticCss = (css = '.bound-rule { color: green; }', opts = {}) => {
em.Css.addCollection(css, { extend: 1 }); em.Css.addCollection(css, { extend: 1, ...opts });
}; };
const expectUntouchedComponentValues = ( const expectUntouchedComponentValues = (
@ -366,6 +367,39 @@ describe('Data source import policy', () => {
expectUntouchedComponentValues(component); expectUntouchedComponentValues(component);
}); });
test('supports per-call override on parsed HTML import', () => {
init({
dataSources: { dataBindingImportPolicy: 'skip' },
});
addBaseDataSource();
const component = createBoundComponent();
importStaticHtml(undefined, { dataBindingImportPolicy: 'update' });
expect(dsm.getValue('records.rec1.tagName')).toBe('section');
expect(dsm.getValue('records.rec1.title')).toBe('Imported Title');
expect(dsm.getValue('records.rec1.color')).toBe('green');
expect(component.get('tagName', { skipResolve: true })).toEqual(makeTagNameVar());
expect(component.get('tagName')).toBe('section');
expect(component.getAttributes({ skipResolve: true })['data-attr']).toEqual(makeTitleVar());
expect(component.getStyle({ skipResolve: true }).color).toEqual(makeColorVar());
});
test('supports per-call override on parsed CSS import', () => {
init({
dataSources: { dataBindingImportPolicy: 'skip' },
});
addBaseDataSource();
const rule = createBoundRule();
importStaticCss(undefined, { dataBindingImportPolicy: 'update' });
expect(dsm.getValue('records.rec1.color')).toBe('green');
expect(rule.getStyle('', { skipResolve: true }).color).toEqual(makeColorVar());
expect(rule.getStyle().color).toBe('green');
expectUntouchedRuleValues(rule);
});
test('keeps bindings and warns when update cannot write data-condition values', () => { test('keeps bindings and warns when update cannot write data-condition values', () => {
init({ init({
dataSources: { dataBindingImportPolicy: 'update' }, dataSources: { dataBindingImportPolicy: 'update' },

Loading…
Cancel
Save