Potentially breaking change:
lodashandlodash-esare no longer dependencies of any@rjsf/*package. No RJSF public API changed, but an application that importslodashitself without declaring it — relying on it being hoisted intonode_modulesbecause RJSF depended on it — must now addlodashto its ownpackage.json.
@rjsf/antd
- Updated
CheckboxWidgetto append a*onto the end of the label when the field is required AND the schema value is hardcoded totrue, fixing #4136 - Declared
"sideEffects": falseinpackage.json, allowing bundlers to tree-shake unused exports - Fixed
BaseInputTemplateto clearnumber/integerfields back toundefinedinstead ofnullwhen theInputNumberwidget is emptied, fixing #5213 - Fixed
BaseInputTemplate'sui:allowClearTextInputsclear button to storeui:emptyValue(undefinedby default) instead of always storing"", so clicking it now behaves exactly like clearing the input by typing. Potentially breaking change: an app that never setsui:emptyValueand clicks the clear button on a field (rather than backspacing it) previously got""back; it now getsundefined, matching every other way of emptying the field.
@rjsf/chakra-ui
- Updated
CheckboxWidgetto append a*onto the end of the label when the field is required AND the schema value is hardcoded totrue, fixing #4136 - Declared
"sideEffects": falseinpackage.json, allowing bundlers to tree-shake unused exports - Fixed
BaseInputTemplate'sui:allowClearTextInputsclear button to storeui:emptyValue(undefinedby default) instead of always storing"", so clicking it now behaves exactly like clearing the input by typing. Potentially breaking change: an app that never setsui:emptyValueand clicks the clear button on a field (rather than backspacing it) previously got""back; it now getsundefined, matching every other way of emptying the field.
@rjsf/core
- Declared
"sideEffects": falseinpackage.json, allowing bundlers to tree-shake unused modules; a consumer importing onlyFormno longer bundles the AJV validator chain pulled in bygetTestRegistry, shrinking a minimal bundle by ~34kB gzipped - Fixed
TimeWidgetto respect schemamultipleOftime precision, preserving second-precision values while keeping minute-precision native inputs synchronized with their displayed value (#5174) - Replaced all path-based
lodashusage (get,set,unset,toPath,pick) with the new@rjsf/utilspath utilities - Replaced the remaining non-path
lodashusage (isEmpty,isObject,isPlainObject,each,flatten,includes,intersection,last,uniqueId,noop) with native equivalents, and dropped thelodash/lodash-esdependencies entirely - Fixed the clearing of errors on change so that only the field that actually changed loses its error, along with the errors the containers holding it own, rather than every field under the top-level key holding it, fixing #5197 (#5205)
- Updated
CheckboxWidgetto append a*onto the end of the label when the field is required AND the schema value is hardcoded totrue, fixing #4136 - Renamed the test file
Form.test.tsxtoForm.behaviors.test.tsxso all theFormtest files follow theForm.<topic>.test.tsxnaming pattern introduced by #5219 - Fixed
ObjectFieldto coerce a clearedadditionalProperties/patternPropertiesvalue to the empty string only when the change targets the additional property's own path, so clearing a field nested inside an entry now omits that field's key instead of storing""in it, fixing #5222 - Fixed
BaseInputTemplate'sui:allowClearTextInputsclear button to storeui:emptyValue(undefinedby default) instead of always storing"", so clicking it now behaves exactly like clearing the input by typing. Potentially breaking change: an app that never setsui:emptyValueand clicks the clear button on a field (rather than backspacing it) previously got""back; it now getsundefined, matching every other way of emptying the field.
@rjsf/daisyui
- Updated
CheckboxWidgetto append a*onto the end of the label when the field is required AND the schema value is hardcoded totrue, fixing #4136 - Declared
"sideEffects": falseinpackage.json, allowing bundlers to tree-shake unused exports - Removed the module-level Font Awesome
library.add()call fromAddButton; every icon is passed toFontAwesomeIconas an imported icon object, so the global registry was never consulted - Registered
ArrayFieldDescriptionTemplateandArrayFieldTitleTemplateingenerateTemplates();ArrayFieldTemplatealready looked these up from the registry, but since they were never registered, array titles/descriptions silently fell back tocore's unstyled defaults instead of the DaisyUI-styled versions the theme ships - Added
generateForm,generateTemplates,generateThemeandgenerateWidgetsexports solib/index.d.tsmatches the other themes, and consolidated the duplicatedaisyFormentry point intoDaisyUIForm - Wired the previously-unused
getDaisy()/DaisyPropshelpers intoFieldTemplate, soui:options: { daisy: { theme, className, style } }now applies a per-field DaisyUI theme, class name and/or style - Fixed
build:esm/build:umdinpackage.json, which built and named the bundle as@rjsf/chakra-ui(dist/chakra-ui.esm.js/.umd.js) instead of@rjsf/daisyui - Gave
ArrayFieldTitleTemplateandArrayFieldDescriptionTemplatetheid(titleId/descriptionIdderived fromfieldPathId) and empty-value guard every other template implementing these has, and that registering them ingenerateTemplates()had otherwise dropped from array titles/descriptions - Fixed
BaseInputTemplate'sui:allowClearTextInputsclear button to storeui:emptyValue(undefinedby default) instead of always storing"", so clicking it now behaves exactly like clearing the input by typing. Potentially breaking change: an app that never setsui:emptyValueand clicks the clear button on a field (rather than backspacing it) previously got""back; it now getsundefined, matching every other way of emptying the field.
@rjsf/fluentui-rc
- Updated
CheckboxWidgetto append a*onto the end of the label when the field is required AND the schema value is hardcoded totrue, fixing #4136 - Declared
"sideEffects": falseinpackage.json, allowing bundlers to tree-shake unused exports - Fixed
BaseInputTemplate'sui:allowClearTextInputsclear button to storeui:emptyValue(undefinedby default) instead of always storing"", so clicking it now behaves exactly like clearing the input by typing. Potentially breaking change: an app that never setsui:emptyValueand clicks the clear button on a field (rather than backspacing it) previously got""back; it now getsundefined, matching every other way of emptying the field.
@rjsf/mantine
- Updated
CheckboxWidgetto append a*onto the end of the label when the field is required AND the schema value is hardcoded totrue, fixing #4136 - Declared
"sideEffects": falseinpackage.json, allowing bundlers to tree-shake unused exports - Moved the
dayjscustomParseFormatplugin registration from the widgets barrel file intoDateTimeInput, so it loads with the date widgets that actually need it - Fixed
BaseInputTemplate'sui:allowClearTextInputsclear button to storeui:emptyValue(undefinedby default) instead of always storing"", so clicking it now behaves exactly like clearing the input by typing. Potentially breaking change: an app that never setsui:emptyValueand clicks the clear button on a field (rather than backspacing it) previously got""back; it now getsundefined, matching every other way of emptying the field.
@rjsf/mui
- Updated
CheckboxWidgetto append a*onto the end of the label when the field is required AND the schema value is hardcoded totrue, fixing #4136 - Declared
"sideEffects": falseinpackage.json, allowing bundlers to tree-shake unused exports - Fixed
BaseInputTemplate'sui:allowClearTextInputsclear button to storeui:emptyValue(undefinedby default) instead of always storing"", so clicking it now behaves exactly like clearing the input by typing. Potentially breaking change: an app that never setsui:emptyValueand clicks the clear button on a field (rather than backspacing it) previously got""back; it now getsundefined, matching every other way of emptying the field.
@rjsf/primereact
- Updated
CheckboxWidgetto append a*onto the end of the label when the field is required AND the schema value is hardcoded totrue, fixing #4136 - Declared
"sideEffects": falseinpackage.json, allowing bundlers to tree-shake unused exports - Fixed
ArrayFieldTemplateleaking theerrorSchemaobject into the DOM as anerrorschema="[object Object]"attribute - Fixed
SelectWidgetclobbering a consumer-suppliedoptions.prime.autoCompletewithundefinedwhenui:autocompleteis not set - Fixed
BaseInputTemplate'sui:allowClearTextInputsclear button to storeui:emptyValue(undefinedby default) instead of always storing"", so clicking it now behaves exactly like clearing the input by typing. Potentially breaking change: an app that never setsui:emptyValueand clicks the clear button on a field (rather than backspacing it) previously got""back; it now getsundefined, matching every other way of emptying the field.
@rjsf/react-bootstrap
- Updated
CheckboxWidgetto append a*onto the end of the label when the field is required AND the schema value is hardcoded totrue, fixing #4136 - Declared
"sideEffects": falseinpackage.json, allowing bundlers to tree-shake unused exports - Fixed
BaseInputTemplate'sui:allowClearTextInputsclear button to storeui:emptyValue(undefinedby default) instead of always storing"", so clicking it now behaves exactly like clearing the input by typing. Potentially breaking change: an app that never setsui:emptyValueand clicks the clear button on a field (rather than backspacing it) previously got""back; it now getsundefined, matching every other way of emptying the field.
@rjsf/semantic-ui
- Updated
CheckboxWidgetto append a*onto the end of the label when the field is required AND the schema value is hardcoded totrue, fixing #4136 - Declared
"sideEffects": falseinpackage.json, allowing bundlers to tree-shake unused exports - Fixed
RadioWidgetforwarding the unsupportedfluid/invertedprops to Semantic UI'sRadio, which triggered React unknown-attribute warnings - Fixed
BaseInputTemplate'sui:allowClearTextInputsclear button to storeui:emptyValue(undefinedby default) instead of always storing"", so clicking it now behaves exactly like clearing the input by typing. Potentially breaking change: an app that never setsui:emptyValueand clicks the clear button on a field (rather than backspacing it) previously got""back; it now getsundefined, matching every other way of emptying the field.
@rjsf/shadcn
- Updated
CheckboxWidgetto append a*onto the end of the label when the field is required AND the schema value is hardcoded totrue, fixing #4136 - Declared
"sideEffects": falseinpackage.json, allowing bundlers to tree-shake unused exports - Fixed
FancySelectshowing a red error border on required empty enum fields before validation runs, fixing #5187 (#5209) - Fixed
BaseInputTemplate'sui:allowClearTextInputsclear button to storeui:emptyValue(undefinedby default) instead of always storing"", so clicking it now behaves exactly like clearing the input by typing. Potentially breaking change: an app that never setsui:emptyValueand clicks the clear button on a field (rather than backspacing it) previously got""back; it now getsundefined, matching every other way of emptying the field.
@rjsf/utils
- Fixed
mergeDefaultsWithFormData()to take the recursive path when the default under an object key holds an array, so a default that lives inside adependenciessubschema is no longer dropped when the owning array sits more than one object below the root, fixing part of #5198 (#5202) - Added new path utilities
getByPath,setByPath,hasByPath,unsetByPathandtoPath, and switched all path-basedlodashusage (get,set,setWith,has,unset,toPath,pick) over to them. Unlike their lodash counterparts, these treat a bare string as a single literal key, lodash-style dotted path strings are parsed explicitly viatoPath(), andgetByPath()/hasByPath()resolve own properties only (inherited members and prototype internals such as__proto__never resolve) - Replaced the remaining non-path
lodashusage (isEmpty,isObject,isPlainObject,difference,times,uniqueId,noop) with native equivalents, and dropped thelodash/lodash-esdependencies entirely - Added
isPlainObject, the stricter counterpart toisObject()that excludes class instances, replacinglodash/isPlainObjectfor consumers - Added
getPropertySchema(), which reads a property sub-schema out of a schema'sproperties, defaulting to an empty schema; it replaces the repeated(schema[PROPERTIES_KEY]?.[key] ?? {}) as Slookups in@rjsf/utilsand@rjsf/core - Added
noop(), a do-nothing function replacinglodash/noopfor consumers - Added an optional
deepflag togetChangedFields()that descends into nested objects and same-length arrays and returns the dotted path of the field that changed (#5205) - Made the default value of a required boolean field be false if a
defaultis not present in the schema - Fixed
omitExtraData()by removing the over-reachingadditionalProperties: falsepost-processing block introduced in #5147 that incorrectly stripped keys written by winningoneOf/anyOfandif/then/elsebranches, fixing #5194 - Declared
"sideEffects": falseinpackage.json, allowing bundlers to tree-shake unused exports - Sped up the test suite (~6.2s → ~2.7s) by defaulting to vitest's
nodeenvironment; the few DOM-dependent test files opt back into jsdom with a@vitest-environmentpragma, and the shared test setup skips its ResizeObserver mock when there is nowindow
@rjsf/validator-ajv8
- Replaced all
lodash/getusage with the new@rjsf/utilspath utilities - Replaced
lodash/isObjectwithisObjectfrom@rjsf/utilsand dropped thelodash/lodash-esdependencies entirely - Declared
"sideEffects": falseinpackage.json, allowing bundlers to tree-shake unused exports
@rjsf/validator-ata
- Replaced all
lodash/getusage with the new@rjsf/utilspath utilities - Replaced
lodash/isObjectwithisObjectfrom@rjsf/utilsand dropped thelodash/lodash-esdependencies entirely - Updated
ata-validatordependency to^1.7.1, picking up lazily materialized errors and the closure-tree interpreted engine (#5211) - Declared
"sideEffects": falseinpackage.json, allowing bundlers to tree-shake unused exports
@rjsf/validator-cfworker
- Replaced all
lodash/getusage with the new@rjsf/utilspath utilities and dropped thelodash/lodash-esdependencies entirely - Declared
"sideEffects": falseinpackage.json, allowing bundlers to tree-shake unused exports
Dev / docs / playground
- Removed the last
lodashusage from the playground and the test suites, so no package declareslodash/lodash-esas a direct dependency any more (both remain in the lockfile as transitive dependencies of third-party tooling). ThelodashReplacertsc-aliasmachinery that rewrotelodashimports tolodash-esfor the ESM builds has been deleted along with it - Cleaned up
@rjsf/validator-ajv8's tests: the deliberately-triggered AJVconsole.warnoutput is now asserted with a sharedexpectWarn()helper instead of leaking into the test output - Added
size-limitCI checks that enforce bundle size budgets for@rjsf/core,@rjsf/utilsand@rjsf/validator-ajv8— each measured both with and without its runtime dependencies, plus single-export tree-shaking canaries — and comment the size diff versus the base branch on every PR - Restructured
@rjsf/core's test suite for speed: the "Form common" suite was split by topic into six test files so vitest can parallelize them, and theStringFieldsuite is no longer re-executed via cross-imports from theArrayField/ObjectFieldsuites (302 duplicate test executions removed) - Added
knipand removed the unused code, exports and dependencies it reported (#5194) - Removed test-setup shims that empirically no longer do anything (each verified by deleting it and running the package's suite): core's
setImmediateglobal, antd'sMessageChannelglobal, chakra-ui'sstructuredCloneJSON polyfill (native since Node 17), mantine'scleanSnapshotSerializer(a no-op on all current snapshots), and primereact's<style>-injection blocker - Upgraded the test tooling:
@testing-library/jest-dom6→7,jsdom29→30,@testing-library/user-eventto 14.6.6,vitestto 4.1.11, and declared the@testing-library/dompeer explicitly at the root. Self-anchored test selectors were rewritten to:scopeto match jsdom 30's corrected element-scopedquerySelectorAllbehavior - Tests now resolve
@rjsf/*workspace imports to TypeScript source via a custom@rjsf/sourceexport condition (declared in a new sharedtesting/vitest.base.tsthat every package's vitest config extends), sogit clone && pnpm install && pnpm vitest runworks with no build step and tests always exercise current source; a root vitestprojectsconfig also lets vitest run across every package from the repo root, while the nx-driven test scripts remain unchanged - Simplified
@rjsf/validator-ajv8's precompiled-validator test harness: the tests now compilesuperSchemain memory via a smallcompileSuperSchema()helper, replacing the generated gitignoredsuperSchema*.cjsfixtures and with them thecompileSchemasnpm script and the vitestglobalSetupthat regenerated them - Updated the
emptyValueandallowClearTextInputsuiSchema docs to indicate relationship each other.