Changelog - 2026-11-04
ardor-react and ardor-admin no longer depend on lodash
EnhancementIn one line. @venizia/ardor-react and @venizia/ardor-admin used lodash for six small calls. Together those four modules (merge, omit, isEqual, isPlainObject) are about 10.3 KB brotli (31.9 KB minified) in an app bundle, and no size budget could see them. They are gone: the packages no longer list lodash or @types/lodash, and ARDOR adds about 220 B of its own code in their place.
What changed
omit(the list and read requests of the REST data provider, and the list filter) became rest destructuring. The two reads in the provider now share the onefilterthat is left, instead of omittingparamstwice.isPlainObject(the feature message keys) became a plaintypeofcheck.merge(feature messages, and the application's messages over them) became a small deep merge: a later source wins, plain objects merge recursively, an array or a string replaces, anundefinednever overwrites a value, and__proto__is dropped. The sources are not changed.isEqual(theuseDeepEqualSelectorthatSelectorHooks.create()returns) became a small deep comparison of primitives, plain objects, arrays and dates. Any other object, such as aMap, aSetor a class instance, is now equal only to itself, whereisEqualcompared it by content. Data a selector returns from a Redux store is plain, so a selector over state behaves as before.- Size.
@venizia/ardor-reactgrows by 143 B and@venizia/ardor-adminby 74 B, measured withsize-limitagainst the current develop. An app that did not already bundle those four lodash modules saves about 10.1 KB brotli.
Who is affected
- An app that imported
lodashand relied on ARDOR to install it. Addlodashto your ownpackage.json; ARDOR no longer brings it. - A
useDeepEqualSelectorselector that returns aMap, aSetor a class instance. It now re-renders whenever the instance changes, as the default selector does. Return plain data, or compare in the selector. - A message source that relied on
mergecombining arrays by index. An array in a later source now replaces the earlier one. Message bundles are strings and nested objects, so this does not arise in practice. - All other apps. No action needed.
See Hooks and Internationalization.