Stability and versioning
react-dockable-desktop follows Semantic Versioning. This page says exactly what that promises: what counts as the public API, what each kind of release may change, how long a deprecated API keeps working, and how long an old major version is supported.
Why 7.0.0 broke so much, and why it won't happen again
7.0.0 renamed most of the public API in one release, with no deprecation period. That was a one-time cost: the React, Vue and Angular editions of this library (react-dockable-desktop, vue-dockable-desktop and angular-dockable-desktop) now share one vocabulary, so a concept has the same name in all three and a team can move between them. Since 7.0.0, the rules below apply to every release, and a rename of that kind will not happen again.
The public API
A breaking change to anything in this list needs a new major version.
- The exports of
react-dockable-desktop, with their full type signatures: components, hooks, functions, classes, constants and types. They are recorded inapi/react-dockable-desktop.api.md, which is generated from the published type declarations. That file is the contract: every change to it shows as a diff in review, and CI rejects a removed or changed signature unless the major version goes up. - The two entry points:
react-dockable-desktopandreact-dockable-desktop/styles.css. - Saved layouts. A layout saved by
saveLayout()in any 7.x release loads withloadLayout()(orinitialState) in every later 7.x release. Fixtures written by the realsaveLayout()are part of the test suite, and each release that changes the format adds one. A new major version states in its migration guide whether it reads the previous major's layouts.
Not covered
These may change in a minor release. Every such change is listed in the CHANGELOG:
- Styling: the
--rdd-*CSS custom properties, the.rdd-*class names, thedata-rdd-*attributes and the DOM structure. Tests pin the parts the stylesheet relies on, but they are not yet part of this promise. - Defaults: sizes, spacing, colours, animation timings, default labels. Changing a default, such as a padding, is a minor release with a CHANGELOG note.
- Anything marked
@internalor not exported, includingWorkspace._core. - The wording of development-only console warnings.
What each kind of release may do
| Release | May contain |
|---|---|
| Major (8.0.0) | Breaking changes to the public API, batched together, each with a migration note. Removes only APIs that were deprecated first. |
| Minor (7.8.0) | New APIs, new options, deprecations, changed defaults and visual changes, each with a CHANGELOG note. |
| Patch (7.7.4) | Bug fixes. |
A major version breaks nothing outside the public API, and nothing in it that wasn't deprecated first.
Deprecation
When an API is replaced:
- The old name stays, as an alias of the new one, marked
@deprecatedin its documentation (your editor shows it struck through), with the replacement and the version that removes it. - In development builds it prints one console warning, once per page load, naming the replacement. Production builds print nothing.
- The CHANGELOG entry of that release lists it under Deprecated.
- It keeps working for at least one minor release and at least three months, and is removed only in a major version.
- A rename ships with a codemod: a jscodeshift script, so the migration is one command:
npx jscodeshift -t <codemod URL from the CHANGELOG> src/.
Support for older major versions
The previous major version gets bug fixes for 12 months after the next one ships: 7.x until 12 months after 8.0.0. Fixes only, no new features.
How often major versions ship
At most one or two a year, with breaking changes batched into them rather than spread over releases. The deprecations a major version will remove ship in a 7.x minor release first, so you can move to the new APIs at your own pace before upgrading.
How it is enforced
- API report.
npm run api:checkruns in CI on every push: the committed API report must match the built type declarations, and a removed declaration, a removed member or a changed signature since the last release fails the build unless the major version went up. - Exports. A test pins every runtime and type export by name.
- Saved layouts. Fixture layouts written by earlier releases must load and save back unchanged.
- Migration guide. A sample 6.x app migrated with the 7.0 guide alone keeps compiling against the current API.