fix: enhance rich text handling in PDF generation

- Bump @tanstack/react-form version to 1.32.0 in package.json.
- Refactor rich-input component to simplify highlight configuration.
- Improve rich text HTML normalization to handle <mark> elements and apply styles correctly in PDF output.
- Update global CSS for WYSIWYG to adjust paragraph and list margins.
This commit is contained in:
Amruth Pillai
2026-05-11 09:04:42 +02:00
parent 69c23211a0
commit 334ea48bc7
10 changed files with 477 additions and 47 deletions
+1 -1
View File
@@ -48,7 +48,7 @@
"@reactive-resume/ui": "workspace:*", "@reactive-resume/ui": "workspace:*",
"@reactive-resume/utils": "workspace:*", "@reactive-resume/utils": "workspace:*",
"@tailwindcss/vite": "^4.3.0", "@tailwindcss/vite": "^4.3.0",
"@tanstack/react-form": "^1.31.0", "@tanstack/react-form": "^1.32.0",
"@tanstack/react-hotkeys": "^0.10.0", "@tanstack/react-hotkeys": "^0.10.0",
"@tanstack/react-query": "^5.100.9", "@tanstack/react-query": "^5.100.9",
"@tanstack/react-router": "^1.169.2", "@tanstack/react-router": "^1.169.2",
+3 -5
View File
@@ -86,11 +86,7 @@ const extensions = [
}), }),
TextStyle, TextStyle,
Color, Color,
Highlight.configure({ Highlight.configure(),
HTMLAttributes: {
class: "rounded-md px-0.5 py-px",
},
}),
TextAlign.configure({ types: ["heading", "paragraph", "listItem"] }), TextAlign.configure({ types: ["heading", "paragraph", "listItem"] }),
TableKit.configure(), TableKit.configure(),
]; ];
@@ -108,6 +104,8 @@ export function RichInput({ value, onChange, style, className, editorClassName,
const textDirection = isRTL(i18n.locale) ? "rtl" : undefined; const textDirection = isRTL(i18n.locale) ? "rtl" : undefined;
const [isFullscreen, setIsFullscreen] = useState(false); const [isFullscreen, setIsFullscreen] = useState(false);
console.log(value);
const editor = useEditor({ const editor = useEditor({
...options, ...options,
extensions, extensions,
+3
View File
@@ -1,3 +1,6 @@
module.exports = { module.exports = {
extends: ["@commitlint/config-conventional"], extends: ["@commitlint/config-conventional"],
rules: {
"body-max-line-length": [0, "always", Number.Infinity],
},
}; };
@@ -1,5 +1,12 @@
import type { ReactElement } from "react";
import { describe, expect, it } from "vitest"; import { describe, expect, it } from "vitest";
import { normalizeRichTextHtml } from "./rich-text-html"; import { Text as PdfText } from "@react-pdf/renderer";
import { renderHtml } from "react-pdf-html";
import { normalizeRichTextHtml, richTextMarkClassName } from "./rich-text-html";
type PdfElement = ReactElement<{ children?: unknown; element?: { tag: string } }>;
const getPdfElementProps = (element: unknown) => (element as PdfElement).props;
describe("normalizeRichTextHtml", () => { describe("normalizeRichTextHtml", () => {
it("wraps loose inline content in a <p>", () => { it("wraps loose inline content in a <p>", () => {
@@ -31,6 +38,33 @@ describe("normalizeRichTextHtml", () => {
expect(normalizeRichTextHtml("<span>x</span>")).toBe("<p><span>x</span></p>"); expect(normalizeRichTextHtml("<span>x</span>")).toBe("<p><span>x</span></p>");
}); });
it("maps <mark> to a styled inline span", () => {
expect(normalizeRichTextHtml('<mark class="rounded-md">highlighted</mark> text')).toBe(
'<p><span class="rounded-md rr-pdf-mark">highlighted</span> text</p>',
);
});
it("keeps highlighted text in the same react-pdf-html inline text bucket", () => {
const root = renderHtml(normalizeRichTextHtml("before <mark>highlighted</mark> after"), {
resetStyles: true,
stylesheet: {
[`.${richTextMarkClassName}`]: { backgroundColor: "#ffff00" },
},
});
const paragraph = getPdfElementProps(root).children;
const textBucket = getPdfElementProps(paragraph).children as PdfElement;
const textChildren = getPdfElementProps(textBucket).children as unknown[];
const highlightedSpan = textChildren[1];
expect(textBucket.type).toBe(PdfText);
expect(textChildren).toHaveLength(3);
expect(textChildren[0]).toBe("before ");
expect(getPdfElementProps(highlightedSpan).element?.tag).toBe("span");
expect(getPdfElementProps(highlightedSpan).children).toBe("highlighted");
expect(textChildren[2]).toBe(" after");
});
it("trims input whitespace", () => { it("trims input whitespace", () => {
expect(normalizeRichTextHtml(" text ")).toBe("<p>text</p>"); expect(normalizeRichTextHtml(" text ")).toBe("<p>text</p>");
}); });
@@ -1,6 +1,8 @@
import type { Node } from "node-html-parser"; import type { Node } from "node-html-parser";
import { NodeType, parse } from "node-html-parser"; import { NodeType, parse } from "node-html-parser";
export const richTextMarkClassName = "rr-pdf-mark";
const inlineTags = new Set([ const inlineTags = new Set([
"a", "a",
"abbr", "abbr",
@@ -27,6 +29,20 @@ const getTagName = (node: Node) => node.rawTagName.toLowerCase();
const hasBlockDescendant = (node: Node): boolean => const hasBlockDescendant = (node: Node): boolean =>
node.childNodes.some((child) => child.nodeType === NodeType.ELEMENT_NODE && !isInlineNode(child)); node.childNodes.some((child) => child.nodeType === NodeType.ELEMENT_NODE && !isInlineNode(child));
const mergeClassNames = (...classNames: (string | undefined)[]): string =>
classNames
.flatMap((className) => className?.split(/\s+/) ?? [])
.filter(Boolean)
.filter((className, index, classNames) => classNames.indexOf(className) === index)
.join(" ");
const normalizeMarkElements = (root: ReturnType<typeof parse>) => {
for (const mark of root.querySelectorAll("mark")) {
mark.tagName = "span";
mark.setAttribute("class", mergeClassNames(mark.getAttribute("class"), richTextMarkClassName));
}
};
const isInlineNode = (node: Node): boolean => { const isInlineNode = (node: Node): boolean => {
if (node.nodeType === NodeType.TEXT_NODE || node.nodeType === NodeType.COMMENT_NODE) return true; if (node.nodeType === NodeType.TEXT_NODE || node.nodeType === NodeType.COMMENT_NODE) return true;
if (node.nodeType !== NodeType.ELEMENT_NODE) return false; if (node.nodeType !== NodeType.ELEMENT_NODE) return false;
@@ -39,6 +55,8 @@ export const normalizeRichTextHtml = (html: string): string => {
const normalized: string[] = []; const normalized: string[] = [];
let inlineNodes: string[] = []; let inlineNodes: string[] = [];
normalizeMarkElements(root);
const flushInlineNodes = () => { const flushInlineNodes = () => {
const inlineHtml = inlineNodes.join("").trim(); const inlineHtml = inlineNodes.join("").trim();
@@ -0,0 +1,174 @@
import { describe, expect, it } from "vitest";
import { parse } from "node-html-parser";
import {
createRichTextProseSpacing,
getRichTextEdgeTrimStyle,
isRichTextElementInsideListItem,
isRichTextElementInsideOrderedList,
resolveRichTextBodyLineHeight,
stripRichTextVerticalMargins,
} from "./rich-text-spacing";
const requireElement = <T>(element: T | null | undefined): T => {
expect(element).toBeDefined();
if (!element) throw new Error("Expected element to exist.");
return element;
};
describe("createRichTextProseSpacing", () => {
it("uses 0.2x the configured body line height for each paragraph and list-item side margin", () => {
const spacing = createRichTextProseSpacing(15);
expect(spacing.paragraph.marginTop).toBeCloseTo(3);
expect(spacing.paragraph.marginBottom).toBeCloseTo(3);
expect(spacing.listItem.marginTop).toBeCloseTo(3);
expect(spacing.listItem.marginBottom).toBeCloseTo(3);
expect((spacing.paragraph.marginBottom as number) + (spacing.paragraph.marginTop as number)).toBeCloseTo(6);
});
it("does not invent spacing when no configured body line height is available", () => {
expect(createRichTextProseSpacing(undefined)).toEqual({
paragraph: {},
listItem: {},
});
});
});
describe("resolveRichTextBodyLineHeight", () => {
it("derives the configured body line height from body font size and line-height multiplier", () => {
expect(resolveRichTextBodyLineHeight({ fontSize: 10, lineHeight: 1.5 })).toBe(15);
});
it("uses the last resolved numeric font size and line height from template styles", () => {
expect(
resolveRichTextBodyLineHeight({ fontSize: 9, lineHeight: 1.2 }, [
{ color: "#111" },
{ fontSize: 11, lineHeight: 1.5 },
]),
).toBe(16.5);
});
it("parses px font-size and line-height strings when styles contain them", () => {
expect(resolveRichTextBodyLineHeight({ fontSize: "12px", lineHeight: "18px" })).toBe(18);
});
it("returns undefined when configured body line height cannot be resolved", () => {
expect(resolveRichTextBodyLineHeight({ fontSize: 10 })).toBeUndefined();
expect(resolveRichTextBodyLineHeight({ lineHeight: 1.5 })).toBeUndefined();
});
});
describe("getRichTextEdgeTrimStyle", () => {
it("trims both edges for a single paragraph", () => {
const [paragraph] = parse("<p>Only paragraph.</p>").querySelectorAll("p");
expect(getRichTextEdgeTrimStyle(requireElement(paragraph))).toEqual({ marginTop: 0, marginBottom: 0 });
});
it("trims only the outer edges for multiple paragraphs", () => {
const [firstParagraph, secondParagraph] = parse("<p>First.</p><p>Second.</p>").querySelectorAll("p");
expect(getRichTextEdgeTrimStyle(requireElement(firstParagraph))).toEqual({ marginTop: 0 });
expect(getRichTextEdgeTrimStyle(requireElement(secondParagraph))).toEqual({ marginBottom: 0 });
});
it("trims only the outer edges for list items", () => {
const [firstItem, secondItem] = parse("<ul><li>First.</li><li>Second.</li></ul>").querySelectorAll("li");
expect(getRichTextEdgeTrimStyle(requireElement(firstItem))).toEqual({ marginTop: 0 });
expect(getRichTextEdgeTrimStyle(requireElement(secondItem))).toEqual({ marginBottom: 0 });
});
it("trims across mixed paragraph and list content", () => {
const root = parse("<p>Intro.</p><ul><li><p>Nested item paragraph.</p></li></ul>");
const introParagraph = root.querySelector("p");
const listItem = root.querySelector("li");
const nestedParagraph = root.querySelector("li p");
expect(getRichTextEdgeTrimStyle(requireElement(introParagraph))).toEqual({ marginTop: 0 });
expect(getRichTextEdgeTrimStyle(requireElement(listItem))).toEqual({ marginBottom: 0 });
expect(getRichTextEdgeTrimStyle(requireElement(nestedParagraph))).toEqual({});
});
it("normalizes uppercase and mixed-case tags before trimming edges", () => {
const [firstParagraph, secondItem] = parse("<P>Intro.</P><UL><LI>Item.</LI></UL>").querySelectorAll("p, li");
expect(getRichTextEdgeTrimStyle(requireElement(firstParagraph))).toEqual({ marginTop: 0 });
expect(getRichTextEdgeTrimStyle(requireElement(secondItem))).toEqual({ marginBottom: 0 });
});
});
describe("stripRichTextVerticalMargins", () => {
it("removes vertical margin properties from list content styles and preserves text styles", () => {
expect(
stripRichTextVerticalMargins({
color: "#222",
fontSize: 10,
margin: 0,
marginTop: 1,
marginBottom: 2,
marginVertical: 3,
}),
).toEqual({
color: "#222",
fontSize: 10,
});
});
});
describe("isRichTextElementInsideListItem", () => {
it("detects paragraphs nested directly inside list items", () => {
const paragraph = parse("<ul><li><p>Nested item paragraph.</p></li></ul>").querySelector("p");
expect(isRichTextElementInsideListItem(requireElement(paragraph))).toBe(true);
});
it("detects paragraphs nested deeper inside list item content", () => {
const paragraph = parse("<ul><li><section><p>Nested item paragraph.</p></section></li></ul>").querySelector("p");
expect(isRichTextElementInsideListItem(requireElement(paragraph))).toBe(true);
});
it("normalizes uppercase and mixed-case tags for list item ancestor detection", () => {
const paragraph = parse("<UL><LI><Section><P>Nested item paragraph.</P></Section></LI></UL>").querySelector("p");
expect(isRichTextElementInsideListItem(requireElement(paragraph))).toBe(true);
});
it("does not treat top-level paragraphs as list item content", () => {
const paragraph = parse("<p>Top-level paragraph.</p>").querySelector("p");
expect(isRichTextElementInsideListItem(requireElement(paragraph))).toBe(false);
});
});
describe("isRichTextElementInsideOrderedList", () => {
it("normalizes uppercase and mixed-case ordered-list ancestors", () => {
const firstItem = parse("<OL><LI>First item.</LI></OL>").querySelector("li");
const nestedParagraph = parse("<Ol><Li><Section><P>Nested item paragraph.</P></Section></Li></Ol>").querySelector(
"p",
);
expect(isRichTextElementInsideOrderedList(requireElement(firstItem))).toBe(true);
expect(isRichTextElementInsideOrderedList(requireElement(nestedParagraph))).toBe(true);
});
it("does not treat unordered-list ancestors as ordered lists", () => {
const item = parse("<UL><LI>First item.</LI></UL>").querySelector("li");
expect(isRichTextElementInsideOrderedList(requireElement(item))).toBe(false);
});
it("uses the nearest list ancestor when ordered and unordered lists are nested", () => {
const unorderedNestedInOrdered = parse("<ol><li><ul><li>Nested unordered item.</li></ul></li></ol>").querySelector(
"ul li",
);
const orderedNestedInUnordered = parse("<ul><li><ol><li>Nested ordered item.</li></ol></li></ul>").querySelector(
"ol li",
);
expect(isRichTextElementInsideOrderedList(requireElement(unorderedNestedInOrdered))).toBe(false);
expect(isRichTextElementInsideOrderedList(requireElement(orderedNestedInUnordered))).toBe(true);
});
});
@@ -0,0 +1,173 @@
import type { Style } from "@react-pdf/types";
import type { StyleInput } from "./styles";
import { NodeType } from "node-html-parser";
import { composeStyles } from "./styles";
type RichTextSpacingElement = {
nodeType: number;
tag?: string;
localName?: string;
rawTagName?: string;
tagName?: string;
parentNode?: RichTextSpacingElement | null;
childNodes?: unknown[];
};
type RichTextProseSpacing = {
paragraph: Style;
listItem: Style;
};
const parseFiniteNumber = (value: unknown): number | undefined =>
typeof value === "number" && Number.isFinite(value) ? value : undefined;
const parsePxValue = (value: unknown): number | undefined => {
if (typeof value !== "string" || !value.endsWith("px")) return undefined;
const parsedValue = Number.parseFloat(value);
return Number.isFinite(parsedValue) ? parsedValue : undefined;
};
const parseFontSize = (fontSize: Style["fontSize"]): number | undefined =>
parseFiniteNumber(fontSize) ?? parsePxValue(fontSize);
const parseLineHeight = (
lineHeight: Style["lineHeight"],
): { type: "multiplier" | "absolute"; value: number } | undefined => {
const multiplier = parseFiniteNumber(lineHeight);
if (multiplier !== undefined) return { type: "multiplier", value: multiplier };
const absoluteLineHeight = parsePxValue(lineHeight);
if (absoluteLineHeight !== undefined) return { type: "absolute", value: absoluteLineHeight };
return undefined;
};
const isElementNode = (node: unknown): node is RichTextSpacingElement =>
typeof node === "object" && node !== null && "nodeType" in node && node.nodeType === NodeType.ELEMENT_NODE;
const readTagName = (
element: RichTextSpacingElement,
key: "tag" | "localName" | "rawTagName" | "tagName",
): string | undefined => {
try {
const tagName = element[key];
return typeof tagName === "string" ? tagName : undefined;
} catch {
return undefined;
}
};
const normalizeTagName = (element: RichTextSpacingElement): string | undefined =>
(
readTagName(element, "tag") ??
readTagName(element, "localName") ??
readTagName(element, "rawTagName") ??
readTagName(element, "tagName")
)?.toLowerCase();
const isRichTextTag = (element: RichTextSpacingElement, ...tagNames: string[]): boolean => {
const normalizedTagName = normalizeTagName(element);
return normalizedTagName !== undefined && tagNames.includes(normalizedTagName);
};
const getRootElement = (element: RichTextSpacingElement): RichTextSpacingElement => {
let root = element;
while (root.parentNode) {
root = root.parentNode;
}
return root;
};
const getTopLevelFlowElements = (root: RichTextSpacingElement): RichTextSpacingElement[] =>
(root.childNodes ?? []).filter(isElementNode).flatMap((child) => {
if (isRichTextTag(child, "p")) return [child];
if (!isRichTextTag(child, "ul", "ol")) return [];
return (child.childNodes ?? []).filter(isElementNode).filter((listChild) => isRichTextTag(listChild, "li"));
});
export const createRichTextProseSpacing = (bodyLineHeight: number | undefined): RichTextProseSpacing => {
if (bodyLineHeight === undefined) return { paragraph: {}, listItem: {} };
const sideMargin = bodyLineHeight * 0.2;
return {
paragraph: {
marginTop: sideMargin,
marginBottom: sideMargin,
},
listItem: {
marginTop: sideMargin,
marginBottom: sideMargin,
},
};
};
export const resolveRichTextBodyLineHeight = (...styles: StyleInput[]): number | undefined => {
let bodyFontSize: number | undefined;
let bodyLineHeight: ReturnType<typeof parseLineHeight>;
for (const style of composeStyles(...styles)) {
const fontSize = parseFontSize(style.fontSize);
if (fontSize !== undefined) bodyFontSize = fontSize;
const lineHeight = parseLineHeight(style.lineHeight);
if (lineHeight !== undefined) bodyLineHeight = lineHeight;
}
if (bodyFontSize === undefined || bodyLineHeight === undefined) return undefined;
return bodyLineHeight.type === "multiplier" ? bodyFontSize * bodyLineHeight.value : bodyLineHeight.value;
};
export const getRichTextEdgeTrimStyle = (element: RichTextSpacingElement): Style => {
const flowElements = getTopLevelFlowElements(getRootElement(element));
const flowIndex = flowElements.indexOf(element);
if (flowIndex === -1) return {};
return {
...(flowIndex === 0 ? { marginTop: 0 } : {}),
...(flowIndex === flowElements.length - 1 ? { marginBottom: 0 } : {}),
};
};
export const isRichTextElementInsideListItem = (element: RichTextSpacingElement): boolean => {
let current = element.parentNode;
while (current) {
if (isRichTextTag(current, "li")) return true;
current = current.parentNode;
}
return false;
};
export const isRichTextElementInsideOrderedList = (element: RichTextSpacingElement): boolean => {
let current = element.parentNode;
while (current) {
if (isRichTextTag(current, "ol")) return true;
if (isRichTextTag(current, "ul")) return false;
current = current.parentNode;
}
return false;
};
export const stripRichTextVerticalMargins = (style: Style): Style => {
const {
margin: _margin,
marginTop: _marginTop,
marginBottom: _marginBottom,
marginVertical: _marginVertical,
...rest
} = style;
return rest;
};
@@ -3,13 +3,32 @@ import { Text as PdfText, View } from "@react-pdf/renderer";
import { Html } from "react-pdf-html"; import { Html } from "react-pdf-html";
import { useTemplateStyle } from "./context"; import { useTemplateStyle } from "./context";
import { safeTextStyle } from "./primitives"; import { safeTextStyle } from "./primitives";
import { normalizeRichTextHtml } from "./rich-text-html"; import { normalizeRichTextHtml, richTextMarkClassName } from "./rich-text-html";
import {
createRichTextProseSpacing,
getRichTextEdgeTrimStyle,
isRichTextElementInsideListItem,
isRichTextElementInsideOrderedList,
resolveRichTextBodyLineHeight,
stripRichTextVerticalMargins,
} from "./rich-text-spacing";
import { composeStyles, mergeLinkStyles, mergeStyles } from "./styles"; import { composeStyles, mergeLinkStyles, mergeStyles } from "./styles";
const richListItemContentStackStyle = { const richListItemContentStackStyle = {
flexDirection: "column", flexDirection: "column",
} satisfies Style; } satisfies Style;
const richMarkStyle = {
backgroundColor: "#ffff00",
} satisfies Style;
const toStyleArray = (style: Style | Style[] | undefined): Style[] => {
if (!style) return [];
if (Array.isArray(style)) return style.filter(Boolean);
return [style];
};
export const RichText = ({ children }: { children: string }) => { export const RichText = ({ children }: { children: string }) => {
const boldStyle = useTemplateStyle("bold"); const boldStyle = useTemplateStyle("bold");
const linkStyle = useTemplateStyle("link"); const linkStyle = useTemplateStyle("link");
@@ -17,6 +36,8 @@ export const RichText = ({ children }: { children: string }) => {
const richListItemRowStyle = useTemplateStyle("richListItemRow"); const richListItemRowStyle = useTemplateStyle("richListItemRow");
const richListItemMarkerStyle = useTemplateStyle("richListItemMarker"); const richListItemMarkerStyle = useTemplateStyle("richListItemMarker");
const richListItemContentStyle = useTemplateStyle("richListItemContent"); const richListItemContentStyle = useTemplateStyle("richListItemContent");
const bodyLineHeight = resolveRichTextBodyLineHeight(richParagraphStyle, richListItemContentStyle);
const proseSpacing = createRichTextProseSpacing(bodyLineHeight);
const html = normalizeRichTextHtml(children); const html = normalizeRichTextHtml(children);
@@ -27,19 +48,26 @@ export const RichText = ({ children }: { children: string }) => {
resetStyles resetStyles
renderers={{ renderers={{
b: ({ children }) => <PdfText style={composeStyles(boldStyle, safeTextStyle)}>{children}</PdfText>, b: ({ children }) => <PdfText style={composeStyles(boldStyle, safeTextStyle)}>{children}</PdfText>,
p: ({ element, style, children }) => {
const paragraphStyles = isRichTextElementInsideListItem(element)
? toStyleArray(style).map(stripRichTextVerticalMargins)
: style;
return <View style={composeStyles(paragraphStyles, getRichTextEdgeTrimStyle(element))}>{children}</View>;
},
li: ({ element, style, children }) => { li: ({ element, style, children }) => {
const list = element.closest("ol, ul"); const isOrderedList = isRichTextElementInsideOrderedList(element);
const isOrderedList = list?.rawTagName === "ol" || element.parentNode.tag === "ol";
const marker = isOrderedList ? `${element.indexOfType + 1}.` : "•"; const marker = isOrderedList ? `${element.indexOfType + 1}.` : "•";
const itemStyle = Array.isArray(style) ? (style as Style[]) : [style as Style | undefined]; const itemStyles = toStyleArray(style);
const contentItemStyles = itemStyles.map(stripRichTextVerticalMargins);
return ( return (
<View style={composeStyles(richListItemRowStyle)}> <View style={composeStyles(richListItemRowStyle, itemStyles, getRichTextEdgeTrimStyle(element))}>
<PdfText style={composeStyles(richListItemMarkerStyle)}>{marker}</PdfText> <PdfText style={composeStyles(richListItemMarkerStyle)}>{marker}</PdfText>
<View <View
style={composeStyles( style={composeStyles(
richListItemContentStyle, richListItemContentStyle,
...itemStyle, contentItemStyles,
richListItemContentStackStyle, richListItemContentStackStyle,
safeTextStyle, safeTextStyle,
)} )}
@@ -53,7 +81,9 @@ export const RichText = ({ children }: { children: string }) => {
stylesheet={{ stylesheet={{
b: mergeStyles(boldStyle, safeTextStyle), b: mergeStyles(boldStyle, safeTextStyle),
strong: mergeStyles(boldStyle, safeTextStyle), strong: mergeStyles(boldStyle, safeTextStyle),
p: mergeStyles(richParagraphStyle, safeTextStyle), li: mergeStyles(proseSpacing.listItem),
[`.${richTextMarkClassName}`]: mergeStyles(richMarkStyle, safeTextStyle),
p: mergeStyles(richParagraphStyle, safeTextStyle, proseSpacing.paragraph),
a: mergeLinkStyles(linkStyle, safeTextStyle), a: mergeLinkStyles(linkStyle, safeTextStyle),
}} }}
> >
+1 -1
View File
@@ -154,7 +154,7 @@
} }
.wysiwyg { .wysiwyg {
@apply prose prose-sm prose-zinc dark:prose-invert max-w-none prose-p:my-0! prose-li:my-0! prose-ul:my-0! prose-ol:my-0!; @apply prose prose-sm prose-zinc dark:prose-invert max-w-none prose-p:my-3! prose-li:my-3! prose-ul:my-3! prose-ol:my-3!;
} }
} }
+32 -32
View File
@@ -73,16 +73,16 @@ importers:
version: 1.4.1(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) version: 1.4.1(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
'@better-auth/api-key': '@better-auth/api-key':
specifier: ^1.6.10 specifier: ^1.6.10
version: 1.6.10(@better-auth/core@1.6.10(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0))(@better-auth/utils@0.4.0)(better-auth@1.6.10(@opentelemetry/api@1.9.0)(@tanstack/react-start@1.167.65(crossws@0.4.5(srvx@0.11.15))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vite@8.0.11(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.4)))(drizzle-orm@1.0.0-beta.22(@opentelemetry/api@1.9.0)(@types/pg@8.20.0)(pg@8.20.0)(zod@4.4.3))(next@16.2.3(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(pg@8.20.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vitest@4.1.5)) version: 1.6.10(@better-auth/core@1.6.10(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0))(@better-auth/utils@0.4.0)(better-auth@1.6.10(@opentelemetry/api@1.9.0)(@tanstack/react-start@1.167.65(crossws@0.4.5(srvx@0.11.15))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vite@8.0.11(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.4)))(drizzle-orm@1.0.0-beta.22(@opentelemetry/api@1.9.0)(@types/pg@8.20.0)(pg@8.20.0)(zod@4.4.3))(next@16.2.3(@opentelemetry/api@1.9.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(pg@8.20.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vitest@4.1.5))
'@better-auth/infra': '@better-auth/infra':
specifier: ^0.2.6 specifier: ^0.2.6
version: 0.2.6(c5e49ade875b56891bf7ad7edc89abae) version: 0.2.6(4ea1f299f932814591939b4faa6a1316)
'@better-auth/oauth-provider': '@better-auth/oauth-provider':
specifier: ^1.6.10 specifier: ^1.6.10
version: 1.6.10(@better-auth/core@1.6.10(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0))(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(better-auth@1.6.10(@opentelemetry/api@1.9.0)(@tanstack/react-start@1.167.65(crossws@0.4.5(srvx@0.11.15))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vite@8.0.11(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.4)))(drizzle-orm@1.0.0-beta.22(@opentelemetry/api@1.9.0)(@types/pg@8.20.0)(pg@8.20.0)(zod@4.4.3))(next@16.2.3(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(pg@8.20.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vitest@4.1.5))(better-call@1.3.5(zod@4.4.3)) version: 1.6.10(@better-auth/core@1.6.10(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0))(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(better-auth@1.6.10(@opentelemetry/api@1.9.0)(@tanstack/react-start@1.167.65(crossws@0.4.5(srvx@0.11.15))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vite@8.0.11(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.4)))(drizzle-orm@1.0.0-beta.22(@opentelemetry/api@1.9.0)(@types/pg@8.20.0)(pg@8.20.0)(zod@4.4.3))(next@16.2.3(@opentelemetry/api@1.9.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(pg@8.20.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vitest@4.1.5))(better-call@1.3.5(zod@4.4.3))
'@better-auth/passkey': '@better-auth/passkey':
specifier: ^1.6.10 specifier: ^1.6.10
version: 1.6.10(@better-auth/core@1.6.10(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0))(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(better-auth@1.6.10(@opentelemetry/api@1.9.0)(@tanstack/react-start@1.167.65(crossws@0.4.5(srvx@0.11.15))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vite@8.0.11(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.4)))(drizzle-orm@1.0.0-beta.22(@opentelemetry/api@1.9.0)(@types/pg@8.20.0)(pg@8.20.0)(zod@4.4.3))(next@16.2.3(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(pg@8.20.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vitest@4.1.5))(better-call@1.3.5(zod@4.4.3))(nanostores@1.3.0) version: 1.6.10(@better-auth/core@1.6.10(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0))(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(better-auth@1.6.10(@opentelemetry/api@1.9.0)(@tanstack/react-start@1.167.65(crossws@0.4.5(srvx@0.11.15))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vite@8.0.11(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.4)))(drizzle-orm@1.0.0-beta.22(@opentelemetry/api@1.9.0)(@types/pg@8.20.0)(pg@8.20.0)(zod@4.4.3))(next@16.2.3(@opentelemetry/api@1.9.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(pg@8.20.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vitest@4.1.5))(better-call@1.3.5(zod@4.4.3))(nanostores@1.3.0)
'@dnd-kit/core': '@dnd-kit/core':
specifier: ^6.3.1 specifier: ^6.3.1
version: 6.3.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6) version: 6.3.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
@@ -162,8 +162,8 @@ importers:
specifier: ^4.3.0 specifier: ^4.3.0
version: 4.3.0(vite@8.0.11(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.4)) version: 4.3.0(vite@8.0.11(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.4))
'@tanstack/react-form': '@tanstack/react-form':
specifier: ^1.31.0 specifier: ^1.32.0
version: 1.31.0(@tanstack/react-start@1.167.65(crossws@0.4.5(srvx@0.11.15))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vite@8.0.11(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.4)))(react-dom@19.2.6(react@19.2.6))(react@19.2.6) version: 1.32.0(@tanstack/react-start@1.167.65(crossws@0.4.5(srvx@0.11.15))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vite@8.0.11(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.4)))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
'@tanstack/react-hotkeys': '@tanstack/react-hotkeys':
specifier: ^0.10.0 specifier: ^0.10.0
version: 0.10.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6) version: 0.10.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
@@ -214,7 +214,7 @@ importers:
version: 2.10.1(@babel/runtime@7.29.2)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) version: 2.10.1(@babel/runtime@7.29.2)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
better-auth: better-auth:
specifier: 1.6.10 specifier: 1.6.10
version: 1.6.10(@opentelemetry/api@1.9.0)(@tanstack/react-start@1.167.65(crossws@0.4.5(srvx@0.11.15))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vite@8.0.11(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.4)))(drizzle-orm@1.0.0-beta.22(@opentelemetry/api@1.9.0)(@types/pg@8.20.0)(pg@8.20.0)(zod@4.4.3))(next@16.2.3(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(pg@8.20.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vitest@4.1.5) version: 1.6.10(@opentelemetry/api@1.9.0)(@tanstack/react-start@1.167.65(crossws@0.4.5(srvx@0.11.15))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vite@8.0.11(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.4)))(drizzle-orm@1.0.0-beta.22(@opentelemetry/api@1.9.0)(@types/pg@8.20.0)(pg@8.20.0)(zod@4.4.3))(next@16.2.3(@opentelemetry/api@1.9.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(pg@8.20.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vitest@4.1.5)
cmdk: cmdk:
specifier: ^1.1.1 specifier: ^1.1.1
version: 1.1.1(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) version: 1.1.1(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
@@ -420,7 +420,7 @@ importers:
version: 6.0.0 version: 6.0.0
better-auth: better-auth:
specifier: 1.6.10 specifier: 1.6.10
version: 1.6.10(@opentelemetry/api@1.9.0)(@tanstack/react-start@1.167.65(crossws@0.4.5(srvx@0.11.15))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vite@8.0.11(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.4)))(drizzle-orm@1.0.0-beta.22(@opentelemetry/api@1.9.0)(@types/pg@8.20.0)(pg@8.20.0)(zod@4.4.3))(next@16.2.3(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(pg@8.20.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vitest@4.1.5) version: 1.6.10(@opentelemetry/api@1.9.0)(@tanstack/react-start@1.167.65(crossws@0.4.5(srvx@0.11.15))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vite@8.0.11(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.4)))(drizzle-orm@1.0.0-beta.22(@opentelemetry/api@1.9.0)(@types/pg@8.20.0)(pg@8.20.0)(zod@4.4.3))(next@16.2.3(@opentelemetry/api@1.9.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(pg@8.20.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vitest@4.1.5)
drizzle-orm: drizzle-orm:
specifier: 1.0.0-beta.22 specifier: 1.0.0-beta.22
version: 1.0.0-beta.22(@opentelemetry/api@1.9.0)(@types/pg@8.20.0)(pg@8.20.0)(zod@4.4.3) version: 1.0.0-beta.22(@opentelemetry/api@1.9.0)(@types/pg@8.20.0)(pg@8.20.0)(zod@4.4.3)
@@ -463,19 +463,19 @@ importers:
dependencies: dependencies:
'@better-auth/api-key': '@better-auth/api-key':
specifier: ^1.6.10 specifier: ^1.6.10
version: 1.6.10(@better-auth/core@1.6.10(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0))(@better-auth/utils@0.4.0)(better-auth@1.6.10(@opentelemetry/api@1.9.0)(@tanstack/react-start@1.167.65(crossws@0.4.5(srvx@0.11.15))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vite@8.0.11(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.4)))(drizzle-orm@1.0.0-beta.22(@opentelemetry/api@1.9.0)(@types/pg@8.20.0)(pg@8.20.0)(zod@4.4.3))(next@16.2.3(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(pg@8.20.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vitest@4.1.5)) version: 1.6.10(@better-auth/core@1.6.10(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0))(@better-auth/utils@0.4.0)(better-auth@1.6.10(@opentelemetry/api@1.9.0)(@tanstack/react-start@1.167.65(crossws@0.4.5(srvx@0.11.15))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vite@8.0.11(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.4)))(drizzle-orm@1.0.0-beta.22(@opentelemetry/api@1.9.0)(@types/pg@8.20.0)(pg@8.20.0)(zod@4.4.3))(next@16.2.3(@opentelemetry/api@1.9.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(pg@8.20.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vitest@4.1.5))
'@better-auth/drizzle-adapter': '@better-auth/drizzle-adapter':
specifier: ^1.6.10 specifier: ^1.6.10
version: 1.6.10(@better-auth/core@1.6.10(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0))(@better-auth/utils@0.4.0)(drizzle-orm@1.0.0-beta.22(@opentelemetry/api@1.9.0)(@types/pg@8.20.0)(pg@8.20.0)(zod@4.4.3)) version: 1.6.10(@better-auth/core@1.6.10(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0))(@better-auth/utils@0.4.0)(drizzle-orm@1.0.0-beta.22(@opentelemetry/api@1.9.0)(@types/pg@8.20.0)(pg@8.20.0)(zod@4.4.3))
'@better-auth/infra': '@better-auth/infra':
specifier: ^0.2.6 specifier: ^0.2.6
version: 0.2.6(c5e49ade875b56891bf7ad7edc89abae) version: 0.2.6(4ea1f299f932814591939b4faa6a1316)
'@better-auth/oauth-provider': '@better-auth/oauth-provider':
specifier: ^1.6.10 specifier: ^1.6.10
version: 1.6.10(@better-auth/core@1.6.10(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0))(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(better-auth@1.6.10(@opentelemetry/api@1.9.0)(@tanstack/react-start@1.167.65(crossws@0.4.5(srvx@0.11.15))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vite@8.0.11(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.4)))(drizzle-orm@1.0.0-beta.22(@opentelemetry/api@1.9.0)(@types/pg@8.20.0)(pg@8.20.0)(zod@4.4.3))(next@16.2.3(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(pg@8.20.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vitest@4.1.5))(better-call@1.3.5(zod@4.4.3)) version: 1.6.10(@better-auth/core@1.6.10(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0))(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(better-auth@1.6.10(@opentelemetry/api@1.9.0)(@tanstack/react-start@1.167.65(crossws@0.4.5(srvx@0.11.15))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vite@8.0.11(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.4)))(drizzle-orm@1.0.0-beta.22(@opentelemetry/api@1.9.0)(@types/pg@8.20.0)(pg@8.20.0)(zod@4.4.3))(next@16.2.3(@opentelemetry/api@1.9.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(pg@8.20.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vitest@4.1.5))(better-call@1.3.5(zod@4.4.3))
'@better-auth/passkey': '@better-auth/passkey':
specifier: ^1.6.10 specifier: ^1.6.10
version: 1.6.10(@better-auth/core@1.6.10(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0))(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(better-auth@1.6.10(@opentelemetry/api@1.9.0)(@tanstack/react-start@1.167.65(crossws@0.4.5(srvx@0.11.15))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vite@8.0.11(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.4)))(drizzle-orm@1.0.0-beta.22(@opentelemetry/api@1.9.0)(@types/pg@8.20.0)(pg@8.20.0)(zod@4.4.3))(next@16.2.3(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(pg@8.20.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vitest@4.1.5))(better-call@1.3.5(zod@4.4.3))(nanostores@1.3.0) version: 1.6.10(@better-auth/core@1.6.10(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0))(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(better-auth@1.6.10(@opentelemetry/api@1.9.0)(@tanstack/react-start@1.167.65(crossws@0.4.5(srvx@0.11.15))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vite@8.0.11(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.4)))(drizzle-orm@1.0.0-beta.22(@opentelemetry/api@1.9.0)(@types/pg@8.20.0)(pg@8.20.0)(zod@4.4.3))(next@16.2.3(@opentelemetry/api@1.9.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(pg@8.20.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vitest@4.1.5))(better-call@1.3.5(zod@4.4.3))(nanostores@1.3.0)
'@reactive-resume/db': '@reactive-resume/db':
specifier: workspace:* specifier: workspace:*
version: link:../db version: link:../db
@@ -496,7 +496,7 @@ importers:
version: 6.0.0 version: 6.0.0
better-auth: better-auth:
specifier: 1.6.10 specifier: 1.6.10
version: 1.6.10(@opentelemetry/api@1.9.0)(@tanstack/react-start@1.167.65(crossws@0.4.5(srvx@0.11.15))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vite@8.0.11(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.4)))(drizzle-orm@1.0.0-beta.22(@opentelemetry/api@1.9.0)(@types/pg@8.20.0)(pg@8.20.0)(zod@4.4.3))(next@16.2.3(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(pg@8.20.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vitest@4.1.5) version: 1.6.10(@opentelemetry/api@1.9.0)(@tanstack/react-start@1.167.65(crossws@0.4.5(srvx@0.11.15))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vite@8.0.11(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.4)))(drizzle-orm@1.0.0-beta.22(@opentelemetry/api@1.9.0)(@types/pg@8.20.0)(pg@8.20.0)(zod@4.4.3))(next@16.2.3(@opentelemetry/api@1.9.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(pg@8.20.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vitest@4.1.5)
drizzle-orm: drizzle-orm:
specifier: 1.0.0-beta.22 specifier: 1.0.0-beta.22
version: 1.0.0-beta.22(@opentelemetry/api@1.9.0)(@types/pg@8.20.0)(pg@8.20.0)(zod@4.4.3) version: 1.0.0-beta.22(@opentelemetry/api@1.9.0)(@types/pg@8.20.0)(pg@8.20.0)(zod@4.4.3)
@@ -4417,8 +4417,8 @@ packages:
engines: {node: '>=18'} engines: {node: '>=18'}
hasBin: true hasBin: true
'@tanstack/form-core@1.31.0': '@tanstack/form-core@1.32.0':
resolution: {integrity: sha512-t5G/LnrM/U10mQgzYis/WvHc6yTDj7jyF5cYf6GjVJpEbn0et0wDUQtafiOXY8hiXJ9D1HUqBi0u76ZX05uiHw==} resolution: {integrity: sha512-Tn5VRDSjyqjmaet2tJMuEWDRFyrCaon03vxXPlSSaiSs6C/N7lCIwGCXJbZXEUq1kTj8jYN9qyXHbsz4LQHcow==}
'@tanstack/history@1.161.6': '@tanstack/history@1.161.6':
resolution: {integrity: sha512-NaOGLRrddszbQj9upGat6HG/4TKvXLvu+osAIgfxPYA+eIvYKv8GKDJOrY2D3/U9MRnKfMWD7bU4jeD4xmqyIg==} resolution: {integrity: sha512-NaOGLRrddszbQj9upGat6HG/4TKvXLvu+osAIgfxPYA+eIvYKv8GKDJOrY2D3/U9MRnKfMWD7bU4jeD4xmqyIg==}
@@ -4435,8 +4435,8 @@ packages:
'@tanstack/query-core@5.100.9': '@tanstack/query-core@5.100.9':
resolution: {integrity: sha512-SJSFw1S8+kQ0+knv/XGfrbocWoAlT7vDKsSImtLx3ZPQmEcR46hkDjLSvynSy25N8Ms4tIEini1FuBd5k7IscQ==} resolution: {integrity: sha512-SJSFw1S8+kQ0+knv/XGfrbocWoAlT7vDKsSImtLx3ZPQmEcR46hkDjLSvynSy25N8Ms4tIEini1FuBd5k7IscQ==}
'@tanstack/react-form@1.31.0': '@tanstack/react-form@1.32.0':
resolution: {integrity: sha512-31hoeKlk45jCAnry85bOiL89FwySL9HtAhfWLHmCJ5WcvBlHJpoqnMvl6Cy8DM+7ey2eWHKiPiEL29BkG5o12w==} resolution: {integrity: sha512-6WP5SQTA6/H9crCpvpq3ZppYWqtrdE5NjOy6ebABi6uAQPqhfTzrdjS9t40mCZCFtGI5585OhJV6zBP/KN2zcw==}
peerDependencies: peerDependencies:
'@tanstack/react-start': '*' '@tanstack/react-start': '*'
react: ^17.0.0 || ^18.0.0 || ^19.0.0 react: ^17.0.0 || ^18.0.0 || ^19.0.0
@@ -10263,11 +10263,11 @@ snapshots:
'@bcoe/v8-coverage@1.0.2': {} '@bcoe/v8-coverage@1.0.2': {}
'@better-auth/api-key@1.6.10(@better-auth/core@1.6.10(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0))(@better-auth/utils@0.4.0)(better-auth@1.6.10(@opentelemetry/api@1.9.0)(@tanstack/react-start@1.167.65(crossws@0.4.5(srvx@0.11.15))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vite@8.0.11(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.4)))(drizzle-orm@1.0.0-beta.22(@opentelemetry/api@1.9.0)(@types/pg@8.20.0)(pg@8.20.0)(zod@4.4.3))(next@16.2.3(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(pg@8.20.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vitest@4.1.5))': '@better-auth/api-key@1.6.10(@better-auth/core@1.6.10(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0))(@better-auth/utils@0.4.0)(better-auth@1.6.10(@opentelemetry/api@1.9.0)(@tanstack/react-start@1.167.65(crossws@0.4.5(srvx@0.11.15))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vite@8.0.11(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.4)))(drizzle-orm@1.0.0-beta.22(@opentelemetry/api@1.9.0)(@types/pg@8.20.0)(pg@8.20.0)(zod@4.4.3))(next@16.2.3(@opentelemetry/api@1.9.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(pg@8.20.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vitest@4.1.5))':
dependencies: dependencies:
'@better-auth/core': 1.6.10(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0) '@better-auth/core': 1.6.10(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0)
'@better-auth/utils': 0.4.0 '@better-auth/utils': 0.4.0
better-auth: 1.6.10(@opentelemetry/api@1.9.0)(@tanstack/react-start@1.167.65(crossws@0.4.5(srvx@0.11.15))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vite@8.0.11(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.4)))(drizzle-orm@1.0.0-beta.22(@opentelemetry/api@1.9.0)(@types/pg@8.20.0)(pg@8.20.0)(zod@4.4.3))(next@16.2.3(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(pg@8.20.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vitest@4.1.5) better-auth: 1.6.10(@opentelemetry/api@1.9.0)(@tanstack/react-start@1.167.65(crossws@0.4.5(srvx@0.11.15))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vite@8.0.11(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.4)))(drizzle-orm@1.0.0-beta.22(@opentelemetry/api@1.9.0)(@types/pg@8.20.0)(pg@8.20.0)(zod@4.4.3))(next@16.2.3(@opentelemetry/api@1.9.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(pg@8.20.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vitest@4.1.5)
zod: 4.4.3 zod: 4.4.3
'@better-auth/core@1.6.10(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0)': '@better-auth/core@1.6.10(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0)':
@@ -10291,12 +10291,12 @@ snapshots:
optionalDependencies: optionalDependencies:
drizzle-orm: 1.0.0-beta.22(@opentelemetry/api@1.9.0)(@types/pg@8.20.0)(pg@8.20.0)(zod@4.4.3) drizzle-orm: 1.0.0-beta.22(@opentelemetry/api@1.9.0)(@types/pg@8.20.0)(pg@8.20.0)(zod@4.4.3)
'@better-auth/infra@0.2.6(c5e49ade875b56891bf7ad7edc89abae)': '@better-auth/infra@0.2.6(4ea1f299f932814591939b4faa6a1316)':
dependencies: dependencies:
'@better-auth/core': 1.6.10(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0) '@better-auth/core': 1.6.10(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0)
'@better-auth/sso': 1.6.9(@better-auth/core@1.6.10(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0))(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(better-auth@1.6.10(@opentelemetry/api@1.9.0)(@tanstack/react-start@1.167.65(crossws@0.4.5(srvx@0.11.15))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vite@8.0.11(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.4)))(drizzle-orm@1.0.0-beta.22(@opentelemetry/api@1.9.0)(@types/pg@8.20.0)(pg@8.20.0)(zod@4.4.3))(next@16.2.3(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(pg@8.20.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vitest@4.1.5))(better-call@1.3.5(zod@4.4.3)) '@better-auth/sso': 1.6.9(@better-auth/core@1.6.10(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0))(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(better-auth@1.6.10(@opentelemetry/api@1.9.0)(@tanstack/react-start@1.167.65(crossws@0.4.5(srvx@0.11.15))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vite@8.0.11(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.4)))(drizzle-orm@1.0.0-beta.22(@opentelemetry/api@1.9.0)(@types/pg@8.20.0)(pg@8.20.0)(zod@4.4.3))(next@16.2.3(@opentelemetry/api@1.9.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(pg@8.20.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vitest@4.1.5))(better-call@1.3.5(zod@4.4.3))
'@better-fetch/fetch': 1.1.21 '@better-fetch/fetch': 1.1.21
better-auth: 1.6.10(@opentelemetry/api@1.9.0)(@tanstack/react-start@1.167.65(crossws@0.4.5(srvx@0.11.15))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vite@8.0.11(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.4)))(drizzle-orm@1.0.0-beta.22(@opentelemetry/api@1.9.0)(@types/pg@8.20.0)(pg@8.20.0)(zod@4.4.3))(next@16.2.3(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(pg@8.20.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vitest@4.1.5) better-auth: 1.6.10(@opentelemetry/api@1.9.0)(@tanstack/react-start@1.167.65(crossws@0.4.5(srvx@0.11.15))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vite@8.0.11(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.4)))(drizzle-orm@1.0.0-beta.22(@opentelemetry/api@1.9.0)(@types/pg@8.20.0)(pg@8.20.0)(zod@4.4.3))(next@16.2.3(@opentelemetry/api@1.9.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(pg@8.20.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vitest@4.1.5)
better-call: 1.3.5(zod@4.4.3) better-call: 1.3.5(zod@4.4.3)
jose: 6.2.3 jose: 6.2.3
libphonenumber-js: 1.13.0 libphonenumber-js: 1.13.0
@@ -10319,24 +10319,24 @@ snapshots:
'@better-auth/core': 1.6.10(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0) '@better-auth/core': 1.6.10(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0)
'@better-auth/utils': 0.4.0 '@better-auth/utils': 0.4.0
'@better-auth/oauth-provider@1.6.10(@better-auth/core@1.6.10(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0))(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(better-auth@1.6.10(@opentelemetry/api@1.9.0)(@tanstack/react-start@1.167.65(crossws@0.4.5(srvx@0.11.15))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vite@8.0.11(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.4)))(drizzle-orm@1.0.0-beta.22(@opentelemetry/api@1.9.0)(@types/pg@8.20.0)(pg@8.20.0)(zod@4.4.3))(next@16.2.3(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(pg@8.20.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vitest@4.1.5))(better-call@1.3.5(zod@4.4.3))': '@better-auth/oauth-provider@1.6.10(@better-auth/core@1.6.10(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0))(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(better-auth@1.6.10(@opentelemetry/api@1.9.0)(@tanstack/react-start@1.167.65(crossws@0.4.5(srvx@0.11.15))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vite@8.0.11(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.4)))(drizzle-orm@1.0.0-beta.22(@opentelemetry/api@1.9.0)(@types/pg@8.20.0)(pg@8.20.0)(zod@4.4.3))(next@16.2.3(@opentelemetry/api@1.9.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(pg@8.20.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vitest@4.1.5))(better-call@1.3.5(zod@4.4.3))':
dependencies: dependencies:
'@better-auth/core': 1.6.10(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0) '@better-auth/core': 1.6.10(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0)
'@better-auth/utils': 0.4.0 '@better-auth/utils': 0.4.0
'@better-fetch/fetch': 1.1.21 '@better-fetch/fetch': 1.1.21
better-auth: 1.6.10(@opentelemetry/api@1.9.0)(@tanstack/react-start@1.167.65(crossws@0.4.5(srvx@0.11.15))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vite@8.0.11(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.4)))(drizzle-orm@1.0.0-beta.22(@opentelemetry/api@1.9.0)(@types/pg@8.20.0)(pg@8.20.0)(zod@4.4.3))(next@16.2.3(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(pg@8.20.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vitest@4.1.5) better-auth: 1.6.10(@opentelemetry/api@1.9.0)(@tanstack/react-start@1.167.65(crossws@0.4.5(srvx@0.11.15))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vite@8.0.11(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.4)))(drizzle-orm@1.0.0-beta.22(@opentelemetry/api@1.9.0)(@types/pg@8.20.0)(pg@8.20.0)(zod@4.4.3))(next@16.2.3(@opentelemetry/api@1.9.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(pg@8.20.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vitest@4.1.5)
better-call: 1.3.5(zod@4.4.3) better-call: 1.3.5(zod@4.4.3)
jose: 6.2.3 jose: 6.2.3
zod: 4.4.3 zod: 4.4.3
'@better-auth/passkey@1.6.10(@better-auth/core@1.6.10(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0))(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(better-auth@1.6.10(@opentelemetry/api@1.9.0)(@tanstack/react-start@1.167.65(crossws@0.4.5(srvx@0.11.15))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vite@8.0.11(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.4)))(drizzle-orm@1.0.0-beta.22(@opentelemetry/api@1.9.0)(@types/pg@8.20.0)(pg@8.20.0)(zod@4.4.3))(next@16.2.3(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(pg@8.20.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vitest@4.1.5))(better-call@1.3.5(zod@4.4.3))(nanostores@1.3.0)': '@better-auth/passkey@1.6.10(@better-auth/core@1.6.10(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0))(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(better-auth@1.6.10(@opentelemetry/api@1.9.0)(@tanstack/react-start@1.167.65(crossws@0.4.5(srvx@0.11.15))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vite@8.0.11(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.4)))(drizzle-orm@1.0.0-beta.22(@opentelemetry/api@1.9.0)(@types/pg@8.20.0)(pg@8.20.0)(zod@4.4.3))(next@16.2.3(@opentelemetry/api@1.9.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(pg@8.20.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vitest@4.1.5))(better-call@1.3.5(zod@4.4.3))(nanostores@1.3.0)':
dependencies: dependencies:
'@better-auth/core': 1.6.10(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0) '@better-auth/core': 1.6.10(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0)
'@better-auth/utils': 0.4.0 '@better-auth/utils': 0.4.0
'@better-fetch/fetch': 1.1.21 '@better-fetch/fetch': 1.1.21
'@simplewebauthn/browser': 13.3.0 '@simplewebauthn/browser': 13.3.0
'@simplewebauthn/server': 13.3.0 '@simplewebauthn/server': 13.3.0
better-auth: 1.6.10(@opentelemetry/api@1.9.0)(@tanstack/react-start@1.167.65(crossws@0.4.5(srvx@0.11.15))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vite@8.0.11(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.4)))(drizzle-orm@1.0.0-beta.22(@opentelemetry/api@1.9.0)(@types/pg@8.20.0)(pg@8.20.0)(zod@4.4.3))(next@16.2.3(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(pg@8.20.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vitest@4.1.5) better-auth: 1.6.10(@opentelemetry/api@1.9.0)(@tanstack/react-start@1.167.65(crossws@0.4.5(srvx@0.11.15))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vite@8.0.11(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.4)))(drizzle-orm@1.0.0-beta.22(@opentelemetry/api@1.9.0)(@types/pg@8.20.0)(pg@8.20.0)(zod@4.4.3))(next@16.2.3(@opentelemetry/api@1.9.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(pg@8.20.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vitest@4.1.5)
better-call: 1.3.5(zod@4.4.3) better-call: 1.3.5(zod@4.4.3)
nanostores: 1.3.0 nanostores: 1.3.0
zod: 4.4.3 zod: 4.4.3
@@ -10346,12 +10346,12 @@ snapshots:
'@better-auth/core': 1.6.10(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0) '@better-auth/core': 1.6.10(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0)
'@better-auth/utils': 0.4.0 '@better-auth/utils': 0.4.0
'@better-auth/sso@1.6.9(@better-auth/core@1.6.10(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0))(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(better-auth@1.6.10(@opentelemetry/api@1.9.0)(@tanstack/react-start@1.167.65(crossws@0.4.5(srvx@0.11.15))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vite@8.0.11(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.4)))(drizzle-orm@1.0.0-beta.22(@opentelemetry/api@1.9.0)(@types/pg@8.20.0)(pg@8.20.0)(zod@4.4.3))(next@16.2.3(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(pg@8.20.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vitest@4.1.5))(better-call@1.3.5(zod@4.4.3))': '@better-auth/sso@1.6.9(@better-auth/core@1.6.10(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0))(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(better-auth@1.6.10(@opentelemetry/api@1.9.0)(@tanstack/react-start@1.167.65(crossws@0.4.5(srvx@0.11.15))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vite@8.0.11(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.4)))(drizzle-orm@1.0.0-beta.22(@opentelemetry/api@1.9.0)(@types/pg@8.20.0)(pg@8.20.0)(zod@4.4.3))(next@16.2.3(@opentelemetry/api@1.9.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(pg@8.20.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vitest@4.1.5))(better-call@1.3.5(zod@4.4.3))':
dependencies: dependencies:
'@better-auth/core': 1.6.10(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0) '@better-auth/core': 1.6.10(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0)
'@better-auth/utils': 0.4.0 '@better-auth/utils': 0.4.0
'@better-fetch/fetch': 1.1.21 '@better-fetch/fetch': 1.1.21
better-auth: 1.6.10(@opentelemetry/api@1.9.0)(@tanstack/react-start@1.167.65(crossws@0.4.5(srvx@0.11.15))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vite@8.0.11(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.4)))(drizzle-orm@1.0.0-beta.22(@opentelemetry/api@1.9.0)(@types/pg@8.20.0)(pg@8.20.0)(zod@4.4.3))(next@16.2.3(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(pg@8.20.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vitest@4.1.5) better-auth: 1.6.10(@opentelemetry/api@1.9.0)(@tanstack/react-start@1.167.65(crossws@0.4.5(srvx@0.11.15))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vite@8.0.11(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.4)))(drizzle-orm@1.0.0-beta.22(@opentelemetry/api@1.9.0)(@types/pg@8.20.0)(pg@8.20.0)(zod@4.4.3))(next@16.2.3(@opentelemetry/api@1.9.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(pg@8.20.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vitest@4.1.5)
better-call: 1.3.5(zod@4.4.3) better-call: 1.3.5(zod@4.4.3)
fast-xml-parser: 5.7.3 fast-xml-parser: 5.7.3
jose: 6.2.3 jose: 6.2.3
@@ -12696,7 +12696,7 @@ snapshots:
'@tanstack/devtools-event-client@0.4.3': {} '@tanstack/devtools-event-client@0.4.3': {}
'@tanstack/form-core@1.31.0': '@tanstack/form-core@1.32.0':
dependencies: dependencies:
'@tanstack/devtools-event-client': 0.4.3 '@tanstack/devtools-event-client': 0.4.3
'@tanstack/pacer-lite': 0.1.1 '@tanstack/pacer-lite': 0.1.1
@@ -12712,9 +12712,9 @@ snapshots:
'@tanstack/query-core@5.100.9': {} '@tanstack/query-core@5.100.9': {}
'@tanstack/react-form@1.31.0(@tanstack/react-start@1.167.65(crossws@0.4.5(srvx@0.11.15))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vite@8.0.11(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.4)))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': '@tanstack/react-form@1.32.0(@tanstack/react-start@1.167.65(crossws@0.4.5(srvx@0.11.15))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vite@8.0.11(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.4)))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)':
dependencies: dependencies:
'@tanstack/form-core': 1.31.0 '@tanstack/form-core': 1.32.0
'@tanstack/react-store': 0.9.3(react-dom@19.2.6(react@19.2.6))(react@19.2.6) '@tanstack/react-store': 0.9.3(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
react: 19.2.6 react: 19.2.6
optionalDependencies: optionalDependencies:
@@ -13623,7 +13623,7 @@ snapshots:
node-addon-api: 8.7.0 node-addon-api: 8.7.0
node-gyp-build: 4.8.4 node-gyp-build: 4.8.4
better-auth@1.6.10(@opentelemetry/api@1.9.0)(@tanstack/react-start@1.167.65(crossws@0.4.5(srvx@0.11.15))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vite@8.0.11(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.4)))(drizzle-orm@1.0.0-beta.22(@opentelemetry/api@1.9.0)(@types/pg@8.20.0)(pg@8.20.0)(zod@4.4.3))(next@16.2.3(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(pg@8.20.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vitest@4.1.5): better-auth@1.6.10(@opentelemetry/api@1.9.0)(@tanstack/react-start@1.167.65(crossws@0.4.5(srvx@0.11.15))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vite@8.0.11(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.4)))(drizzle-orm@1.0.0-beta.22(@opentelemetry/api@1.9.0)(@types/pg@8.20.0)(pg@8.20.0)(zod@4.4.3))(next@16.2.3(@opentelemetry/api@1.9.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(pg@8.20.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vitest@4.1.5):
dependencies: dependencies:
'@better-auth/core': 1.6.10(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0) '@better-auth/core': 1.6.10(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0)
'@better-auth/drizzle-adapter': 1.6.10(@better-auth/core@1.6.10(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0))(@better-auth/utils@0.4.0)(drizzle-orm@1.0.0-beta.22(@opentelemetry/api@1.9.0)(@types/pg@8.20.0)(pg@8.20.0)(zod@4.4.3)) '@better-auth/drizzle-adapter': 1.6.10(@better-auth/core@1.6.10(@better-auth/utils@0.4.0)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0))(@better-auth/utils@0.4.0)(drizzle-orm@1.0.0-beta.22(@opentelemetry/api@1.9.0)(@types/pg@8.20.0)(pg@8.20.0)(zod@4.4.3))