Skip to content

[lexical][lexical-extension] Chore: Remove @experimental flag from Extension and NodeState APIs - #8354

Merged
etrepum merged 3 commits into
meta:mainfrom
etrepum:claude/list-experimental-exports-gBV9Y
Apr 14, 2026
Merged

etrepum merged 3 commits into
meta:mainfrom
etrepum:claude/list-experimental-exports-gBV9Y

Conversation

@etrepum

@etrepum etrepum commented Apr 14, 2026

Copy link
Copy Markdown
Collaborator

Description

Lexical Extension can be documented as stable. It has been available for more than six months (v0.36.1 was released in Sep 2025), now has much more usage in the playground, and hasn't needed any significant API changes.

NodeState has been around for over a year, since Feb 2025 v0.26.0, so we can remove notes about its stability as well.

Test plan

Docs-only change

claude added 3 commits April 14, 2026 04:23
…exports

These APIs are no longer experimental: defineExtension, configExtension,
declarePeerDependency, getPeerDependencyFromEditor, namedSignals,
getKnownTypesAndNodes, watchedSignal, getExtensionDependencyFromEditor.

https://claude.ai/code/session_01Eh8EBHN3FFnmobAWEXZgis
The Lexical Extensions API is no longer experimental, so remove the
stability warning section from the extensions intro page.

https://claude.ai/code/session_01Eh8EBHN3FFnmobAWEXZgis
The NodeState API is no longer experimental, so remove the stability
warning section from the node-state docs page.

https://claude.ai/code/session_01Eh8EBHN3FFnmobAWEXZgis
@vercel

vercel Bot commented Apr 14, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
lexical Ready Ready Preview, Comment Apr 14, 2026 4:32am
lexical-playground Ready Ready Preview, Comment Apr 14, 2026 4:32am

Request Review

@meta-cla meta-cla Bot added the CLA Signed This label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed. label Apr 14, 2026
@etrepum etrepum added the extended-tests Run extended e2e tests on a PR label Apr 14, 2026
@etrepum
etrepum added this pull request to the merge queue Apr 14, 2026
Merged via the queue into meta:main with commit cd35c9c Apr 14, 2026
41 checks passed
@etrepum
etrepum deleted the claude/list-experimental-exports-gBV9Y branch April 19, 2026 02:32
@etrepum etrepum mentioned this pull request Apr 27, 2026
etrepum pushed a commit to etrepum/lexical that referenced this pull request Aug 2, 2026
…s and deprecate static transform()

## Description

Audit of APIs still marked experimental whose signatures have been unchanged
for more than 6 months, comparing the experimental surface at v0.40.0
(2026-02-02, the 6-month boundary) against main. Of 225 experimental
annotations on main, only 11 existed 6 months ago -- everything else (named
slots, DOM import/render, mdast, shadow DOM) landed 2026-04 or later. Collab v2
is intentionally left experimental.

Three APIs qualified, and the repo marks experimental status two ways
(`@experimental` tags and prose `EXPERIMENTAL`), so a tag-only scan misses some.

**Graduated (leftovers from meta#8354).** That PR removed the experimental
designation from the Extension and NodeState APIs, including the "This API is
experimental" stability section in `docs/concepts/node-state.md`, but only
cleaned up the `@experimental` tags. Two NodeState APIs spelled the marker as
prose `EXPERIMENTAL` and were missed:

- `makeStateWrapper` (`@lexical/utils`) -- its signature and the
  `StateConfigWrapper` interface are unchanged since meta#7117 (2025-02-27)
- `stateConfigs` in `StaticNodeConfigValue` (`lexical`) -- declaration unchanged
  since meta#7258 (2025-06-22), and it is the documented entry point in
  `node-state.md` whose experimental notice was already removed

**Deprecated instead of graduated.** `LexicalNode.transform()` is the oldest
qualifier -- `@experimental` since meta#4030 (2023-03-07) with a byte-identical
signature for 3 years 5 months -- but blessing it as stable would be the wrong
call: it is superseded by the `$transform` property of the config returned by
`$config()`, which the codebase already steered people toward. Per AGENTS.md,
it is deprecated with the replacement documented rather than removed, and it
keeps working unchanged. The `$transform` doc no longer describes
`transform()` as "internal" now that it is deprecated and publicly documented.

Two APIs were considered and deliberately left alone:

- `hasNestedTables` (`@lexical/react`, `@lexical/table`) qualifies mechanically
  at 8.7 months with an unchanged declaration, but its marker reads "Nested
  tables are not officially supported" -- a product-support caveat, not an
  API-stability one, so clearing it would assert support. Its sibling
  `hasFitNestedTables` (meta#8097) is 5.9 months old and misses the cutoff, so
  graduating one would split the pair.
- `StaticNodeConfigValue` had its type parameter widened from `string` to
  `string | symbol` in meta#8645 (2026-06-05), so it fails the unchanged-API test.

## Test plan

Comment-only changes: no type or runtime surface is modified. `transform()`
remains fully functional, and `getTransformSetFromKlass` still collects both it
and `$transform` into the same transform set, so no behavior changes for
existing callers. Existing test coverage (including the `static transform()`
override in `LexicalNestedComposer.test.tsx`) applies unchanged.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
etrepum pushed a commit to etrepum/lexical that referenced this pull request Aug 3, 2026
…ic transform(), normalize makeStateWrapper marker

## Description

Audit of APIs still marked experimental whose signatures have been unchanged
for more than 6 months, comparing the experimental surface at v0.40.0
(2026-02-02, the 6-month boundary) against main. Of 225 experimental
annotations on main, only 11 existed 6 months ago -- everything else (named
slots, DOM import/render, mdast, shadow DOM) landed 2026-04 or later. Collab v2
is intentionally left experimental.

The repo marks experimental status two ways (`@experimental` tags and prose
`EXPERIMENTAL`), so a tag-only scan misses some. This PR makes three changes.

**Graduated: `stateConfigs`** in `StaticNodeConfigValue` (`lexical`). Its
declaration is unchanged since meta#7258 (2025-06-22) and it is the documented
entry point in `docs/concepts/node-state.md`, whose "This API is experimental"
stability section was already removed by meta#8354. That PR graduated the Extension
and NodeState APIs but only cleaned up the `@experimental` tags, so this prose
`EXPERIMENTAL` marker was left behind.

**Deprecated: `LexicalNode.transform()`.** It is the oldest qualifier --
`@experimental` since meta#4030 (2023-03-07) with a byte-identical signature for 3
years 5 months -- but blessing it as stable would be the wrong call: it is
superseded by the `$transform` property of the config returned by `$config()`,
which the codebase already steered people toward. Per AGENTS.md it is
deprecated with the replacement documented rather than removed, and it keeps
working unchanged. The `$transform` doc no longer describes `transform()` as
"internal" now that it is deprecated and publicly documented.

**Left experimental, marker normalized: `makeStateWrapper`**
(`@lexical/utils`). Its signature and the `StateConfigWrapper` interface are
unchanged since meta#7117 (2025-02-27), so it qualifies on age, but it is a public
export with no call sites, tests, or documentation references anywhere in the
repo. An API that nothing exercises has not really been validated by that time,
so it stays experimental; only the prose `EXPERIMENTAL` is rewritten to the
`@experimental` tag so tooling and future audits can see it.

Two APIs were considered and deliberately left alone:

- `hasNestedTables` (`@lexical/react`, `@lexical/table`) qualifies mechanically
  at 8.7 months with an unchanged declaration, but its marker reads "Nested
  tables are not officially supported" -- a product-support caveat, not an
  API-stability one, so clearing it would assert support. Its sibling
  `hasFitNestedTables` (meta#8097) is 5.9 months old and misses the cutoff, so
  graduating one would split the pair.
- `StaticNodeConfigValue` had its type parameter widened from `string` to
  `string | symbol` in meta#8645 (2026-06-05), so it fails the unchanged-API test.

## Test plan

Comment-only changes: no type or runtime surface is modified. `transform()`
remains fully functional, and `getTransformSetFromKlass` still collects both it
and `$transform` into the same transform set, so no behavior changes for
existing callers. Existing test coverage (including the `static transform()`
override in `LexicalNestedComposer.test.tsx`) applies unchanged.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

This branch was successfully deployed

2 active deployments
Preview – lexical-playground — 91a67594 Deployed Apr 14, 2026 by vercel[bot]
Preview – lexical — 91a67594 Deployed Apr 14, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA Signed This label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed. extended-tests Run extended e2e tests on a PR

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants