Skip to content

chore(backend): Improve subject handling for machine auth objects #6099

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 10 commits into from
Jun 11, 2025

Conversation

wobsoriano
Copy link
Member

@wobsoriano wobsoriano commented Jun 10, 2025

Description

This PR improves the subject property handling for machine auth objects. Specifically:

  • For api_keys, added a userId and orgId
  • For machine_token, added a machineId
  • For oauth_token, added a userId and the clientId for convenience.

Resolves USER-2118

Checklist

  • pnpm test runs as expected.
  • pnpm build runs as expected.
  • (If applicable) JSDoc comments have been added or updated for any package exports
  • (If applicable) Documentation has been updated

Type of change

  • 🐛 Bug fix
  • 🌟 New feature
  • 🔨 Breaking change
  • 📖 Refactoring / dependency upgrade / documentation
  • other:

Summary by CodeRabbit

Summary by CodeRabbit

  • New Features

    • Enhanced support for machine authentication objects, providing clearer identification properties such as userId, orgId, machineId, and clientId for different token types (API keys, machine tokens, and OAuth tokens).
  • Bug Fixes

    • Improved consistency in token and subject prefixes for machine tokens.
    • Renamed method and parameter for OAuth token verification to better reflect usage.
  • Tests

    • Updated and expanded test cases to reflect new identifier properties and adjusted expected values for machine token IDs.
    • Simplified type assertions in tests for authentication objects.
  • Documentation

    • Added usage examples and improved documentation for handling machine authentication objects.

Copy link

changeset-bot bot commented Jun 10, 2025

🦋 Changeset detected

Latest commit: b21e16f

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

This PR includes changesets to release 11 packages
Name Type
@clerk/backend Minor
@clerk/agent-toolkit Patch
@clerk/astro Patch
@clerk/express Patch
@clerk/fastify Patch
@clerk/nextjs Patch
@clerk/nuxt Patch
@clerk/react-router Patch
@clerk/remix Patch
@clerk/tanstack-react-start Patch
@clerk/testing Patch

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

Copy link

vercel bot commented Jun 10, 2025

The latest updates on your projects. Learn more about Vercel for Git ↗︎

1 Skipped Deployment
Name Status Preview Comments Updated (UTC)
clerk-js-sandbox ⬜️ Skipped (Inspect) Jun 10, 2025 8:56pm

Copy link
Contributor

coderabbitai bot commented Jun 10, 2025

📝 Walkthrough

"""

Walkthrough

This change updates the handling of machine authentication objects to provide explicit and type-safe support for API key, machine-to-machine (M2M), and OAuth token types. It revises type definitions, runtime object construction, and related tests to ensure the correct identifiers are present for each token type, and updates machine token prefixes throughout the codebase.

Changes

File(s) Change Summary
packages/backend/src/tokens/authObjects.ts Extended machine token type definitions and runtime construction to include userId, orgId, machineId, and clientId properties as appropriate for each token type. Updated code comment example for ID prefix.
packages/backend/src/api/endpoints/IdPOAuthAccessTokenApi.ts
packages/backend/src/tokens/verify.ts
Renamed method and parameter from verifySecret(secret) to verifyAccessToken(accessToken) for OAuth access token verification, updating internal usage accordingly.
packages/backend/src/fixtures/machine.ts
packages/backend/src/tokens/tests/verify.test.ts
packages/express/src/tests/getAuth.test.ts
packages/fastify/src/tests/getAuth.test.ts
Updated machine token ID and subject prefixes from mt_/user_ to m2m_/mch_ in fixtures and tests.
packages/backend/src/tokens/tests/authObjects.test.ts Revised and expanded tests for authenticated machine objects to check new property structure for each token type (userId, orgId, machineId, clientId), replacing previous generic checks.
packages/backend/src/tokens/tests/getAuth.test-d.ts Removed detailed property-specific type assertions and TypeScript error checks, simplifying to broader type matching assertions for discriminated unions. Removed unused import.
.changeset/mean-items-retire.md Added a changeset documenting the updated handling and usage of the subject property and new identifier properties for machine authentication objects.

Assessment against linked issues

Objective Addressed Explanation
Update AuthObject properties for each machine token type as specified (id, userId, orgId for API keys; id, machineId for M2M tokens; id, userId, clientId for OAuth tokens) ([USER-2118])

Assessment against linked issues: Out-of-scope changes

No out-of-scope changes were found.
"""


📜 Recent review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 00d1e6c and b21e16f.

📒 Files selected for processing (1)
  • packages/nextjs/src/server/__tests__/getAuthDataFromRequest.test.ts (1 hunks)
✅ Files skipped from review due to trivial changes (1)
  • packages/nextjs/src/server/tests/getAuthDataFromRequest.test.ts
⏰ Context from checks skipped due to timeout of 90000ms (3)
  • GitHub Check: semgrep/ci
  • GitHub Check: semgrep-cloud-platform/scan
  • GitHub Check: Analyze (javascript-typescript)
✨ Finishing Touches
  • 📝 Generate Docstrings

🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Explain this complex logic.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai explain this code block.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and explain its main purpose.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Support

Need help? Create a ticket on our support page for assistance with any issues or questions.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR.
  • @coderabbitai generate sequence diagram to generate a sequence diagram of the changes in this PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

@wobsoriano wobsoriano changed the title chore(backend): Update machine auth object properties chore(backend): Improve subject handling for machine auth objects Jun 10, 2025
@wobsoriano wobsoriano marked this pull request as ready for review June 10, 2025 20:20
@@ -5,11 +5,11 @@ import { AbstractAPI } from './AbstractApi';
const basePath = '/oauth_applications/access_tokens';

export class IdPOAuthAccessTokenApi extends AbstractAPI {
async verifySecret(secret: string) {
async verifyAccessToken(accessToken: string) {
Copy link
Member Author

@wobsoriano wobsoriano Jun 10, 2025

Choose a reason for hiding this comment

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

These machine token BAPI methods are not exposed in the SDK yet so it's safe to update this

return this.request<IdPOAuthAccessToken>({
method: 'POST',
path: joinPaths(basePath, 'verify'),
bodyParams: { secret },
bodyParams: { access_token: accessToken },
Copy link
Member Author

Choose a reason for hiding this comment

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

originally secret, deprecated in favor of access_token

Copy link
Contributor

@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: 7

🔭 Outside diff range comments (1)
packages/backend/src/tokens/machine.ts (1)

15-18: 🧹 Nitpick (assertive)

Comment prefix no longer matches code

The JSDoc examples still reference "oauth_access_", but the actual prefix constant is "oat_".

- * (e.g. "org_a_m2m_", "org_a_oauth_access_", "org_a_api_key_")
+ * (e.g. "org_a_m2m_", "org_a_oat_", "org_a_api_key_")

Aligning docs with code prevents confusion for integrators reading generated typings.

📜 Review details

Configuration used: CodeRabbit UI
Review profile: ASSERTIVE
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 97749d5 and 1494ec9.

📒 Files selected for processing (11)
  • .changeset/mean-items-retire.md (1 hunks)
  • packages/backend/src/api/endpoints/IdPOAuthAccessTokenApi.ts (1 hunks)
  • packages/backend/src/fixtures/machine.ts (2 hunks)
  • packages/backend/src/tokens/__tests__/authObjects.test.ts (3 hunks)
  • packages/backend/src/tokens/__tests__/getAuth.test-d.ts (2 hunks)
  • packages/backend/src/tokens/__tests__/verify.test.ts (4 hunks)
  • packages/backend/src/tokens/authObjects.ts (7 hunks)
  • packages/backend/src/tokens/machine.ts (1 hunks)
  • packages/backend/src/tokens/verify.ts (1 hunks)
  • packages/express/src/__tests__/getAuth.test.ts (1 hunks)
  • packages/fastify/src/__tests__/getAuth.test.ts (1 hunks)
🧰 Additional context used
🧬 Code Graph Analysis (3)
packages/fastify/src/__tests__/getAuth.test.ts (1)
packages/fastify/src/getAuth.ts (1)
  • getAuth (14-22)
packages/express/src/__tests__/getAuth.test.ts (1)
packages/express/src/__tests__/helpers.ts (1)
  • mockRequestWithAuth (29-39)
packages/backend/src/api/endpoints/IdPOAuthAccessTokenApi.ts (1)
packages/backend/src/api/resources/IdPOAuthAccessToken.ts (1)
  • IdPOAuthAccessToken (3-33)
🪛 Gitleaks (8.26.0)
packages/backend/src/fixtures/machine.ts

4-4: Detected a Generic API Key, potentially exposing access to various services and sensitive operations.

(generic-api-key)

packages/backend/src/tokens/__tests__/verify.test.ts

101-101: Detected a Generic API Key, potentially exposing access to various services and sensitive operations.

(generic-api-key)


223-223: Detected a Generic API Key, potentially exposing access to various services and sensitive operations.

(generic-api-key)

🪛 markdownlint-cli2 (0.17.2)
.changeset/mean-items-retire.md

5-5: First line in a file should be a top-level heading
null

(MD041, first-line-heading, first-line-h1)

⏰ Context from checks skipped due to timeout of 90000ms (2)
  • GitHub Check: semgrep-cloud-platform/scan
  • GitHub Check: Analyze (javascript-typescript)
🔇 Additional comments (11)
packages/express/src/__tests__/getAuth.test.ts (1)

31-36:

❓ Verification inconclusive

Add coverage for the newly-introduced machineId property

The PR description states that machine_token auth objects now expose a machineId.
This test still asserts that subject is undefined but never checks for machineId, so we’re missing regression coverage for the new field.

-    const req = mockRequestWithAuth({ tokenType: 'machine_token', id: 'm2m_1234' });
+    const req = mockRequestWithAuth({
+      tokenType: 'machine_token',
+      id: 'm2m_1234',
+      machineId: 'mch_5678',
+    });
...
-    expect(result.subject).toBeUndefined();
+    expect(result.machineId).toBe('mch_5678');
+    // `subject` was intentionally removed for machine tokens – document that:
+    expect(result.subject).toBeUndefined();

This small extension both exercises the new field and clarifies intentional absence of subject.


🏁 Script executed:

#!/bin/bash
set -e

echo "Searching for mockRequestWithAuth definition..."
rg "mockRequestWithAuth" -n .

echo
echo "Searching for getAuth implementation..."
rg "export function getAuth" -n packages/express/src

echo
echo "Searching for 'machineId' references..."
rg "machineId" -n .

Length of output: 1740


🏁 Script executed:

#!/bin/bash
set -e

echo "Searching for AuthObject definition..."
rg -n "interface AuthObject" -n packages/express/src
rg -n "type AuthObject" -n packages/express/src

echo
echo "Displaying mockRequestWithAuth implementation..."
sed -n '1,200p' packages/express/src/__tests__/helpers.ts

echo
echo "Searching for getAuth implementation and usage of machineId..."
rg -n "getAuth" -n packages/express/src
rg -n "machineId" -n packages/express/src

Length of output: 150


🏁 Script executed:

#!/bin/bash
set -e

echo "Searching for AuthObject references..."
rg -n 'AuthObject' packages/express/src

echo
echo "Searching for getAuth implementation..."
rg -n 'export function getAuth' packages/express/src

echo
echo "Displaying the mockRequestWithAuth helper (first 200 lines)..."
sed -n '1,200p' packages/express/src/__tests__/helpers.ts

echo
echo "Searching for any usage of machineId in the codebase..."
rg -n 'machineId' .

Length of output: 1524


🏁 Script executed:

#!/bin/bash
set -e

echo "=== getAuth.ts ==="
sed -n '1,200p' packages/express/src/getAuth.ts || echo "getAuth.ts not found"

echo
echo "=== utils.ts ==="
sed -n '1,200p' packages/express/src/utils.ts || echo "utils.ts not found"

Length of output: 3291


Add coverage for new machineId in getAuth test

The PR notes that machine_token auth objects now include a machineId. The existing test only checks that subject is undefined and doesn’t exercise the new field. Please update the test at packages/express/src/__tests__/getAuth.test.ts (lines 31–36) as follows:

-  const req = mockRequestWithAuth({ tokenType: 'machine_token', id: 'm2m_1234' });
+  const req = mockRequestWithAuth({
+    tokenType: 'machine_token',
+    id: 'm2m_1234',
+    machineId: 'mch_5678',
+  });
...
-  expect(result.subject).toBeUndefined();
+  expect(result.machineId).toBe('mch_5678');
+  // `subject` remains undefined for machine tokens
+  expect(result.subject).toBeUndefined();

This addition ensures we have regression coverage for the new machineId property.

packages/backend/src/tokens/verify.ts (1)

216-223: 🧹 Nitpick (assertive)

Rename local variable to avoid future confusion

Now that the first parameter is accessToken, the local variable in the catch helper should follow the same naming style for consistency with verifyAPIKey and verifyMachineToken. (Currently it is correct, just suggesting cohesion.)

-async function verifyOAuthToken(
-  accessToken: string,
+async function verifyOAuthToken(
+  accessToken: string,
   options: VerifyTokenOptions,
 ...
-    const verifiedToken = await client.idPOAuthAccessToken.verifyAccessToken(accessToken);
+    const verifiedToken = await client.idPOAuthAccessToken.verifyAccessToken(accessToken);

No functional change, only readability.

Likely an incorrect or invalid review comment.

packages/backend/src/tokens/__tests__/verify.test.ts (2)

202-224: Consistency in error-case fixtures

Error-case tokens were updated to m2m_…, but the mocked endpoint remains /m2m_tokens/verify (👍).
No issues spotted—just confirming the contract stays aligned with backend routes.

🧰 Tools
🪛 Gitleaks (8.26.0)

223-223: Detected a Generic API Key, potentially exposing access to various services and sensitive operations.

(generic-api-key)


100-109:

✅ Verification successful

Ensure mt_ prefix is fully eradicated across the repo

Great catch updating the happy-path test to the new m2m_ prefix. Please double-check that no stray mt_ tokens remain in the codebase (fixtures, docs, comments) otherwise tests may silently diverge from production behaviour.


🏁 Script executed:

#!/bin/bash
# Search for any remaining occurrences of the old machine-token prefix.
rg -n $'\bmt_[A-Za-z0-9_]+' --glob '!node_modules'

Length of output: 50


Let’s re-run the search using a plain regex (avoiding the bash‐specific \b escape) to catch any remaining mt_ prefixes:


🏁 Script executed:

#!/bin/bash
# Search for any occurrences of the old machine-token prefix across the repo
rg -n 'mt_[A-Za-z0-9_]+' --glob '!node_modules'

Length of output: 49


No remaining mt_ prefixes detected

A repository-wide search found zero occurrences of the old mt_ token prefix—everything now consistently uses m2m_. All fixtures, docs, comments, and code are updated.

🧰 Tools
🪛 Gitleaks (8.26.0)

101-101: Detected a Generic API Key, potentially exposing access to various services and sensitive operations.

(generic-api-key)

packages/backend/src/fixtures/machine.ts (1)

40-43: LGTM – fixture matches new conventions

id and subject correctly use the m2m_ / mch_ prefixes and align with the tests. No further action needed.

packages/backend/src/tokens/__tests__/authObjects.test.ts (2)

330-337: OAuth expectations updated correctly

clientId assertion added—matches new typing. No issues.


359-364: Machine token assertions align with new machineId field

Happy path verified; good to go.

packages/backend/src/tokens/__tests__/getAuth.test-d.ts (1)

40-48: Type-level discriminated-union test streamlined

The reduced assertions still preserve compile-time guarantees and keep the file maintainable. 👍

packages/backend/src/tokens/authObjects.ts (3)

90-104: Type definitions look good!

The enhanced type definitions properly model the identity properties for each token type with appropriate conditional typing for authenticated vs unauthenticated states.


277-284: OAuth token handling looks good!

The implementation correctly extracts userId from the subject and includes clientId and scopes properties as expected by the type definition.


424-424: Documentation updated correctly

Good fix - the example now uses the correct m2m_ prefix for machine tokens.

Comment on lines 26 to 32
it('returns the actual auth object if its tokenType is included in the acceptsToken array', () => {
const req = { auth: { tokenType: 'machine_token', id: 'mt_1234' } } as unknown as FastifyRequest;
const req = { auth: { tokenType: 'machine_token', id: 'm2m_1234' } } as unknown as FastifyRequest;
const result = getAuth(req, { acceptsToken: ['machine_token', 'api_key'] });
expect(result.tokenType).toBe('machine_token');
expect(result.id).toBe('mt_1234');
expect(result.id).toBe('m2m_1234');
expect(result.subject).toBeUndefined();
});
Copy link
Contributor

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Mirror Express-side assertions to keep test suites in sync

For completeness and consistency with the Express tests, please include the new machineId assertion here as well.

-    const req = { auth: { tokenType: 'machine_token', id: 'm2m_1234' } } as unknown as FastifyRequest;
+    const req = {
+      auth: { tokenType: 'machine_token', id: 'm2m_1234', machineId: 'mch_5678' },
+    } as unknown as FastifyRequest;
...
-    expect(result.subject).toBeUndefined();
+    expect(result.machineId).toBe('mch_5678');
+    expect(result.subject).toBeUndefined();

Keeping both frameworks’ tests parallel reduces the probability of silent divergences.

📝 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
it('returns the actual auth object if its tokenType is included in the acceptsToken array', () => {
const req = { auth: { tokenType: 'machine_token', id: 'mt_1234' } } as unknown as FastifyRequest;
const req = { auth: { tokenType: 'machine_token', id: 'm2m_1234' } } as unknown as FastifyRequest;
const result = getAuth(req, { acceptsToken: ['machine_token', 'api_key'] });
expect(result.tokenType).toBe('machine_token');
expect(result.id).toBe('mt_1234');
expect(result.id).toBe('m2m_1234');
expect(result.subject).toBeUndefined();
});
it('returns the actual auth object if its tokenType is included in the acceptsToken array', () => {
const req = {
auth: { tokenType: 'machine_token', id: 'm2m_1234', machineId: 'mch_5678' },
} as unknown as FastifyRequest;
const result = getAuth(req, { acceptsToken: ['machine_token', 'api_key'] });
expect(result.tokenType).toBe('machine_token');
expect(result.id).toBe('m2m_1234');
expect(result.machineId).toBe('mch_5678');
expect(result.subject).toBeUndefined();
});
🤖 Prompt for AI Agents
In packages/fastify/src/__tests__/getAuth.test.ts around lines 26 to 32, the
test is missing an assertion for the new machineId property to mirror the
Express-side tests. Add an assertion to check that result.machineId is undefined
or matches the expected value to keep the Fastify test suite consistent with the
Express tests and prevent silent divergences.

Copy link

pkg-pr-new bot commented Jun 10, 2025

Open in StackBlitz

@clerk/agent-toolkit

npm i https://pkg.pr.new/@clerk/agent-toolkit@6099

@clerk/astro

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

@clerk/backend

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

@clerk/chrome-extension

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

@clerk/clerk-js

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

@clerk/dev-cli

npm i https://pkg.pr.new/@clerk/dev-cli@6099

@clerk/elements

npm i https://pkg.pr.new/@clerk/elements@6099

@clerk/clerk-expo

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

@clerk/expo-passkeys

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

@clerk/express

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

@clerk/fastify

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

@clerk/localizations

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

@clerk/nextjs

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

@clerk/nuxt

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

@clerk/clerk-react

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

@clerk/react-router

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

@clerk/remix

npm i https://pkg.pr.new/@clerk/remix@6099

@clerk/shared

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

@clerk/tanstack-react-start

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

@clerk/testing

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

@clerk/themes

npm i https://pkg.pr.new/@clerk/themes@6099

@clerk/types

npm i https://pkg.pr.new/@clerk/types@6099

@clerk/upgrade

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

@clerk/vue

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

commit: b21e16f

@wobsoriano wobsoriano merged commit 4118ed7 into main Jun 11, 2025
45 checks passed
@wobsoriano wobsoriano deleted the rob/user-2118-update-authobject-return-types branch June 11, 2025 12:46
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.

3 participants