Skip to content

Commit

Permalink
fix: don't overwrite overrides' fields with wrong fields overrides
Browse files Browse the repository at this point in the history
Co-Authored-By: Maxime Da Silva <maximed@poool.fr>
  • Loading branch information
dackmin and maximedasilva committed Sep 27, 2024
1 parent f8fb5f8 commit e06e129
Show file tree
Hide file tree
Showing 7 changed files with 43 additions and 49 deletions.
12 changes: 3 additions & 9 deletions packages/core/lib/Overrides/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import {
FieldOverride,
SettingOverride,
} from '../classes';
import { assignDefined } from '../utils';
import Emitter from '../Emitter';
import Builder from '../Builder';

Expand Down Expand Up @@ -178,15 +179,8 @@ export default class Overrides extends Emitter implements IOverrides {
merge (
overrides: Array<ComponentOverride | FieldOverride | SettingOverride>
): FieldOverride | ComponentOverride | SettingOverride {
return overrides.reduce((res, override) => {
Object.keys(override).forEach((key: string) => {
if (
(override as any)[key] === null ||
(override as any)[key as any] === undefined) {
delete (override as any)[key];
}
});
Object.assign(res, override);
return overrides.reverse().reduce((res, override) => {
assignDefined(res, override.toObject?.());

return res;
}, {} as FieldOverride | ComponentOverride | SettingOverride);
Expand Down
8 changes: 4 additions & 4 deletions packages/core/lib/classes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -178,7 +178,7 @@ export class Override {
export class ComponentOverride extends Override {
id: string;
targets: string[];
fields: ComponentSettingsFieldObject[];
fields?: ComponentSettingsFieldObject[];
render: ComponentOverrideObject['render'];
construct: (
opts: { builder: Builder, baseElement?: ElementObject }
Expand All @@ -198,7 +198,7 @@ export class ComponentOverride extends Override {
this.type = 'component';
this.id = props.id;
this.targets = props.targets || [];
this.fields = props.fields || [];
this.fields = props.fields;
this.render = props.render;
this.sanitize = props.sanitize;
this.construct = props.construct;
Expand Down Expand Up @@ -277,7 +277,7 @@ export class SettingOverride extends Override {
valueType: string;
condition: SettingOverrideObject['condition'];
priority: number;
fields: ComponentSettingsFieldObject[];
fields?: ComponentSettingsFieldObject[];
props: object;
info: string | GetTextCallback;

Expand All @@ -299,7 +299,7 @@ export class SettingOverride extends Override {
this.condition = props.condition;
this.priority = props.priority;
this.info = props.info;
this.fields = props.fields || [];
this.fields = props.fields;
this.props = props.props;
}

Expand Down
1 change: 1 addition & 0 deletions packages/core/lib/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,6 @@ export { default as Builder } from './Builder';

export * from './addons';
export * from './classes';
export * from './utils';

export type * from './types';
19 changes: 19 additions & 0 deletions packages/core/lib/utils.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
export function assignDefined<T extends any> (
target: T,
...sources: Array<any>
): T {
for (const source of sources) {
if (!source) {
continue;
}

for (const key in source) {
if (typeof source[key] !== 'undefined') {
// @ts-ignore it's obviously any
target[key] = source[key];
}
}
}

return target;
}
14 changes: 7 additions & 7 deletions packages/react/lib/DisplayableSettings/Property.tsx
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
import { type ComponentPropsWithoutRef, useMemo } from 'react';
import type {
ComponentOverride,
ComponentOverrideObject,
ComponentSettingsFieldObject,
ComponentSettingsFieldOptionObject,
ElementObject,
import {
type ComponentOverride,
type ComponentOverrideObject,
type ComponentSettingsFieldObject,
type ComponentSettingsFieldOptionObject,
type ElementObject,
assignDefined,
} from '@oakjs/core';
import { get, classNames } from '@junipero/react';

import { assignDefined } from '../utils';
import Text from '../Text';

interface PropertyProps extends ComponentPropsWithoutRef<'span'> {
Expand Down
18 changes: 9 additions & 9 deletions packages/react/lib/Editable/Field.tsx
Original file line number Diff line number Diff line change
@@ -1,22 +1,22 @@
import type {
ComponentObject,
ComponentSettingsFieldObject,
ElementObject,
FieldObject,
FieldOverride,
SettingOverride,
} from '@oakjs/core';
import type {
SpecialComponentPropsWithoutRef,
} from '@junipero/react';
import {
type MutableRefObject,
useMemo,
} from 'react';
import {
type ComponentObject,
type ComponentSettingsFieldObject,
type ElementObject,
type FieldObject,
type FieldOverride,
type SettingOverride,
assignDefined,
} from '@oakjs/core';

import type { EditableRef } from './index';
import { useBuilder } from '../hooks';
import { assignDefined } from '../utils';

export interface FieldProps extends SpecialComponentPropsWithoutRef {
setting: ComponentSettingsFieldObject;
Expand Down
20 changes: 0 additions & 20 deletions packages/react/lib/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,23 +24,3 @@ export const sanitizeHTML = (content: string) => {
return '';
}
};

export function assignDefined<T extends any> (
target: T,
...sources: Array<any>
): T {
for (const source of sources) {
if (!source) {
continue;
}

for (const key in source) {
if (typeof source[key] !== 'undefined') {
// @ts-ignore it's obviously any
target[key] = source[key];
}
}
}

return target;
}

0 comments on commit e06e129

Please sign in to comment.