Skip to content

fix: disallow undefined where clause #21062

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

Draft
wants to merge 14 commits into
base: main
Choose a base branch
from
Draft

fix: disallow undefined where clause #21062

wants to merge 14 commits into from

Conversation

anikdhabal
Copy link
Contributor

@anikdhabal anikdhabal commented May 1, 2025

What does this PR do?

Summary by mrge

Disallowed undefined, empty object, and empty array values in Prisma where clauses to prevent invalid queries.

  • Bug Fixes
    • Added validation to throw errors if a where clause is undefined, empty, or contains undefined fields.
    • Updated extension to cover findMany, updateMany, and deleteMany queries.

@anikdhabal anikdhabal requested a review from a team as a code owner May 1, 2025 17:19
Copy link

vercel bot commented May 1, 2025

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

3 Skipped Deployments
Name Status Preview Comments Updated (UTC)
cal ⬜️ Ignored (Inspect) Visit Preview Aug 11, 2025 9:14am
cal-eu ⬜️ Ignored (Inspect) Aug 11, 2025 9:14am
calcom-web-canary ⬜️ Ignored (Inspect) Visit Preview Aug 11, 2025 9:14am

@graphite-app graphite-app bot requested a review from a team May 1, 2025 17:19
@keithwillcode keithwillcode added the core area: core, team members only label May 1, 2025
Copy link

graphite-app bot commented May 1, 2025

Graphite Automations

"Add consumer team as reviewer" took an action on this PR • (05/01/25)

1 reviewer was added to this PR based on Keith Williams's automation.

"Add platform team as reviewer" took an action on this PR • (08/11/25)

1 reviewer was added to this PR based on Keith Williams's automation.

Copy link
Contributor

@cubic-dev-ai cubic-dev-ai bot left a comment

Choose a reason for hiding this comment

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

mrge found 1 issue across 3 files. View it in mrge.io

Comment on lines 45 to 56
$allModels: {
async deleteMany({ args, query }) {
checkUndefinedInValue(args.where);
validateWhereClause(args.where);
return query(args);
},
async updateMany({ args, query }) {
checkUndefinedInValue(args.where);
validateWhereClause(args.where);
return query(args);
},
async findMany({ args, query }) {
validateWhereClause(args.where);
return query(args);
Copy link
Contributor Author

Choose a reason for hiding this comment

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

Currently, we have this guard for these operations. Do we need to add more operations here?

Comment on lines 62 to 91
it("validateWhereClause should throw exception when the where object is undefined", async () => {
const where = undefined;

expect(() => validateWhereClause(where)).toThrowError('The "where" clause cannot be undefined.');
});

it("validateWhereClause should throw exception when the where object is {}", async () => {
const where = {};

expect(() => validateWhereClause(where)).toThrowError('The "where" clause cannot be an empty object {}.');
});

it("validateWhereClause should throw exception when the where object is []", async () => {
const where = [];

expect(() => validateWhereClause(where)).toThrowError('The "where" clause cannot be an empty array [].');
});

it("validateWhereClause should throw exception when the 'in' field of where object is []", async () => {
const where = {
id: {
in: [],
},
};

expect(() => validateWhereClause(where)).toThrowError(
'The "in" value for the field "id" cannot be an empty array [].'
);
});
});
Copy link
Contributor Author

Choose a reason for hiding this comment

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

Added new test

Copy link
Contributor

github-actions bot commented May 2, 2025

E2E results are ready!

Copy link
Contributor

@Udit-takkar Udit-takkar left a comment

Choose a reason for hiding this comment

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

All E2E tests are failing

@github-actions github-actions bot marked this pull request as draft May 8, 2025 11:54
@anikdhabal anikdhabal marked this pull request as ready for review May 16, 2025 05:08
@dosubot dosubot bot added the 🐛 bug Something isn't working label May 16, 2025
Copy link
Contributor

@cubic-dev-ai cubic-dev-ai bot left a comment

Choose a reason for hiding this comment

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

mrge found 2 issues across 4 files. Review them in mrge.io

Copy link
Contributor

This PR is being marked as stale due to inactivity.

@github-actions github-actions bot added the Stale label May 31, 2025
Copy link
Contributor

github-actions bot commented Jul 1, 2025

This PR is being marked as stale due to inactivity.

@github-actions github-actions bot added the Stale label Jul 1, 2025
Copy link
Contributor

coderabbitai bot commented Aug 11, 2025

Note

Other AI code review bot(s) detected

CodeRabbit has detected other AI code review bot(s) in this pull request and will avoid duplicating their findings in the review comments. This may lead to a less comprehensive review.

Walkthrough

This change replaces the “disallow undefined delete/update many” logic with a generalized “disallow undefined where” validation. It introduces validateWhereClause and a renamed extension disallowUndefinedWhereExtension that validates where for deleteMany, updateMany, and findMany, including checks for undefined, empty object, and empty array. Index wiring is updated to use the new extension. The old test file is removed, and a new test suite is added covering undefined and null scenarios, empty where cases, and error messages.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~18 minutes

✨ Finishing Touches
  • 📝 Generate Docstrings
🧪 Generate unit tests
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch where-caluse

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
🪧 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.
  • 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.

Support

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

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 generate unit tests to generate unit tests for 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.

@anikdhabal anikdhabal marked this pull request as ready for review August 11, 2025 07:58
@anikdhabal anikdhabal requested a review from a team as a code owner August 11, 2025 07:58
@dosubot dosubot bot added the platform Anything related to our platform plan label Aug 11, 2025
@graphite-app graphite-app bot requested a review from a team August 11, 2025 08:00
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: 2

🔭 Outside diff range comments (2)
packages/prisma/extensions/disallow-undefined-where-clause.ts (2)

19-38: Deep validation misses nested undefineds (OR/AND/NOT), only checks top-level fields and top-level 'in'

Cases like { OR: [{ id: undefined }] } or nested relation filters can slip through. If the intent is to “disallow undefined fields anywhere in where,” you need recursive validation over objects and arrays.

Sketch:

function hasUndefinedDeep(value: unknown): boolean {
  if (value === undefined) return true;
  if (value === null) return false;
  if (Array.isArray(value)) return value.some(hasUndefinedDeep);
  if (typeof value === "object") {
    return Object.values(value as Record<string, unknown>).some(hasUndefinedDeep);
  }
  return false;
}

// Then inside validateWhereClause after top-level checks:
if (typeof where === "object" || Array.isArray(where)) {
  if (hasUndefinedDeep(where)) {
    throw new Error('The "where" clause contains undefined values.');
  }
}

Optionally, keep the specific "in" error message if you want a more descriptive error for that path, but a deep scan will broadly prevent undefineds anywhere.


34-37: Use safe hasOwnProperty check and guard non-objects

whereInput can be primitives (e.g., id: "x", teamId: null), so directly accessing hasOwnProperty may be surprising. Also, use Object.prototype.hasOwnProperty.call to avoid prototype overrides.

-      if (whereInput.hasOwnProperty("in") && typeof whereInput.in === "undefined") {
+      if (
+        whereInput &&
+        typeof whereInput === "object" &&
+        Object.prototype.hasOwnProperty.call(whereInput, "in") &&
+        typeof (whereInput as any).in === "undefined"
+      ) {
         message = `The "in" value for the field "${key}" cannot be undefined.`;
         throw new Error(message);
       }
♻️ Duplicate comments (1)
packages/prisma/extensions/disallow-undefined-where-clause.ts (1)

3-16: Strengthen typing and null handling in validateWhereClause; avoid any and clarify null-case

  • Replace any with unknown and add precise type guards.
  • Avoid Object.keys(where || {}) and explicitly check for null to produce clearer error messages.
-export const validateWhereClause = (where: any) => {
+export const validateWhereClause = (where: unknown) => {
   // Check if where is undefined
   if (where === undefined) {
     throw new Error('The "where" clause cannot be undefined.');
   }

-  // Check if where is an empty object
-  if (typeof where === "object" && !Array.isArray(where) && Object.keys(where || {}).length === 0) {
+  // Disallow null explicitly to avoid misreporting it as {}
+  if (where === null) {
+    throw new Error('The "where" clause cannot be null.');
+  }
+
+  // Check if where is an empty object
+  if (typeof where === "object" && !Array.isArray(where) && Object.keys(where as Record<string, unknown>).length === 0) {
     throw new Error('The "where" clause cannot be an empty object {}.');
   }

   // Check if where is an empty array
   if (Array.isArray(where) && where.length === 0) {
     throw new Error('The "where" clause cannot be an empty array [].');
   }

Pros:

  • Better type-safety and clearer error for null.
  • Avoids reliance on falsy coalescing which can hide intent.

Cons:

  • Introduces a new error message for null; add a matching test if you adopt this.
🧹 Nitpick comments (3)
packages/prisma/extensions/disallow-undefined-where-clause.test.ts (3)

39-39: Typos: “contain” → “contains”

Minor grammar cleanup in test names.

-it("validateWhereClause should not throw exception when the where object contain null values", async () => {
+it("validateWhereClause should not throw exception when the where object contains null values", () => {

-it("validateWhereClause should throw exception when the where object contain null values and 'in' field is undefined", async () => {
+it("validateWhereClause should throw exception when the where object contains null values and 'in' field is undefined", () => {

Also applies to: 48-48


36-37: Make “does not throw” assertions explicit

Prefer an explicit not.toThrow() to make intent clear and to ensure any unexpected throw is caught by the assertion rather than the test runner.

-    validateWhereClause(where);
+    expect(() => validateWhereClause(where)).not.toThrow();

Also applies to: 45-46


62-67: Consider adding a test for where = null (if you adopt null-specific error)

Your current code treats null like empty {} due to coalescing. If you adopt explicit null handling, add a test to assert the null message.

Example:

it('validateWhereClause should throw exception when the where object is null', () => {
  const where = null as unknown as object;
  expect(() => validateWhereClause(where)).toThrowError('The "where" clause cannot be null.');
});
📜 Review details

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

📥 Commits

Reviewing files that changed from the base of the PR and between 1fa8a5e and 6e837f0.

📒 Files selected for processing (4)
  • packages/prisma/extensions/disallow-undefined-delete-update-many.test.ts (0 hunks)
  • packages/prisma/extensions/disallow-undefined-where-clause.test.ts (1 hunks)
  • packages/prisma/extensions/disallow-undefined-where-clause.ts (2 hunks)
  • packages/prisma/index.ts (3 hunks)
💤 Files with no reviewable changes (1)
  • packages/prisma/extensions/disallow-undefined-delete-update-many.test.ts
🧰 Additional context used
📓 Path-based instructions (2)
**/*.ts

📄 CodeRabbit Inference Engine (.cursor/rules/review.mdc)

**/*.ts: For Prisma queries, only select data you need; never use include, always use select
Ensure the credential.key field is never returned from tRPC endpoints or APIs

Files:

  • packages/prisma/extensions/disallow-undefined-where-clause.test.ts
  • packages/prisma/extensions/disallow-undefined-where-clause.ts
  • packages/prisma/index.ts
**/*.{ts,tsx}

📄 CodeRabbit Inference Engine (.cursor/rules/review.mdc)

Flag excessive Day.js use in performance-critical code; prefer native Date or Day.js .utc() in hot paths like loops

Files:

  • packages/prisma/extensions/disallow-undefined-where-clause.test.ts
  • packages/prisma/extensions/disallow-undefined-where-clause.ts
  • packages/prisma/index.ts
🧬 Code Graph Analysis (2)
packages/prisma/extensions/disallow-undefined-where-clause.test.ts (1)
packages/prisma/extensions/disallow-undefined-where-clause.ts (1)
  • validateWhereClause (3-40)
packages/prisma/index.ts (1)
packages/prisma/extensions/disallow-undefined-where-clause.ts (1)
  • disallowUndefinedWhereExtension (42-61)
🪛 GitHub Check: Tests / Integration
packages/prisma/extensions/disallow-undefined-where-clause.ts

[failure] 6-6: apps/api/v1/test/lib/bookings/_get.integration-test.ts > GET /api/bookings > Returns bookings for all users when accessed by system-wide admin
Error: The "where" clause cannot be undefined.
❯ validateWhereClause packages/prisma/extensions/disallow-undefined-where-clause.ts:6:11
❯ Array.findMany packages/prisma/extensions/disallow-undefined-where-clause.ts:55:11
❯ node_modules/@prisma/client/runtime/library.js:34:4829
❯ i node_modules/@prisma/client/runtime/library.js:123:987
❯ PrismaPromise.then node_modules/@prisma/client/runtime/library.js:123:1063


[failure] 6-6: packages/features/flags/features.repository.integration-test.ts > FeaturesRepository Integration Tests > checkIfFeatureIsEnabledGlobally > should return true when feature is enabled globally
Error: The "where" clause cannot be undefined.
❯ validateWhereClause packages/prisma/extensions/disallow-undefined-where-clause.ts:6:11
❯ Array.findMany packages/prisma/extensions/disallow-undefined-where-clause.ts:55:11
❯ node_modules/@prisma/client/runtime/library.js:34:4829
❯ i node_modules/@prisma/client/runtime/library.js:123:987
❯ PrismaPromise.then node_modules/@prisma/client/runtime/library.js:123:1063


[failure] 6-6: packages/features/flags/features.repository.integration-test.ts > FeaturesRepository Integration Tests > checkIfFeatureIsEnabledGlobally > should return false when feature is not enabled globally
Error: The "where" clause cannot be undefined.
❯ validateWhereClause packages/prisma/extensions/disallow-undefined-where-clause.ts:6:11
❯ Array.findMany packages/prisma/extensions/disallow-undefined-where-clause.ts:55:11
❯ node_modules/@prisma/client/runtime/library.js:34:4829
❯ i node_modules/@prisma/client/runtime/library.js:123:987
❯ PrismaPromise.then node_modules/@prisma/client/runtime/library.js:123:1063

⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
  • GitHub Check: Merge reports / merge-reports
  • GitHub Check: Codacy Static Code Analysis
🔇 Additional comments (3)
packages/prisma/extensions/disallow-undefined-where-clause.ts (1)

46-49: Good: Strict guards on deleteMany/updateMany

Blocking deleteMany/updateMany with undefined or empty where mitigates accidental mass writes/deletes. This aligns with the PR objective.

Also applies to: 51-53

packages/prisma/extensions/disallow-undefined-where-clause.test.ts (1)

6-6: Remove unnecessary async from tests that don't await (repeat of past comment)

These tests are synchronous; async is not needed and can mask unhandled sync exceptions.

[ suggest_nitpick ][ duplicate_comment ]

-  it("...", async () => {
+  it("...", () => {

Also applies to: 18-18, 28-28, 39-39, 48-48, 62-62, 68-68, 74-74

packages/prisma/index.ts (1)

50-50: Heads-up: Applying disallowUndefinedWhere to findMany is currently breaking integrations

Wiring looks fine, but the current extension rejects findMany when where is undefined, which is a legitimate and widely used pattern (fetch all). Please update the extension’s findMany handler to only validate when where is provided (not undefined), as suggested in the extension file comment.

No changes needed here once the extension is fixed.

Also applies to: 64-64

Comment on lines +5 to +79
describe("Disallow undefined where", () => {
it("validateWhereClause should throw exception when the 'in' field of where object is undefined", async () => {
const where = {
id: {
in: undefined,
},
};

expect(() => validateWhereClause(where)).toThrowError(
'The "in" value for the field "id" cannot be undefined.'
);
});

it("validateWhereClause should throw exception when a field of where object is undefined", async () => {
const where = {
from: undefined,
};

expect(() => validateWhereClause(where)).toThrowError(
'The value for the field "from" cannot be undefined.'
);
});

it("validateWhereClause should not throw exception when the where object does not contain undefined values", async () => {
const where = {
id: {
in: [1, 2, 3],
},
name: "test name",
};

validateWhereClause(where);
});

it("validateWhereClause should not throw exception when the where object contain null values", async () => {
const where = {
teamId: null,
parentId: null,
};

validateWhereClause(where);
});

it("validateWhereClause should throw exception when the where object contain null values and 'in' field is undefined", async () => {
const where = {
teamId: null,
parentId: null,
id: {
in: undefined,
},
};

expect(() => validateWhereClause(where)).toThrowError(
'The "in" value for the field "id" cannot be undefined.'
);
});

it("validateWhereClause should throw exception when the where object is undefined", async () => {
const where = undefined;

expect(() => validateWhereClause(where)).toThrowError('The "where" clause cannot be undefined.');
});

it("validateWhereClause should throw exception when the where object is {}", async () => {
const where = {};

expect(() => validateWhereClause(where)).toThrowError('The "where" clause cannot be an empty object {}.');
});

it("validateWhereClause should throw exception when the where object is []", async () => {
const where = [];

expect(() => validateWhereClause(where)).toThrowError('The "where" clause cannot be an empty array [].');
});
});
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

Missing cases: nested OR/AND/NOT with undefineds

If you extend validation to recurse (suggested), add tests like:

  • { OR: [{ id: undefined }] } → throws
  • { AND: [{ teamId: null }, { id: { in: [1, 2] } }] } → ok
  • { NOT: [{ name: { equals: undefined } }] } → throws
🤖 Prompt for AI Agents
In packages/prisma/extensions/disallow-undefined-where-clause.test.ts around
lines 5 to 79, add unit tests covering nested logical operators so recursion is
validated: add tests asserting that { OR: [{ id: undefined }] } throws the
expected undefined error, that { AND: [{ teamId: null }, { id: { in: [1,2] } }]
} does not throw, and that { NOT: [{ name: { equals: undefined } }] } throws;
ensure the tests use the same validateWhereClause invocation and error message
assertions as the existing cases for consistency.

Comment on lines +54 to 56
async findMany({ args, query }) {
validateWhereClause(args.where);
return query(args);
Copy link
Contributor

Choose a reason for hiding this comment

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

💡 Verification agent

❓ Verification inconclusive

Blocking: findMany guard breaks legitimate queries (see failing integrations). Allow undefined where for findMany.

Integration tests are failing because findMany commonly relies on omitting where (or passing it as undefined) to fetch all rows. Enforcing non-undefined here is a breaking change.

Harden deleteMany/updateMany (dangerous by default), but for findMany, only validate when where is provided (not undefined). This preserves existing behavior while still catching empty object/array and undefined fields when explicitly passed.

Apply this diff:

-        async findMany({ args, query }) {
-          validateWhereClause(args.where);
-          return query(args);
-        },
+        async findMany({ args, query }) {
+          // Allow undefined where for findMany to preserve "fetch all" semantics.
+          if (typeof args.where !== "undefined") {
+            validateWhereClause(args.where);
+          }
+          return query(args);
+        },

Evidence: Pipeline failures indicate findMany calls without where:

  • apps/api/v1/test/lib/bookings/_get.integration-test.ts
  • packages/features/flags/features.repository.integration-test.ts

#!/bin/bash
# Search for validateWhereClause definition and usages
echo "=== validateWhereClause occurrences ==="
rg -n "validateWhereClause" -C3

# Search for async findMany in extensions
echo
echo "=== findMany in disallow-undefined-where-clause.ts ==="
rg -n "async findMany" -C3

Allow undefined where in findMany to preserve “fetch all” behavior

Only run validateWhereClause when args.where is explicitly provided, so existing queries without a where clause continue to work.

• packages/prisma/extensions/disallow-undefined-where-clause.ts – wrap the guard in an undefined check within async findMany.
• Integration tests failing in:
– apps/api/v1/test/lib/bookings/_get.integration-test.ts
– packages/features/flags/features.repository.integration-test.ts

Suggested change:

-        async findMany({ args, query }) {
-          validateWhereClause(args.where);
-          return query(args);
-        },
+        async findMany({ args, query }) {
+          // Preserve "fetch all" semantics by skipping validation when where is undefined
+          if (typeof args.where !== "undefined") {
+            validateWhereClause(args.where);
+          }
+          return query(args);
+        },
📝 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
async findMany({ args, query }) {
validateWhereClause(args.where);
return query(args);
async findMany({ args, query }) {
// Preserve "fetch all" semantics by skipping validation when where is undefined
if (typeof args.where !== "undefined") {
validateWhereClause(args.where);
}
return query(args);
},
🤖 Prompt for AI Agents
In packages/prisma/extensions/disallow-undefined-where-clause.ts around lines 54
to 56, the current findMany always calls validateWhereClause(args.where) which
breaks existing "fetch all" queries; change it to only call validateWhereClause
when args.where is explicitly provided (i.e., if (args.where !== undefined)
validateWhereClause(args.where)) so queries without a where continue to work and
integration tests pass.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
🐛 bug Something isn't working core area: core, team members only platform Anything related to our platform plan ready-for-e2e Stale
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants