Skip to content

feat(bestax-migrate): convert Bulma form fields, controls, inputs and textareas - #759

Merged
allxsmith merged 4 commits into
mainfrom
feat/bulma-classes-forms
Sep 26, 2026
Merged

allxsmith merged 4 commits into
mainfrom
feat/bulma-classes-forms

Conversation

@allxsmith

@allxsmith allxsmith commented Sep 26, 2026 •

Copy link
Copy Markdown
Owner

Part of #743: the next structural family after Navbar (#754). The bulma-classes source left form markup as a family (family:field, family:input, family:textarea), because bestax's Input and TextArea render a .field and a .control of their own. The pieces map one to one, though: Field and Control render exactly their Bulma elements, and InputBase and TextAreaBase are the controls without wrappers, which is how Field's own docs compose them.

What converts

  • .field → Field (is-horizontal, is-grouped, has-addons, is-narrow), .field-label → Field.Label (its size), .field-body → Field.Body.
  • .control → Control on a <div> or <p> (has-icons-left/-right, is-loading, is-expanded, its size).
  • .input → InputBase and .textarea → TextAreaBase, with their sizes and states.

On Bulma's own form markup (the new form fixture pair) every field, control, input and textarea converts. The .select, .checkbox and span.icon keep their family TODOs, and .label and .help stay as they are.

What stays, and why

  • An input's or textarea's color (is-danger): color renders has-text-<color> on it too, so the class stays.
  • has-addons-centered, has-addons-right, is-grouped-*: the hasAddons and grouped values that render them render has-addons or is-grouped as well.
  • A horizontal field whose children aren't a label or a body: Field wraps anything else in a .field-body of its own. That's Card's wrapsChildren rule with a new when condition, since a plain field doesn't wrap.
  • Helper classes on Field.Label, Field.Body and Control: they spread their raw props onto the element as well as rest, so a helper prop would reach the DOM as an attribute too.

Context

Field and Control tell bestax's form controls inside them to skip their own wrappers, and bestax's wrapped inputs read that context. So there are two guards, both reported as context:<Target>:

  • A .field or .control that already holds a bestax component (an Input from an earlier migration by hand) stays markup, because converting it would change how that component renders.
  • An input or textarea with no id inside a bestax Field stays markup, because it would adopt the Field's generated id.

"Already holds" and "inside" are resolved by binding, like the Card children, so a local that shadows a bestax name doesn't count.

The other surfaces

  • MCP (feat(bestax-mcp)): the lookup states the field's wrap rule only when is-horizontal is there.
  • ESLint (fix(eslint-plugin)): the regenerated metadata reports the six classes as converted.
  • Skill and docs: component map, prop map, unmappables (context:<Target>, and new family:select and family:file recipes) and the migration guide.
  • Eval (test(eval)): the codemod converts the contact form except its select and checkbox, so the addendum names it as the third partial family, and its contact row accepts the Control + base-control composition. I ran the codemod over the fixture to check.

Checked

  • The render truth test holds each new entry on every tag it reaches, with each modifier, helper and in the seeded fuzz. InputBase and TextAreaBase have no API page, so the prop-classification check reads their props with the same extractor the index uses. The harness renders a textarea without children, since React refuses text beside a value.
  • The props e2e typechecks every conversion. The new form fixture pair and the kitchen sink's form render the same before and after, and a second run changes nothing.
  • pnpm all passes locally.

For you

Summary by CodeRabbit

  • New Features
    • Bulma form fields, labels, controls, inputs, and textareas can now be migrated to Bestax components. Horizontal fields receive the appropriate child wrapping, and supported size and state modifiers are mapped.
    • Form migration works piece by piece; existing label and help-text markup and input color classes remain unchanged. Selects and checkboxes are not converted by this update.
    • Migration flags cases where existing Bestax form components or missing input IDs prevent a safe conversion.
  • Documentation
    • Updated the migration guide with form conversion details and cases that require manual review.

@allxsmith

Copy link
Copy Markdown
Owner Author

deep-review: fresh

Read-only: don't install, build or run tests; CI covers them on this head.

Read the form entries in bestax-migrate/src/sources/bulma-classes/class-map.ts (field, field-label, field-body, control, input, textarea), the providesContext / adoptsIdFrom / wrapsChildren.when lines in plan.ts, and the bestaxInside / bestaxAround code in transform.ts, against bulma-ui/src/form/Field.tsx, Control.tsx, InputBase.tsx and TextAreaBase.tsx. Priority: a form conversion that renders different markup than the raw element, including through Field or Control context reaching a component inside, or a label id reaching an input.

Skip the MCP and ESLint packages, generated files, fixtures, eval/ and the markdown.

@coderabbitai

coderabbitai Bot commented Sep 26, 2026 •

Copy link
Copy Markdown

Review in Change Stack →

Navigate logical layers of code changes, visualize relationships, and explore their blast radius.

Warning

Review limit reached

Next included review available in 37 minutes.

Check out review usage here.

View limit details

Limit details: You’ve used the included review currently available.

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

Learn how review limits work.

Review configuration:

⚙️ Run configuration

Configuration used: Repository: allxsmith/bestax/.coderabbit.yaml

Review profile: CHILL

Plan: Advanced

Run ID: 43b43f34-9576-401d-b923-db62033cba8d

📥 Commits

Reviewing files that changed from the base of the PR and between 512c749 and 7de870d.

⛔ Files ignored due to path filters (1)
  • eslint-plugin/src/generated/metadata.ts is excluded by !**/generated/**
📒 Files selected for processing (20)
  • bestax-mcp/data/bulma-classes.json
  • bestax-mcp/data/skills.json
  • bestax-mcp/src/__tests__/server.test.ts
  • bestax-mcp/src/bulma-classes.ts
  • bestax-migrate/CLAUDE.md
  • bestax-migrate/e2e/bulma-classes-truth.test.ts
  • bestax-migrate/fixtures/bulma-classes-kitchen-sink/src/elements.tsx
  • bestax-migrate/src/sources/bulma-classes/__testfixtures__/form.input.tsx
  • bestax-migrate/src/sources/bulma-classes/__testfixtures__/form.output.tsx
  • bestax-migrate/src/sources/bulma-classes/__tests__/plan.test.ts
  • bestax-migrate/src/sources/bulma-classes/__tests__/transform.test.ts
  • bestax-migrate/src/sources/bulma-classes/class-map.ts
  • bestax-migrate/src/sources/bulma-classes/plan.ts
  • bestax-migrate/src/sources/bulma-classes/rules.ts
  • bestax-migrate/src/sources/bulma-classes/transform.ts
  • docs/docs/guides/getting-started/migration/bulma-classes.md
  • eval/agent-loop/briefs/bulma-migrate.completeness.md
  • skills/bestax-migrate/references/bulma-classes/component-map.md
  • skills/bestax-migrate/references/bulma-classes/prop-map.md
  • skills/bestax-migrate/references/bulma-classes/unmappables.md

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Repository: allxsmith/bestax/.coderabbit.yaml

Review profile: CHILL

Plan: Advanced

Run ID: e354d9f7-e934-4686-b073-a14740f3949e

📥 Commits

Reviewing files that changed from the base of the PR and between 91df641 and 512c749.

⛔ Files ignored due to path filters (1)
  • eslint-plugin/src/generated/metadata.ts is excluded by !**/generated/**
📒 Files selected for processing (20)
  • bestax-mcp/data/bulma-classes.json
  • bestax-mcp/data/skills.json
  • bestax-mcp/src/__tests__/server.test.ts
  • bestax-mcp/src/bulma-classes.ts
  • bestax-migrate/CLAUDE.md
  • bestax-migrate/e2e/bulma-classes-truth.test.ts
  • bestax-migrate/fixtures/bulma-classes-kitchen-sink/src/elements.tsx
  • bestax-migrate/src/sources/bulma-classes/__testfixtures__/form.input.tsx
  • bestax-migrate/src/sources/bulma-classes/__testfixtures__/form.output.tsx
  • bestax-migrate/src/sources/bulma-classes/__tests__/plan.test.ts
  • bestax-migrate/src/sources/bulma-classes/__tests__/transform.test.ts
  • bestax-migrate/src/sources/bulma-classes/class-map.ts
  • bestax-migrate/src/sources/bulma-classes/plan.ts
  • bestax-migrate/src/sources/bulma-classes/rules.ts
  • bestax-migrate/src/sources/bulma-classes/transform.ts
  • docs/docs/guides/getting-started/migration/bulma-classes.md
  • eval/agent-loop/briefs/bulma-migrate.completeness.md
  • skills/bestax-migrate/references/bulma-classes/component-map.md
  • skills/bestax-migrate/references/bulma-classes/prop-map.md
  • skills/bestax-migrate/references/bulma-classes/unmappables.md

Included review availability: This review used your included allowance. Your plan provides up to 1 included review per hour; 0 remain after this review.


Walkthrough

Bulma form classes now map to Bestax field, control, input, and textarea components. The migration planner considers existing Bestax components and generated IDs when planning conversions. Tests, fixtures, and migration references cover the mappings and conversion conditions.

Changes

Bulma form migration

Layer / File(s) Summary
Form class mappings and lookup
bestax-migrate/src/sources/bulma-classes/class-map.ts, bestax-mcp/data/bulma-classes.json, bestax-mcp/src/bulma-classes.ts, bestax-mcp/src/__tests__/server.test.ts, skills/bestax-migrate/references/bulma-classes/component-map.md, skills/bestax-migrate/references/bulma-classes/prop-map.md, docs/docs/guides/getting-started/migration/bulma-classes.md, bestax-mcp/data/skills.json
Bulma field, field-label, field-body, control, input, and textarea classes map to Bestax form components. The mappings include modifier and prop support, conditional horizontal-field wrapping, and input/textarea color handling. Lookup reports wrapping metadata only when its optional class condition is met.
Context-aware conversion planning
bestax-migrate/src/sources/bulma-classes/plan.ts, bestax-migrate/src/sources/bulma-classes/transform.ts, bestax-migrate/src/sources/bulma-classes/rules.ts, bestax-migrate/src/sources/bulma-classes/__tests__/*, skills/bestax-migrate/references/bulma-classes/unmappables.md, docs/docs/guides/getting-started/migration/bulma-classes.md, bestax-migrate/CLAUDE.md
The transform passes existing Bestax components inside and around elements to the planner. The planner can refuse conversion when a target provides context, when a surrounding Field may supply an ID, or when conditional child wrapping applies. Tests cover these decisions and the related TODO results.
Form examples and migration validation
bestax-migrate/e2e/bulma-classes-truth.test.ts, bestax-migrate/fixtures/bulma-classes-kitchen-sink/src/elements.tsx, bestax-migrate/src/sources/bulma-classes/__testfixtures__/form.*.tsx, eval/agent-loop/briefs/bulma-migrate.completeness.md
Form fixtures and the kitchen-sink example include Bulma form markup and converted Bestax components. End-to-end tests cover conditional wrapping and prop classification. The completeness brief describes the contact-form conversion scope.

Priority: ➖ Normal

Estimated code review effort: 3 (Moderate) | ~25 minutes

Change: Feature

Sequence Diagram(s)

sequenceDiagram
  participant Transform
  participant Plan
  participant RootEntry
  participant MigrationResult
  Transform->>Plan: Pass element facts and Bestax context
  Plan->>RootEntry: Read target and conversion metadata
  RootEntry-->>Plan: Return mapping and context rules
  Plan-->>Transform: Return conversion plan or refusal
  Transform-->>MigrationResult: Emit converted components or retained markup with TODO
Loading

Merge Risk: ⚪ Minimal · up to 512c7

The form conversions appear ready to merge after normal checks; no actionable issue was established.

Security Architecture Review

Security architecture risk: 🔵 Low · up to 512c7

The migration can now replace more form markup with components. The reviewed safeguards preserve markup where component context, generated IDs, or child wrapping could change its behavior. No introduced security issue was established, but the assessment does not cover every downstream use.

Retained concerns
No architecture-level concerns identified.

Security review details

Security Blast Radius

  • inferred — The independently affected scope is source submitted for this form-class conversion and consumers of its class-lookup guidance. The supplied evidence does not establish exposure across tenants, credentials, or deployment environments.

Trust Boundaries and Controls

  • observed — Class lookup selects mapping metadata from input tokens, while migration planning retains explicit context and ID-adoption refusal conditions rather than converting every matching form class.
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 6 functions across 12 files. (8 skipped: 8… Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and concisely summarizes the main change: adding Bulma form field, control, input, and textarea conversions.
Description check ✅ Passed The description provides a detailed summary of the conversion behavior, affected surfaces, context and ID guards, tests, documentation, and validation results. It does not use the template headings or…
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Full details: Docstring Coverage

Explanation

Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 6 functions across 12 files. (8 skipped: 8 unsupported.)

✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Commit to this branch
  • Create a new PR
🧪 Generate unit tests (beta)
  • Commit to this branch
  • Create a new PR

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actions

Copy link
Copy Markdown
Contributor

Preview Deployment

Preview URL: https://c8fd29fd.bestax.pages.dev

Comment thread bestax-migrate/src/sources/bulma-classes/plan.ts Outdated

@claude claude Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Deep review — 1 blocking · 4 advisory

No. Severity Area Finding Location
1 🟡 Minor Correctness A labelled Field reached through a wrapper component is invisible to bestaxAround, so the input converts and adopts the generated id of that Field — and two bare controls under one wrapper get the same id bestax-migrate/src/sources/bulma-classes/plan.ts:242-251
2 🔵 Advisory Robustness The mirror blind spot: providesContext only sees bestax elements written in this file, so a .field div holding a user component that renders a bestax Input still converts, and that Input then drops the .field it would have rendered. Lower likelihood — the pre-migration markup is already double-wrapped bestax-migrate/src/sources/bulma-classes/plan.ts:235
3 🔵 Advisory Correctness The adoptsIdFrom TODO asserts "inside a bestax Field with a label", but the guard reads only the name of the ancestor. It also fires for a Field with no label and for a grouped or has-addons labelled Field, where targetId is undefined (Field.tsx:231-234) and no id is ever handed down — a safe over-refusal, but the message describes a situation that is not the one that occurred bestax-migrate/src/sources/bulma-classes/plan.ts:249
4 🔵 Advisory Coverage Adding textarea to VOID means the render-equality sweep never renders a textarea with children through both paths. Verified by inspection that it is fine: TextAreaBase does not destructure children, so it flows through rest onto the element unchanged bestax-migrate/e2e/bulma-classes-truth.test.ts:49
5 🔵 Advisory Robustness The old one-line doc comment above VOID ("Elements that must stay empty in HTML") was left in place above the new one; textarea is in the set for a different reason bestax-migrate/e2e/bulma-classes-truth.test.ts:44

Overall: The table work is careful and the modifier mapping is exact — I cross-checked every class Field, FieldLabel, FieldBody, Control, InputBase and TextAreaBase can emit from their usePrefixedClassNames maps against the six new entries, and each one is either a mapped modifier or deliberately left in className for a reason that holds (component colors, has-addons-*, is-grouped-*, textarea is-loading). The riskiest part is the pair of new context guards: both resolve context by JSX name in this file, while React resolves it by render tree, and the two diverge the moment a user component sits in between. Focus there first — finding 1 reaches an idiomatic composition, a small Labelled component that forwards its children into a labelled Field, and can produce duplicate DOM ids.

Residual risk:

  • Context reaching a component the codemod itself writes — refuted. Of the six new targets only InputBase and TextAreaBase read form context, and only useFieldLabelId. A codemod-written Field never gets a label prop, so targetId is undefined (Field.tsx:231-234) and the provider hands down nothing. No other mapped target in ROOTS calls useInsideField / useInsideControl / useFieldLabelId — checked every consumer under bulma-ui/src/form/.
  • A bestax control written inside a JSX expression container, such as one returned from a .map callback — refuted. The ancestor walk behind bestaxInside calls continue on non-JSXElement paths rather than stopping, so the enclosing .field or .control is still reached and still refuses.
  • An indirect bestax control inside a converting .field or .control — open, row 2 above.
  • Helper props reaching the DOM as attributes — refuted. FieldLabel and FieldBody spread their raw props onto the element, and so does Control, and all three carry noHelpers: true; Field spreads only the rest from useBulmaClasses, and keeps helpers. That matches the components as written.
  • wrapsChildren.when changing behaviour for the existing Card entry — refuted. The negated when check short-circuits, so every entry without a when plans exactly as before.
  • The ref claims — refuted. FORWARDS_REF gains exactly Control, InputBase and TextAreaBase, all three React.forwardRef; Field, Field.Label and Field.Body are plain FCs and are absent. The truth test asserts that set exactly, and props-extract.mjs emits a ref row for forwardRef components, so the new passThrough ref entries line up with the index — confirmed against bestax-mcp/data/components/Control.json.
  • Numeric-typed attributes such as rows and maxLength needing numberAttrs — refuted. The React type for rows on a textarea is already number, so a string rows never typechecks on the raw element either; numberAttrs is only needed where bestax narrows a DOM type that was wider, as with a progress value.

🏄 Clean set of waves here — six form classes carved one-for-one onto real components, every modifier checked against the source, and the whole thing lands on its feet. Just watch that one reef: the context guards read the file, but React reads the tree, and a little wrapper component in between is where the id sneaks through. Patch that and it is all glass.

… textareas

The bulma-classes source left form markup as a family, because bestax's
Input and TextArea render .field and .control wrappers of their own. But
the pieces map one to one: Field and Control render exactly their Bulma
elements, and InputBase and TextAreaBase are the controls without wrappers.

- .field, .field-label, .field-body, .control, .input and .textarea are
  mapped entries now. The modifiers with a prop of their own convert; an
  input's color stays a class, because color sets has-text-<color> too, and
  so do has-addons-centered and the is-grouped-* variants.
- A horizontal field converts once its label and body do, through a when
  condition on wrapsChildren. Field.Label, Field.Body and Control spread
  their raw props onto the element, so helper classes stay on them.
- Two context guards, reported as context:<Target>. A .field or .control
  that already holds a bestax component stays markup, since Field and
  Control tell bestax's form controls to skip their own wrappers. An input
  or textarea with no id inside a bestax Field stays markup, since it would
  take the Field's generated id.
- The truth test reads InputBase's and TextAreaBase's props with the API
  extractor, since neither has an API page of its own, and renders a
  textarea without children.
- A form fixture pair from Bulma's own form markup, and a form in the
  kitchen sink.

Part of #743
…zontal

lookup_bulma_classes now covers .field, .control, .input and .textarea from
the codemod's table. Field wraps its children in a .field-body of its own
only when it's horizontal, so the lookup states that condition for
field is-horizontal and not for a plain field.
…onverts

no-bulma-component-class reported .field, .input and .textarea as a family
converted by hand, and skipped .control, .field-label and .field-body as
parts. bestax-migrate converts all six now, so the regenerated metadata
reports them with the converts message.
The codemod converts the contact form's fields, controls, input and textarea
now, leaving the select and the checkbox. The addendum names it as the third
partial family, and the contact row accepts the Control and base-control
composition the codemod writes.
@allxsmith
allxsmith force-pushed the feat/bulma-classes-forms branch from 512c749 to 7de870d Compare September 26, 2026 16:25
@allxsmith

Copy link
Copy Markdown
Owner Author

On the deep review's advisory rows, folded into the feat(bestax-migrate) commit:

  • 2, a component inside a .field that renders a bestax Input: left as a stated limit rather than widened like the id guard. Refusing every .field or .control that holds any component would catch a <FormattedMessage> in a label and turn most real forms into TODOs, and the markup you describe is already double-wrapped before the migration. The unmappables context: section now says the codemod can't see a component in another file that renders bestax form controls, and what to do about it.
  • 3, the TODO claiming "with a label": reworded. It now says the element sits inside something that is or could render a labelled Field, which is true of every case the guard fires on.
  • 4, textarea in VOID: agreed, nothing to change.
  • 5, the stale comment above VOID: deleted.

@allxsmith

Copy link
Copy Markdown
Owner Author

deep-review: verify

Read-only: don't install, build or run tests; CI covers them on this head. Settle the open wrapper-component thread against the current bestax-migrate/src/sources/bulma-classes/plan.ts (adoptsIdFrom), the around helper in transform.ts, and the new form context cases in __tests__/transform.test.ts.

@github-actions

Copy link
Copy Markdown
Contributor

Preview Deployment

Preview URL: https://34e39d78.bestax.pages.dev

@claude claude Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Deep review (verify) — 1 resolved · 0 open

No Severity Area Finding Location
1 🟡 Minor Correctness Resolved — labelled Field reached through a wrapper component handed the input its generated id bestax-migrate/src/sources/bulma-classes/plan.ts:247

Thread settled

  • A labelled Field reached through a wrapper component still hands the input its id — verified fixed. The guard no longer keys off bestaxAround alone: plan.ts:247-260 fires whenever an adoptsIdFrom entry has no id attribute and picks facts.bestaxAround?.find(...) ?? facts.componentsAround?.[0], and the around() helper in transform.ts (410-429) fills other with every JSX ancestor that is not a bestax import, not an intrinsic tag, not a custom element and not in PASS_THROUGH_PARENTS. The Labelled repro from that thread is now a test (__tests__/transform.test.ts:479-495): the bare input refuses with context:InputBase, the id="email" variant still converts to <InputBase id="email" type="email" />, and a React.Fragment wrapper raises nothing — so the fragment exemption did not get swept up with the fix. plan.test.ts:515-527 covers the componentsAround fallback branch on its own, and both the input and textarea entries set adoptsIdFrom to Field (class-map.ts:831, :867), so the sibling target is covered too. The duplicate-id variant of the repro (two bare controls under one wrapper) is subsumed: neither converts. The one case the walk still cannot see — a wrapper defined in another file — is stated in skills/bestax-migrate/references/bulma-classes/unmappables.md:99-101 with the advice to give inputs ids first, which is what the thread asked for on the record.

Overall: This pass settled the one open thread from the earlier review and reviewed no commits — no fresh review was performed, and no new findings were raised. The fix is the narrow, conservative shape that thread suggested (refuse on any unaccounted-for component ancestor rather than reach across files), so the residual cost is lost conversions on inputs under app wrappers, not incorrect output. A maintainer wanting the commits since the original review judged should ask for a deep-review: fresh run.

Residual risk:

  • Cross-file wrapper rendering a labelled Field: still out of reach by construction (the codemod reads one file at a time) — documented rather than guarded, which is the accepted trade-off recorded in unmappables.md.
  • Over-refusal: any missing-id .input/.textarea under a non-bestax component ancestor now stays markup even when that ancestor renders no Field. Conservative by design — a skipped conversion, never wrong markup.
  • Not re-examined this pass: everything outside the settled thread. Per VERIFY mode, no other path was reviewed, so absence of findings here is not a clean bill for the rest of the diff.

🏄 Caught the one leaky spot in the lineup, patched it, and the tests prove the wave still breaks the same way it did before. Cleanly settled — paddle it in.

@allxsmith
allxsmith merged commit 16105fe into main Sep 26, 2026
48 checks passed
@allxsmith
allxsmith deleted the feat/bulma-classes-forms branch September 26, 2026 17:20
@bestax-release-bot

Copy link
Copy Markdown

🎉 This PR is included in version 2.7.0 🎉

The release is available on:

Your semantic-release bot 📦🚀

@bestax-release-bot

Copy link
Copy Markdown

🎉 This PR is included in version 1.4.0 🎉

The release is available on:

Your semantic-release bot 📦🚀

@bestax-release-bot

Copy link
Copy Markdown

🎉 This PR is included in version 5.16.10 🎉

The release is available on:

Your semantic-release bot 📦🚀

@bestax-release-bot

Copy link
Copy Markdown

🎉 This PR is included in version 4.2.13 🎉

The release is available on:

Your semantic-release bot 📦🚀

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant