Skip to content

Commit d8b7182

Browse files
committed
fix: {} not being treated as no-op
1 parent 79683e1 commit d8b7182

1 file changed

Lines changed: 10 additions & 3 deletions

File tree

‎src/plan/change-set.ts‎

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -154,13 +154,13 @@ export class ChangeSet<T extends StringIndexedObject> {
154154
): ParameterChange<T>[] {
155155
const parameterChangeSet = new Array<ParameterChange<T>>();
156156

157-
// Filter out null and undefined values or else the diff below will not work
157+
// Filter out null, undefined, [], and {} — all treated as "no value"
158158
const desired = Object.fromEntries(
159-
Object.entries(desiredParameters).filter(([, v]) => v !== null && v !== undefined)
159+
Object.entries(desiredParameters).filter(([, v]) => !ChangeSet.isAbsent(v))
160160
) as Partial<T>
161161

162162
const current = Object.fromEntries(
163-
Object.entries(currentParameters).filter(([, v]) => v !== null && v !== undefined)
163+
Object.entries(currentParameters).filter(([, v]) => !ChangeSet.isAbsent(v))
164164
) as Partial<T>
165165

166166
for (const k of new Set([...Object.keys(current), ...Object.keys(desired)])) {
@@ -227,6 +227,13 @@ export class ChangeSet<T extends StringIndexedObject> {
227227
return orderOfOperations[Math.max(indexPrev, indexNext)];
228228
}
229229

230+
private static isAbsent(v: unknown): boolean {
231+
if (v === null || v === undefined) return true;
232+
if (Array.isArray(v)) return v.length === 0;
233+
if (typeof v === 'object') return Object.keys(v as object).length === 0;
234+
return false;
235+
}
236+
230237
private static isSame(
231238
desired: unknown,
232239
current: unknown,

0 commit comments

Comments
 (0)