github rjsf-team/react-jsonschema-form v6.9.0
6.9.0

5 hours ago

Potentially breaking change: lodash and lodash-es are no longer dependencies of any @rjsf/* package. No RJSF public API changed, but an application that imports lodash itself without declaring it — relying on it being hoisted into node_modules because RJSF depended on it — must now add lodash to its own package.json.

@rjsf/antd

  • Updated CheckboxWidget to append a * onto the end of the label when the field is required AND the schema value is hardcoded to true, fixing #4136
  • Declared "sideEffects": false in package.json, allowing bundlers to tree-shake unused exports
  • Fixed BaseInputTemplate to clear number/integer fields back to undefined instead of null when the InputNumber widget is emptied, fixing #5213
  • Fixed BaseInputTemplate's ui:allowClearTextInputs clear button to store ui:emptyValue (undefined by default) instead of always storing "", so clicking it now behaves exactly like clearing the input by typing. Potentially breaking change: an app that never sets ui:emptyValue and clicks the clear button on a field (rather than backspacing it) previously got "" back; it now gets undefined, matching every other way of emptying the field.

@rjsf/chakra-ui

  • Updated CheckboxWidget to append a * onto the end of the label when the field is required AND the schema value is hardcoded to true, fixing #4136
  • Declared "sideEffects": false in package.json, allowing bundlers to tree-shake unused exports
  • Fixed BaseInputTemplate's ui:allowClearTextInputs clear button to store ui:emptyValue (undefined by default) instead of always storing "", so clicking it now behaves exactly like clearing the input by typing. Potentially breaking change: an app that never sets ui:emptyValue and clicks the clear button on a field (rather than backspacing it) previously got "" back; it now gets undefined, matching every other way of emptying the field.

@rjsf/core

  • Declared "sideEffects": false in package.json, allowing bundlers to tree-shake unused modules; a consumer importing only Form no longer bundles the AJV validator chain pulled in by getTestRegistry, shrinking a minimal bundle by ~34kB gzipped
  • Fixed TimeWidget to respect schema multipleOf time precision, preserving second-precision values while keeping minute-precision native inputs synchronized with their displayed value (#5174)
  • Replaced all path-based lodash usage (get, set, unset, toPath, pick) with the new @rjsf/utils path utilities
  • Replaced the remaining non-path lodash usage (isEmpty, isObject, isPlainObject, each, flatten, includes, intersection, last, uniqueId, noop) with native equivalents, and dropped the lodash/lodash-es dependencies 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 CheckboxWidget to append a * onto the end of the label when the field is required AND the schema value is hardcoded to true, fixing #4136
  • Renamed the test file Form.test.tsx to Form.behaviors.test.tsx so all the Form test files follow the Form.<topic>.test.tsx naming pattern introduced by #5219
  • Fixed ObjectField to coerce a cleared additionalProperties/patternProperties value 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's ui:allowClearTextInputs clear button to store ui:emptyValue (undefined by default) instead of always storing "", so clicking it now behaves exactly like clearing the input by typing. Potentially breaking change: an app that never sets ui:emptyValue and clicks the clear button on a field (rather than backspacing it) previously got "" back; it now gets undefined, matching every other way of emptying the field.

@rjsf/daisyui

  • Updated CheckboxWidget to append a * onto the end of the label when the field is required AND the schema value is hardcoded to true, fixing #4136
  • Declared "sideEffects": false in package.json, allowing bundlers to tree-shake unused exports
  • Removed the module-level Font Awesome library.add() call from AddButton; every icon is passed to FontAwesomeIcon as an imported icon object, so the global registry was never consulted
  • Registered ArrayFieldDescriptionTemplate and ArrayFieldTitleTemplate in generateTemplates(); ArrayFieldTemplate already looked these up from the registry, but since they were never registered, array titles/descriptions silently fell back to core's unstyled defaults instead of the DaisyUI-styled versions the theme ships
  • Added generateForm, generateTemplates, generateTheme and generateWidgets exports so lib/index.d.ts matches the other themes, and consolidated the duplicate daisyForm entry point into DaisyUIForm
  • Wired the previously-unused getDaisy()/DaisyProps helpers into FieldTemplate, so ui:options: { daisy: { theme, className, style } } now applies a per-field DaisyUI theme, class name and/or style
  • Fixed build:esm/build:umd in package.json, which built and named the bundle as @rjsf/chakra-ui (dist/chakra-ui.esm.js/.umd.js) instead of @rjsf/daisyui
  • Gave ArrayFieldTitleTemplate and ArrayFieldDescriptionTemplate the id (titleId/descriptionId derived from fieldPathId) and empty-value guard every other template implementing these has, and that registering them in generateTemplates() had otherwise dropped from array titles/descriptions
  • Fixed BaseInputTemplate's ui:allowClearTextInputs clear button to store ui:emptyValue (undefined by default) instead of always storing "", so clicking it now behaves exactly like clearing the input by typing. Potentially breaking change: an app that never sets ui:emptyValue and clicks the clear button on a field (rather than backspacing it) previously got "" back; it now gets undefined, matching every other way of emptying the field.

@rjsf/fluentui-rc

  • Updated CheckboxWidget to append a * onto the end of the label when the field is required AND the schema value is hardcoded to true, fixing #4136
  • Declared "sideEffects": false in package.json, allowing bundlers to tree-shake unused exports
  • Fixed BaseInputTemplate's ui:allowClearTextInputs clear button to store ui:emptyValue (undefined by default) instead of always storing "", so clicking it now behaves exactly like clearing the input by typing. Potentially breaking change: an app that never sets ui:emptyValue and clicks the clear button on a field (rather than backspacing it) previously got "" back; it now gets undefined, matching every other way of emptying the field.

@rjsf/mantine

  • Updated CheckboxWidget to append a * onto the end of the label when the field is required AND the schema value is hardcoded to true, fixing #4136
  • Declared "sideEffects": false in package.json, allowing bundlers to tree-shake unused exports
  • Moved the dayjs customParseFormat plugin registration from the widgets barrel file into DateTimeInput, so it loads with the date widgets that actually need it
  • Fixed BaseInputTemplate's ui:allowClearTextInputs clear button to store ui:emptyValue (undefined by default) instead of always storing "", so clicking it now behaves exactly like clearing the input by typing. Potentially breaking change: an app that never sets ui:emptyValue and clicks the clear button on a field (rather than backspacing it) previously got "" back; it now gets undefined, matching every other way of emptying the field.

@rjsf/mui

  • Updated CheckboxWidget to append a * onto the end of the label when the field is required AND the schema value is hardcoded to true, fixing #4136
  • Declared "sideEffects": false in package.json, allowing bundlers to tree-shake unused exports
  • Fixed BaseInputTemplate's ui:allowClearTextInputs clear button to store ui:emptyValue (undefined by default) instead of always storing "", so clicking it now behaves exactly like clearing the input by typing. Potentially breaking change: an app that never sets ui:emptyValue and clicks the clear button on a field (rather than backspacing it) previously got "" back; it now gets undefined, matching every other way of emptying the field.

@rjsf/primereact

  • Updated CheckboxWidget to append a * onto the end of the label when the field is required AND the schema value is hardcoded to true, fixing #4136
  • Declared "sideEffects": false in package.json, allowing bundlers to tree-shake unused exports
  • Fixed ArrayFieldTemplate leaking the errorSchema object into the DOM as an errorschema="[object Object]" attribute
  • Fixed SelectWidget clobbering a consumer-supplied options.prime.autoComplete with undefined when ui:autocomplete is not set
  • Fixed BaseInputTemplate's ui:allowClearTextInputs clear button to store ui:emptyValue (undefined by default) instead of always storing "", so clicking it now behaves exactly like clearing the input by typing. Potentially breaking change: an app that never sets ui:emptyValue and clicks the clear button on a field (rather than backspacing it) previously got "" back; it now gets undefined, matching every other way of emptying the field.

@rjsf/react-bootstrap

  • Updated CheckboxWidget to append a * onto the end of the label when the field is required AND the schema value is hardcoded to true, fixing #4136
  • Declared "sideEffects": false in package.json, allowing bundlers to tree-shake unused exports
  • Fixed BaseInputTemplate's ui:allowClearTextInputs clear button to store ui:emptyValue (undefined by default) instead of always storing "", so clicking it now behaves exactly like clearing the input by typing. Potentially breaking change: an app that never sets ui:emptyValue and clicks the clear button on a field (rather than backspacing it) previously got "" back; it now gets undefined, matching every other way of emptying the field.

@rjsf/semantic-ui

  • Updated CheckboxWidget to append a * onto the end of the label when the field is required AND the schema value is hardcoded to true, fixing #4136
  • Declared "sideEffects": false in package.json, allowing bundlers to tree-shake unused exports
  • Fixed RadioWidget forwarding the unsupported fluid/inverted props to Semantic UI's Radio, which triggered React unknown-attribute warnings
  • Fixed BaseInputTemplate's ui:allowClearTextInputs clear button to store ui:emptyValue (undefined by default) instead of always storing "", so clicking it now behaves exactly like clearing the input by typing. Potentially breaking change: an app that never sets ui:emptyValue and clicks the clear button on a field (rather than backspacing it) previously got "" back; it now gets undefined, matching every other way of emptying the field.

@rjsf/shadcn

  • Updated CheckboxWidget to append a * onto the end of the label when the field is required AND the schema value is hardcoded to true, fixing #4136
  • Declared "sideEffects": false in package.json, allowing bundlers to tree-shake unused exports
  • Fixed FancySelect showing a red error border on required empty enum fields before validation runs, fixing #5187 (#5209)
  • Fixed BaseInputTemplate's ui:allowClearTextInputs clear button to store ui:emptyValue (undefined by default) instead of always storing "", so clicking it now behaves exactly like clearing the input by typing. Potentially breaking change: an app that never sets ui:emptyValue and clicks the clear button on a field (rather than backspacing it) previously got "" back; it now gets undefined, 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 a dependencies subschema 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, unsetByPath and toPath, and switched all path-based lodash usage (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 via toPath(), and getByPath()/hasByPath() resolve own properties only (inherited members and prototype internals such as __proto__ never resolve)
  • Replaced the remaining non-path lodash usage (isEmpty, isObject, isPlainObject, difference, times, uniqueId, noop) with native equivalents, and dropped the lodash/lodash-es dependencies entirely
  • Added isPlainObject, the stricter counterpart to isObject() that excludes class instances, replacing lodash/isPlainObject for consumers
  • Added getPropertySchema(), which reads a property sub-schema out of a schema's properties, defaulting to an empty schema; it replaces the repeated (schema[PROPERTIES_KEY]?.[key] ?? {}) as S lookups in @rjsf/utils and @rjsf/core
  • Added noop(), a do-nothing function replacing lodash/noop for consumers
  • Added an optional deep flag to getChangedFields() 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 default is not present in the schema
  • Fixed omitExtraData() by removing the over-reaching additionalProperties: false post-processing block introduced in #5147 that incorrectly stripped keys written by winning oneOf/anyOf and if/then/else branches, fixing #5194
  • Declared "sideEffects": false in package.json, allowing bundlers to tree-shake unused exports
  • Sped up the test suite (~6.2s → ~2.7s) by defaulting to vitest's node environment; the few DOM-dependent test files opt back into jsdom with a @vitest-environment pragma, and the shared test setup skips its ResizeObserver mock when there is no window

@rjsf/validator-ajv8

  • Replaced all lodash/get usage with the new @rjsf/utils path utilities
  • Replaced lodash/isObject with isObject from @rjsf/utils and dropped the lodash/lodash-es dependencies entirely
  • Declared "sideEffects": false in package.json, allowing bundlers to tree-shake unused exports

@rjsf/validator-ata

  • Replaced all lodash/get usage with the new @rjsf/utils path utilities
  • Replaced lodash/isObject with isObject from @rjsf/utils and dropped the lodash/lodash-es dependencies entirely
  • Updated ata-validator dependency to ^1.7.1, picking up lazily materialized errors and the closure-tree interpreted engine (#5211)
  • Declared "sideEffects": false in package.json, allowing bundlers to tree-shake unused exports

@rjsf/validator-cfworker

  • Replaced all lodash/get usage with the new @rjsf/utils path utilities and dropped the lodash/lodash-es dependencies entirely
  • Declared "sideEffects": false in package.json, allowing bundlers to tree-shake unused exports

Dev / docs / playground

  • Removed the last lodash usage from the playground and the test suites, so no package declares lodash/lodash-es as a direct dependency any more (both remain in the lockfile as transitive dependencies of third-party tooling). The lodashReplacer tsc-alias machinery that rewrote lodash imports to lodash-es for the ESM builds has been deleted along with it
  • Cleaned up @rjsf/validator-ajv8's tests: the deliberately-triggered AJV console.warn output is now asserted with a shared expectWarn() helper instead of leaking into the test output
  • Added size-limit CI checks that enforce bundle size budgets for @rjsf/core, @rjsf/utils and @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 the StringField suite is no longer re-executed via cross-imports from the ArrayField/ObjectField suites (302 duplicate test executions removed)
  • Added knip and 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 setImmediate global, antd's MessageChannel global, chakra-ui's structuredClone JSON polyfill (native since Node 17), mantine's cleanSnapshotSerializer (a no-op on all current snapshots), and primereact's <style>-injection blocker
  • Upgraded the test tooling: @testing-library/jest-dom 6→7, jsdom 29→30, @testing-library/user-event to 14.6.6, vitest to 4.1.11, and declared the @testing-library/dom peer explicitly at the root. Self-anchored test selectors were rewritten to :scope to match jsdom 30's corrected element-scoped querySelectorAll behavior
  • Tests now resolve @rjsf/* workspace imports to TypeScript source via a custom @rjsf/source export condition (declared in a new shared testing/vitest.base.ts that every package's vitest config extends), so git clone && pnpm install && pnpm vitest run works with no build step and tests always exercise current source; a root vitest projects config 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 compile superSchema in memory via a small compileSuperSchema() helper, replacing the generated gitignored superSchema*.cjs fixtures and with them the compileSchemas npm script and the vitest globalSetup that regenerated them
  • Updated the emptyValue and allowClearTextInputs uiSchema docs to indicate relationship each other.

Don't miss a new react-jsonschema-form release

NewReleases is sending notifications on new releases.