Skip to content

Commit

Permalink
allow orderind
Browse files Browse the repository at this point in the history
  • Loading branch information
therohk committed Aug 30, 2024
1 parent 108041c commit 8cde665
Show file tree
Hide file tree
Showing 4 changed files with 39 additions and 20 deletions.
11 changes: 6 additions & 5 deletions src/diff-high.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,8 @@ export function deepDiffFlat(
}
const updated = Object.assign({}, oldFlat);
const removed = Object.assign({}, newFlat);
//delete the unUpdated keys
for (let key of Object.keys(newFlat)) {
//delete the unchanged keys
for (const key of Object.keys(newFlat)) {
if (newFlat[key] === oldFlat[key]) {
delete updated[key];
delete removed[key];
Expand All @@ -24,10 +24,11 @@ export function deepDiffFlat(
}

export function deepDiffTyped<T>(
lhsObj: T,
rhsObj: T,
lhsObj: T, //target
rhsObj: T, //source
orderInd: boolean = false,
): Partial<T> {
const differences = deepDiffLow(lhsObj, rhsObj);
const differences = deepDiffLow(lhsObj, rhsObj, orderInd);
const deltaObj: Partial<T> = {};
if (!differences) {
return deltaObj;
Expand Down
34 changes: 28 additions & 6 deletions src/merge-conf.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { isArrayOfAny, emptyObject, isNullish, isObject, isString } from "./type-utils";
import { isArrayOfAny, emptyObject, isNullish, isObject, isString, TupleObj } from "./type-utils";
import { createGlobRegex, deepClone, getObjectKeys } from "./datum-utils";
import { deepDiffTyped } from "./diff-high";
import { UpdateCode, mergeScalarField, mergeVectorField } from "./merge-low";
import { MergeTuple } from "./merge-high";
import { updateCodeInfo } from "./merge-high";

export type DetailConfig = {
[key: string]: UpdateCode | DetailConfig;
Expand All @@ -12,7 +12,7 @@ export type MergeConfig = {
scalar?: UpdateCode, //default
vector?: UpdateCode, //array types
nested?: UpdateCode, //object types
[key: string]: UpdateCode | MergeConfig | undefined,
[glob: string]: UpdateCode | MergeConfig | undefined,
};

//-----------------------------------------------------------------------------
Expand Down Expand Up @@ -68,13 +68,35 @@ export function immutableDetailMerge(
return targetCopy;
}

/**
* @returns list of mergeable keys for given config
*/
export function selectDetailKeys(
obj: any,
mergeCodes: DetailConfig,
excludeKeys?: string[],
): string[] {
const includeKeys: string[] = [];
if (!obj || !mergeCodes) {
return includeKeys;
}
for (const label of getObjectKeys(obj, excludeKeys)) {
const labelConf = mergeCodes[label];
if (isString(labelConf) && updateCodeInfo(labelConf).enable)
includeKeys.push(label);
if (isObject(labelConf) && !emptyObject(labelConf))
includeKeys.push(label);
}
return includeKeys;
}

//-----------------------------------------------------------------------------

/**
* merge structured data and return diff
* @returns diff or false
* @returns diff or false if no changes
*/
export function customMerge<T extends MergeTuple>(
export function customMerge<T extends TupleObj>(
target: T,
source: Partial<T>,
mergeConf: MergeConfig | UpdateCode,
Expand All @@ -99,7 +121,7 @@ export function customMerge<T extends MergeTuple>(
}
const targetBkp: T = deepClone(target);
const changed = detailMerge(target, source, mergeCodes);
const delta = deepDiffTyped<T>(targetBkp, target);
const delta = deepDiffTyped<T>(targetBkp, target, true);
if (changed || !emptyObject(delta)) {
return delta;
}
Expand Down
6 changes: 1 addition & 5 deletions src/merge-high.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,7 @@ import { deepClone, getObjectKeys } from "./datum-utils";
import { deepDiffTyped } from "./diff-high";
import { UpdateCode, mergeScalarField, mergeVectorField } from "./merge-low";

export type MergeTypes = string[] | number[] | string | number | boolean;
export type MergeSafeTuple = { [label: string]: MergeTypes };
export type MergeTuple = { [label: string]: any };
export type MergeCode = `${UpdateCode}`;

export type MergePerms = {
enable: boolean;
insert?: boolean;
Expand Down Expand Up @@ -108,7 +104,7 @@ export function immutableMerge(
/**
* simulated diff generated by shallow merge
* target object is not modified
* @returns diff or false
* @returns diff or false if no changes
*/
export function diffFromMerge(
target: any,
Expand Down
8 changes: 4 additions & 4 deletions src/type-utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,10 @@ export type ObjectKeys<T> = keyof T;
export type ObjectVals<T> = T[keyof T];
export type Prettify<T> = { [K in keyof T]: T[K]; } & {};

export type SafeTypes = Primitive | VectorArray;
export type SafeTupleObj = { [label: string]: SafeTypes };
export type TupleObj = { [label: string]: any };

export function isString(value: any): value is string {
return typeof value === 'string';
}
Expand Down Expand Up @@ -40,10 +44,6 @@ export function integerString(str: string): boolean {
&& Number.isSafeInteger(Number(str.toString())));
}

export function isRegExp(value: any): value is RegExp {
return value instanceof RegExp;
}

export function isObject(value: any): value is object {
return typeof value === 'object'
&& !Array.isArray(value)
Expand Down

0 comments on commit 8cde665

Please sign in to comment.