Skip to content

feat: enable verbatim module on @ory/elements-react and update imports#599

Open
GauthierPLM wants to merge 2 commits intoory:mainfrom
GauthierPLM:refactor/verbatim-module-on-elements-react
Open

feat: enable verbatim module on @ory/elements-react and update imports#599
GauthierPLM wants to merge 2 commits intoory:mainfrom
GauthierPLM:refactor/verbatim-module-on-elements-react

Conversation

@GauthierPLM
Copy link
Copy Markdown

@GauthierPLM GauthierPLM commented May 4, 2026

Enables verbatimModuleSyntax in the TypeScript compiler options and adds the type qualifier to every type-only import across the codebase (e.g. import type { Foo } from '...').

Without verbatimModuleSyntax, TypeScript silently erases type-only imports at compile time in a way that is opaque to bundlers and module-aware tools. I encountered such issues when importing the stories in my project to have a preview of our custom styling: some components / imports used type but a large number of them did not.

Instead of only fixing it in stories on our side, I thought I could spend a bit more time to contribute these changes.

Related Issue or Design Document

Checklist

  • I have read the contributing guidelines
    and signed the CLA.
  • I have referenced an issue containing the design document if my change
    introduces a new feature.
  • I have read the security policy.
  • I confirm that this pull request does not address a security
    vulnerability. If this pull request addresses a security vulnerability, I
    confirm that I got approval (please contact
    security@ory.com) from the maintainers to push
    the changes.
  • I have added tests that prove my fix is effective or that my feature
    works.
  • I have added the necessary documentation within the code base (if
    appropriate).

Further comments

I know that the contributing guidelines require to open a discussion / issue prior to opening a PR, but I read them after finishing the changes.
Let me know if the PR isn't fit and I will close it.

Summary by CodeRabbit

  • Refactor
    • Converted many internal imports to TypeScript type-only syntax across the React component library. Builds now avoid unnecessary runtime import bindings, improving bundle output and tree-shaking. No user-facing behavior, APIs, or component rendering changed.

@vercel
Copy link
Copy Markdown

vercel Bot commented May 4, 2026

@GauthierPLM is attempting to deploy a commit to the ory Team on Vercel.

A member of the Team first needs to authorize it.

@changeset-bot
Copy link
Copy Markdown

changeset-bot Bot commented May 4, 2026

⚠️ No Changeset found

Latest commit: 6189f3f

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

@CLAassistant
Copy link
Copy Markdown

CLA assistant check
Thank you for your submission! We really appreciate it. Like many open source projects, we ask that you sign our Contributor License Agreement before we can accept your contribution.
You have signed the CLA already but the status is still pending? Let us recheck it.

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented May 4, 2026

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: d9a0f106-5128-48f0-9eb8-af826c8a0a37

📥 Commits

Reviewing files that changed from the base of the PR and between 6c0661c and 6189f3f.

📒 Files selected for processing (150)
  • packages/elements-react/src/client/frontendClient.ts
  • packages/elements-react/src/client/session-provider.tsx
  • packages/elements-react/src/client/useSession.spec.tsx
  • packages/elements-react/src/components/card/card.tsx
  • packages/elements-react/src/components/card/content.tsx
  • packages/elements-react/src/components/card/index.tsx
  • packages/elements-react/src/components/card/two-step/__tests__/card-two-step.spec.ts
  • packages/elements-react/src/components/card/two-step/state-method-active.tsx
  • packages/elements-react/src/components/card/two-step/state-provide-identifier.tsx
  • packages/elements-react/src/components/card/two-step/state-select-method.tsx
  • packages/elements-react/src/components/card/two-step/utils.ts
  • packages/elements-react/src/components/form/form-helpers.ts
  • packages/elements-react/src/components/form/form-provider.tsx
  • packages/elements-react/src/components/form/form-resolver.test.tsx
  • packages/elements-react/src/components/form/form-resolver.ts
  • packages/elements-react/src/components/form/form.tsx
  • packages/elements-react/src/components/form/messages.tsx
  • packages/elements-react/src/components/form/nodes/hooks/useInputProps.tsx
  • packages/elements-react/src/components/form/nodes/input.tsx
  • packages/elements-react/src/components/form/nodes/node-button.tsx
  • packages/elements-react/src/components/form/nodes/node.tsx
  • packages/elements-react/src/components/form/nodes/renderer/button-renderer.tsx
  • packages/elements-react/src/components/form/nodes/renderer/checkbox-renderer.tsx
  • packages/elements-react/src/components/form/nodes/renderer/consent-checkbox-renderer.tsx
  • packages/elements-react/src/components/form/nodes/renderer/hidden-input-renderer.tsx
  • packages/elements-react/src/components/form/nodes/renderer/image-renderer.tsx
  • packages/elements-react/src/components/form/nodes/renderer/input-renderer.tsx
  • packages/elements-react/src/components/form/nodes/renderer/select-renderer.test.tsx
  • packages/elements-react/src/components/form/nodes/renderer/select-renderer.tsx
  • packages/elements-react/src/components/form/nodes/renderer/sso-button-renderer.tsx
  • packages/elements-react/src/components/form/nodes/renderer/text-renderer.tsx
  • packages/elements-react/src/components/form/settings-section.tsx
  • packages/elements-react/src/components/form/social.test.tsx
  • packages/elements-react/src/components/form/social.tsx
  • packages/elements-react/src/components/form/useOryFormSubmit.ts
  • packages/elements-react/src/components/form/useResendCode.ts
  • packages/elements-react/src/components/settings/index.tsx
  • packages/elements-react/src/components/settings/oidc-settings.tsx
  • packages/elements-react/src/components/settings/passkey-settings.tsx
  • packages/elements-react/src/components/settings/recovery-codes-settings.tsx
  • packages/elements-react/src/components/settings/settings-card.tsx
  • packages/elements-react/src/components/settings/totp-settings.tsx
  • packages/elements-react/src/components/settings/webauthn-settings.tsx
  • packages/elements-react/src/context/component.tsx
  • packages/elements-react/src/context/config.tsx
  • packages/elements-react/src/context/defaultNodeSorter.test.ts
  • packages/elements-react/src/context/defaultNodeSorter.ts
  • packages/elements-react/src/context/flow-context.tsx
  • packages/elements-react/src/context/form-state.test.ts
  • packages/elements-react/src/context/form-state.ts
  • packages/elements-react/src/context/intl-context.tsx
  • packages/elements-react/src/context/provider.tsx
  • packages/elements-react/src/tests/jest/test-utils.tsx
  • packages/elements-react/src/theme/default/components/card/auth-method-list-container.tsx
  • packages/elements-react/src/theme/default/components/card/auth-method-list-item.tsx
  • packages/elements-react/src/theme/default/components/card/content.tsx
  • packages/elements-react/src/theme/default/components/card/current-identifier-button.test.ts
  • packages/elements-react/src/theme/default/components/card/current-identifier-button.tsx
  • packages/elements-react/src/theme/default/components/card/footer.test.tsx
  • packages/elements-react/src/theme/default/components/card/footer.tsx
  • packages/elements-react/src/theme/default/components/card/index.tsx
  • packages/elements-react/src/theme/default/components/card/list-item.tsx
  • packages/elements-react/src/theme/default/components/default-components.tsx
  • packages/elements-react/src/theme/default/components/form/button.tsx
  • packages/elements-react/src/theme/default/components/form/captcha.tsx
  • packages/elements-react/src/theme/default/components/form/checkbox.tsx
  • packages/elements-react/src/theme/default/components/form/consent-scope-checkbox.tsx
  • packages/elements-react/src/theme/default/components/form/group-container.tsx
  • packages/elements-react/src/theme/default/components/form/image.tsx
  • packages/elements-react/src/theme/default/components/form/index.tsx
  • packages/elements-react/src/theme/default/components/form/input.tsx
  • packages/elements-react/src/theme/default/components/form/label.tsx
  • packages/elements-react/src/theme/default/components/form/link-button.tsx
  • packages/elements-react/src/theme/default/components/form/pin-code-input.tsx
  • packages/elements-react/src/theme/default/components/form/section.tsx
  • packages/elements-react/src/theme/default/components/form/select.tsx
  • packages/elements-react/src/theme/default/components/form/sso.tsx
  • packages/elements-react/src/theme/default/components/form/text.tsx
  • packages/elements-react/src/theme/default/components/generic/page-header.tsx
  • packages/elements-react/src/theme/default/components/generic/toast.tsx
  • packages/elements-react/src/theme/default/components/settings/settings-oidc.tsx
  • packages/elements-react/src/theme/default/components/settings/settings-passkey.tsx
  • packages/elements-react/src/theme/default/components/settings/settings-recovery-codes.tsx
  • packages/elements-react/src/theme/default/components/settings/settings-totp.tsx
  • packages/elements-react/src/theme/default/components/settings/settings-webauthn.tsx
  • packages/elements-react/src/theme/default/components/ui/checkbox-label.spec.tsx
  • packages/elements-react/src/theme/default/components/ui/checkbox-label.tsx
  • packages/elements-react/src/theme/default/components/ui/dropdown-menu.tsx
  • packages/elements-react/src/theme/default/components/ui/user-avater.tsx
  • packages/elements-react/src/theme/default/components/ui/user-menu.tsx
  • packages/elements-react/src/theme/default/flows/consent.tsx
  • packages/elements-react/src/theme/default/flows/error.tsx
  • packages/elements-react/src/theme/default/flows/login.tsx
  • packages/elements-react/src/theme/default/flows/recovery.tsx
  • packages/elements-react/src/theme/default/flows/registration.tsx
  • packages/elements-react/src/theme/default/flows/settings.tsx
  • packages/elements-react/src/theme/default/flows/verification.tsx
  • packages/elements-react/src/theme/default/utils/__tests__/constructCardHeader.spec.tsx
  • packages/elements-react/src/theme/default/utils/__tests__/user.spec.ts
  • packages/elements-react/src/theme/default/utils/constructCardHeader.ts
  • packages/elements-react/src/theme/default/utils/logout.ts
  • packages/elements-react/src/theme/default/utils/oauth2.ts
  • packages/elements-react/src/theme/default/utils/user.ts
  • packages/elements-react/src/types.ts
  • packages/elements-react/src/util/childCounter.ts
  • packages/elements-react/src/util/client.ts
  • packages/elements-react/src/util/clientConfiguration.ts
  • packages/elements-react/src/util/events.ts
  • packages/elements-react/src/util/flowContainer.ts
  • packages/elements-react/src/util/flowHasErrors.ts
  • packages/elements-react/src/util/i18n/__tests__/index.spec.tsx
  • packages/elements-react/src/util/i18n/__tests__/test-components.tsx
  • packages/elements-react/src/util/i18n/index.ts
  • packages/elements-react/src/util/nodes.ts
  • packages/elements-react/src/util/omitAttributes.ts
  • packages/elements-react/src/util/onSubmitLogin.test.ts
  • packages/elements-react/src/util/onSubmitLogin.ts
  • packages/elements-react/src/util/onSubmitRecovery.test.ts
  • packages/elements-react/src/util/onSubmitRecovery.ts
  • packages/elements-react/src/util/onSubmitRegistration.test.ts
  • packages/elements-react/src/util/onSubmitRegistration.ts
  • packages/elements-react/src/util/onSubmitSettings.test.ts
  • packages/elements-react/src/util/onSubmitSettings.ts
  • packages/elements-react/src/util/onSubmitVerification.test.ts
  • packages/elements-react/src/util/onSubmitVerification.ts
  • packages/elements-react/src/util/sdk-helpers/__test__/continueWith.spec.ts
  • packages/elements-react/src/util/sdk-helpers/__test__/ui.spec.ts
  • packages/elements-react/src/util/sdk-helpers/__test__/utils.spec.ts
  • packages/elements-react/src/util/sdk-helpers/continueWith.ts
  • packages/elements-react/src/util/sdk-helpers/error.ts
  • packages/elements-react/src/util/sdk-helpers/ui.ts
  • packages/elements-react/src/util/sdk-helpers/utils.ts
  • packages/elements-react/src/util/showToast.tsx
  • packages/elements-react/src/util/submitHandler.ts
  • packages/elements-react/src/util/transientPayload.test.ts
  • packages/elements-react/src/util/transientPayload.ts
  • packages/elements-react/src/util/ui/__test__/ui.spec.ts
  • packages/elements-react/src/util/ui/index.ts
  • packages/elements-react/src/util/utilFixSDKTypesHelper.ts
  • packages/elements-react/stories/components/error/error.stories.tsx
  • packages/elements-react/stories/components/settings/all-2fa.stories.ts
  • packages/elements-react/stories/components/settings/all.stories.tsx
  • packages/elements-react/stories/components/settings/lookup_secrets.stories.ts
  • packages/elements-react/stories/components/settings/oidc.stories.ts
  • packages/elements-react/stories/components/settings/passkey.stories.ts
  • packages/elements-react/stories/components/settings/saml.stories.ts
  • packages/elements-react/stories/components/settings/totp.stories.ts
  • packages/elements-react/stories/components/settings/webauthn.stories.ts
  • packages/elements-react/stories/utils.ts
  • packages/elements-react/tsconfig.json
✅ Files skipped from review due to trivial changes (144)
  • packages/elements-react/src/components/form/nodes/renderer/input-renderer.tsx
  • packages/elements-react/src/components/form/nodes/node-button.tsx
  • packages/elements-react/src/theme/default/components/form/consent-scope-checkbox.tsx
  • packages/elements-react/src/components/form/form-provider.tsx
  • packages/elements-react/src/theme/default/components/ui/user-avater.tsx
  • packages/elements-react/src/components/form/nodes/renderer/hidden-input-renderer.tsx
  • packages/elements-react/src/theme/default/components/form/image.tsx
  • packages/elements-react/stories/components/settings/saml.stories.ts
  • packages/elements-react/tsconfig.json
  • packages/elements-react/src/theme/default/components/ui/user-menu.tsx
  • packages/elements-react/src/util/omitAttributes.ts
  • packages/elements-react/src/util/i18n/tests/test-components.tsx
  • packages/elements-react/stories/components/error/error.stories.tsx
  • packages/elements-react/stories/components/settings/totp.stories.ts
  • packages/elements-react/src/components/form/form-resolver.ts
  • packages/elements-react/src/util/clientConfiguration.ts
  • packages/elements-react/src/theme/default/components/generic/page-header.tsx
  • packages/elements-react/src/theme/default/components/card/content.tsx
  • packages/elements-react/src/util/onSubmitLogin.test.ts
  • packages/elements-react/stories/components/settings/all-2fa.stories.ts
  • packages/elements-react/src/theme/default/utils/user.ts
  • packages/elements-react/src/theme/default/components/card/auth-method-list-container.tsx
  • packages/elements-react/src/context/form-state.test.ts
  • packages/elements-react/src/theme/default/components/ui/checkbox-label.spec.tsx
  • packages/elements-react/src/components/form/nodes/renderer/sso-button-renderer.tsx
  • packages/elements-react/src/theme/default/components/settings/settings-passkey.tsx
  • packages/elements-react/src/components/settings/recovery-codes-settings.tsx
  • packages/elements-react/src/client/session-provider.tsx
  • packages/elements-react/src/util/nodes.ts
  • packages/elements-react/src/util/onSubmitRecovery.test.ts
  • packages/elements-react/src/theme/default/components/card/footer.tsx
  • packages/elements-react/src/components/card/two-step/state-method-active.tsx
  • packages/elements-react/src/util/transientPayload.test.ts
  • packages/elements-react/src/theme/default/flows/settings.tsx
  • packages/elements-react/src/components/form/messages.tsx
  • packages/elements-react/src/util/i18n/tests/index.spec.tsx
  • packages/elements-react/src/components/settings/totp-settings.tsx
  • packages/elements-react/src/components/form/social.test.tsx
  • packages/elements-react/src/components/card/index.tsx
  • packages/elements-react/src/components/form/social.tsx
  • packages/elements-react/src/components/form/nodes/input.tsx
  • packages/elements-react/src/components/form/form-helpers.ts
  • packages/elements-react/src/theme/default/components/form/input.tsx
  • packages/elements-react/src/theme/default/components/settings/settings-oidc.tsx
  • packages/elements-react/src/theme/default/flows/verification.tsx
  • packages/elements-react/src/components/card/content.tsx
  • packages/elements-react/src/theme/default/components/ui/checkbox-label.tsx
  • packages/elements-react/src/components/form/nodes/renderer/select-renderer.test.tsx
  • packages/elements-react/src/theme/default/utils/constructCardHeader.ts
  • packages/elements-react/src/components/card/two-step/state-select-method.tsx
  • packages/elements-react/src/components/form/form-resolver.test.tsx
  • packages/elements-react/src/theme/default/flows/registration.tsx
  • packages/elements-react/src/components/card/two-step/utils.ts
  • packages/elements-react/src/theme/default/utils/tests/constructCardHeader.spec.tsx
  • packages/elements-react/src/theme/default/components/settings/settings-totp.tsx
  • packages/elements-react/src/components/form/nodes/renderer/image-renderer.tsx
  • packages/elements-react/src/util/sdk-helpers/test/continueWith.spec.ts
  • packages/elements-react/src/components/settings/webauthn-settings.tsx
  • packages/elements-react/src/theme/default/components/form/link-button.tsx
  • packages/elements-react/src/types.ts
  • packages/elements-react/src/context/defaultNodeSorter.ts
  • packages/elements-react/src/theme/default/components/form/group-container.tsx
  • packages/elements-react/src/theme/default/components/form/captcha.tsx
  • packages/elements-react/src/theme/default/components/form/pin-code-input.tsx
  • packages/elements-react/src/theme/default/components/form/checkbox.tsx
  • packages/elements-react/src/util/sdk-helpers/ui.ts
  • packages/elements-react/src/util/transientPayload.ts
  • packages/elements-react/src/theme/default/components/ui/dropdown-menu.tsx
  • packages/elements-react/src/theme/default/components/form/select.tsx
  • packages/elements-react/src/theme/default/components/card/current-identifier-button.test.ts
  • packages/elements-react/src/util/utilFixSDKTypesHelper.ts
  • packages/elements-react/src/theme/default/components/card/footer.test.tsx
  • packages/elements-react/src/util/ui/index.ts
  • packages/elements-react/src/components/form/nodes/renderer/select-renderer.tsx
  • packages/elements-react/src/util/flowHasErrors.ts
  • packages/elements-react/src/components/form/nodes/renderer/consent-checkbox-renderer.tsx
  • packages/elements-react/src/components/settings/oidc-settings.tsx
  • packages/elements-react/stories/components/settings/lookup_secrets.stories.ts
  • packages/elements-react/src/theme/default/components/form/index.tsx
  • packages/elements-react/src/util/submitHandler.ts
  • packages/elements-react/src/util/onSubmitSettings.test.ts
  • packages/elements-react/src/util/onSubmitVerification.test.ts
  • packages/elements-react/src/components/form/nodes/hooks/useInputProps.tsx
  • packages/elements-react/src/components/form/useResendCode.ts
  • packages/elements-react/src/theme/default/components/settings/settings-recovery-codes.tsx
  • packages/elements-react/src/components/settings/settings-card.tsx
  • packages/elements-react/src/theme/default/components/form/section.tsx
  • packages/elements-react/src/theme/default/components/form/label.tsx
  • packages/elements-react/src/theme/default/utils/logout.ts
  • packages/elements-react/src/context/flow-context.tsx
  • packages/elements-react/src/util/events.ts
  • packages/elements-react/src/theme/default/utils/oauth2.ts
  • packages/elements-react/src/util/flowContainer.ts
  • packages/elements-react/src/util/childCounter.ts
  • packages/elements-react/src/context/form-state.ts
  • packages/elements-react/src/theme/default/components/card/auth-method-list-item.tsx
  • packages/elements-react/src/components/form/nodes/renderer/checkbox-renderer.tsx
  • packages/elements-react/src/util/i18n/index.ts
  • packages/elements-react/src/theme/default/flows/recovery.tsx
  • packages/elements-react/src/theme/default/components/default-components.tsx
  • packages/elements-react/src/context/defaultNodeSorter.test.ts
  • packages/elements-react/src/components/settings/passkey-settings.tsx
  • packages/elements-react/src/theme/default/components/form/sso.tsx
  • packages/elements-react/src/context/config.tsx
  • packages/elements-react/src/context/component.tsx
  • packages/elements-react/src/context/intl-context.tsx
  • packages/elements-react/src/theme/default/components/settings/settings-webauthn.tsx
  • packages/elements-react/src/theme/default/utils/tests/user.spec.ts
  • packages/elements-react/src/components/card/two-step/state-provide-identifier.tsx
  • packages/elements-react/src/components/form/nodes/renderer/button-renderer.tsx
  • packages/elements-react/src/context/provider.tsx
  • packages/elements-react/src/theme/default/components/card/current-identifier-button.tsx
  • packages/elements-react/src/theme/default/flows/consent.tsx
  • packages/elements-react/src/components/card/card.tsx
  • packages/elements-react/stories/components/settings/webauthn.stories.ts
  • packages/elements-react/src/client/useSession.spec.tsx
  • packages/elements-react/src/tests/jest/test-utils.tsx
  • packages/elements-react/src/util/onSubmitVerification.ts
  • packages/elements-react/src/components/form/useOryFormSubmit.ts
  • packages/elements-react/stories/components/settings/passkey.stories.ts
  • packages/elements-react/src/util/ui/test/ui.spec.ts
  • packages/elements-react/src/theme/default/flows/login.tsx
  • packages/elements-react/src/util/client.ts
  • packages/elements-react/src/util/onSubmitRecovery.ts
  • packages/elements-react/stories/components/settings/all.stories.tsx
  • packages/elements-react/src/util/onSubmitSettings.ts
  • packages/elements-react/src/util/onSubmitRegistration.test.ts
  • packages/elements-react/src/components/form/settings-section.tsx
  • packages/elements-react/src/util/sdk-helpers/test/utils.spec.ts
  • packages/elements-react/src/theme/default/components/card/list-item.tsx
  • packages/elements-react/src/components/form/form.tsx
  • packages/elements-react/src/util/sdk-helpers/test/ui.spec.ts
  • packages/elements-react/src/util/showToast.tsx
  • packages/elements-react/src/util/sdk-helpers/error.ts
  • packages/elements-react/src/theme/default/components/form/text.tsx
  • packages/elements-react/src/util/sdk-helpers/utils.ts
  • packages/elements-react/src/components/form/nodes/renderer/text-renderer.tsx
  • packages/elements-react/src/components/card/two-step/tests/card-two-step.spec.ts
  • packages/elements-react/stories/components/settings/oidc.stories.ts
  • packages/elements-react/src/client/frontendClient.ts
  • packages/elements-react/src/util/sdk-helpers/continueWith.ts
  • packages/elements-react/src/util/onSubmitLogin.ts
  • packages/elements-react/src/theme/default/components/generic/toast.tsx
  • packages/elements-react/src/theme/default/flows/error.tsx
🚧 Files skipped from review as they are similar to previous changes (5)
  • packages/elements-react/src/theme/default/components/form/button.tsx
  • packages/elements-react/src/components/form/nodes/node.tsx
  • packages/elements-react/src/components/settings/index.tsx
  • packages/elements-react/stories/utils.ts
  • packages/elements-react/src/util/onSubmitRegistration.ts

📝 Walkthrough

Walkthrough

This PR converts many runtime value imports to TypeScript type-only imports across the elements-react package and adds verbatimModuleSyntax: true to tsconfig, preserving type-only import syntax in emitted output. Runtime logic, exported APIs, and behavior are unchanged.

Changes

Type-Only Import Migration

Layer / File(s) Summary
Configuration
packages/elements-react/tsconfig.json
Adds compilerOptions.verbatimModuleSyntax: true to preserve original module syntax in emitted output.
Core Types
packages/elements-react/src/types.ts
React and @ory/client-fetch imports converted to import type so exported type aliases remain compile-time only.
Client
packages/elements-react/src/client/*, packages/elements-react/src/util/client.ts
ConfigurationParameters, Session, and other SDK types switched to type-only imports; frontendClient and session/provider runtime logic unchanged.
Context & Providers
packages/elements-react/src/context/*, packages/elements-react/src/context/provider.tsx
React types (Dispatch, PropsWithChildren) and internal SDK/types (UiNode, OryFlowContainer, form state/actions, handler types) marked import type; runtime hooks and provider wiring unchanged.
Utilities
packages/elements-react/src/util/*, packages/elements-react/src/util/sdk-helpers/*
Wide conversion of SDK and local helper types (flows, nodes, events, handlers, payloads) to type-only imports across utilities (events, flowContainer, nodes, omitAttributes, submitHandler, transientPayload, i18n, ui helpers, etc.).
Components — Form / Nodes / Renderers
packages/elements-react/src/components/form/*, .../nodes/*, .../renderer/*
UiNode, UiText, input/attribute types, React prop types converted to import type; component implementations, renderers, hooks, and logic unchanged.
Components — Card / Settings / Theme
packages/elements-react/src/components/card/*, .../components/*, .../settings/*, packages/elements-react/src/theme/default/*
Prop types (e.g., OryCard*Props, OryNode*Props), SDK UI types, and React-only types converted to type-only imports across card, settings, theme components and default component implementations remain the same.
Flows (Theme)
packages/elements-react/src/theme/default/flows/*
Flow model types (LoginFlow, RegistrationFlow, RecoveryFlow, SettingsFlow, VerificationFlow, ConsentFlow) and handler/config types converted to import type; runtime FlowType and provider components remain runtime imports.
Tests & Stories
packages/elements-react/src/**/__tests__/*, packages/elements-react/stories/*, packages/elements-react/src/tests/*
Test and Storybook type imports (Meta, StoryObj, flow types, Ui* types, PropsWithChildren, RenderOptions) switched to type-only imports; tests and stories unchanged functionally.
Small formatting / import reorders
many files
Minor import reformatting and reordering to separate type-only imports from runtime imports; no behavioral changes.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~12 minutes

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

@GauthierPLM GauthierPLM force-pushed the refactor/verbatim-module-on-elements-react branch from 6c0661c to 52914a2 Compare May 4, 2026 21:04
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 5

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
packages/elements-react/src/components/form/nodes/node.tsx (1)

56-56: ⚠️ Potential issue | 🔴 Critical | ⚡ Quick win

Fix missing React namespace import on line 56.

Line 56 uses React.HTMLAttributeReferrerPolicy in a type cast, but React is not imported as a namespace. The file only imports ReactNode as a type-only import (line 5), which does not make the React namespace available. With verbatimModuleSyntax: true and jsx: react-jsx in tsconfig, TypeScript will fail to resolve React at compile time.

Add a namespace import:

+import type * as React from "react"
import type { ReactNode } from "react"

Or use inline import syntax in the cast:

-referrerPolicy={referrerpolicy as React.HTMLAttributeReferrerPolicy}
+referrerPolicy={referrerpolicy as import("react").HTMLAttributeReferrerPolicy}
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/elements-react/src/components/form/nodes/node.tsx` at line 56, The
cast using React.HTMLAttributeReferrerPolicy in the referrerPolicy prop is
failing because the React namespace is not imported (only the type ReactNode is
imported); fix by bringing the React namespace into scope or by using an inline
import type cast: either add a namespace import for React (e.g., import * as
React from 'react') so React.HTMLAttributeReferrerPolicy resolves, or change the
cast to the inline form (import('react').HTMLAttributeReferrerPolicy) so the
type is resolved without a namespace; update the referrerPolicy usage
accordingly near the referrerpolicy prop and ensure imports at the top include
the chosen change.
🧹 Nitpick comments (3)
packages/elements-react/stories/utils.ts (1)

12-12: ⚡ Quick win

Avoid importing from internal @ory/client-fetch/src/ paths.

The LoginFlowActiveEnum is not part of the @ory/client-fetch public API surface. Importing directly from src/ bypasses the public interface and can silently break on internal package refactors. Since the enum is not publicly exported, inline the type as a string union literal instead:

♻️ Suggested fix
-import { LoginFlowActiveEnum } from "@ory/client-fetch/src/models/LoginFlow"
+type LoginFlowActiveMethod = "password" | "oidc" | "totp" | "webauthn" | "lookup_secret" | "code"

Then replace LoginFlowActiveEnum usages with the local type.

Note: This pattern exists in multiple story files and should be addressed across all of them.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/elements-react/stories/utils.ts` at line 12, Remove the non-public
import of LoginFlowActiveEnum (import { LoginFlowActiveEnum } ...) and replace
it with a local string-union type (e.g., type LoginFlowActive = 'active' |
'pending' | ...) declared in this file, then update all usages of
LoginFlowActiveEnum in this file (and other story files with the same pattern)
to use the local type name (e.g., LoginFlowActive) so you no longer import from
`@ory/client-fetch/src/`.
packages/elements-react/src/context/defaultNodeSorter.test.ts (1)

5-5: ⚡ Quick win

UiNodeInputAttributesTypeEnum is only used as a type — add the type modifier for consistency

UiNodeInputAttributesTypeEnum appears in exactly one position in this file: the parameter type annotation on line 11 (inputType?: UiNodeInputAttributesTypeEnum). It is never used as a runtime value (no member access like .Text, .Submit, etc.; callers always pass string literals). Without the type modifier, any import without a type modifier is left in the emitted output; anything that uses the type modifier is dropped entirely. So the import is kept as a runtime reference unnecessarily.

Note: TypeScript does not error on a regular enum imported and used only as a type even with verbatimModuleSyntax enabled — the missing TS1484 diagnostic is a known compiler gap, so this won't break the build. However, the documented best practice is to use import type for enums when used only as types.

♻️ Proposed fix
-import { type UiNode, UiNodeInputAttributesTypeEnum } from "@ory/client-fetch"
+import { type UiNode, type UiNodeInputAttributesTypeEnum } from "@ory/client-fetch"
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/elements-react/src/context/defaultNodeSorter.test.ts` at line 5,
Change the import so UiNodeInputAttributesTypeEnum is imported only as a type
(e.g. add the type modifier for UiNodeInputAttributesTypeEnum) because it’s used
only in the parameter annotation inputType?: UiNodeInputAttributesTypeEnum;
update the import line that currently mentions UiNode and
UiNodeInputAttributesTypeEnum so that UiNodeInputAttributesTypeEnum is prefixed
with type (or moved to an import type {...} statement) to avoid emitting an
unnecessary runtime reference.
packages/elements-react/src/util/events.ts (1)

4-17: ⚡ Quick win

FlowType is never used as a value here — consider marking it type FlowType.

Every reference to FlowType in this file (lines 32, 44, 61, 75, 86, 97, 134–138, 153–163) is inside an export type { ... } declaration — none are runtime value accesses. With verbatimModuleSyntax: true, a non-type import is emitted verbatim into JavaScript, so the compiled events.js will carry an unnecessary runtime import of FlowType from @ory/client-fetch.

TypeScript will not raise a compile error here (regular enum imports are intentionally not flagged even when only used as types), but the intent of this PR is to make module-level type dependencies explicit and avoid opaque runtime coupling.

♻️ Suggested fix
 import {
   type ErrorFlowReplaced,
-  FlowType,
+  type FlowType,
   type GenericError,
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/elements-react/src/util/events.ts` around lines 4 - 17, The import
includes FlowType as a value but it's only used in type-only exports (e.g., the
export type { FlowType, ... } occurrences), so change the import specifier for
FlowType to a type-only import (i.e., import type { FlowType } from
"@ory/client-fetch") while leaving the other runtime imports unchanged; update
the import statement that currently lists FlowType alongside ErrorFlowReplaced,
GenericError, Identity, LoginFlow, etc., to import FlowType with the type
keyword so the compiled events.ts does not emit an unnecessary runtime import.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@packages/elements-react/src/context/config.tsx`:
- Line 1: The committed file packages/elements-react/src/context/config.tsx is
not formatted according to the project's formatter; re-run the project's
formatter (e.g., Prettier) on that file, stage and commit the formatted changes
so `git diff HEAD --exit-code` passes; ensure you run the same format command
used in CI (or npm/yarn script like "format") and verify formatting for any
exported symbols in this file (e.g., ConfigContext, ConfigProvider) before
pushing.
- Line 4: The import of FrontendApi in
packages/elements-react/src/context/config.tsx is used only as a type and must
be imported as a type-only import to satisfy verbatimModuleSyntax; update the
import statement that currently references FrontendApi to use the type modifier
(so FrontendApi is imported as a type) so the type alias frontend: FrontendApi
compiles without TS1484 errors.

In
`@packages/elements-react/src/theme/default/components/card/auth-method-list-item.tsx`:
- Line 10: The file fails CI formatting due to an import line (import { type
OryCardAuthMethodListItemProps, useOryFlow } from "@ory/elements-react") — run
the project formatter (e.g., prettier --write or the repo's format script) on
packages/elements-react/src/theme/default/components/card/auth-method-list-item.tsx
to reflow the long import; ensure the import statement for
OryCardAuthMethodListItemProps and useOryFlow matches the repo’s Prettier
configuration (line breaks/spacing) so git diff HEAD --exit-code is clean.

In `@packages/elements-react/src/theme/default/utils/constructCardHeader.ts`:
- Around line 5-12: The import for AuthenticatorAssuranceLevel is missing the
type qualifier causing TS errors with verbatimModuleSyntax; update the import
list in constructCardHeader.ts to import AuthenticatorAssuranceLevel with the
type modifier (i.e., add "type" before AuthenticatorAssuranceLevel) so it
matches the pattern used for OAuth2ConsentRequest, Session, and UiContainer and
satisfies the usage at the requested_aal?: AuthenticatorAssuranceLevel type
position.

In `@packages/elements-react/src/util/i18n/index.ts`:
- Line 5: Import useIntl as a type-only import because it's only used in a type
position (ReturnType<typeof useIntl>) — change the import statement to use the
TypeScript "type" specifier for useIntl (i.e., import { defineMessages, type
IntlShape, type useIntl } from "react-intl") so the binding is treated as
type-only and satisfies verbatimModuleSyntax; update the import that currently
includes useIntl without "type" and ensure ReturnType<typeof useIntl> remains
unchanged.

---

Outside diff comments:
In `@packages/elements-react/src/components/form/nodes/node.tsx`:
- Line 56: The cast using React.HTMLAttributeReferrerPolicy in the
referrerPolicy prop is failing because the React namespace is not imported (only
the type ReactNode is imported); fix by bringing the React namespace into scope
or by using an inline import type cast: either add a namespace import for React
(e.g., import * as React from 'react') so React.HTMLAttributeReferrerPolicy
resolves, or change the cast to the inline form
(import('react').HTMLAttributeReferrerPolicy) so the type is resolved without a
namespace; update the referrerPolicy usage accordingly near the referrerpolicy
prop and ensure imports at the top include the chosen change.

---

Nitpick comments:
In `@packages/elements-react/src/context/defaultNodeSorter.test.ts`:
- Line 5: Change the import so UiNodeInputAttributesTypeEnum is imported only as
a type (e.g. add the type modifier for UiNodeInputAttributesTypeEnum) because
it’s used only in the parameter annotation inputType?:
UiNodeInputAttributesTypeEnum; update the import line that currently mentions
UiNode and UiNodeInputAttributesTypeEnum so that UiNodeInputAttributesTypeEnum
is prefixed with type (or moved to an import type {...} statement) to avoid
emitting an unnecessary runtime reference.

In `@packages/elements-react/src/util/events.ts`:
- Around line 4-17: The import includes FlowType as a value but it's only used
in type-only exports (e.g., the export type { FlowType, ... } occurrences), so
change the import specifier for FlowType to a type-only import (i.e., import
type { FlowType } from "@ory/client-fetch") while leaving the other runtime
imports unchanged; update the import statement that currently lists FlowType
alongside ErrorFlowReplaced, GenericError, Identity, LoginFlow, etc., to import
FlowType with the type keyword so the compiled events.ts does not emit an
unnecessary runtime import.

In `@packages/elements-react/stories/utils.ts`:
- Line 12: Remove the non-public import of LoginFlowActiveEnum (import {
LoginFlowActiveEnum } ...) and replace it with a local string-union type (e.g.,
type LoginFlowActive = 'active' | 'pending' | ...) declared in this file, then
update all usages of LoginFlowActiveEnum in this file (and other story files
with the same pattern) to use the local type name (e.g., LoginFlowActive) so you
no longer import from `@ory/client-fetch/src/`.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: eb1bb19f-aef1-4a30-bc2b-1bdb7cb5576d

📥 Commits

Reviewing files that changed from the base of the PR and between f30f9f0 and 6c0661c.

📒 Files selected for processing (150)
  • packages/elements-react/src/client/frontendClient.ts
  • packages/elements-react/src/client/session-provider.tsx
  • packages/elements-react/src/client/useSession.spec.tsx
  • packages/elements-react/src/components/card/card.tsx
  • packages/elements-react/src/components/card/content.tsx
  • packages/elements-react/src/components/card/index.tsx
  • packages/elements-react/src/components/card/two-step/__tests__/card-two-step.spec.ts
  • packages/elements-react/src/components/card/two-step/state-method-active.tsx
  • packages/elements-react/src/components/card/two-step/state-provide-identifier.tsx
  • packages/elements-react/src/components/card/two-step/state-select-method.tsx
  • packages/elements-react/src/components/card/two-step/utils.ts
  • packages/elements-react/src/components/form/form-helpers.ts
  • packages/elements-react/src/components/form/form-provider.tsx
  • packages/elements-react/src/components/form/form-resolver.test.tsx
  • packages/elements-react/src/components/form/form-resolver.ts
  • packages/elements-react/src/components/form/form.tsx
  • packages/elements-react/src/components/form/messages.tsx
  • packages/elements-react/src/components/form/nodes/hooks/useInputProps.tsx
  • packages/elements-react/src/components/form/nodes/input.tsx
  • packages/elements-react/src/components/form/nodes/node-button.tsx
  • packages/elements-react/src/components/form/nodes/node.tsx
  • packages/elements-react/src/components/form/nodes/renderer/button-renderer.tsx
  • packages/elements-react/src/components/form/nodes/renderer/checkbox-renderer.tsx
  • packages/elements-react/src/components/form/nodes/renderer/consent-checkbox-renderer.tsx
  • packages/elements-react/src/components/form/nodes/renderer/hidden-input-renderer.tsx
  • packages/elements-react/src/components/form/nodes/renderer/image-renderer.tsx
  • packages/elements-react/src/components/form/nodes/renderer/input-renderer.tsx
  • packages/elements-react/src/components/form/nodes/renderer/select-renderer.test.tsx
  • packages/elements-react/src/components/form/nodes/renderer/select-renderer.tsx
  • packages/elements-react/src/components/form/nodes/renderer/sso-button-renderer.tsx
  • packages/elements-react/src/components/form/nodes/renderer/text-renderer.tsx
  • packages/elements-react/src/components/form/settings-section.tsx
  • packages/elements-react/src/components/form/social.test.tsx
  • packages/elements-react/src/components/form/social.tsx
  • packages/elements-react/src/components/form/useOryFormSubmit.ts
  • packages/elements-react/src/components/form/useResendCode.ts
  • packages/elements-react/src/components/settings/index.tsx
  • packages/elements-react/src/components/settings/oidc-settings.tsx
  • packages/elements-react/src/components/settings/passkey-settings.tsx
  • packages/elements-react/src/components/settings/recovery-codes-settings.tsx
  • packages/elements-react/src/components/settings/settings-card.tsx
  • packages/elements-react/src/components/settings/totp-settings.tsx
  • packages/elements-react/src/components/settings/webauthn-settings.tsx
  • packages/elements-react/src/context/component.tsx
  • packages/elements-react/src/context/config.tsx
  • packages/elements-react/src/context/defaultNodeSorter.test.ts
  • packages/elements-react/src/context/defaultNodeSorter.ts
  • packages/elements-react/src/context/flow-context.tsx
  • packages/elements-react/src/context/form-state.test.ts
  • packages/elements-react/src/context/form-state.ts
  • packages/elements-react/src/context/intl-context.tsx
  • packages/elements-react/src/context/provider.tsx
  • packages/elements-react/src/tests/jest/test-utils.tsx
  • packages/elements-react/src/theme/default/components/card/auth-method-list-container.tsx
  • packages/elements-react/src/theme/default/components/card/auth-method-list-item.tsx
  • packages/elements-react/src/theme/default/components/card/content.tsx
  • packages/elements-react/src/theme/default/components/card/current-identifier-button.test.ts
  • packages/elements-react/src/theme/default/components/card/current-identifier-button.tsx
  • packages/elements-react/src/theme/default/components/card/footer.test.tsx
  • packages/elements-react/src/theme/default/components/card/footer.tsx
  • packages/elements-react/src/theme/default/components/card/index.tsx
  • packages/elements-react/src/theme/default/components/card/list-item.tsx
  • packages/elements-react/src/theme/default/components/default-components.tsx
  • packages/elements-react/src/theme/default/components/form/button.tsx
  • packages/elements-react/src/theme/default/components/form/captcha.tsx
  • packages/elements-react/src/theme/default/components/form/checkbox.tsx
  • packages/elements-react/src/theme/default/components/form/consent-scope-checkbox.tsx
  • packages/elements-react/src/theme/default/components/form/group-container.tsx
  • packages/elements-react/src/theme/default/components/form/image.tsx
  • packages/elements-react/src/theme/default/components/form/index.tsx
  • packages/elements-react/src/theme/default/components/form/input.tsx
  • packages/elements-react/src/theme/default/components/form/label.tsx
  • packages/elements-react/src/theme/default/components/form/link-button.tsx
  • packages/elements-react/src/theme/default/components/form/pin-code-input.tsx
  • packages/elements-react/src/theme/default/components/form/section.tsx
  • packages/elements-react/src/theme/default/components/form/select.tsx
  • packages/elements-react/src/theme/default/components/form/sso.tsx
  • packages/elements-react/src/theme/default/components/form/text.tsx
  • packages/elements-react/src/theme/default/components/generic/page-header.tsx
  • packages/elements-react/src/theme/default/components/generic/toast.tsx
  • packages/elements-react/src/theme/default/components/settings/settings-oidc.tsx
  • packages/elements-react/src/theme/default/components/settings/settings-passkey.tsx
  • packages/elements-react/src/theme/default/components/settings/settings-recovery-codes.tsx
  • packages/elements-react/src/theme/default/components/settings/settings-totp.tsx
  • packages/elements-react/src/theme/default/components/settings/settings-webauthn.tsx
  • packages/elements-react/src/theme/default/components/ui/checkbox-label.spec.tsx
  • packages/elements-react/src/theme/default/components/ui/checkbox-label.tsx
  • packages/elements-react/src/theme/default/components/ui/dropdown-menu.tsx
  • packages/elements-react/src/theme/default/components/ui/user-avater.tsx
  • packages/elements-react/src/theme/default/components/ui/user-menu.tsx
  • packages/elements-react/src/theme/default/flows/consent.tsx
  • packages/elements-react/src/theme/default/flows/error.tsx
  • packages/elements-react/src/theme/default/flows/login.tsx
  • packages/elements-react/src/theme/default/flows/recovery.tsx
  • packages/elements-react/src/theme/default/flows/registration.tsx
  • packages/elements-react/src/theme/default/flows/settings.tsx
  • packages/elements-react/src/theme/default/flows/verification.tsx
  • packages/elements-react/src/theme/default/utils/__tests__/constructCardHeader.spec.tsx
  • packages/elements-react/src/theme/default/utils/__tests__/user.spec.ts
  • packages/elements-react/src/theme/default/utils/constructCardHeader.ts
  • packages/elements-react/src/theme/default/utils/logout.ts
  • packages/elements-react/src/theme/default/utils/oauth2.ts
  • packages/elements-react/src/theme/default/utils/user.ts
  • packages/elements-react/src/types.ts
  • packages/elements-react/src/util/childCounter.ts
  • packages/elements-react/src/util/client.ts
  • packages/elements-react/src/util/clientConfiguration.ts
  • packages/elements-react/src/util/events.ts
  • packages/elements-react/src/util/flowContainer.ts
  • packages/elements-react/src/util/flowHasErrors.ts
  • packages/elements-react/src/util/i18n/__tests__/index.spec.tsx
  • packages/elements-react/src/util/i18n/__tests__/test-components.tsx
  • packages/elements-react/src/util/i18n/index.ts
  • packages/elements-react/src/util/nodes.ts
  • packages/elements-react/src/util/omitAttributes.ts
  • packages/elements-react/src/util/onSubmitLogin.test.ts
  • packages/elements-react/src/util/onSubmitLogin.ts
  • packages/elements-react/src/util/onSubmitRecovery.test.ts
  • packages/elements-react/src/util/onSubmitRecovery.ts
  • packages/elements-react/src/util/onSubmitRegistration.test.ts
  • packages/elements-react/src/util/onSubmitRegistration.ts
  • packages/elements-react/src/util/onSubmitSettings.test.ts
  • packages/elements-react/src/util/onSubmitSettings.ts
  • packages/elements-react/src/util/onSubmitVerification.test.ts
  • packages/elements-react/src/util/onSubmitVerification.ts
  • packages/elements-react/src/util/sdk-helpers/__test__/continueWith.spec.ts
  • packages/elements-react/src/util/sdk-helpers/__test__/ui.spec.ts
  • packages/elements-react/src/util/sdk-helpers/__test__/utils.spec.ts
  • packages/elements-react/src/util/sdk-helpers/continueWith.ts
  • packages/elements-react/src/util/sdk-helpers/error.ts
  • packages/elements-react/src/util/sdk-helpers/ui.ts
  • packages/elements-react/src/util/sdk-helpers/utils.ts
  • packages/elements-react/src/util/showToast.tsx
  • packages/elements-react/src/util/submitHandler.ts
  • packages/elements-react/src/util/transientPayload.test.ts
  • packages/elements-react/src/util/transientPayload.ts
  • packages/elements-react/src/util/ui/__test__/ui.spec.ts
  • packages/elements-react/src/util/ui/index.ts
  • packages/elements-react/src/util/utilFixSDKTypesHelper.ts
  • packages/elements-react/stories/components/error/error.stories.tsx
  • packages/elements-react/stories/components/settings/all-2fa.stories.ts
  • packages/elements-react/stories/components/settings/all.stories.tsx
  • packages/elements-react/stories/components/settings/lookup_secrets.stories.ts
  • packages/elements-react/stories/components/settings/oidc.stories.ts
  • packages/elements-react/stories/components/settings/passkey.stories.ts
  • packages/elements-react/stories/components/settings/saml.stories.ts
  • packages/elements-react/stories/components/settings/totp.stories.ts
  • packages/elements-react/stories/components/settings/webauthn.stories.ts
  • packages/elements-react/stories/utils.ts
  • packages/elements-react/tsconfig.json

Comment thread packages/elements-react/src/context/config.tsx
Comment thread packages/elements-react/src/context/config.tsx Outdated
Comment thread packages/elements-react/src/theme/default/utils/constructCardHeader.ts Outdated
Comment thread packages/elements-react/src/util/i18n/index.ts Outdated
@GauthierPLM
Copy link
Copy Markdown
Author

Not sure to understand the issue with @ory/elements-react:api-extractor task. How may I fix this?

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants