Skip to content

feat(expo): add experimental useSSO with new hooks - #9103

Open
swolfand wants to merge 4 commits into
mainfrom
sam/mobile-582-update-usesso-in-clerkexpoexperimental-to-use-new-hooks
Open

feat(expo): add experimental useSSO with new hooks#9103
swolfand wants to merge 4 commits into
mainfrom
sam/mobile-582-update-usesso-in-clerkexpoexperimental-to-use-new-hooks

Conversation

@swolfand

@swolfand swolfand commented Jul 7, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Add an experimental useSSO export for @clerk/expo/experimental that uses the new useClerk, useSignIn, and useSignUp hooks.
  • Preserve the existing Expo SSO behavior for redirect URL creation, browser auth sessions, rotating token nonce reloads, and transfer sign-ups.
  • Add focused coverage for OAuth, enterprise SSO, transfer sign-up, dismissed browser sessions, error handling, and the experimental export.

Linear: MOBILE-582

Testing

  • corepack pnpm --filter @clerk/expo exec vitest run src/hooks/__tests__/useSSO.experimental.test.ts src/hooks/__tests__/useSSO.test.ts
  • corepack pnpm --filter @clerk/expo exec eslint src/experimental.ts src/hooks/useSSO.experimental.ts src/hooks/ssoDependencies.ts src/hooks/__tests__/useSSO.experimental.test.ts
  • corepack pnpm --filter @clerk/expo format:check
  • Manual device test with https://pkg.pr.new/@clerk/expo@9103: Google SSO from the native development build returned to the app and signed in successfully.

Notes

  • Local build:declarations was blocked by workspace dependency resolution / pnpm non-interactive module purge behavior in this shell, before reaching this change.

@changeset-bot

changeset-bot Bot commented Jul 7, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: e7a9719

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 1 package
Name Type
@clerk/expo Minor

Not sure what this means? Click here to learn what changesets are.

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

@vercel

vercel Bot commented Jul 7, 2026

Copy link
Copy Markdown

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

Project Deployment Actions Updated (UTC)
clerk-js-sandbox Ready Ready Preview Jul 29, 2026 8:27pm
swingset Ready Ready Preview Jul 29, 2026 8:27pm

Request Review

@coderabbitai

coderabbitai Bot commented Jul 7, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

📝 Walkthrough

Walkthrough

Introduces an experimental Expo useSSO hook, optional SSO dependency loading, SSO flow handling for OAuth, enterprise, and transferable sign-ins, an experimental entry-point re-export, and Vitest coverage for success and failure paths.

Changes

Area Summary
Optional dependency loader Loads expo-auth-session and expo-web-browser with installation error handling.
useSSO hook Adds typed flow parameters and results, browser authentication, nonce-based client reload, transferable sign-up handling, and existing-session activation.
Experimental export Re-exports the hook from experimental.ts and adds a minor changeset.
Tests Covers exports, flow variants, session activation, dismissed sessions, and errors.

Estimated code review effort: 4 (Complex) | ~40 minutes

Suggested reviewers: mikepitre

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly summarizes the main change: adding experimental useSSO support and related hooks in Expo.
Description check ✅ Passed The description matches the changeset and summarizes the new experimental hook, behavior, tests, and export.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
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.

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.

@pkg-pr-new

pkg-pr-new Bot commented Jul 7, 2026

Copy link
Copy Markdown

Open in StackBlitz

@clerk/astro

npm i https://pkg.pr.new/@clerk/astro@9103

@clerk/backend

npm i https://pkg.pr.new/@clerk/backend@9103

@clerk/chrome-extension

npm i https://pkg.pr.new/@clerk/chrome-extension@9103

@clerk/clerk-js

npm i https://pkg.pr.new/@clerk/clerk-js@9103

@clerk/electron

npm i https://pkg.pr.new/@clerk/electron@9103

@clerk/electron-passkeys

npm i https://pkg.pr.new/@clerk/electron-passkeys@9103

@clerk/eslint-plugin

npm i https://pkg.pr.new/@clerk/eslint-plugin@9103

@clerk/expo

npm i https://pkg.pr.new/@clerk/expo@9103

@clerk/expo-google-signin

npm i https://pkg.pr.new/@clerk/expo-google-signin@9103

@clerk/expo-passkeys

npm i https://pkg.pr.new/@clerk/expo-passkeys@9103

@clerk/express

npm i https://pkg.pr.new/@clerk/express@9103

@clerk/fastify

npm i https://pkg.pr.new/@clerk/fastify@9103

@clerk/hono

npm i https://pkg.pr.new/@clerk/hono@9103

@clerk/localizations

npm i https://pkg.pr.new/@clerk/localizations@9103

@clerk/nextjs

npm i https://pkg.pr.new/@clerk/nextjs@9103

@clerk/nuxt

npm i https://pkg.pr.new/@clerk/nuxt@9103

@clerk/react

npm i https://pkg.pr.new/@clerk/react@9103

@clerk/react-router

npm i https://pkg.pr.new/@clerk/react-router@9103

@clerk/shared

npm i https://pkg.pr.new/@clerk/shared@9103

@clerk/tanstack-react-start

npm i https://pkg.pr.new/@clerk/tanstack-react-start@9103

@clerk/testing

npm i https://pkg.pr.new/@clerk/testing@9103

@clerk/ui

npm i https://pkg.pr.new/@clerk/ui@9103

@clerk/upgrade

npm i https://pkg.pr.new/@clerk/upgrade@9103

@clerk/vue

npm i https://pkg.pr.new/@clerk/vue@9103

commit: e7a9719

@swolfand
swolfand requested a review from wobsoriano July 7, 2026 20:21
@swolfand
swolfand marked this pull request as ready for review July 7, 2026 20:21
@swolfand
swolfand requested a review from mikepitre July 7, 2026 20:21
@github-actions

github-actions Bot commented Jul 7, 2026

Copy link
Copy Markdown
Contributor

API Changes Report

Generated by Break Check on 2026-07-29T20:28:09.567Z

Summary

Metric Count
Packages analyzed 19
Packages with changes 1
🔴 Breaking changes 0
🟡 Non-breaking changes 0
🟢 Additions 4

@clerk/expo

Current version: 4.1.0
Recommended bump: MINOR → 4.2.0

Subpath ./experimental

🟢 Additions (4)

Added: StartSSOFlowParams
+ export type StartSSOFlowParams = {
+     redirectUrl?: string;
+     unsafeMetadata?: SignUpUnsafeMetadata;
+     authSessionOptions?: Pick<WebBrowser.AuthSessionOpenOptions, 'showInRecents'>;
+ } & ({
+     strategy: OAuthStrategy;
+ } | {
+     strategy: EnterpriseSSOStrategy;
+     identifier: string;
+ });

Added type alias StartSSOFlowParams

Added: StartSSOFlowReturnType
+ export type StartSSOFlowReturnType = {
+     createdSessionId: string | null;
+     authSessionResult: WebBrowser.WebBrowserAuthSessionResult | null;
+     signIn?: SignInFutureResource | null;
+     signUp?: SignUpFutureResource | null;
+ };

Added type alias StartSSOFlowReturnType

Added: useSSO
+ export declare function useSSO(): UseSSOReturn;

Added function useSSO

Added: UseSSOReturn
+ export type UseSSOReturn = {
+     startSSOFlow: (params: StartSSOFlowParams) => Promise<StartSSOFlowReturnType>;
+ };

Added type alias UseSSOReturn


Report generated by Break Check

Last ran on e7a9719.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🧹 Nitpick comments (3)
packages/expo/src/hooks/useSSO.experimental.ts (2)

14-34: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Public API types lack JSDoc.

StartSSOFlowParams and StartSSOFlowReturnType are exported and re-exported through experimental.ts, making them part of the generated reference docs surface. Neither has JSDoc describing fields like redirectUrl, authSessionOptions, createdSessionId, or authSessionResult.

As per path instructions, "If a PR adds or changes public/reference-facing API surface area, check whether the corresponding JSDoc is present, accurate, and aligned with the implementation." Since this is new reference-facing surface, the Docs team may need to review the addition.

🤖 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/expo/src/hooks/useSSO.experimental.ts` around lines 14 - 34, The
exported public API types in useSSO.experimental.ts are missing JSDoc, so add
doc comments for StartSSOFlowParams and StartSSOFlowReturnType and their
documented fields to match the reference-facing surface. Make sure the
descriptions cover the optional inputs like redirectUrl, unsafeMetadata,
authSessionOptions, and the returned values such as createdSessionId and
authSessionResult, and keep the docs aligned with the behavior of useSSO so the
generated reference remains accurate.

Source: Path instructions


58-63: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

useSSO is missing an explicit return type and JSDoc.

As per coding guidelines, "Always define explicit return types for functions, especially public APIs" and "Document functions with JSDoc comments including @param, @returns, @throws, and @example tags." useSSO is the primary exported hook for this feature and has neither.

♻️ Suggested fix
+export interface UseSSOReturn {
+  startSSOFlow: (startSSOFlowParams: StartSSOFlowParams) => Promise<StartSSOFlowReturnType>;
+}
+
+/**
+ * Hook to initiate an SSO (OAuth or Enterprise SSO) flow in Expo apps.
+ * `@example`
+ * const { startSSOFlow } = useSSO();
+ */
-export function useSSO() {
+export function useSSO(): UseSSOReturn {

Since this is also a reference-facing export via experimental.ts, the added JSDoc will likely surface in generated docs.

🤖 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/expo/src/hooks/useSSO.experimental.ts` around lines 58 - 63, The
exported useSSO hook lacks an explicit return type and JSDoc, so update the
useSSO declaration to name its return type explicitly and add a docblock above
it. Document the hook with `@param` for any inputs it exposes through
startSSOFlow, `@returns` for the hook API it provides, `@throws` for expected
failures in the SSO flow, and `@example` for typical usage. Keep the documentation
attached to useSSO so it also benefits the experimental export surface.

Sources: Coding guidelines, Path instructions

packages/expo/src/hooks/ssoDependencies.ts (1)

16-27: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

No direct test coverage for the actual require() failure path.

All tests in useSSO.experimental.test.ts fully mock loadSSODependencies, so this file's real try/catch branch (and its install-guidance error message) is never executed by the test suite.

♻️ Suggested test addition
// packages/expo/src/hooks/__tests__/ssoDependencies.test.ts
vi.mock('expo-auth-session', () => {
  throw new Error('Cannot find module');
});

test('throws install guidance when optional deps are missing', () => {
  expect(() => loadSSODependencies()).toThrow(/npx expo install expo-auth-session expo-web-browser/);
});
🤖 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/expo/src/hooks/ssoDependencies.ts` around lines 16 - 27, Add direct
test coverage for the real failure path in loadSSODependencies, since
useSSO.experimental.test.ts only mocks it and never exercises the try/catch.
Create a test around the actual loadSSODependencies function in
ssoDependencies.test.ts that makes require('expo-auth-session') or
require('expo-web-browser') throw, then assert the thrown message includes the
install guidance text. This should validate the catch block’s behavior and the
error message for missing optional SSO dependencies.
🤖 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.

Nitpick comments:
In `@packages/expo/src/hooks/ssoDependencies.ts`:
- Around line 16-27: Add direct test coverage for the real failure path in
loadSSODependencies, since useSSO.experimental.test.ts only mocks it and never
exercises the try/catch. Create a test around the actual loadSSODependencies
function in ssoDependencies.test.ts that makes require('expo-auth-session') or
require('expo-web-browser') throw, then assert the thrown message includes the
install guidance text. This should validate the catch block’s behavior and the
error message for missing optional SSO dependencies.

In `@packages/expo/src/hooks/useSSO.experimental.ts`:
- Around line 14-34: The exported public API types in useSSO.experimental.ts are
missing JSDoc, so add doc comments for StartSSOFlowParams and
StartSSOFlowReturnType and their documented fields to match the reference-facing
surface. Make sure the descriptions cover the optional inputs like redirectUrl,
unsafeMetadata, authSessionOptions, and the returned values such as
createdSessionId and authSessionResult, and keep the docs aligned with the
behavior of useSSO so the generated reference remains accurate.
- Around line 58-63: The exported useSSO hook lacks an explicit return type and
JSDoc, so update the useSSO declaration to name its return type explicitly and
add a docblock above it. Document the hook with `@param` for any inputs it exposes
through startSSOFlow, `@returns` for the hook API it provides, `@throws` for
expected failures in the SSO flow, and `@example` for typical usage. Keep the
documentation attached to useSSO so it also benefits the experimental export
surface.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository YAML (base), Repository UI (inherited)

Review profile: CHILL

Plan: Pro Plus

Run ID: 67a83ff0-5090-473c-9bf4-b389a5c17703

📥 Commits

Reviewing files that changed from the base of the PR and between 409cdae and 205771d.

📒 Files selected for processing (4)
  • packages/expo/src/experimental.ts
  • packages/expo/src/hooks/__tests__/useSSO.experimental.test.ts
  • packages/expo/src/hooks/ssoDependencies.ts
  • packages/expo/src/hooks/useSSO.experimental.ts

@wobsoriano wobsoriano left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Looking good with minor changes!

Comment thread packages/expo/src/hooks/useSSO.experimental.ts Outdated
Comment thread packages/expo/src/hooks/useSSO.experimental.ts Outdated
Comment thread packages/expo/src/hooks/useSSO.experimental.ts Outdated
Co-authored-by: Robert Soriano <sorianorobertc@gmail.com>

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Caution

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

⚠️ Outside diff range comments (2)
packages/expo/src/hooks/useSSO.experimental.ts (2)

118-120: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Reject successful callbacks without a rotating token nonce.

The ?? '' fallback turns an invalid callback into reload({ rotatingTokenNonce: '' }), causing an unnecessary API call and an opaque failure. Validate the nonce before reloading and tell developers to restart the SSO flow or verify the callback configuration.

Proposed fix
 const params = new URL(authSessionResult.url).searchParams;
-const rotatingTokenNonce = params.get('rotating_token_nonce') ?? '';
+const rotatingTokenNonce = params.get('rotating_token_nonce');
+if (!rotatingTokenNonce) {
+  return errorThrower.throw(
+    'SSO callback is missing rotating_token_nonce. Restart the SSO flow and verify the redirect URL configuration.',
+  );
+}
 await client.signIn.reload({ rotatingTokenNonce });
🤖 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/expo/src/hooks/useSSO.experimental.ts` around lines 118 - 120,
Update the callback handling around rotatingTokenNonce in the SSO flow to reject
successful callbacks when the URL lacks a rotating token nonce, rather than
defaulting to an empty string. Before calling client.signIn.reload, validate the
nonce and surface an actionable error instructing developers to restart the SSO
flow or verify the callback configuration.

14-34: 📐 Maintainability & Code Quality | 🟠 Major | ⚡ Quick win

Add explicit typing and JSDoc for the public hook API.

useSSO is exported without a return annotation, and the new public types/API lack the required JSDoc (@param, @returns, @throws, and @example). Add a named hook return type and document the returned startSSOFlow contract.

As per coding guidelines, public TypeScript APIs require explicit return types and comprehensive JSDoc. Based on learnings, exported/public functions in this repository should retain explicit return annotations.

Also applies to: 58-63

🤖 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/expo/src/hooks/useSSO.experimental.ts` around lines 14 - 34, Update
the exported useSSO hook with an explicit named return type, and add
comprehensive JSDoc for the public hook and returned startSSOFlow contract.
Document parameters, return values, possible throws, and include an example,
using the existing StartSSOFlowParams and StartSSOFlowReturnType symbols rather
than duplicating types.

Sources: Coding guidelines, Learnings

🤖 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.

Outside diff comments:
In `@packages/expo/src/hooks/useSSO.experimental.ts`:
- Around line 118-120: Update the callback handling around rotatingTokenNonce in
the SSO flow to reject successful callbacks when the URL lacks a rotating token
nonce, rather than defaulting to an empty string. Before calling
client.signIn.reload, validate the nonce and surface an actionable error
instructing developers to restart the SSO flow or verify the callback
configuration.
- Around line 14-34: Update the exported useSSO hook with an explicit named
return type, and add comprehensive JSDoc for the public hook and returned
startSSOFlow contract. Document parameters, return values, possible throws, and
include an example, using the existing StartSSOFlowParams and
StartSSOFlowReturnType symbols rather than duplicating types.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository YAML (base), Organization UI (inherited)

Review profile: CHILL

Plan: Pro Plus

Run ID: fec0cc2c-6143-4657-b376-40053ffb4cbf

📥 Commits

Reviewing files that changed from the base of the PR and between 205771d and a6ef329.

📒 Files selected for processing (1)
  • packages/expo/src/hooks/useSSO.experimental.ts
🔗 Linked repositories identified

CodeRabbit considers these linked repositories for cross-repo context during reviews:

  • clerk/clerk_go (manual)
  • clerk/dashboard (manual)
  • clerk/accounts (manual)
  • clerk/backoffice (manual)
  • clerk/clerk (manual)
  • clerk/clerk-docs (manual)
  • clerk/cloudflare-workers (manual)

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 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/expo/src/hooks/__tests__/ssoDependencies.test.ts`:
- Around line 21-31: Ensure the module-loader spy created in the
loadSSODependencies test is always restored, including when the assertion fails.
Wrap the expect assertion in a try/finally block and call loadSpy.mockRestore()
in the finally clause.
🪄 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: Repository YAML (base), Organization UI (inherited)

Review profile: CHILL

Plan: Pro Plus

Run ID: 8a93c7f4-af7d-4aa2-8e3e-3989d30175a5

📥 Commits

Reviewing files that changed from the base of the PR and between a6ef329 and e7a9719.

📒 Files selected for processing (4)
  • .changeset/bright-taxis-sing.md
  • packages/expo/src/hooks/__tests__/ssoDependencies.test.ts
  • packages/expo/src/hooks/__tests__/useSSO.experimental.test.ts
  • packages/expo/src/hooks/useSSO.experimental.ts
🔗 Linked repositories identified

CodeRabbit considers these linked repositories for cross-repo context during reviews:

  • clerk/clerk_go (manual)
  • clerk/dashboard (manual)
  • clerk/accounts (manual)
  • clerk/backoffice (manual)
  • clerk/clerk (manual)
  • clerk/clerk-docs (manual)
  • clerk/cloudflare-workers (manual)
🚧 Files skipped from review as they are similar to previous changes (1)
  • packages/expo/src/hooks/tests/useSSO.experimental.test.ts

Comment on lines +21 to +31
test('throws install guidance when an optional dependency cannot be loaded', () => {
const loadSpy = vi.spyOn(moduleWithLoad, '_load').mockImplementation((request, parent, isMain) => {
if (request === 'expo-auth-session') {
throw new Error('Cannot find module expo-auth-session');
}

return originalModuleLoad(request, parent, isMain);
});

expect(() => loadSSODependencies()).toThrow(/npx expo install expo-auth-session expo-web-browser/);
loadSpy.mockRestore();

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Always restore the module-loader spy.

If Line 30 fails, Line 31 is skipped and _load remains mocked for subsequent tests. Use try/finally around the assertion.

Proposed fix
-    expect(() => loadSSODependencies()).toThrow(/npx expo install expo-auth-session expo-web-browser/);
-    loadSpy.mockRestore();
+    try {
+      expect(() => loadSSODependencies()).toThrow(/npx expo install expo-auth-session expo-web-browser/);
+    } finally {
+      loadSpy.mockRestore();
+    }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
test('throws install guidance when an optional dependency cannot be loaded', () => {
const loadSpy = vi.spyOn(moduleWithLoad, '_load').mockImplementation((request, parent, isMain) => {
if (request === 'expo-auth-session') {
throw new Error('Cannot find module expo-auth-session');
}
return originalModuleLoad(request, parent, isMain);
});
expect(() => loadSSODependencies()).toThrow(/npx expo install expo-auth-session expo-web-browser/);
loadSpy.mockRestore();
test('throws install guidance when an optional dependency cannot be loaded', () => {
const loadSpy = vi.spyOn(moduleWithLoad, '_load').mockImplementation((request, parent, isMain) => {
if (request === 'expo-auth-session') {
throw new Error('Cannot find module expo-auth-session');
}
return originalModuleLoad(request, parent, isMain);
});
try {
expect(() => loadSSODependencies()).toThrow(/npx expo install expo-auth-session expo-web-browser/);
} finally {
loadSpy.mockRestore();
}
🤖 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/expo/src/hooks/__tests__/ssoDependencies.test.ts` around lines 21 -
31, Ensure the module-loader spy created in the loadSSODependencies test is
always restored, including when the assertion fails. Wrap the expect assertion
in a try/finally block and call loadSpy.mockRestore() in the finally clause.

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

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants