Skip to content

Changelog - 2026-09-17 ​

No IGNIS package depends on lodash ​

Fix
FunctionCall sitesReplaced by
isEmpty20isEmpty in @venizia/ignis-inversion
omit8omit in @venizia/ignis-inversion
get1plain indexing - the key came from Object.keys, never a path
set1plain assignment - drizzle's columns is a flat map
round1a local exponent-shift round

Both shared functions are re-exported from @venizia/ignis-helpers/common, so nothing outside inversion imports them by a new path.

isEmpty is not !value, and that is the whole point ​

ts
isEmpty({ value: {} });   // true
!{};                      // false

Three cases were actual mismatches while writing it, each kept as a test:

  • An empty object. A falsy check calls it non-empty and takes the other branch. Twenty call sites were swapped; two of them pass an object.
  • An inherited key. for...in walks the prototype chain, so Object.create({ a: 1 }) looked non-empty.
  • { length: 0 }. Duck-typing on .length calls it empty. It is not - it has an own key.

The implementation was diffed against lodash across 40 values before any call site changed: strings, arrays, typed arrays, Map, Set, Date, RegExp, functions, class instances, symbols, bigints, Buffer, ArrayBuffer, Promise, WeakMap. Zero disagreements.

round has one deliberate difference: a result of negative zero is normalised to 0. Checked across 114 value/precision pairs, the sign of zero was the only disagreement, and -0 === 0 is true while both stringify and serialise identically.

Measured ​

EntryBeforeAfter
@venizia/ignis-helpers/core20.8 KB gzipped17.2 KB
@venizia/ignis-kernel/metadata14.9 KB14.0 KB

A guard test fails if lodash reaches the container, the metadata entry or the utilities barrel. One import isEmpty from 'lodash/isEmpty' brings the whole library back, and nothing else in the build would notice.

Who is affected ​

Nobody, at the API. Same behaviour, same exports. isEmpty and omit are now available from @venizia/ignis-helpers/common if you want them.

Files: