mirror of
https://github.com/stack-auth/stack.git
synced 2026-06-13 21:01:21 +08:00
Merge branch 'dev' into llm-mcp-flow
This commit is contained in:
commit
fa4c814ad8
@ -99,7 +99,7 @@
|
||||
"jiti": "^2.6.1",
|
||||
"jose": "^6.1.3",
|
||||
"json-diff": "^1.0.6",
|
||||
"next": "16.1.5",
|
||||
"next": "16.2.2",
|
||||
"nodemailer": "^6.9.10",
|
||||
"oidc-provider": "^8.5.1",
|
||||
"openid-client": "5.6.4",
|
||||
|
||||
@ -84,7 +84,7 @@
|
||||
"input-otp": "^1.4.1",
|
||||
"jose": "^6.1.3",
|
||||
"lodash": "^4.17.21",
|
||||
"next": "16.1.5",
|
||||
"next": "16.2.2",
|
||||
"next-themes": "^0.2.1",
|
||||
"posthog-js": "^1.336.1",
|
||||
"react": "19.2.3",
|
||||
|
||||
@ -1630,9 +1630,9 @@ function Draggable(props: {
|
||||
<div className="text-red-500 text-sm p-2 bg-red-500/10 font-mono whitespace-pre-wrap">
|
||||
A runtime error occured while rendering this widget.<br />
|
||||
<br />
|
||||
{props.reset && <button className="text-blue-500 hover:underline" onClick={() => {
|
||||
props.reset!();
|
||||
}}>Reload widget</button>}<br />
|
||||
<button className="text-blue-500 hover:underline" onClick={() => {
|
||||
props.reset();
|
||||
}}>Reload widget</button><br />
|
||||
<br />
|
||||
{errorToNiceString(props.error)}
|
||||
</div>
|
||||
|
||||
@ -1,3 +1,4 @@
|
||||
import { randomUUID } from "crypto";
|
||||
import { describe } from "vitest";
|
||||
import { it } from "../../../../../helpers";
|
||||
import { Auth, backendContext, createMailbox, niceBackendFetch, waitForOutboxEmailWithStatus } from "../../../../backend-helpers";
|
||||
@ -45,13 +46,14 @@ describe("POST /api/v1/internal/feedback", () => {
|
||||
|
||||
it("should send feedback without authentication (dev tool)", async ({ expect }) => {
|
||||
const recipientMailbox = createMailbox("team@stack-auth.com");
|
||||
const subject = "[Support] devtool-user@example.com";
|
||||
const senderEmail = `devtool-user-${randomUUID()}@example.com`;
|
||||
const subject = `[Support] ${senderEmail}`;
|
||||
|
||||
const response = await niceBackendFetch("/api/v1/internal/feedback", {
|
||||
method: "POST",
|
||||
body: {
|
||||
name: "Dev Tool User",
|
||||
email: "devtool-user@example.com",
|
||||
email: senderEmail,
|
||||
message: "Unauthenticated feedback from the dev tool.",
|
||||
feedback_type: "feedback",
|
||||
},
|
||||
@ -75,18 +77,19 @@ describe("POST /api/v1/internal/feedback", () => {
|
||||
const messages = await recipientMailbox.waitForMessagesWithSubject(subject);
|
||||
expect(messages).toHaveLength(1);
|
||||
expect(messages[0].body?.text).toContain("Dev Tool User");
|
||||
expect(messages[0].body?.text).toContain("devtool-user@example.com");
|
||||
expect(messages[0].body?.text).toContain(senderEmail);
|
||||
expect(messages[0].body?.text).toContain("Unauthenticated feedback from the dev tool.");
|
||||
});
|
||||
|
||||
it("should send bug reports with correct label", async ({ expect }) => {
|
||||
const recipientMailbox = createMailbox("team@stack-auth.com");
|
||||
const subject = "[Bug Report] bug@example.com";
|
||||
const reporterEmail = `bug-${randomUUID()}@example.com`;
|
||||
const subject = `[Bug Report] ${reporterEmail}`;
|
||||
|
||||
const response = await niceBackendFetch("/api/v1/internal/feedback", {
|
||||
method: "POST",
|
||||
body: {
|
||||
email: "bug@example.com",
|
||||
email: reporterEmail,
|
||||
message: "Something is broken.",
|
||||
feedback_type: "bug",
|
||||
},
|
||||
@ -109,7 +112,7 @@ describe("POST /api/v1/internal/feedback", () => {
|
||||
|
||||
const messages = await recipientMailbox.waitForMessagesWithSubject(subject);
|
||||
expect(messages).toHaveLength(1);
|
||||
expect(messages[0].subject).toBe("[Bug Report] bug@example.com");
|
||||
expect(messages[0].subject).toBe(subject);
|
||||
});
|
||||
|
||||
it("should reject invalid payloads", async ({ expect }) => {
|
||||
|
||||
@ -258,3 +258,9 @@ A: The app link wrapper in `docs-mintlify/snippets/docs-apps-home-grid.jsx` used
|
||||
|
||||
Q: How should the sidebar Apps filter behave when there are no matches?
|
||||
A: In `docs-mintlify/snippets/docs-apps-home-grid.jsx`, track visible rows while filtering and show a small inline empty state (`No more results. Clear filter`) when query is non-empty and visible count is zero; wire `Clear filter` to reset the input, rerun filtering, and refocus the input.
|
||||
|
||||
Q: Why did internal feedback E2E tests expect 1 Inbucket message but get 2?
|
||||
A: Inbucket persists mail across runs. `Mailbox.waitForMessagesWithSubject` waits until at least one match then returns **all** messages whose subject includes the string. Fixed subjects like `[Support] devtool-user@example.com` accumulate, so assertions should use a unique subject per run (e.g. `randomUUID()` in the sender email) or a baseline count before/after.
|
||||
|
||||
Q: Why does `@typescript-eslint/no-unnecessary-condition` fire on `props.reset` in Next.js `ErrorBoundary` `errorComponent`?
|
||||
A: Next’s typings treat `reset` as always present on the error component props, so `props.reset &&` is redundant; render the reload control unconditionally and call `props.reset()` directly.
|
||||
|
||||
@ -80,8 +80,6 @@ RUN cp -a /app/node_modules /pruned-node_modules && \
|
||||
posthog-js@* \
|
||||
@prisma+studio-core@* @prisma+dev@* @prisma+query-plan-executor@* \
|
||||
convex@* @electric-sql+*@* \
|
||||
# Duplicate Next.js copies (keep only one for next/headers.js resolution)
|
||||
'next@16.1.5_@babel+core@7.29.0*' 'next@16.1.5_@babel+core@7.28.5*' \
|
||||
next@14* @next+swc-*@14* \
|
||||
# Native build binaries not needed at runtime
|
||||
@esbuild+*@* esbuild@* @rolldown+*@* \
|
||||
|
||||
561
pnpm-lock.yaml
561
pnpm-lock.yaml
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user