chore: update dependencies

This commit is contained in:
Amruth Pillai
2026-07-27 13:19:54 +02:00
parent 6503da7e49
commit 3266066826
19 changed files with 2862 additions and 2545 deletions
+34 -34
View File
@@ -17,33 +17,33 @@
"#react-pdf-renderer": "@react-pdf/renderer"
},
"dependencies": {
"@ai-sdk/anthropic": "^4.0.10",
"@ai-sdk/cerebras": "^3.0.6",
"@ai-sdk/cohere": "^4.0.6",
"@ai-sdk/deepseek": "^3.0.6",
"@ai-sdk/fireworks": "^3.0.7",
"@ai-sdk/google": "^4.0.10",
"@ai-sdk/groq": "^4.0.6",
"@ai-sdk/mistral": "^4.0.7",
"@ai-sdk/openai": "^4.0.9",
"@ai-sdk/openai-compatible": "^3.0.6",
"@ai-sdk/perplexity": "^4.0.7",
"@ai-sdk/togetherai": "^3.0.7",
"@ai-sdk/xai": "^4.0.9",
"@aws-sdk/client-s3": "^3.1081.0",
"@better-auth/api-key": "^1.6.23",
"@better-auth/drizzle-adapter": "^1.6.23",
"@better-auth/infra": "^0.3.5",
"@better-auth/oauth-provider": "^1.6.23",
"@better-auth/passkey": "^1.6.23",
"@hono/node-server": "^2.0.8",
"@ai-sdk/anthropic": "^4.0.21",
"@ai-sdk/cerebras": "^3.0.14",
"@ai-sdk/cohere": "^4.0.12",
"@ai-sdk/deepseek": "^3.0.13",
"@ai-sdk/fireworks": "^3.0.15",
"@ai-sdk/google": "^4.0.24",
"@ai-sdk/groq": "^4.0.13",
"@ai-sdk/mistral": "^4.0.14",
"@ai-sdk/openai": "^4.0.20",
"@ai-sdk/openai-compatible": "^3.0.14",
"@ai-sdk/perplexity": "^4.0.13",
"@ai-sdk/togetherai": "^3.0.15",
"@ai-sdk/xai": "^4.0.18",
"@aws-sdk/client-s3": "^3.1095.0",
"@better-auth/api-key": "^1.6.25",
"@better-auth/drizzle-adapter": "^1.6.25",
"@better-auth/infra": "^0.3.7",
"@better-auth/oauth-provider": "^1.6.25",
"@better-auth/passkey": "^1.6.25",
"@hono/node-server": "^2.0.12",
"@modelcontextprotocol/sdk": "^1.29.0",
"@orpc/client": "^1.14.7",
"@orpc/experimental-ratelimit": "^1.14.7",
"@orpc/json-schema": "^1.14.7",
"@orpc/openapi": "^1.14.7",
"@orpc/server": "^1.14.7",
"@orpc/zod": "^1.14.7",
"@orpc/client": "^1.14.10",
"@orpc/experimental-ratelimit": "^1.14.10",
"@orpc/json-schema": "^1.14.10",
"@orpc/openapi": "^1.14.10",
"@orpc/server": "^1.14.10",
"@orpc/zod": "^1.14.10",
"@react-pdf/renderer": "^4.5.1",
"@reactive-resume/api": "workspace:*",
"@reactive-resume/auth": "workspace:*",
@@ -55,24 +55,24 @@
"@sindresorhus/slugify": "^3.0.0",
"@t3-oss/env-core": "^0.13.11",
"@uiw/color-convert": "^2.10.3",
"ai": "^7.0.18",
"ai": "^7.0.37",
"bcrypt": "^6.0.0",
"better-auth": "1.6.23",
"better-auth": "1.6.25",
"cjk-regex": "^3.4.0",
"deepmerge-ts": "^7.1.5",
"drizzle-orm": "1.0.0-rc.4",
"drizzle-zod": "1.0.0-beta.14-a36c63d",
"es-toolkit": "^1.49.0",
"es-toolkit": "^1.50.0",
"fast-json-patch": "^3.1.1",
"hono": "^4.12.28",
"hono": "^4.12.32",
"jsonrepair": "^3.15.0",
"node-html-parser": "^9.0.0",
"nodemailer": "^9.0.3",
"ollama-ai-provider-v2": "^4.0.1",
"pg": "^8.22.0",
"phosphor-icons-react-pdf": "^0.1.3",
"react": "^19.2.7",
"react-email": "^6.6.8",
"react": "^19.2.8",
"react-email": "^6.9.1",
"react-pdf-html": "^2.1.5",
"resumable-stream": "^2.2.12",
"sharp": "^0.35.3",
@@ -87,8 +87,8 @@
"@types/pg": "^8.20.0",
"@types/react": "^19.2.17",
"@typescript/native-preview": "7.0.0-dev.20260707.2",
"tsdown": "^0.22.4",
"tsx": "^4.23.0",
"tsdown": "^0.22.14",
"tsx": "^4.23.1",
"typescript": "^7.0.2",
"vitest": "^4.1.10"
}
+21 -26
View File
@@ -41,21 +41,17 @@ describe("web app fallback classification", () => {
expect(response.headers.get("Content-Security-Policy-Report-Only")).toContain("frame-ancestors 'none'");
});
it.each([
"/auth/login",
"/dashboard",
"/builder/resume-1",
"/agent",
"/templates",
"/templates/azurill.pdf",
])("serves noindex shell for known app prefix %s", async (pathname) => {
const response = await handleWebApp(new Request(`https://example.com${pathname}`));
it.each(["/auth/login", "/dashboard", "/builder/resume-1", "/agent", "/templates", "/templates/azurill.pdf"])(
"serves noindex shell for known app prefix %s",
async (pathname) => {
const response = await handleWebApp(new Request(`https://example.com${pathname}`));
expect(response.status).toBe(200);
expect(response.headers.get("Content-Type")).toBe("text/html; charset=UTF-8");
expect(response.headers.get("X-Robots-Tag")).toBe("noindex, follow");
expect(await response.text()).toBe("<html>app</html>");
});
expect(response.status).toBe(200);
expect(response.headers.get("Content-Type")).toBe("text/html; charset=UTF-8");
expect(response.headers.get("X-Robots-Tag")).toBe("noindex, follow");
expect(await response.text()).toBe("<html>app</html>");
},
);
it("serves noindex shell for public resume shaped routes", async () => {
const response = await handleWebApp(new Request("https://example.com/alice/resume"));
@@ -75,19 +71,18 @@ describe("web app fallback classification", () => {
expect(fs.readFile).not.toHaveBeenCalled();
});
it.each([
"/api/foo",
"/mcp/foo",
"/uploads/foo",
])("does not treat reserved two-segment path %s as a public resume", async (pathname) => {
const response = await handleWebApp(new Request(`https://example.com${pathname}`));
it.each(["/api/foo", "/mcp/foo", "/uploads/foo"])(
"does not treat reserved two-segment path %s as a public resume",
async (pathname) => {
const response = await handleWebApp(new Request(`https://example.com${pathname}`));
expect(response.status).toBe(404);
expect(response.headers.get("Content-Type")).toBe("text/plain; charset=UTF-8");
expect(response.headers.get("X-Robots-Tag")).toBe("noindex, nofollow");
expect(await response.text()).toBe("Not Found");
expect(fs.readFile).not.toHaveBeenCalled();
});
expect(response.status).toBe(404);
expect(response.headers.get("Content-Type")).toBe("text/plain; charset=UTF-8");
expect(response.headers.get("X-Robots-Tag")).toBe("noindex, nofollow");
expect(await response.text()).toBe("Not Found");
expect(fs.readFile).not.toHaveBeenCalled();
},
);
it("returns plain 404 for missing asset-looking paths", async () => {
const response = await handleWebApp(new Request("https://example.com/assets/missing.css"));
+41 -41
View File
@@ -16,20 +16,20 @@
"lingui:extract": "lingui extract --clean --overwrite"
},
"dependencies": {
"@ai-sdk/react": "^4.0.19",
"@ai-sdk/react": "^4.0.40",
"@base-ui/react": "^1.6.0",
"@better-auth/api-key": "^1.6.23",
"@better-auth/infra": "^0.3.5",
"@better-auth/oauth-provider": "^1.6.23",
"@better-auth/passkey": "^1.6.23",
"@better-auth/api-key": "^1.6.25",
"@better-auth/infra": "^0.3.7",
"@better-auth/oauth-provider": "^1.6.25",
"@better-auth/passkey": "^1.6.25",
"@dnd-kit/core": "^6.3.1",
"@dnd-kit/sortable": "^10.0.0",
"@dnd-kit/utilities": "^3.2.2",
"@lingui/core": "^6.5.0",
"@lingui/react": "^6.5.0",
"@orpc/client": "^1.14.7",
"@orpc/server": "^1.14.7",
"@orpc/tanstack-query": "^1.14.7",
"@lingui/core": "^6.6.0",
"@lingui/react": "^6.6.0",
"@orpc/client": "^1.14.10",
"@orpc/server": "^1.14.10",
"@orpc/tanstack-query": "^1.14.10",
"@phosphor-icons/react": "^2.1.10",
"@react-pdf/renderer": "^4.5.1",
"@reactive-resume/ai": "workspace:*",
@@ -43,39 +43,39 @@
"@reactive-resume/schema": "workspace:*",
"@reactive-resume/ui": "workspace:*",
"@reactive-resume/utils": "workspace:*",
"@tailwindcss/vite": "^4.3.2",
"@tanstack/react-form": "^1.33.0",
"@tailwindcss/vite": "^4.3.3",
"@tanstack/react-form": "^1.33.2",
"@tanstack/react-hotkeys": "^0.10.0",
"@tanstack/react-query": "^5.101.2",
"@tanstack/react-router": "^1.170.17",
"@tiptap/extension-color": "^3.27.3",
"@tiptap/extension-highlight": "^3.27.3",
"@tiptap/extension-text-align": "^3.27.3",
"@tiptap/extension-text-style": "^3.27.3",
"@tiptap/pm": "^3.27.3",
"@tiptap/react": "^3.27.3",
"@tiptap/starter-kit": "^3.27.3",
"@tanstack/react-query": "^5.101.4",
"@tanstack/react-router": "^1.170.18",
"@tiptap/extension-color": "^3.29.1",
"@tiptap/extension-highlight": "^3.29.1",
"@tiptap/extension-text-align": "^3.29.1",
"@tiptap/extension-text-style": "^3.29.1",
"@tiptap/pm": "^3.29.1",
"@tiptap/react": "^3.29.1",
"@tiptap/starter-kit": "^3.29.1",
"@types/js-cookie": "^3.0.6",
"@uiw/color-convert": "^2.10.3",
"@uiw/react-color-colorful": "^2.10.3",
"ai": "^7.0.18",
"better-auth": "1.6.23",
"ai": "^7.0.37",
"better-auth": "1.6.25",
"cmdk": "^1.1.1",
"drizzle-orm": "1.0.0-rc.4",
"es-toolkit": "^1.49.0",
"fuse.js": "^7.4.2",
"immer": "^11.1.11",
"es-toolkit": "^1.50.0",
"fuse.js": "^7.5.0",
"immer": "^11.1.15",
"js-cookie": "^3.0.8",
"motion": "^12.42.2",
"pdfjs-dist": "6.1.200",
"pg": "^8.22.0",
"qrcode.react": "^4.2.0",
"react": "^19.2.7",
"react-dom": "^19.2.7",
"react-easy-crop": "^6.2.2",
"react": "^19.2.8",
"react-dom": "^19.2.8",
"react-easy-crop": "^6.2.3",
"react-markdown": "^10.1.0",
"react-resizable-panels": "^4.12.1",
"react-window": "^2.2.7",
"react-resizable-panels": "^4.12.2",
"react-window": "^2.3.0",
"react-zoom-pan-pinch": "^4.0.3",
"remark-gfm": "^4.0.1",
"sonner": "^2.0.7",
@@ -86,27 +86,27 @@
},
"devDependencies": {
"@babel/core": "^8.0.1",
"@lingui/babel-plugin-lingui-macro": "^6.5.0",
"@lingui/cli": "^6.5.0",
"@lingui/format-po": "^6.5.0",
"@lingui/vite-plugin": "^6.5.0",
"@lingui/babel-plugin-lingui-macro": "^6.6.0",
"@lingui/cli": "^6.6.0",
"@lingui/format-po": "^6.6.0",
"@lingui/vite-plugin": "^6.6.0",
"@reactive-resume/config": "workspace:*",
"@rolldown/plugin-babel": "^0.2.3",
"@tanstack/devtools-vite": "^0.8.1",
"@tanstack/react-devtools": "^0.10.8",
"@tanstack/react-query-devtools": "^5.101.2",
"@tanstack/devtools-vite": "^0.8.3",
"@tanstack/react-devtools": "^0.10.9",
"@tanstack/react-query-devtools": "^5.101.4",
"@tanstack/react-router-devtools": "^1.167.0",
"@tanstack/router-plugin": "^1.168.19",
"@tanstack/router-plugin": "^1.168.23",
"@types/babel__core": "^7.20.5",
"@types/pg": "^8.20.0",
"@types/react": "^19.2.17",
"@types/react-dom": "^19.2.3",
"@typescript/native-preview": "7.0.0-dev.20260707.2",
"@vitejs/plugin-react": "^6.0.3",
"@vitejs/plugin-react": "^6.0.4",
"babel-plugin-macros": "^3.1.0",
"babel-plugin-react-compiler": "^1.0.0",
"rimraf": "^6.1.3",
"typescript": "^7.0.2",
"vite": "^8.1.3"
"vite": "^8.1.5"
}
}
@@ -15,21 +15,21 @@ function rendererBody(name: string) {
}
describe("custom section dialog layout", () => {
it.each([
"CreateCustomSectionFormRenderer",
"UpdateCustomSectionFormRenderer",
])("renders icon and title in one row for %s", (name) => {
const body = rendererBody(name);
const rowIndex = body.indexOf('"flex items-end sm:col-span-full"');
const iconIndex = body.indexOf('name="icon"', rowIndex);
const titleIndex = body.indexOf('name="title"', rowIndex);
const sectionTypeIndex = body.indexOf('name="type"', rowIndex);
it.each(["CreateCustomSectionFormRenderer", "UpdateCustomSectionFormRenderer"])(
"renders icon and title in one row for %s",
(name) => {
const body = rendererBody(name);
const rowIndex = body.indexOf('"flex items-end sm:col-span-full"');
const iconIndex = body.indexOf('name="icon"', rowIndex);
const titleIndex = body.indexOf('name="title"', rowIndex);
const sectionTypeIndex = body.indexOf('name="type"', rowIndex);
expect(rowIndex).toBeGreaterThanOrEqual(0);
expect(iconIndex).toBeGreaterThan(rowIndex);
expect(titleIndex).toBeGreaterThan(iconIndex);
expect(sectionTypeIndex).toBeGreaterThan(titleIndex);
expect(body).toContain('className="rounded-r-none border-input border-e-0"');
expect(body).toContain('className="rounded-s-none"');
});
expect(rowIndex).toBeGreaterThanOrEqual(0);
expect(iconIndex).toBeGreaterThan(rowIndex);
expect(titleIndex).toBeGreaterThan(iconIndex);
expect(sectionTypeIndex).toBeGreaterThan(titleIndex);
expect(body).toContain('className="rounded-r-none border-input border-e-0"');
expect(body).toContain('className="rounded-s-none"');
},
);
});
+260 -260
View File
@@ -9,45 +9,39 @@
// Additionally, you should also exclude this file from your linter and/or formatter to prevent it from being checked or modified.
import { Route as rootRouteImport } from "./routes/__root";
import { Route as DashboardRouteRouteImport } from "./routes/dashboard/route";
import { Route as AuthRouteRouteImport } from "./routes/auth/route";
import { Route as AgentRouteRouteImport } from "./routes/agent/route";
import { Route as HomeRouteRouteImport } from "./routes/_home/route";
import { Route as DashboardIndexRouteImport } from "./routes/dashboard/index";
import { Route as AuthIndexRouteImport } from "./routes/auth/index";
import { Route as AgentIndexRouteImport } from "./routes/agent/index";
import { Route as HomeIndexRouteImport } from "./routes/_home/index";
import { Route as TemplatesSplatRouteImport } from "./routes/templates/$";
import { Route as AuthVerify2faBackupRouteImport } from "./routes/auth/verify-2fa-backup";
import { Route as AuthVerify2faRouteImport } from "./routes/auth/verify-2fa";
import { Route as AuthResumePasswordRouteImport } from "./routes/auth/resume-password";
import { Route as AuthResetPasswordRouteImport } from "./routes/auth/reset-password";
import { Route as AuthRegisterRouteImport } from "./routes/auth/register";
import { Route as AuthLoginRouteImport } from "./routes/auth/login";
import { Route as AuthForgotPasswordRouteImport } from "./routes/auth/forgot-password";
import { Route as AgentNewRouteImport } from "./routes/agent/new";
import { Route as AgentThreadIdRouteImport } from "./routes/agent/$threadId";
import { Route as AgentRouteRouteImport } from "./routes/agent/route";
import { Route as AuthRouteRouteImport } from "./routes/auth/route";
import { Route as DashboardRouteRouteImport } from "./routes/dashboard/route";
import { Route as UsernameSlugRouteImport } from "./routes/$username/$slug";
import { Route as HomeIndexRouteImport } from "./routes/_home/index";
import { Route as AgentIndexRouteImport } from "./routes/agent/index";
import { Route as AgentThreadIdRouteImport } from "./routes/agent/$threadId";
import { Route as AgentNewRouteImport } from "./routes/agent/new";
import { Route as AuthIndexRouteImport } from "./routes/auth/index";
import { Route as AuthForgotPasswordRouteImport } from "./routes/auth/forgot-password";
import { Route as AuthLoginRouteImport } from "./routes/auth/login";
import { Route as AuthRegisterRouteImport } from "./routes/auth/register";
import { Route as AuthResetPasswordRouteImport } from "./routes/auth/reset-password";
import { Route as AuthResumePasswordRouteImport } from "./routes/auth/resume-password";
import { Route as AuthVerify2faRouteImport } from "./routes/auth/verify-2fa";
import { Route as AuthVerify2faBackupRouteImport } from "./routes/auth/verify-2fa-backup";
import { Route as BuilderResumeIdRouteRouteImport } from "./routes/builder/$resumeId/route";
import { Route as DashboardResumesIndexRouteImport } from "./routes/dashboard/resumes/index";
import { Route as DashboardApplicationsIndexRouteImport } from "./routes/dashboard/applications/index";
import { Route as DashboardIndexRouteImport } from "./routes/dashboard/index";
import { Route as TemplatesSplatRouteImport } from "./routes/templates/$";
import { Route as BuilderResumeIdIndexRouteImport } from "./routes/builder/$resumeId/index";
import { Route as DashboardSettingsProfileRouteImport } from "./routes/dashboard/settings/profile";
import { Route as DashboardSettingsPreferencesRouteImport } from "./routes/dashboard/settings/preferences";
import { Route as DashboardSettingsJobSearchRouteImport } from "./routes/dashboard/settings/job-search";
import { Route as DashboardSettingsDangerZoneRouteImport } from "./routes/dashboard/settings/danger-zone";
import { Route as DashboardApplicationsIndexRouteImport } from "./routes/dashboard/applications/index";
import { Route as DashboardResumesIndexRouteImport } from "./routes/dashboard/resumes/index";
import { Route as DashboardSettingsApiKeysRouteImport } from "./routes/dashboard/settings/api-keys";
import { Route as DashboardSettingsDangerZoneRouteImport } from "./routes/dashboard/settings/danger-zone";
import { Route as DashboardSettingsIntegrationsRouteRouteImport } from "./routes/dashboard/settings/integrations/route";
import { Route as DashboardSettingsJobSearchRouteImport } from "./routes/dashboard/settings/job-search";
import { Route as DashboardSettingsPreferencesRouteImport } from "./routes/dashboard/settings/preferences";
import { Route as DashboardSettingsProfileRouteImport } from "./routes/dashboard/settings/profile";
import { Route as DashboardSettingsAuthenticationIndexRouteImport } from "./routes/dashboard/settings/authentication/index";
const DashboardRouteRoute = DashboardRouteRouteImport.update({
id: "/dashboard",
path: "/dashboard",
getParentRoute: () => rootRouteImport,
} as any);
const AuthRouteRoute = AuthRouteRouteImport.update({
id: "/auth",
path: "/auth",
const HomeRouteRoute = HomeRouteRouteImport.update({
id: "/_home",
getParentRoute: () => rootRouteImport,
} as any);
const AgentRouteRoute = AgentRouteRouteImport.update({
@@ -55,73 +49,29 @@ const AgentRouteRoute = AgentRouteRouteImport.update({
path: "/agent",
getParentRoute: () => rootRouteImport,
} as any);
const HomeRouteRoute = HomeRouteRouteImport.update({
id: "/_home",
const AuthRouteRoute = AuthRouteRouteImport.update({
id: "/auth",
path: "/auth",
getParentRoute: () => rootRouteImport,
} as any);
const DashboardIndexRoute = DashboardIndexRouteImport.update({
id: "/",
path: "/",
getParentRoute: () => DashboardRouteRoute,
const DashboardRouteRoute = DashboardRouteRouteImport.update({
id: "/dashboard",
path: "/dashboard",
getParentRoute: () => rootRouteImport,
} as any);
const AuthIndexRoute = AuthIndexRouteImport.update({
id: "/",
path: "/",
getParentRoute: () => AuthRouteRoute,
} as any);
const AgentIndexRoute = AgentIndexRouteImport.update({
id: "/",
path: "/",
getParentRoute: () => AgentRouteRoute,
const UsernameSlugRoute = UsernameSlugRouteImport.update({
id: "/$username/$slug",
path: "/$username/$slug",
getParentRoute: () => rootRouteImport,
} as any);
const HomeIndexRoute = HomeIndexRouteImport.update({
id: "/",
path: "/",
getParentRoute: () => HomeRouteRoute,
} as any);
const TemplatesSplatRoute = TemplatesSplatRouteImport.update({
id: "/templates/$",
path: "/templates/$",
getParentRoute: () => rootRouteImport,
} as any);
const AuthVerify2faBackupRoute = AuthVerify2faBackupRouteImport.update({
id: "/verify-2fa-backup",
path: "/verify-2fa-backup",
getParentRoute: () => AuthRouteRoute,
} as any);
const AuthVerify2faRoute = AuthVerify2faRouteImport.update({
id: "/verify-2fa",
path: "/verify-2fa",
getParentRoute: () => AuthRouteRoute,
} as any);
const AuthResumePasswordRoute = AuthResumePasswordRouteImport.update({
id: "/resume-password",
path: "/resume-password",
getParentRoute: () => AuthRouteRoute,
} as any);
const AuthResetPasswordRoute = AuthResetPasswordRouteImport.update({
id: "/reset-password",
path: "/reset-password",
getParentRoute: () => AuthRouteRoute,
} as any);
const AuthRegisterRoute = AuthRegisterRouteImport.update({
id: "/register",
path: "/register",
getParentRoute: () => AuthRouteRoute,
} as any);
const AuthLoginRoute = AuthLoginRouteImport.update({
id: "/login",
path: "/login",
getParentRoute: () => AuthRouteRoute,
} as any);
const AuthForgotPasswordRoute = AuthForgotPasswordRouteImport.update({
id: "/forgot-password",
path: "/forgot-password",
getParentRoute: () => AuthRouteRoute,
} as any);
const AgentNewRoute = AgentNewRouteImport.update({
id: "/new",
path: "/new",
const AgentIndexRoute = AgentIndexRouteImport.update({
id: "/",
path: "/",
getParentRoute: () => AgentRouteRoute,
} as any);
const AgentThreadIdRoute = AgentThreadIdRouteImport.update({
@@ -129,48 +79,86 @@ const AgentThreadIdRoute = AgentThreadIdRouteImport.update({
path: "/$threadId",
getParentRoute: () => AgentRouteRoute,
} as any);
const UsernameSlugRoute = UsernameSlugRouteImport.update({
id: "/$username/$slug",
path: "/$username/$slug",
getParentRoute: () => rootRouteImport,
const AgentNewRoute = AgentNewRouteImport.update({
id: "/new",
path: "/new",
getParentRoute: () => AgentRouteRoute,
} as any);
const AuthIndexRoute = AuthIndexRouteImport.update({
id: "/",
path: "/",
getParentRoute: () => AuthRouteRoute,
} as any);
const AuthForgotPasswordRoute = AuthForgotPasswordRouteImport.update({
id: "/forgot-password",
path: "/forgot-password",
getParentRoute: () => AuthRouteRoute,
} as any);
const AuthLoginRoute = AuthLoginRouteImport.update({
id: "/login",
path: "/login",
getParentRoute: () => AuthRouteRoute,
} as any);
const AuthRegisterRoute = AuthRegisterRouteImport.update({
id: "/register",
path: "/register",
getParentRoute: () => AuthRouteRoute,
} as any);
const AuthResetPasswordRoute = AuthResetPasswordRouteImport.update({
id: "/reset-password",
path: "/reset-password",
getParentRoute: () => AuthRouteRoute,
} as any);
const AuthResumePasswordRoute = AuthResumePasswordRouteImport.update({
id: "/resume-password",
path: "/resume-password",
getParentRoute: () => AuthRouteRoute,
} as any);
const AuthVerify2faRoute = AuthVerify2faRouteImport.update({
id: "/verify-2fa",
path: "/verify-2fa",
getParentRoute: () => AuthRouteRoute,
} as any);
const AuthVerify2faBackupRoute = AuthVerify2faBackupRouteImport.update({
id: "/verify-2fa-backup",
path: "/verify-2fa-backup",
getParentRoute: () => AuthRouteRoute,
} as any);
const BuilderResumeIdRouteRoute = BuilderResumeIdRouteRouteImport.update({
id: "/builder/$resumeId",
path: "/builder/$resumeId",
getParentRoute: () => rootRouteImport,
} as any);
const DashboardResumesIndexRoute = DashboardResumesIndexRouteImport.update({
id: "/resumes/",
path: "/resumes/",
const DashboardIndexRoute = DashboardIndexRouteImport.update({
id: "/",
path: "/",
getParentRoute: () => DashboardRouteRoute,
} as any);
const TemplatesSplatRoute = TemplatesSplatRouteImport.update({
id: "/templates/$",
path: "/templates/$",
getParentRoute: () => rootRouteImport,
} as any);
const BuilderResumeIdIndexRoute = BuilderResumeIdIndexRouteImport.update({
id: "/",
path: "/",
getParentRoute: () => BuilderResumeIdRouteRoute,
} as any);
const DashboardApplicationsIndexRoute =
DashboardApplicationsIndexRouteImport.update({
id: "/applications/",
path: "/applications/",
getParentRoute: () => DashboardRouteRoute,
} as any);
const BuilderResumeIdIndexRoute = BuilderResumeIdIndexRouteImport.update({
id: "/",
path: "/",
getParentRoute: () => BuilderResumeIdRouteRoute,
const DashboardResumesIndexRoute = DashboardResumesIndexRouteImport.update({
id: "/resumes/",
path: "/resumes/",
getParentRoute: () => DashboardRouteRoute,
} as any);
const DashboardSettingsProfileRoute =
DashboardSettingsProfileRouteImport.update({
id: "/settings/profile",
path: "/settings/profile",
getParentRoute: () => DashboardRouteRoute,
} as any);
const DashboardSettingsPreferencesRoute =
DashboardSettingsPreferencesRouteImport.update({
id: "/settings/preferences",
path: "/settings/preferences",
getParentRoute: () => DashboardRouteRoute,
} as any);
const DashboardSettingsJobSearchRoute =
DashboardSettingsJobSearchRouteImport.update({
id: "/settings/job-search",
path: "/settings/job-search",
const DashboardSettingsApiKeysRoute =
DashboardSettingsApiKeysRouteImport.update({
id: "/settings/api-keys",
path: "/settings/api-keys",
getParentRoute: () => DashboardRouteRoute,
} as any);
const DashboardSettingsDangerZoneRoute =
@@ -179,18 +167,30 @@ const DashboardSettingsDangerZoneRoute =
path: "/settings/danger-zone",
getParentRoute: () => DashboardRouteRoute,
} as any);
const DashboardSettingsApiKeysRoute =
DashboardSettingsApiKeysRouteImport.update({
id: "/settings/api-keys",
path: "/settings/api-keys",
getParentRoute: () => DashboardRouteRoute,
} as any);
const DashboardSettingsIntegrationsRouteRoute =
DashboardSettingsIntegrationsRouteRouteImport.update({
id: "/settings/integrations",
path: "/settings/integrations",
getParentRoute: () => DashboardRouteRoute,
} as any);
const DashboardSettingsJobSearchRoute =
DashboardSettingsJobSearchRouteImport.update({
id: "/settings/job-search",
path: "/settings/job-search",
getParentRoute: () => DashboardRouteRoute,
} as any);
const DashboardSettingsPreferencesRoute =
DashboardSettingsPreferencesRouteImport.update({
id: "/settings/preferences",
path: "/settings/preferences",
getParentRoute: () => DashboardRouteRoute,
} as any);
const DashboardSettingsProfileRoute =
DashboardSettingsProfileRouteImport.update({
id: "/settings/profile",
path: "/settings/profile",
getParentRoute: () => DashboardRouteRoute,
} as any);
const DashboardSettingsAuthenticationIndexRoute =
DashboardSettingsAuthenticationIndexRouteImport.update({
id: "/settings/authentication/",
@@ -394,18 +394,11 @@ export interface RootRouteChildren {
declare module "@tanstack/react-router" {
interface FileRoutesByPath {
"/dashboard": {
id: "/dashboard";
path: "/dashboard";
fullPath: "/dashboard";
preLoaderRoute: typeof DashboardRouteRouteImport;
parentRoute: typeof rootRouteImport;
};
"/auth": {
id: "/auth";
path: "/auth";
fullPath: "/auth";
preLoaderRoute: typeof AuthRouteRouteImport;
"/_home": {
id: "/_home";
path: "";
fullPath: "/";
preLoaderRoute: typeof HomeRouteRouteImport;
parentRoute: typeof rootRouteImport;
};
"/agent": {
@@ -415,33 +408,26 @@ declare module "@tanstack/react-router" {
preLoaderRoute: typeof AgentRouteRouteImport;
parentRoute: typeof rootRouteImport;
};
"/_home": {
id: "/_home";
path: "";
fullPath: "/";
preLoaderRoute: typeof HomeRouteRouteImport;
"/auth": {
id: "/auth";
path: "/auth";
fullPath: "/auth";
preLoaderRoute: typeof AuthRouteRouteImport;
parentRoute: typeof rootRouteImport;
};
"/dashboard/": {
id: "/dashboard/";
path: "/";
fullPath: "/dashboard/";
preLoaderRoute: typeof DashboardIndexRouteImport;
parentRoute: typeof DashboardRouteRoute;
"/dashboard": {
id: "/dashboard";
path: "/dashboard";
fullPath: "/dashboard";
preLoaderRoute: typeof DashboardRouteRouteImport;
parentRoute: typeof rootRouteImport;
};
"/auth/": {
id: "/auth/";
path: "/";
fullPath: "/auth/";
preLoaderRoute: typeof AuthIndexRouteImport;
parentRoute: typeof AuthRouteRoute;
};
"/agent/": {
id: "/agent/";
path: "/";
fullPath: "/agent/";
preLoaderRoute: typeof AgentIndexRouteImport;
parentRoute: typeof AgentRouteRoute;
"/$username/$slug": {
id: "/$username/$slug";
path: "/$username/$slug";
fullPath: "/$username/$slug";
preLoaderRoute: typeof UsernameSlugRouteImport;
parentRoute: typeof rootRouteImport;
};
"/_home/": {
id: "/_home/";
@@ -450,67 +436,11 @@ declare module "@tanstack/react-router" {
preLoaderRoute: typeof HomeIndexRouteImport;
parentRoute: typeof HomeRouteRoute;
};
"/templates/$": {
id: "/templates/$";
path: "/templates/$";
fullPath: "/templates/$";
preLoaderRoute: typeof TemplatesSplatRouteImport;
parentRoute: typeof rootRouteImport;
};
"/auth/verify-2fa-backup": {
id: "/auth/verify-2fa-backup";
path: "/verify-2fa-backup";
fullPath: "/auth/verify-2fa-backup";
preLoaderRoute: typeof AuthVerify2faBackupRouteImport;
parentRoute: typeof AuthRouteRoute;
};
"/auth/verify-2fa": {
id: "/auth/verify-2fa";
path: "/verify-2fa";
fullPath: "/auth/verify-2fa";
preLoaderRoute: typeof AuthVerify2faRouteImport;
parentRoute: typeof AuthRouteRoute;
};
"/auth/resume-password": {
id: "/auth/resume-password";
path: "/resume-password";
fullPath: "/auth/resume-password";
preLoaderRoute: typeof AuthResumePasswordRouteImport;
parentRoute: typeof AuthRouteRoute;
};
"/auth/reset-password": {
id: "/auth/reset-password";
path: "/reset-password";
fullPath: "/auth/reset-password";
preLoaderRoute: typeof AuthResetPasswordRouteImport;
parentRoute: typeof AuthRouteRoute;
};
"/auth/register": {
id: "/auth/register";
path: "/register";
fullPath: "/auth/register";
preLoaderRoute: typeof AuthRegisterRouteImport;
parentRoute: typeof AuthRouteRoute;
};
"/auth/login": {
id: "/auth/login";
path: "/login";
fullPath: "/auth/login";
preLoaderRoute: typeof AuthLoginRouteImport;
parentRoute: typeof AuthRouteRoute;
};
"/auth/forgot-password": {
id: "/auth/forgot-password";
path: "/forgot-password";
fullPath: "/auth/forgot-password";
preLoaderRoute: typeof AuthForgotPasswordRouteImport;
parentRoute: typeof AuthRouteRoute;
};
"/agent/new": {
id: "/agent/new";
path: "/new";
fullPath: "/agent/new";
preLoaderRoute: typeof AgentNewRouteImport;
"/agent/": {
id: "/agent/";
path: "/";
fullPath: "/agent/";
preLoaderRoute: typeof AgentIndexRouteImport;
parentRoute: typeof AgentRouteRoute;
};
"/agent/$threadId": {
@@ -520,12 +450,68 @@ declare module "@tanstack/react-router" {
preLoaderRoute: typeof AgentThreadIdRouteImport;
parentRoute: typeof AgentRouteRoute;
};
"/$username/$slug": {
id: "/$username/$slug";
path: "/$username/$slug";
fullPath: "/$username/$slug";
preLoaderRoute: typeof UsernameSlugRouteImport;
parentRoute: typeof rootRouteImport;
"/agent/new": {
id: "/agent/new";
path: "/new";
fullPath: "/agent/new";
preLoaderRoute: typeof AgentNewRouteImport;
parentRoute: typeof AgentRouteRoute;
};
"/auth/": {
id: "/auth/";
path: "/";
fullPath: "/auth/";
preLoaderRoute: typeof AuthIndexRouteImport;
parentRoute: typeof AuthRouteRoute;
};
"/auth/forgot-password": {
id: "/auth/forgot-password";
path: "/forgot-password";
fullPath: "/auth/forgot-password";
preLoaderRoute: typeof AuthForgotPasswordRouteImport;
parentRoute: typeof AuthRouteRoute;
};
"/auth/login": {
id: "/auth/login";
path: "/login";
fullPath: "/auth/login";
preLoaderRoute: typeof AuthLoginRouteImport;
parentRoute: typeof AuthRouteRoute;
};
"/auth/register": {
id: "/auth/register";
path: "/register";
fullPath: "/auth/register";
preLoaderRoute: typeof AuthRegisterRouteImport;
parentRoute: typeof AuthRouteRoute;
};
"/auth/reset-password": {
id: "/auth/reset-password";
path: "/reset-password";
fullPath: "/auth/reset-password";
preLoaderRoute: typeof AuthResetPasswordRouteImport;
parentRoute: typeof AuthRouteRoute;
};
"/auth/resume-password": {
id: "/auth/resume-password";
path: "/resume-password";
fullPath: "/auth/resume-password";
preLoaderRoute: typeof AuthResumePasswordRouteImport;
parentRoute: typeof AuthRouteRoute;
};
"/auth/verify-2fa": {
id: "/auth/verify-2fa";
path: "/verify-2fa";
fullPath: "/auth/verify-2fa";
preLoaderRoute: typeof AuthVerify2faRouteImport;
parentRoute: typeof AuthRouteRoute;
};
"/auth/verify-2fa-backup": {
id: "/auth/verify-2fa-backup";
path: "/verify-2fa-backup";
fullPath: "/auth/verify-2fa-backup";
preLoaderRoute: typeof AuthVerify2faBackupRouteImport;
parentRoute: typeof AuthRouteRoute;
};
"/builder/$resumeId": {
id: "/builder/$resumeId";
@@ -534,19 +520,19 @@ declare module "@tanstack/react-router" {
preLoaderRoute: typeof BuilderResumeIdRouteRouteImport;
parentRoute: typeof rootRouteImport;
};
"/dashboard/resumes/": {
id: "/dashboard/resumes/";
path: "/resumes";
fullPath: "/dashboard/resumes/";
preLoaderRoute: typeof DashboardResumesIndexRouteImport;
"/dashboard/": {
id: "/dashboard/";
path: "/";
fullPath: "/dashboard/";
preLoaderRoute: typeof DashboardIndexRouteImport;
parentRoute: typeof DashboardRouteRoute;
};
"/dashboard/applications/": {
id: "/dashboard/applications/";
path: "/applications";
fullPath: "/dashboard/applications/";
preLoaderRoute: typeof DashboardApplicationsIndexRouteImport;
parentRoute: typeof DashboardRouteRoute;
"/templates/$": {
id: "/templates/$";
path: "/templates/$";
fullPath: "/templates/$";
preLoaderRoute: typeof TemplatesSplatRouteImport;
parentRoute: typeof rootRouteImport;
};
"/builder/$resumeId/": {
id: "/builder/$resumeId/";
@@ -555,32 +541,18 @@ declare module "@tanstack/react-router" {
preLoaderRoute: typeof BuilderResumeIdIndexRouteImport;
parentRoute: typeof BuilderResumeIdRouteRoute;
};
"/dashboard/settings/profile": {
id: "/dashboard/settings/profile";
path: "/settings/profile";
fullPath: "/dashboard/settings/profile";
preLoaderRoute: typeof DashboardSettingsProfileRouteImport;
"/dashboard/applications/": {
id: "/dashboard/applications/";
path: "/applications";
fullPath: "/dashboard/applications/";
preLoaderRoute: typeof DashboardApplicationsIndexRouteImport;
parentRoute: typeof DashboardRouteRoute;
};
"/dashboard/settings/preferences": {
id: "/dashboard/settings/preferences";
path: "/settings/preferences";
fullPath: "/dashboard/settings/preferences";
preLoaderRoute: typeof DashboardSettingsPreferencesRouteImport;
parentRoute: typeof DashboardRouteRoute;
};
"/dashboard/settings/job-search": {
id: "/dashboard/settings/job-search";
path: "/settings/job-search";
fullPath: "/dashboard/settings/job-search";
preLoaderRoute: typeof DashboardSettingsJobSearchRouteImport;
parentRoute: typeof DashboardRouteRoute;
};
"/dashboard/settings/danger-zone": {
id: "/dashboard/settings/danger-zone";
path: "/settings/danger-zone";
fullPath: "/dashboard/settings/danger-zone";
preLoaderRoute: typeof DashboardSettingsDangerZoneRouteImport;
"/dashboard/resumes/": {
id: "/dashboard/resumes/";
path: "/resumes";
fullPath: "/dashboard/resumes/";
preLoaderRoute: typeof DashboardResumesIndexRouteImport;
parentRoute: typeof DashboardRouteRoute;
};
"/dashboard/settings/api-keys": {
@@ -590,6 +562,13 @@ declare module "@tanstack/react-router" {
preLoaderRoute: typeof DashboardSettingsApiKeysRouteImport;
parentRoute: typeof DashboardRouteRoute;
};
"/dashboard/settings/danger-zone": {
id: "/dashboard/settings/danger-zone";
path: "/settings/danger-zone";
fullPath: "/dashboard/settings/danger-zone";
preLoaderRoute: typeof DashboardSettingsDangerZoneRouteImport;
parentRoute: typeof DashboardRouteRoute;
};
"/dashboard/settings/integrations": {
id: "/dashboard/settings/integrations";
path: "/settings/integrations";
@@ -597,6 +576,27 @@ declare module "@tanstack/react-router" {
preLoaderRoute: typeof DashboardSettingsIntegrationsRouteRouteImport;
parentRoute: typeof DashboardRouteRoute;
};
"/dashboard/settings/job-search": {
id: "/dashboard/settings/job-search";
path: "/settings/job-search";
fullPath: "/dashboard/settings/job-search";
preLoaderRoute: typeof DashboardSettingsJobSearchRouteImport;
parentRoute: typeof DashboardRouteRoute;
};
"/dashboard/settings/preferences": {
id: "/dashboard/settings/preferences";
path: "/settings/preferences";
fullPath: "/dashboard/settings/preferences";
preLoaderRoute: typeof DashboardSettingsPreferencesRouteImport;
parentRoute: typeof DashboardRouteRoute;
};
"/dashboard/settings/profile": {
id: "/dashboard/settings/profile";
path: "/settings/profile";
fullPath: "/dashboard/settings/profile";
preLoaderRoute: typeof DashboardSettingsProfileRouteImport;
parentRoute: typeof DashboardRouteRoute;
};
"/dashboard/settings/authentication/": {
id: "/dashboard/settings/authentication/";
path: "/settings/authentication";
+8 -8
View File
@@ -13,7 +13,7 @@
"type": "git",
"url": "https://github.com/amruthpillai/reactive-resume.git"
},
"packageManager": "pnpm@11.10.0",
"packageManager": "pnpm@11.17.0+sha512.cca3cea332ad254bb84145f966d19f4879615210346fc92c79a047f23a0d7b3cca3c3792f0076ba1f1831d277efbcf0a9119b31a9a60eca7fb3d6231f331ef72",
"workspaces": [
"apps/*",
"packages/*",
@@ -41,25 +41,25 @@
"test:agent": "turbo run test:agent"
},
"devDependencies": {
"@biomejs/biome": "^2.5.3",
"@biomejs/biome": "^2.5.5",
"@commitlint/cli": "^21.2.1",
"@commitlint/config-conventional": "^21.2.0",
"@playwright/test": "^1.61.1",
"@playwright/test": "^1.62.0",
"@reactive-resume/config": "workspace:*",
"@testing-library/dom": "^10.4.1",
"@testing-library/jest-dom": "^6.9.1",
"@testing-library/jest-dom": "^7.0.0",
"@testing-library/react": "^16.3.2",
"@testing-library/user-event": "^14.6.1",
"@types/node": "^26.1.1",
"@types/pg": "^8.20.0",
"@vitest/coverage-v8": "^4.1.10",
"github-actionlint": "1.7.12",
"happy-dom": "^20.10.6",
"knip": "^6.25.0",
"happy-dom": "^20.11.1",
"knip": "^6.29.0",
"lefthook": "^2.1.10",
"markdownlint-cli2": "0.23.0",
"markdownlint-cli2": "0.23.2",
"pg": "^8.22.0",
"turbo": "^2.10.4",
"turbo": "^2.10.7",
"typescript": "^7.0.2",
"vitest": "^4.1.10"
}
+21 -21
View File
@@ -18,23 +18,23 @@
"test:agent": "vitest run --reporter=agent --reporter=json --outputFile.json=reports/vitest-results.json --passWithNoTests"
},
"dependencies": {
"@ai-sdk/anthropic": "^4.0.10",
"@ai-sdk/cerebras": "^3.0.6",
"@ai-sdk/cohere": "^4.0.6",
"@ai-sdk/deepseek": "^3.0.6",
"@ai-sdk/fireworks": "^3.0.7",
"@ai-sdk/google": "^4.0.10",
"@ai-sdk/groq": "^4.0.6",
"@ai-sdk/mistral": "^4.0.7",
"@ai-sdk/openai": "^4.0.9",
"@ai-sdk/openai-compatible": "^3.0.6",
"@ai-sdk/perplexity": "^4.0.7",
"@ai-sdk/togetherai": "^3.0.7",
"@ai-sdk/xai": "^4.0.9",
"@aws-sdk/client-s3": "^3.1081.0",
"@orpc/client": "^1.14.7",
"@orpc/experimental-ratelimit": "^1.14.7",
"@orpc/server": "^1.14.7",
"@ai-sdk/anthropic": "^4.0.21",
"@ai-sdk/cerebras": "^3.0.14",
"@ai-sdk/cohere": "^4.0.12",
"@ai-sdk/deepseek": "^3.0.13",
"@ai-sdk/fireworks": "^3.0.15",
"@ai-sdk/google": "^4.0.24",
"@ai-sdk/groq": "^4.0.13",
"@ai-sdk/mistral": "^4.0.14",
"@ai-sdk/openai": "^4.0.20",
"@ai-sdk/openai-compatible": "^3.0.14",
"@ai-sdk/perplexity": "^4.0.13",
"@ai-sdk/togetherai": "^3.0.15",
"@ai-sdk/xai": "^4.0.18",
"@aws-sdk/client-s3": "^3.1095.0",
"@orpc/client": "^1.14.10",
"@orpc/experimental-ratelimit": "^1.14.10",
"@orpc/server": "^1.14.10",
"@reactive-resume/ai": "workspace:*",
"@reactive-resume/auth": "workspace:*",
"@reactive-resume/db": "workspace:*",
@@ -43,15 +43,15 @@
"@reactive-resume/resume": "workspace:*",
"@reactive-resume/schema": "workspace:*",
"@reactive-resume/utils": "workspace:*",
"ai": "^7.0.18",
"ai": "^7.0.37",
"bcrypt": "^6.0.0",
"better-auth": "1.6.23",
"better-auth": "1.6.25",
"drizzle-orm": "1.0.0-rc.4",
"drizzle-zod": "1.0.0-beta.14-a36c63d",
"es-toolkit": "^1.49.0",
"es-toolkit": "^1.50.0",
"ioredis": "^5.11.1",
"ollama-ai-provider-v2": "^4.0.1",
"react": "^19.2.7",
"react": "^19.2.8",
"resumable-stream": "^2.2.12",
"sharp": "^0.35.3",
"ts-pattern": "^5.9.0",
+14 -18
View File
@@ -52,14 +52,14 @@ describe("agent tools", () => {
expect(tools).not.toHaveProperty("web_search");
});
it.each([
"https://api.openai.com/v1?proxy=1",
"https://api.openai.com/v1#fragment",
])("does not add provider-native web search for OpenAI providers with non-exact base URL %s", (baseURL) => {
const tools = buildTools("openai", { baseURL });
it.each(["https://api.openai.com/v1?proxy=1", "https://api.openai.com/v1#fragment"])(
"does not add provider-native web search for OpenAI providers with non-exact base URL %s",
(baseURL) => {
const tools = buildTools("openai", { baseURL });
expect(tools).not.toHaveProperty("web_search");
});
expect(tools).not.toHaveProperty("web_search");
},
);
it("does not add provider-native web search for unsupported OpenAI models", () => {
const tools = buildTools("openai", { model: "custom-model" });
@@ -67,18 +67,14 @@ describe("agent tools", () => {
expect(tools).not.toHaveProperty("web_search");
});
it.each<AIProvider>([
"anthropic",
"gemini",
"vercel-ai-gateway",
"openrouter",
"ollama",
"openai-compatible",
])("does not add provider-native web search for %s", (provider) => {
const tools = buildTools(provider);
it.each<AIProvider>(["anthropic", "gemini", "vercel-ai-gateway", "openrouter", "ollama", "openai-compatible"])(
"does not add provider-native web search for %s",
(provider) => {
const tools = buildTools(provider);
expect(tools).not.toHaveProperty("web_search");
});
expect(tools).not.toHaveProperty("web_search");
},
);
it("keeps instructions explicit about native search availability", () => {
expect(buildAgentInstructions({ hasProviderNativeSearch: true })).toContain("Use web_search");
+8 -8
View File
@@ -15,20 +15,20 @@
"test:agent": "vitest run --reporter=agent --reporter=json --outputFile.json=reports/vitest-results.json --passWithNoTests"
},
"dependencies": {
"@better-auth/api-key": "^1.6.23",
"@better-auth/drizzle-adapter": "^1.6.23",
"@better-auth/infra": "^0.3.5",
"@better-auth/oauth-provider": "^1.6.23",
"@better-auth/passkey": "^1.6.23",
"@better-auth/api-key": "^1.6.25",
"@better-auth/drizzle-adapter": "^1.6.25",
"@better-auth/infra": "^0.3.7",
"@better-auth/oauth-provider": "^1.6.25",
"@better-auth/passkey": "^1.6.25",
"@reactive-resume/db": "workspace:*",
"@reactive-resume/email": "workspace:*",
"@reactive-resume/env": "workspace:*",
"@reactive-resume/utils": "workspace:*",
"bcrypt": "^6.0.0",
"better-auth": "1.6.23",
"better-auth": "1.6.25",
"drizzle-orm": "1.0.0-rc.4",
"jose": "^6.2.3",
"react": "^19.2.7"
"jose": "^6.2.4",
"react": "^19.2.8"
},
"devDependencies": {
"@reactive-resume/config": "workspace:*",
+3 -3
View File
@@ -18,11 +18,11 @@
"dependencies": {
"@reactive-resume/env": "workspace:*",
"nodemailer": "^9.0.3",
"react": "^19.2.7",
"react-email": "^6.6.8"
"react": "^19.2.8",
"react-email": "^6.9.1"
},
"devDependencies": {
"@react-email/ui": "^6.6.8",
"@react-email/ui": "^6.9.1",
"@reactive-resume/config": "workspace:*",
"@types/nodemailer": "^8.0.1",
"@types/react": "^19.2.17",
+1 -1
View File
@@ -20,7 +20,7 @@
},
"dependencies": {
"@modelcontextprotocol/sdk": "^1.29.0",
"@orpc/server": "^1.14.7",
"@orpc/server": "^1.14.10",
"@reactive-resume/ai": "workspace:*",
"@reactive-resume/api": "workspace:*",
"@reactive-resume/env": "workspace:*",
+1 -1
View File
@@ -27,7 +27,7 @@
"cjk-regex": "^3.4.0",
"node-html-parser": "^9.0.0",
"phosphor-icons-react-pdf": "^0.1.3",
"react": "^19.2.7",
"react": "^19.2.8",
"react-pdf-html": "^2.1.5"
},
"devDependencies": {
@@ -27,21 +27,22 @@ describe("rich text template styles", () => {
expect(richListItemContentBlock?.groups?.body).not.toMatch(/\blineHeight:/);
});
it.each(
templatePageFiles.map((file) => [basename(file), file]),
)("%s keeps list item rich text on the global body line height", (_name, file) => {
const source = readFileSync(file, "utf8");
it.each(templatePageFiles.map((file) => [basename(file), file]))(
"%s keeps list item rich text on the global body line height",
(_name, file) => {
const source = readFileSync(file, "utf8");
if (source.includes("createBaseTemplateStyles")) {
// Factory handles richListItemContent; guard is on the factory test above.
expect(source).toContain("createBaseTemplateStyles");
return;
}
if (source.includes("createBaseTemplateStyles")) {
// Factory handles richListItemContent; guard is on the factory test above.
expect(source).toContain("createBaseTemplateStyles");
return;
}
// Legacy: template defines richListItemContent inline — no lineHeight override allowed.
const richListItemContentBlock = source.match(/richListItemContent:\s*{(?<body>[\s\S]*?)^\s*},/m);
expect(richListItemContentBlock?.groups?.body).toBeDefined();
expect(richListItemContentBlock?.groups?.body).toContain("...bodyText");
expect(richListItemContentBlock?.groups?.body).not.toMatch(/\blineHeight:/);
});
// Legacy: template defines richListItemContent inline — no lineHeight override allowed.
const richListItemContentBlock = source.match(/richListItemContent:\s*{(?<body>[\s\S]*?)^\s*},/m);
expect(richListItemContentBlock?.groups?.body).toBeDefined();
expect(richListItemContentBlock?.groups?.body).toContain("...bodyText");
expect(richListItemContentBlock?.groups?.body).not.toMatch(/\blineHeight:/);
},
);
});
+8 -8
View File
@@ -19,7 +19,7 @@
},
"dependencies": {
"@base-ui/react": "^1.6.0",
"@fontsource-variable/ibm-plex-sans": "^5.2.8",
"@fontsource-variable/ibm-plex-sans": "^5.3.0",
"@phosphor-icons/react": "^2.1.10",
"@phosphor-icons/web": "^2.1.2",
"@reactive-resume/utils": "workspace:*",
@@ -27,22 +27,22 @@
"class-variance-authority": "^0.7.1",
"cmdk": "^1.1.1",
"next-themes": "^0.4.6",
"react": "^19.2.7",
"react-dom": "^19.2.7",
"react-resizable-panels": "^4.12.1",
"shadcn": "^4.13.0",
"react": "^19.2.8",
"react-dom": "^19.2.8",
"react-resizable-panels": "^4.12.2",
"shadcn": "^4.15.0",
"sonner": "^2.0.7",
"tw-animate-css": "^1.4.0"
},
"devDependencies": {
"@reactive-resume/config": "workspace:*",
"@tailwindcss/postcss": "^4.3.2",
"@tailwindcss/postcss": "^4.3.3",
"@tailwindcss/typography": "^0.5.20",
"@types/react": "^19.2.17",
"@types/react-dom": "^19.2.3",
"@typescript/native-preview": "7.0.0-dev.20260707.2",
"postcss": "^8.5.16",
"tailwindcss": "^4.3.2",
"postcss": "^8.5.23",
"tailwindcss": "^4.3.3",
"typescript": "^7.0.2"
}
}
+7 -9
View File
@@ -14,15 +14,13 @@ describe("Badge", () => {
expect(screen.getByText("x")).toHaveClass("my-extra");
});
it.each([
["default"],
["secondary"],
["destructive"],
["outline"],
] as const)("renders variant=%s without throwing", (variant) => {
render(<Badge variant={variant}>{variant}</Badge>);
expect(screen.getByText(variant)).toBeInTheDocument();
});
it.each([["default"], ["secondary"], ["destructive"], ["outline"]] as const)(
"renders variant=%s without throwing",
(variant) => {
render(<Badge variant={variant}>{variant}</Badge>);
expect(screen.getByText(variant)).toBeInTheDocument();
},
);
it("forwards aria attributes", () => {
render(<Badge aria-label="status indicator">3</Badge>);
+14 -24
View File
@@ -52,31 +52,21 @@ describe("Button", () => {
expect(screen.getByRole("button")).toBeDisabled();
});
it.each([
["default"],
["outline"],
["secondary"],
["ghost"],
["destructive"],
["link"],
] as const)("renders variant=%s without throwing", (variant) => {
render(<Button variant={variant}>x</Button>);
expect(screen.getByRole("button")).toBeInTheDocument();
});
it.each([["default"], ["outline"], ["secondary"], ["ghost"], ["destructive"], ["link"]] as const)(
"renders variant=%s without throwing",
(variant) => {
render(<Button variant={variant}>x</Button>);
expect(screen.getByRole("button")).toBeInTheDocument();
},
);
it.each([
["default"],
["xs"],
["sm"],
["lg"],
["icon"],
["icon-xs"],
["icon-sm"],
["icon-lg"],
] as const)("renders size=%s without throwing", (size) => {
render(<Button size={size}>x</Button>);
expect(screen.getByRole("button")).toBeInTheDocument();
});
it.each([["default"], ["xs"], ["sm"], ["lg"], ["icon"], ["icon-xs"], ["icon-sm"], ["icon-lg"]] as const)(
"renders size=%s without throwing",
(size) => {
render(<Button size={size}>x</Button>);
expect(screen.getByRole("button")).toBeInTheDocument();
},
);
it("forwards aria-label", () => {
render(<Button aria-label="Close">×</Button>);
+2387 -2050
View File
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -15,6 +15,6 @@
"@typescript/native-preview": "7.0.0-dev.20260707.2",
"drizzle-orm": "1.0.0-rc.4",
"pg": "^8.22.0",
"tsx": "^4.23.0"
"tsx": "^4.23.1"
}
}
+1 -1
View File
@@ -1,5 +1,5 @@
{
"$schema": "https://turbo.build/schema.json",
"$schema": "https://v2-10-7.turborepo.dev/schema.json",
"ui": "stream",
"boundaries": {
"dependencies": {