mirror of
https://github.com/FranP-code/Reflecto.git
synced 2025-10-13 00:43:31 +00:00
feat: migrate authentication to Appwrite and remove Better-Auth references
This commit is contained in:
36
README.md
36
README.md
@@ -63,13 +63,29 @@ Reflecto/
|
|||||||
|
|
||||||
## Available Scripts
|
## Available Scripts
|
||||||
|
|
||||||
- `pnpm dev`: Start all applications in development mode
|
|
||||||
- `pnpm build`: Build all applications
|
## Authentication (Appwrite)
|
||||||
- `pnpm dev:web`: Start only the web application
|
|
||||||
- `pnpm dev:server`: Start only the server
|
The project now uses Appwrite Authentication instead of Better-Auth.
|
||||||
- `pnpm check-types`: Check TypeScript types across all apps
|
|
||||||
- `pnpm db:push`: Push schema changes to database
|
Environment variables:
|
||||||
- `pnpm db:studio`: Open database studio UI
|
|
||||||
- `cd apps/web && pnpm generate-pwa-assets`: Generate PWA assets
|
- Server (`apps/server/.env`)
|
||||||
- `cd apps/web && pnpm desktop:dev`: Start Tauri desktop app in development
|
- `APPWRITE_ENDPOINT` — e.g. https://<REGION>.cloud.appwrite.io/v1
|
||||||
- `cd apps/web && pnpm desktop:build`: Build Tauri desktop app
|
- `APPWRITE_PROJECT_ID` — your Appwrite Project ID
|
||||||
|
|
||||||
|
- Web (`apps/web/.env`)
|
||||||
|
- `VITE_APPWRITE_ENDPOINT` — same endpoint as above
|
||||||
|
- `VITE_APPWRITE_PROJECT_ID` — same project id
|
||||||
|
- `VITE_SERVER_URL` — TRPC server URL (e.g. http://localhost:3000)
|
||||||
|
|
||||||
|
How it works:
|
||||||
|
|
||||||
|
- Web uses Appwrite's Account SDK to sign up/in and get the current user.
|
||||||
|
- For server calls, web obtains a short-lived JWT via `account.createJWT()` and sends it as `Authorization: Bearer <jwt>`.
|
||||||
|
- Server initializes an Appwrite Server SDK per request, reads the JWT (or falls back to `a_session_<PROJECT_ID>` cookie), and resolves the user with `account.get()` in TRPC context.
|
||||||
|
- Protected routes remain enforced via `protectedProcedure`.
|
||||||
|
|
||||||
|
Notes:
|
||||||
|
|
||||||
|
- If relying on session cookies from the browser, use a custom domain for Appwrite so cookies are first-party (or enable 3rd-party cookies in local dev).
|
||||||
|
|||||||
@@ -18,21 +18,21 @@
|
|||||||
"db:down": "docker compose down"
|
"db:down": "docker compose down"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"dotenv": "^17.2.1",
|
|
||||||
"zod": "^4.0.2",
|
|
||||||
"@trpc/server": "^11.5.0",
|
|
||||||
"@trpc/client": "^11.5.0",
|
|
||||||
"@hono/trpc-server": "^0.4.0",
|
"@hono/trpc-server": "^0.4.0",
|
||||||
"hono": "^4.8.2",
|
"@trpc/client": "^11.5.0",
|
||||||
|
"@trpc/server": "^11.5.0",
|
||||||
|
"dotenv": "^17.2.1",
|
||||||
"drizzle-orm": "^0.44.2",
|
"drizzle-orm": "^0.44.2",
|
||||||
|
"hono": "^4.8.2",
|
||||||
|
"node-appwrite": "^14.2.0",
|
||||||
"pg": "^8.14.1",
|
"pg": "^8.14.1",
|
||||||
"better-auth": "^1.3.7"
|
"zod": "^4.0.2"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"tsdown": "^0.14.1",
|
|
||||||
"typescript": "^5.8.2",
|
|
||||||
"@types/bun": "^1.2.6",
|
"@types/bun": "^1.2.6",
|
||||||
|
"@types/pg": "^8.11.11",
|
||||||
"drizzle-kit": "^0.31.2",
|
"drizzle-kit": "^0.31.2",
|
||||||
"@types/pg": "^8.11.11"
|
"tsdown": "^0.14.1",
|
||||||
|
"typescript": "^5.8.2"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ import { trpcServer } from "@hono/trpc-server";
|
|||||||
import { Hono } from "hono";
|
import { Hono } from "hono";
|
||||||
import { cors } from "hono/cors";
|
import { cors } from "hono/cors";
|
||||||
import { logger as honoLogger } from "hono/logger";
|
import { logger as honoLogger } from "hono/logger";
|
||||||
import { auth } from "./lib/auth";
|
|
||||||
import { createContext } from "./lib/context";
|
import { createContext } from "./lib/context";
|
||||||
import { logger } from "./lib/logger";
|
import { logger } from "./lib/logger";
|
||||||
import { appRouter } from "./routers/index";
|
import { appRouter } from "./routers/index";
|
||||||
@@ -35,8 +34,6 @@ app.use(
|
|||||||
})
|
})
|
||||||
);
|
);
|
||||||
|
|
||||||
app.on(["POST", "GET"], "/api/auth/**", (c) => auth.handler(c.req.raw));
|
|
||||||
|
|
||||||
app.use(
|
app.use(
|
||||||
"/trpc/*",
|
"/trpc/*",
|
||||||
trpcServer({
|
trpcServer({
|
||||||
|
|||||||
@@ -1,23 +0,0 @@
|
|||||||
import { betterAuth } from "better-auth";
|
|
||||||
import { drizzleAdapter } from "better-auth/adapters/drizzle";
|
|
||||||
import { db } from "../db";
|
|
||||||
import * as schema from "../db/schema/auth";
|
|
||||||
|
|
||||||
export const auth = betterAuth({
|
|
||||||
database: drizzleAdapter(db, {
|
|
||||||
provider: "pg",
|
|
||||||
|
|
||||||
schema,
|
|
||||||
}),
|
|
||||||
trustedOrigins: [process.env.CORS_ORIGIN || ""],
|
|
||||||
emailAndPassword: {
|
|
||||||
enabled: true,
|
|
||||||
},
|
|
||||||
advanced: {
|
|
||||||
defaultCookieAttributes: {
|
|
||||||
sameSite: "none",
|
|
||||||
secure: true,
|
|
||||||
httpOnly: true,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
});
|
|
||||||
@@ -1,17 +1,77 @@
|
|||||||
import type { Context as HonoContext } from "hono";
|
import type { Context as HonoContext } from "hono";
|
||||||
import { auth } from "./auth";
|
import { Account, Client } from "node-appwrite";
|
||||||
|
|
||||||
|
// Hoisted regex for performance and linting
|
||||||
|
const BEARER_REGEX = /^Bearer\s+(.+)$/i;
|
||||||
|
|
||||||
|
// Minimal user shape to avoid leaking node-appwrite model types
|
||||||
|
export type AuthUser = {
|
||||||
|
$id: string;
|
||||||
|
name?: string | null;
|
||||||
|
email?: string | null;
|
||||||
|
} | null;
|
||||||
|
|
||||||
export type CreateContextOptions = {
|
export type CreateContextOptions = {
|
||||||
context: HonoContext;
|
context: HonoContext;
|
||||||
};
|
};
|
||||||
|
|
||||||
export async function createContext({ context }: CreateContextOptions) {
|
export async function createContext({ context }: CreateContextOptions) {
|
||||||
const session = await auth.api.getSession({
|
const endpoint = process.env.APPWRITE_ENDPOINT;
|
||||||
headers: context.req.raw.headers,
|
const projectId = process.env.APPWRITE_PROJECT_ID;
|
||||||
});
|
|
||||||
return {
|
if (!(endpoint && projectId)) {
|
||||||
session,
|
// Appwrite not configured; treat as unauthenticated
|
||||||
};
|
return { user: null as AuthUser };
|
||||||
|
}
|
||||||
|
|
||||||
|
// Initialize client per request
|
||||||
|
const client = new Client().setEndpoint(endpoint).setProject(projectId);
|
||||||
|
|
||||||
|
// Prefer JWT from Authorization header if provided
|
||||||
|
const authHeader = context.req.header("Authorization");
|
||||||
|
const bearer = authHeader?.match(BEARER_REGEX)?.[1];
|
||||||
|
|
||||||
|
if (bearer) {
|
||||||
|
client.setJWT(bearer);
|
||||||
|
} else {
|
||||||
|
// Fallback: Appwrite session cookie from browser
|
||||||
|
// Cookie name format: a_session_<PROJECT_ID>
|
||||||
|
const cookieHeader =
|
||||||
|
context.req.header("Cookie") || context.req.header("cookie");
|
||||||
|
if (cookieHeader) {
|
||||||
|
const cookieName = `a_session_${projectId}`;
|
||||||
|
const cookies = Object.fromEntries(
|
||||||
|
cookieHeader.split("; ").map((c) => {
|
||||||
|
const idx = c.indexOf("=");
|
||||||
|
return idx === -1
|
||||||
|
? [c, ""]
|
||||||
|
: [c.substring(0, idx), decodeURIComponent(c.substring(idx + 1))];
|
||||||
|
})
|
||||||
|
);
|
||||||
|
const session = cookies[cookieName];
|
||||||
|
if (session) {
|
||||||
|
client.setSession(session);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const account = new Account(client);
|
||||||
|
|
||||||
|
try {
|
||||||
|
const user = (await account.get()) as unknown as {
|
||||||
|
$id: string;
|
||||||
|
name?: string | null;
|
||||||
|
email?: string | null;
|
||||||
|
};
|
||||||
|
const minimal: AuthUser = {
|
||||||
|
$id: user.$id,
|
||||||
|
name: user.name ?? null,
|
||||||
|
email: user.email ?? null,
|
||||||
|
};
|
||||||
|
return { user: minimal };
|
||||||
|
} catch {
|
||||||
|
return { user: null as AuthUser };
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export type Context = Awaited<ReturnType<typeof createContext>>;
|
export type Context = Awaited<ReturnType<typeof createContext>>;
|
||||||
|
|||||||
@@ -8,17 +8,17 @@ export const router = t.router;
|
|||||||
export const publicProcedure = t.procedure;
|
export const publicProcedure = t.procedure;
|
||||||
|
|
||||||
export const protectedProcedure = t.procedure.use(({ ctx, next }) => {
|
export const protectedProcedure = t.procedure.use(({ ctx, next }) => {
|
||||||
if (!ctx.session) {
|
if (!ctx.user) {
|
||||||
throw new TRPCError({
|
throw new TRPCError({
|
||||||
code: "UNAUTHORIZED",
|
code: "UNAUTHORIZED",
|
||||||
message: "Authentication required",
|
message: "Authentication required",
|
||||||
cause: "No session",
|
cause: "No user",
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
return next({
|
return next({
|
||||||
ctx: {
|
ctx: {
|
||||||
...ctx,
|
...ctx,
|
||||||
session: ctx.session,
|
user: ctx.user,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ export const appRouter = router({
|
|||||||
privateData: protectedProcedure.query(({ ctx }) => {
|
privateData: protectedProcedure.query(({ ctx }) => {
|
||||||
return {
|
return {
|
||||||
message: "This is private",
|
message: "This is private",
|
||||||
user: ctx.session.user,
|
user: ctx.user,
|
||||||
};
|
};
|
||||||
}),
|
}),
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -16,40 +16,40 @@
|
|||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@hookform/resolvers": "^5.1.1",
|
"@hookform/resolvers": "^5.1.1",
|
||||||
"radix-ui": "^1.4.2",
|
|
||||||
"@tanstack/react-form": "^1.12.3",
|
|
||||||
"@tailwindcss/vite": "^4.0.15",
|
"@tailwindcss/vite": "^4.0.15",
|
||||||
|
"@tanstack/react-form": "^1.12.3",
|
||||||
|
"@tanstack/react-query": "^5.85.5",
|
||||||
"@tanstack/react-router": "^1.114.25",
|
"@tanstack/react-router": "^1.114.25",
|
||||||
|
"@trpc/client": "^11.5.0",
|
||||||
|
"@trpc/server": "^11.5.0",
|
||||||
|
"@trpc/tanstack-react-query": "^11.5.0",
|
||||||
|
"appwrite": "^14.0.1",
|
||||||
"class-variance-authority": "^0.7.1",
|
"class-variance-authority": "^0.7.1",
|
||||||
"clsx": "^2.1.1",
|
"clsx": "^2.1.1",
|
||||||
"lucide-react": "^0.473.0",
|
"lucide-react": "^0.473.0",
|
||||||
"next-themes": "^0.4.6",
|
"next-themes": "^0.4.6",
|
||||||
|
"radix-ui": "^1.4.2",
|
||||||
"react": "^19.0.0",
|
"react": "^19.0.0",
|
||||||
"react-dom": "^19.0.0",
|
"react-dom": "^19.0.0",
|
||||||
"sonner": "^2.0.5",
|
"sonner": "^2.0.5",
|
||||||
"tailwind-merge": "^3.3.1",
|
"tailwind-merge": "^3.3.1",
|
||||||
"tw-animate-css": "^1.2.5",
|
"tw-animate-css": "^1.2.5",
|
||||||
"zod": "^4.0.2",
|
|
||||||
"@trpc/tanstack-react-query": "^11.5.0",
|
|
||||||
"@trpc/client": "^11.5.0",
|
|
||||||
"@trpc/server": "^11.5.0",
|
|
||||||
"@tanstack/react-query": "^5.85.5",
|
|
||||||
"vite-plugin-pwa": "^1.0.1",
|
"vite-plugin-pwa": "^1.0.1",
|
||||||
"better-auth": "^1.3.7"
|
"zod": "^4.0.2"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
"@tanstack/react-query-devtools": "^5.85.5",
|
||||||
"@tanstack/react-router-devtools": "^1.114.27",
|
"@tanstack/react-router-devtools": "^1.114.27",
|
||||||
"@tanstack/router-plugin": "^1.114.27",
|
"@tanstack/router-plugin": "^1.114.27",
|
||||||
|
"@tauri-apps/cli": "^2.4.0",
|
||||||
"@types/node": "^22.13.13",
|
"@types/node": "^22.13.13",
|
||||||
"@types/react": "^19.0.12",
|
"@types/react": "^19.0.12",
|
||||||
"@types/react-dom": "^19.0.4",
|
"@types/react-dom": "^19.0.4",
|
||||||
|
"@vite-pwa/assets-generator": "^1.0.0",
|
||||||
"@vitejs/plugin-react": "^4.3.4",
|
"@vitejs/plugin-react": "^4.3.4",
|
||||||
"postcss": "^8.5.3",
|
"postcss": "^8.5.3",
|
||||||
"typescript": "^5.8.3",
|
|
||||||
"tailwindcss": "^4.0.15",
|
"tailwindcss": "^4.0.15",
|
||||||
"vite": "^6.2.2",
|
"typescript": "^5.8.3",
|
||||||
"@tanstack/react-query-devtools": "^5.85.5",
|
"vite": "^6.2.2"
|
||||||
"@vite-pwa/assets-generator": "^1.0.0",
|
|
||||||
"@tauri-apps/cli": "^2.4.0"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,11 @@
|
|||||||
|
const MIN_PASSWORD_LENGTH = 8;
|
||||||
|
|
||||||
import { useForm } from "@tanstack/react-form";
|
import { useForm } from "@tanstack/react-form";
|
||||||
|
import { useQueryClient } from "@tanstack/react-query";
|
||||||
import { useNavigate } from "@tanstack/react-router";
|
import { useNavigate } from "@tanstack/react-router";
|
||||||
import { toast } from "sonner";
|
import { toast } from "sonner";
|
||||||
import z from "zod";
|
import z from "zod";
|
||||||
import { authClient } from "@/lib/auth-client";
|
import { account, authClient } from "@/lib/auth-client";
|
||||||
import Loader from "./loader";
|
import Loader from "./loader";
|
||||||
import { Button } from "./ui/button";
|
import { Button } from "./ui/button";
|
||||||
import { Input } from "./ui/input";
|
import { Input } from "./ui/input";
|
||||||
@@ -17,6 +20,7 @@ export default function SignInForm({
|
|||||||
from: "/",
|
from: "/",
|
||||||
});
|
});
|
||||||
const { isPending } = authClient.useSession();
|
const { isPending } = authClient.useSession();
|
||||||
|
const queryClient = useQueryClient();
|
||||||
|
|
||||||
const form = useForm({
|
const form = useForm({
|
||||||
defaultValues: {
|
defaultValues: {
|
||||||
@@ -24,28 +28,33 @@ export default function SignInForm({
|
|||||||
password: "",
|
password: "",
|
||||||
},
|
},
|
||||||
onSubmit: async ({ value }) => {
|
onSubmit: async ({ value }) => {
|
||||||
await authClient.signIn.email(
|
try {
|
||||||
{
|
await authClient.signIn.email({
|
||||||
email: value.email,
|
email: value.email,
|
||||||
password: value.password,
|
password: value.password,
|
||||||
},
|
});
|
||||||
{
|
// Hydrate session cache immediately for instant UI update
|
||||||
onSuccess: () => {
|
const me = await account.get();
|
||||||
navigate({
|
queryClient.setQueryData(["session", "me"], me);
|
||||||
to: "/dashboard",
|
// Ensure session state updates immediately in UI
|
||||||
});
|
await queryClient.invalidateQueries({ queryKey: ["session", "me"] });
|
||||||
toast.success("Sign in successful");
|
navigate({ to: "/dashboard" });
|
||||||
},
|
toast.success("Sign in successful");
|
||||||
onError: (error) => {
|
} catch (error) {
|
||||||
toast.error(error.error.message || error.error.statusText);
|
const msg =
|
||||||
},
|
error instanceof Error ? error.message : "Failed to sign in";
|
||||||
}
|
toast.error(msg);
|
||||||
);
|
}
|
||||||
},
|
},
|
||||||
validators: {
|
validators: {
|
||||||
onSubmit: z.object({
|
onSubmit: z.object({
|
||||||
email: z.email("Invalid email address"),
|
email: z.email("Invalid email address"),
|
||||||
password: z.string().min(8, "Password must be at least 8 characters"),
|
password: z
|
||||||
|
.string()
|
||||||
|
.min(
|
||||||
|
MIN_PASSWORD_LENGTH,
|
||||||
|
`Password must be at least ${MIN_PASSWORD_LENGTH} characters`
|
||||||
|
),
|
||||||
}),
|
}),
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,13 +1,16 @@
|
|||||||
import { useForm } from "@tanstack/react-form";
|
import { useForm } from "@tanstack/react-form";
|
||||||
|
import { useQueryClient } from "@tanstack/react-query";
|
||||||
import { useNavigate } from "@tanstack/react-router";
|
import { useNavigate } from "@tanstack/react-router";
|
||||||
import { toast } from "sonner";
|
import { toast } from "sonner";
|
||||||
import z from "zod";
|
import z from "zod";
|
||||||
import { authClient } from "@/lib/auth-client";
|
import { account, authClient } from "@/lib/auth-client";
|
||||||
import Loader from "./loader";
|
import Loader from "./loader";
|
||||||
import { Button } from "./ui/button";
|
import { Button } from "./ui/button";
|
||||||
import { Input } from "./ui/input";
|
import { Input } from "./ui/input";
|
||||||
import { Label } from "./ui/label";
|
import { Label } from "./ui/label";
|
||||||
|
|
||||||
|
const MIN_PASSWORD_LENGTH = 8;
|
||||||
|
|
||||||
export default function SignUpForm({
|
export default function SignUpForm({
|
||||||
onSwitchToSignIn,
|
onSwitchToSignIn,
|
||||||
}: {
|
}: {
|
||||||
@@ -17,6 +20,7 @@ export default function SignUpForm({
|
|||||||
from: "/",
|
from: "/",
|
||||||
});
|
});
|
||||||
const { isPending } = authClient.useSession();
|
const { isPending } = authClient.useSession();
|
||||||
|
const queryClient = useQueryClient();
|
||||||
|
|
||||||
const form = useForm({
|
const form = useForm({
|
||||||
defaultValues: {
|
defaultValues: {
|
||||||
@@ -25,30 +29,34 @@ export default function SignUpForm({
|
|||||||
name: "",
|
name: "",
|
||||||
},
|
},
|
||||||
onSubmit: async ({ value }) => {
|
onSubmit: async ({ value }) => {
|
||||||
await authClient.signUp.email(
|
try {
|
||||||
{
|
await authClient.signUp.email({
|
||||||
email: value.email,
|
email: value.email,
|
||||||
password: value.password,
|
password: value.password,
|
||||||
name: value.name,
|
name: value.name,
|
||||||
},
|
});
|
||||||
{
|
// Hydrate session cache immediately and invalidate for freshness
|
||||||
onSuccess: () => {
|
const me = await account.get();
|
||||||
navigate({
|
queryClient.setQueryData(["session", "me"], me);
|
||||||
to: "/dashboard",
|
await queryClient.invalidateQueries({ queryKey: ["session", "me"] });
|
||||||
});
|
navigate({ to: "/dashboard" });
|
||||||
toast.success("Sign up successful");
|
toast.success("Sign up successful");
|
||||||
},
|
} catch (error) {
|
||||||
onError: (error) => {
|
const msg =
|
||||||
toast.error(error.error.message || error.error.statusText);
|
error instanceof Error ? error.message : "Failed to sign up";
|
||||||
},
|
toast.error(msg);
|
||||||
}
|
}
|
||||||
);
|
|
||||||
},
|
},
|
||||||
validators: {
|
validators: {
|
||||||
onSubmit: z.object({
|
onSubmit: z.object({
|
||||||
name: z.string().min(2, "Name must be at least 2 characters"),
|
name: z.string().min(2, "Name must be at least 2 characters"),
|
||||||
email: z.email("Invalid email address"),
|
email: z.email("Invalid email address"),
|
||||||
password: z.string().min(8, "Password must be at least 8 characters"),
|
password: z
|
||||||
|
.string()
|
||||||
|
.min(
|
||||||
|
MIN_PASSWORD_LENGTH,
|
||||||
|
`Password must be at least ${MIN_PASSWORD_LENGTH} characters`
|
||||||
|
),
|
||||||
}),
|
}),
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
import { useQueryClient } from "@tanstack/react-query";
|
||||||
import { Link, useNavigate } from "@tanstack/react-router";
|
import { Link, useNavigate } from "@tanstack/react-router";
|
||||||
import {
|
import {
|
||||||
DropdownMenu,
|
DropdownMenu,
|
||||||
@@ -13,6 +14,7 @@ import { Skeleton } from "./ui/skeleton";
|
|||||||
|
|
||||||
export default function UserMenu() {
|
export default function UserMenu() {
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
|
const queryClient = useQueryClient();
|
||||||
const { data: session, isPending } = authClient.useSession();
|
const { data: session, isPending } = authClient.useSession();
|
||||||
|
|
||||||
if (isPending) {
|
if (isPending) {
|
||||||
@@ -30,25 +32,23 @@ export default function UserMenu() {
|
|||||||
return (
|
return (
|
||||||
<DropdownMenu>
|
<DropdownMenu>
|
||||||
<DropdownMenuTrigger asChild>
|
<DropdownMenuTrigger asChild>
|
||||||
<Button variant="outline">{session.user.name}</Button>
|
<Button variant="outline">{session.name ?? session.email}</Button>
|
||||||
</DropdownMenuTrigger>
|
</DropdownMenuTrigger>
|
||||||
<DropdownMenuContent className="bg-card">
|
<DropdownMenuContent className="bg-card">
|
||||||
<DropdownMenuLabel>My Account</DropdownMenuLabel>
|
<DropdownMenuLabel>My Account</DropdownMenuLabel>
|
||||||
<DropdownMenuSeparator />
|
<DropdownMenuSeparator />
|
||||||
<DropdownMenuItem>{session.user.email}</DropdownMenuItem>
|
<DropdownMenuItem>{session.email}</DropdownMenuItem>
|
||||||
<DropdownMenuItem asChild>
|
<DropdownMenuItem asChild>
|
||||||
<Button
|
<Button
|
||||||
className="w-full"
|
className="w-full"
|
||||||
onClick={() => {
|
onClick={async () => {
|
||||||
authClient.signOut({
|
await authClient.signOut();
|
||||||
fetchOptions: {
|
// Immediately reflect logout in UI
|
||||||
onSuccess: () => {
|
queryClient.setQueryData(["session", "me"], null);
|
||||||
navigate({
|
await queryClient.invalidateQueries({
|
||||||
to: "/",
|
queryKey: ["session", "me"],
|
||||||
});
|
|
||||||
},
|
|
||||||
},
|
|
||||||
});
|
});
|
||||||
|
navigate({ to: "/" });
|
||||||
}}
|
}}
|
||||||
variant="destructive"
|
variant="destructive"
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -1,5 +1,67 @@
|
|||||||
import { createAuthClient } from "better-auth/react";
|
import { useQuery } from "@tanstack/react-query";
|
||||||
|
import type { Models } from "appwrite";
|
||||||
|
import { Account, Client, ID } from "appwrite";
|
||||||
|
|
||||||
export const authClient = createAuthClient({
|
// Initialize Appwrite web client
|
||||||
baseURL: import.meta.env.VITE_SERVER_URL,
|
export const appwriteClient = new Client()
|
||||||
});
|
.setEndpoint(import.meta.env.VITE_APPWRITE_ENDPOINT)
|
||||||
|
.setProject(import.meta.env.VITE_APPWRITE_PROJECT_ID);
|
||||||
|
|
||||||
|
export const account = new Account(appwriteClient);
|
||||||
|
|
||||||
|
// Simple session hook using React Query
|
||||||
|
export function useSession() {
|
||||||
|
return useQuery({
|
||||||
|
queryKey: ["session", "me"],
|
||||||
|
queryFn: async () => {
|
||||||
|
try {
|
||||||
|
const me = await account.get();
|
||||||
|
return me as Models.User<Models.Preferences>;
|
||||||
|
} catch {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
staleTime: 30_000,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sign up, sign in, sign out helpers
|
||||||
|
export const authClient = {
|
||||||
|
useSession,
|
||||||
|
signUp: {
|
||||||
|
email: async ({
|
||||||
|
email,
|
||||||
|
password,
|
||||||
|
name,
|
||||||
|
}: {
|
||||||
|
email: string;
|
||||||
|
password: string;
|
||||||
|
name?: string;
|
||||||
|
}) => {
|
||||||
|
await account.create(ID.unique(), email, password, name);
|
||||||
|
// Immediately create session after sign up
|
||||||
|
await account.createEmailPasswordSession(email, password);
|
||||||
|
},
|
||||||
|
},
|
||||||
|
signIn: {
|
||||||
|
email: async ({ email, password }: { email: string; password: string }) => {
|
||||||
|
await account.createEmailPasswordSession(email, password);
|
||||||
|
},
|
||||||
|
},
|
||||||
|
signOut: async () => {
|
||||||
|
try {
|
||||||
|
await account.deleteSessions();
|
||||||
|
} catch {
|
||||||
|
// ignore
|
||||||
|
}
|
||||||
|
},
|
||||||
|
// Get a short-lived JWT for server-side calls (15 min)
|
||||||
|
getJWT: async (): Promise<string | null> => {
|
||||||
|
try {
|
||||||
|
const jwt = await account.createJWT();
|
||||||
|
return jwt.jwt ?? null;
|
||||||
|
} catch {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ function RouteComponent() {
|
|||||||
to: "/login",
|
to: "/login",
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}, [session, isPending]);
|
}, [session, isPending, navigate]);
|
||||||
|
|
||||||
if (isPending) {
|
if (isPending) {
|
||||||
return <div>Loading...</div>;
|
return <div>Loading...</div>;
|
||||||
@@ -30,7 +30,7 @@ function RouteComponent() {
|
|||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
<h1>Dashboard</h1>
|
<h1>Dashboard</h1>
|
||||||
<p>Welcome {session?.user.name}</p>
|
<p>Welcome {session?.name ?? session?.email}</p>
|
||||||
<p>privateData: {privateData.data?.message}</p>
|
<p>privateData: {privateData.data?.message}</p>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ import { QueryCache, QueryClient } from "@tanstack/react-query";
|
|||||||
import { createTRPCClient, httpBatchLink } from "@trpc/client";
|
import { createTRPCClient, httpBatchLink } from "@trpc/client";
|
||||||
import { createTRPCOptionsProxy } from "@trpc/tanstack-react-query";
|
import { createTRPCOptionsProxy } from "@trpc/tanstack-react-query";
|
||||||
import { toast } from "sonner";
|
import { toast } from "sonner";
|
||||||
|
import { authClient } from "@/lib/auth-client";
|
||||||
import type { AppRouter } from "../../../server/src/routers";
|
import type { AppRouter } from "../../../server/src/routers";
|
||||||
|
|
||||||
export const queryClient = new QueryClient({
|
export const queryClient = new QueryClient({
|
||||||
@@ -23,9 +24,15 @@ export const trpcClient = createTRPCClient<AppRouter>({
|
|||||||
links: [
|
links: [
|
||||||
httpBatchLink({
|
httpBatchLink({
|
||||||
url: `${import.meta.env.VITE_SERVER_URL}/trpc`,
|
url: `${import.meta.env.VITE_SERVER_URL}/trpc`,
|
||||||
fetch(url, options) {
|
async fetch(url, options) {
|
||||||
|
const jwt = await authClient.getJWT();
|
||||||
|
const headers = new Headers(options?.headers);
|
||||||
|
if (jwt) {
|
||||||
|
headers.set("Authorization", `Bearer ${jwt}`);
|
||||||
|
}
|
||||||
return fetch(url, {
|
return fetch(url, {
|
||||||
...options,
|
...options,
|
||||||
|
headers,
|
||||||
credentials: "include",
|
credentials: "include",
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|||||||
319
pnpm-lock.yaml
generated
319
pnpm-lock.yaml
generated
@@ -35,9 +35,6 @@ importers:
|
|||||||
'@trpc/server':
|
'@trpc/server':
|
||||||
specifier: ^11.5.0
|
specifier: ^11.5.0
|
||||||
version: 11.5.0(typescript@5.9.2)
|
version: 11.5.0(typescript@5.9.2)
|
||||||
better-auth:
|
|
||||||
specifier: ^1.3.7
|
|
||||||
version: 1.3.7(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(zod@4.1.5)
|
|
||||||
dotenv:
|
dotenv:
|
||||||
specifier: ^17.2.1
|
specifier: ^17.2.1
|
||||||
version: 17.2.2
|
version: 17.2.2
|
||||||
@@ -47,6 +44,9 @@ importers:
|
|||||||
hono:
|
hono:
|
||||||
specifier: ^4.8.2
|
specifier: ^4.8.2
|
||||||
version: 4.9.6
|
version: 4.9.6
|
||||||
|
node-appwrite:
|
||||||
|
specifier: ^14.2.0
|
||||||
|
version: 14.2.0
|
||||||
pg:
|
pg:
|
||||||
specifier: ^8.14.1
|
specifier: ^8.14.1
|
||||||
version: 8.16.3
|
version: 8.16.3
|
||||||
@@ -96,9 +96,9 @@ importers:
|
|||||||
'@trpc/tanstack-react-query':
|
'@trpc/tanstack-react-query':
|
||||||
specifier: ^11.5.0
|
specifier: ^11.5.0
|
||||||
version: 11.5.0(@tanstack/react-query@5.85.9(react@19.1.1))(@trpc/client@11.5.0(@trpc/server@11.5.0(typescript@5.9.2))(typescript@5.9.2))(@trpc/server@11.5.0(typescript@5.9.2))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2)
|
version: 11.5.0(@tanstack/react-query@5.85.9(react@19.1.1))(@trpc/client@11.5.0(@trpc/server@11.5.0(typescript@5.9.2))(typescript@5.9.2))(@trpc/server@11.5.0(typescript@5.9.2))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2)
|
||||||
better-auth:
|
appwrite:
|
||||||
specifier: ^1.3.7
|
specifier: ^14.0.1
|
||||||
version: 1.3.7(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(zod@4.1.5)
|
version: 14.0.1
|
||||||
class-variance-authority:
|
class-variance-authority:
|
||||||
specifier: ^0.7.1
|
specifier: ^0.7.1
|
||||||
version: 0.7.1
|
version: 0.7.1
|
||||||
@@ -719,12 +719,6 @@ packages:
|
|||||||
resolution: {integrity: sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==}
|
resolution: {integrity: sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==}
|
||||||
engines: {node: '>=6.9.0'}
|
engines: {node: '>=6.9.0'}
|
||||||
|
|
||||||
'@better-auth/utils@0.2.6':
|
|
||||||
resolution: {integrity: sha512-3y/vaL5Ox33dBwgJ6ub3OPkVqr6B5xL2kgxNHG8eHZuryLyG/4JSPGqjbdRSgjuy9kALUZYDFl+ORIAxlWMSuA==}
|
|
||||||
|
|
||||||
'@better-fetch/fetch@1.1.18':
|
|
||||||
resolution: {integrity: sha512-rEFOE1MYIsBmoMJtQbl32PGHHXuG2hDxvEd7rUHE0vCBoFQVSDqaVs9hkZEtHCxRoY+CljXKFCOuJ8uxqw1LcA==}
|
|
||||||
|
|
||||||
'@biomejs/biome@2.2.2':
|
'@biomejs/biome@2.2.2':
|
||||||
resolution: {integrity: sha512-j1omAiQWCkhuLgwpMKisNKnsM6W8Xtt1l0WZmqY/dFj8QPNkIoTvk4tSsi40FaAAkBE1PU0AFG2RWFBWenAn+w==}
|
resolution: {integrity: sha512-j1omAiQWCkhuLgwpMKisNKnsM6W8Xtt1l0WZmqY/dFj8QPNkIoTvk4tSsi40FaAAkBE1PU0AFG2RWFBWenAn+w==}
|
||||||
engines: {node: '>=14.21.3'}
|
engines: {node: '>=14.21.3'}
|
||||||
@@ -1110,9 +1104,6 @@ packages:
|
|||||||
'@floating-ui/utils@0.2.10':
|
'@floating-ui/utils@0.2.10':
|
||||||
resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==}
|
resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==}
|
||||||
|
|
||||||
'@hexagon/base64@1.1.28':
|
|
||||||
resolution: {integrity: sha512-lhqDEAvWixy3bZ+UOYbPwUbBkwBq5C1LAJ/xPC8Oi+lL54oyakv/npbA0aU2hgCsx/1NUd4IBvV03+aUBWxerw==}
|
|
||||||
|
|
||||||
'@hono/trpc-server@0.4.0':
|
'@hono/trpc-server@0.4.0':
|
||||||
resolution: {integrity: sha512-LGlJfCmNIGMwcknZEIYdujVMs9OkNVazhpOhaz3kTWOXvNL660VOHpvvktosCiJrajyBY1RtIJKQ+IKaQvNuSg==}
|
resolution: {integrity: sha512-LGlJfCmNIGMwcknZEIYdujVMs9OkNVazhpOhaz3kTWOXvNL660VOHpvvktosCiJrajyBY1RtIJKQ+IKaQvNuSg==}
|
||||||
engines: {node: '>=16.0.0'}
|
engines: {node: '>=16.0.0'}
|
||||||
@@ -1253,19 +1244,9 @@ packages:
|
|||||||
'@jridgewell/trace-mapping@0.3.30':
|
'@jridgewell/trace-mapping@0.3.30':
|
||||||
resolution: {integrity: sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==}
|
resolution: {integrity: sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==}
|
||||||
|
|
||||||
'@levischuck/tiny-cbor@0.2.11':
|
|
||||||
resolution: {integrity: sha512-llBRm4dT4Z89aRsm6u2oEZ8tfwL/2l6BwpZ7JcyieouniDECM5AqNgr/y08zalEIvW3RSK4upYyybDcmjXqAow==}
|
|
||||||
|
|
||||||
'@napi-rs/wasm-runtime@1.0.3':
|
'@napi-rs/wasm-runtime@1.0.3':
|
||||||
resolution: {integrity: sha512-rZxtMsLwjdXkMUGC3WwsPwLNVqVqnTJT6MNIB6e+5fhMcSCPP0AOsNWuMQ5mdCq6HNjs/ZeWAEchpqeprqBD2Q==}
|
resolution: {integrity: sha512-rZxtMsLwjdXkMUGC3WwsPwLNVqVqnTJT6MNIB6e+5fhMcSCPP0AOsNWuMQ5mdCq6HNjs/ZeWAEchpqeprqBD2Q==}
|
||||||
|
|
||||||
'@noble/ciphers@0.6.0':
|
|
||||||
resolution: {integrity: sha512-mIbq/R9QXk5/cTfESb1OKtyFnk7oc1Om/8onA1158K9/OZUQFDEVy55jVTato+xmp3XX6F6Qh0zz0Nc1AxAlRQ==}
|
|
||||||
|
|
||||||
'@noble/hashes@1.8.0':
|
|
||||||
resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==}
|
|
||||||
engines: {node: ^14.21.3 || >=16}
|
|
||||||
|
|
||||||
'@oxc-project/runtime@0.82.3':
|
'@oxc-project/runtime@0.82.3':
|
||||||
resolution: {integrity: sha512-LNh5GlJvYHAnMurO+EyA8jJwN1rki7l3PSHuosDh2I7h00T6/u9rCkUjg/SvPmT1CZzvhuW0y+gf7jcqUy/Usg==}
|
resolution: {integrity: sha512-LNh5GlJvYHAnMurO+EyA8jJwN1rki7l3PSHuosDh2I7h00T6/u9rCkUjg/SvPmT1CZzvhuW0y+gf7jcqUy/Usg==}
|
||||||
engines: {node: '>=6.9.0'}
|
engines: {node: '>=6.9.0'}
|
||||||
@@ -1273,21 +1254,6 @@ packages:
|
|||||||
'@oxc-project/types@0.82.3':
|
'@oxc-project/types@0.82.3':
|
||||||
resolution: {integrity: sha512-6nCUxBnGX0c6qfZW5MaF6/fmu5dHJDMiMPaioKHKs5mi5+8/FHQ7WGjgQIz1zxpmceMYfdIXkOaLYE+ejbuOtA==}
|
resolution: {integrity: sha512-6nCUxBnGX0c6qfZW5MaF6/fmu5dHJDMiMPaioKHKs5mi5+8/FHQ7WGjgQIz1zxpmceMYfdIXkOaLYE+ejbuOtA==}
|
||||||
|
|
||||||
'@peculiar/asn1-android@2.4.0':
|
|
||||||
resolution: {integrity: sha512-YFueREq97CLslZZBI8dKzis7jMfEHSLxM+nr0Zdx1POiXFLjqqwoY5s0F1UimdBiEw/iKlHey2m56MRDv7Jtyg==}
|
|
||||||
|
|
||||||
'@peculiar/asn1-ecc@2.4.0':
|
|
||||||
resolution: {integrity: sha512-fJiYUBCJBDkjh347zZe5H81BdJ0+OGIg0X9z06v8xXUoql3MFeENUX0JsjCaVaU9A0L85PefLPGYkIoGpTnXLQ==}
|
|
||||||
|
|
||||||
'@peculiar/asn1-rsa@2.4.0':
|
|
||||||
resolution: {integrity: sha512-6PP75voaEnOSlWR9sD25iCQyLgFZHXbmxvUfnnDcfL6Zh5h2iHW38+bve4LfH7a60x7fkhZZNmiYqAlAff9Img==}
|
|
||||||
|
|
||||||
'@peculiar/asn1-schema@2.4.0':
|
|
||||||
resolution: {integrity: sha512-umbembjIWOrPSOzEGG5vxFLkeM8kzIhLkgigtsOrfLKnuzxWxejAcUX+q/SoZCdemlODOcr5WiYa7+dIEzBXZQ==}
|
|
||||||
|
|
||||||
'@peculiar/asn1-x509@2.4.0':
|
|
||||||
resolution: {integrity: sha512-F7mIZY2Eao2TaoVqigGMLv+NDdpwuBKU1fucHPONfzaBS4JXXCNCmfO0Z3dsy7JzKGqtDcYC1mr9JjaZQZNiuw==}
|
|
||||||
|
|
||||||
'@quansync/fs@0.1.5':
|
'@quansync/fs@0.1.5':
|
||||||
resolution: {integrity: sha512-lNS9hL2aS2NZgNW7BBj+6EBl4rOf8l+tQ0eRY6JWCI8jI2kc53gSoqbjojU0OnAWhzoXiOjFyGsHcDGePB3lhA==}
|
resolution: {integrity: sha512-lNS9hL2aS2NZgNW7BBj+6EBl4rOf8l+tQ0eRY6JWCI8jI2kc53gSoqbjojU0OnAWhzoXiOjFyGsHcDGePB3lhA==}
|
||||||
|
|
||||||
@@ -2211,13 +2177,6 @@ packages:
|
|||||||
cpu: [x64]
|
cpu: [x64]
|
||||||
os: [win32]
|
os: [win32]
|
||||||
|
|
||||||
'@simplewebauthn/browser@13.1.2':
|
|
||||||
resolution: {integrity: sha512-aZnW0KawAM83fSBUgglP5WofbrLbLyr7CoPqYr66Eppm7zO86YX6rrCjRB3hQKPrL7ATvY4FVXlykZ6w6FwYYw==}
|
|
||||||
|
|
||||||
'@simplewebauthn/server@13.1.2':
|
|
||||||
resolution: {integrity: sha512-VwoDfvLXSCaRiD+xCIuyslU0HLxVggeE5BL06+GbsP2l1fGf5op8e0c3ZtKoi+vSg1q4ikjtAghC23ze2Q3H9g==}
|
|
||||||
engines: {node: '>=20.0.0'}
|
|
||||||
|
|
||||||
'@standard-schema/utils@0.3.0':
|
'@standard-schema/utils@0.3.0':
|
||||||
resolution: {integrity: sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==}
|
resolution: {integrity: sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==}
|
||||||
|
|
||||||
@@ -2633,6 +2592,9 @@ packages:
|
|||||||
resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
|
resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
|
||||||
engines: {node: '>= 8'}
|
engines: {node: '>= 8'}
|
||||||
|
|
||||||
|
appwrite@14.0.1:
|
||||||
|
resolution: {integrity: sha512-ORlvfqVif/2K3qKGgGiGfMP33Zwm+xxB1fIC4Lm3sojOkDd8u8YvgKQO0Meq5UXb8Dc0Rl66Z7qlGBAfRQ04bA==}
|
||||||
|
|
||||||
aria-hidden@1.2.6:
|
aria-hidden@1.2.6:
|
||||||
resolution: {integrity: sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==}
|
resolution: {integrity: sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==}
|
||||||
engines: {node: '>=10'}
|
engines: {node: '>=10'}
|
||||||
@@ -2645,10 +2607,6 @@ packages:
|
|||||||
resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==}
|
resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==}
|
||||||
engines: {node: '>= 0.4'}
|
engines: {node: '>= 0.4'}
|
||||||
|
|
||||||
asn1js@3.0.6:
|
|
||||||
resolution: {integrity: sha512-UOCGPYbl0tv8+006qks/dTgV9ajs97X2p0FAbyS2iyCRrmLSRolDaHdp+v/CLgnzHc3fVB+CwYiUmei7ndFcgA==}
|
|
||||||
engines: {node: '>=12.0.0'}
|
|
||||||
|
|
||||||
assertion-error@2.0.1:
|
assertion-error@2.0.1:
|
||||||
resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==}
|
resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==}
|
||||||
engines: {node: '>=12'}
|
engines: {node: '>=12'}
|
||||||
@@ -2668,6 +2626,9 @@ packages:
|
|||||||
async@3.2.6:
|
async@3.2.6:
|
||||||
resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==}
|
resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==}
|
||||||
|
|
||||||
|
asynckit@0.4.0:
|
||||||
|
resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
|
||||||
|
|
||||||
at-least-node@1.0.0:
|
at-least-node@1.0.0:
|
||||||
resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==}
|
resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==}
|
||||||
engines: {node: '>= 4.0.0'}
|
engines: {node: '>= 4.0.0'}
|
||||||
@@ -2697,21 +2658,6 @@ packages:
|
|||||||
balanced-match@1.0.2:
|
balanced-match@1.0.2:
|
||||||
resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
|
resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
|
||||||
|
|
||||||
better-auth@1.3.7:
|
|
||||||
resolution: {integrity: sha512-/1fEyx2SGgJQM5ujozDCh9eJksnVkNU/J7Fk/tG5Y390l8nKbrPvqiFlCjlMM+scR+UABJbQzA6An7HT50LHyQ==}
|
|
||||||
peerDependencies:
|
|
||||||
react: ^18.0.0 || ^19.0.0
|
|
||||||
react-dom: ^18.0.0 || ^19.0.0
|
|
||||||
zod: ^3.25.0 || ^4.0.0
|
|
||||||
peerDependenciesMeta:
|
|
||||||
react:
|
|
||||||
optional: true
|
|
||||||
react-dom:
|
|
||||||
optional: true
|
|
||||||
|
|
||||||
better-call@1.0.16:
|
|
||||||
resolution: {integrity: sha512-42dgJ1rOtc0anOoxjXPOWuel/Z/4aeO7EJ2SiXNwvlkySSgjXhNjAjTMWa8DL1nt6EXS3jl3VKC3mPsU/lUgVA==}
|
|
||||||
|
|
||||||
binary-extensions@2.3.0:
|
binary-extensions@2.3.0:
|
||||||
resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==}
|
resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==}
|
||||||
engines: {node: '>=8'}
|
engines: {node: '>=8'}
|
||||||
@@ -2820,6 +2766,10 @@ packages:
|
|||||||
colorette@2.0.20:
|
colorette@2.0.20:
|
||||||
resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==}
|
resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==}
|
||||||
|
|
||||||
|
combined-stream@1.0.8:
|
||||||
|
resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==}
|
||||||
|
engines: {node: '>= 0.8'}
|
||||||
|
|
||||||
commander@14.0.0:
|
commander@14.0.0:
|
||||||
resolution: {integrity: sha512-2uM9rYjPvyq39NwLRqaiLtWHyDC1FvryJDa2ATTVims5YAS4PupsEQsDvP14FqhFr0P49CYDugi59xaxJlTXRA==}
|
resolution: {integrity: sha512-2uM9rYjPvyq39NwLRqaiLtWHyDC1FvryJDa2ATTVims5YAS4PupsEQsDvP14FqhFr0P49CYDugi59xaxJlTXRA==}
|
||||||
engines: {node: '>=20'}
|
engines: {node: '>=20'}
|
||||||
@@ -2850,6 +2800,9 @@ packages:
|
|||||||
core-js-compat@3.45.1:
|
core-js-compat@3.45.1:
|
||||||
resolution: {integrity: sha512-tqTt5T4PzsMIZ430XGviK4vzYSoeNJ6CXODi6c/voxOT6IZqBht5/EKaSNnYiEjjRYxjVz7DQIsOsY0XNi8PIA==}
|
resolution: {integrity: sha512-tqTt5T4PzsMIZ430XGviK4vzYSoeNJ6CXODi6c/voxOT6IZqBht5/EKaSNnYiEjjRYxjVz7DQIsOsY0XNi8PIA==}
|
||||||
|
|
||||||
|
cross-fetch@3.1.5:
|
||||||
|
resolution: {integrity: sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==}
|
||||||
|
|
||||||
crypto-random-string@2.0.0:
|
crypto-random-string@2.0.0:
|
||||||
resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==}
|
resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==}
|
||||||
engines: {node: '>=8'}
|
engines: {node: '>=8'}
|
||||||
@@ -2908,6 +2861,10 @@ packages:
|
|||||||
defu@6.1.4:
|
defu@6.1.4:
|
||||||
resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==}
|
resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==}
|
||||||
|
|
||||||
|
delayed-stream@1.0.0:
|
||||||
|
resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
|
||||||
|
engines: {node: '>=0.4.0'}
|
||||||
|
|
||||||
detect-libc@2.0.4:
|
detect-libc@2.0.4:
|
||||||
resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==}
|
resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==}
|
||||||
engines: {node: '>=8'}
|
engines: {node: '>=8'}
|
||||||
@@ -3161,6 +3118,10 @@ packages:
|
|||||||
resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==}
|
resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==}
|
||||||
engines: {node: '>= 0.4'}
|
engines: {node: '>= 0.4'}
|
||||||
|
|
||||||
|
form-data@2.5.5:
|
||||||
|
resolution: {integrity: sha512-jqdObeR2rxZZbPSGL+3VckHMYtu+f9//KXBsVny6JSX/pa38Fy+bGjuG8eW/H6USNQWhLi8Num++cU2yOCNz4A==}
|
||||||
|
engines: {node: '>= 0.12'}
|
||||||
|
|
||||||
fs-extra@9.1.0:
|
fs-extra@9.1.0:
|
||||||
resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==}
|
resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==}
|
||||||
engines: {node: '>=10'}
|
engines: {node: '>=10'}
|
||||||
@@ -3426,6 +3387,9 @@ packages:
|
|||||||
resolution: {integrity: sha512-3wVJEonAns1OETX83uWsk5IAne2S5zfDcntD2hbtU23LelSqNXzXs9zKjMPOLMzroCgIjCfjYAEHrd2D6FOkiA==}
|
resolution: {integrity: sha512-3wVJEonAns1OETX83uWsk5IAne2S5zfDcntD2hbtU23LelSqNXzXs9zKjMPOLMzroCgIjCfjYAEHrd2D6FOkiA==}
|
||||||
engines: {node: '>=18'}
|
engines: {node: '>=18'}
|
||||||
|
|
||||||
|
isomorphic-form-data@2.0.0:
|
||||||
|
resolution: {integrity: sha512-TYgVnXWeESVmQSg4GLVbalmQ+B4NPi/H4eWxqALKj63KsUrcu301YDjBqaOw3h+cbak7Na4Xyps3BiptHtxTfg==}
|
||||||
|
|
||||||
jake@10.9.4:
|
jake@10.9.4:
|
||||||
resolution: {integrity: sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==}
|
resolution: {integrity: sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==}
|
||||||
engines: {node: '>=10'}
|
engines: {node: '>=10'}
|
||||||
@@ -3435,9 +3399,6 @@ packages:
|
|||||||
resolution: {integrity: sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w==}
|
resolution: {integrity: sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w==}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
|
|
||||||
jose@5.10.0:
|
|
||||||
resolution: {integrity: sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg==}
|
|
||||||
|
|
||||||
js-tokens@4.0.0:
|
js-tokens@4.0.0:
|
||||||
resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
|
resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
|
||||||
|
|
||||||
@@ -3598,6 +3559,14 @@ packages:
|
|||||||
resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==}
|
resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==}
|
||||||
engines: {node: '>=8.6'}
|
engines: {node: '>=8.6'}
|
||||||
|
|
||||||
|
mime-db@1.52.0:
|
||||||
|
resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
|
||||||
|
engines: {node: '>= 0.6'}
|
||||||
|
|
||||||
|
mime-types@2.1.35:
|
||||||
|
resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
|
||||||
|
engines: {node: '>= 0.6'}
|
||||||
|
|
||||||
mimic-function@5.0.1:
|
mimic-function@5.0.1:
|
||||||
resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==}
|
resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==}
|
||||||
engines: {node: '>=18'}
|
engines: {node: '>=18'}
|
||||||
@@ -3634,16 +3603,27 @@ packages:
|
|||||||
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
|
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
|
|
||||||
nanostores@0.11.4:
|
|
||||||
resolution: {integrity: sha512-k1oiVNN4hDK8NcNERSZLQiMfRzEGtfnvZvdBvey3SQbgn8Dcrk0h1I6vpxApjb10PFUflZrgJ2WEZyJQ+5v7YQ==}
|
|
||||||
engines: {node: ^18.0.0 || >=20.0.0}
|
|
||||||
|
|
||||||
next-themes@0.4.6:
|
next-themes@0.4.6:
|
||||||
resolution: {integrity: sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA==}
|
resolution: {integrity: sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA==}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
react: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc
|
react: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc
|
||||||
react-dom: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc
|
react-dom: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc
|
||||||
|
|
||||||
|
node-appwrite@14.2.0:
|
||||||
|
resolution: {integrity: sha512-sPPA+JzdBJRS+lM6azX85y3/6iyKQYlHcXCbjMuWLROh6IiU9EfXRW3XSUTa5HDoBrlo8ve+AnVA6BIjQfUs1g==}
|
||||||
|
|
||||||
|
node-fetch-native-with-agent@1.7.2:
|
||||||
|
resolution: {integrity: sha512-5MaOOCuJEvcckoz7/tjdx1M6OusOY6Xc5f459IaruGStWnKzlI1qpNgaAwmn4LmFYcsSlj+jBMk84wmmRxfk5g==}
|
||||||
|
|
||||||
|
node-fetch@2.6.7:
|
||||||
|
resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==}
|
||||||
|
engines: {node: 4.x || >=6.0.0}
|
||||||
|
peerDependencies:
|
||||||
|
encoding: ^0.1.0
|
||||||
|
peerDependenciesMeta:
|
||||||
|
encoding:
|
||||||
|
optional: true
|
||||||
|
|
||||||
node-releases@2.0.19:
|
node-releases@2.0.19:
|
||||||
resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==}
|
resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==}
|
||||||
|
|
||||||
@@ -3787,13 +3767,6 @@ packages:
|
|||||||
resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
|
resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
|
||||||
engines: {node: '>=6'}
|
engines: {node: '>=6'}
|
||||||
|
|
||||||
pvtsutils@1.3.6:
|
|
||||||
resolution: {integrity: sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==}
|
|
||||||
|
|
||||||
pvutils@1.1.3:
|
|
||||||
resolution: {integrity: sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ==}
|
|
||||||
engines: {node: '>=6.0.0'}
|
|
||||||
|
|
||||||
quansync@0.2.11:
|
quansync@0.2.11:
|
||||||
resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==}
|
resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==}
|
||||||
|
|
||||||
@@ -3949,9 +3922,6 @@ packages:
|
|||||||
engines: {node: '>=18.0.0', npm: '>=8.0.0'}
|
engines: {node: '>=18.0.0', npm: '>=8.0.0'}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
|
|
||||||
rou3@0.5.1:
|
|
||||||
resolution: {integrity: sha512-OXMmJ3zRk2xeXFGfA3K+EOPHC5u7RDFG7lIOx0X1pdnhUkI8MdVrbV+sNsD80ElpUZ+MRHdyxPnFthq9VHs8uQ==}
|
|
||||||
|
|
||||||
safe-array-concat@1.1.3:
|
safe-array-concat@1.1.3:
|
||||||
resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==}
|
resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==}
|
||||||
engines: {node: '>=0.4'}
|
engines: {node: '>=0.4'}
|
||||||
@@ -3992,9 +3962,6 @@ packages:
|
|||||||
resolution: {integrity: sha512-RbcPH1n5cfwKrru7v7+zrZvjLurgHhGyso3HTyGtRivGWgYjbOmGuivCQaORNELjNONoK35nj28EoWul9sb1zQ==}
|
resolution: {integrity: sha512-RbcPH1n5cfwKrru7v7+zrZvjLurgHhGyso3HTyGtRivGWgYjbOmGuivCQaORNELjNONoK35nj28EoWul9sb1zQ==}
|
||||||
engines: {node: '>=10'}
|
engines: {node: '>=10'}
|
||||||
|
|
||||||
set-cookie-parser@2.7.1:
|
|
||||||
resolution: {integrity: sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==}
|
|
||||||
|
|
||||||
set-function-length@1.2.2:
|
set-function-length@1.2.2:
|
||||||
resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==}
|
resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==}
|
||||||
engines: {node: '>= 0.4'}
|
engines: {node: '>= 0.4'}
|
||||||
@@ -4209,6 +4176,9 @@ packages:
|
|||||||
resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
|
resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
|
||||||
engines: {node: '>=8.0'}
|
engines: {node: '>=8.0'}
|
||||||
|
|
||||||
|
tr46@0.0.3:
|
||||||
|
resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==}
|
||||||
|
|
||||||
tr46@1.0.1:
|
tr46@1.0.1:
|
||||||
resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==}
|
resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==}
|
||||||
|
|
||||||
@@ -4332,9 +4302,6 @@ packages:
|
|||||||
unconfig@7.3.3:
|
unconfig@7.3.3:
|
||||||
resolution: {integrity: sha512-QCkQoOnJF8L107gxfHL0uavn7WD9b3dpBcFX6HtfQYmjw2YzWxGuFQ0N0J6tE9oguCBJn9KOvfqYDCMPHIZrBA==}
|
resolution: {integrity: sha512-QCkQoOnJF8L107gxfHL0uavn7WD9b3dpBcFX6HtfQYmjw2YzWxGuFQ0N0J6tE9oguCBJn9KOvfqYDCMPHIZrBA==}
|
||||||
|
|
||||||
uncrypto@0.1.3:
|
|
||||||
resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==}
|
|
||||||
|
|
||||||
undici-types@6.21.0:
|
undici-types@6.21.0:
|
||||||
resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==}
|
resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==}
|
||||||
|
|
||||||
@@ -4486,12 +4453,18 @@ packages:
|
|||||||
jsdom:
|
jsdom:
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
|
webidl-conversions@3.0.1:
|
||||||
|
resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==}
|
||||||
|
|
||||||
webidl-conversions@4.0.2:
|
webidl-conversions@4.0.2:
|
||||||
resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==}
|
resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==}
|
||||||
|
|
||||||
webpack-virtual-modules@0.6.2:
|
webpack-virtual-modules@0.6.2:
|
||||||
resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==}
|
resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==}
|
||||||
|
|
||||||
|
whatwg-url@5.0.0:
|
||||||
|
resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==}
|
||||||
|
|
||||||
whatwg-url@7.1.0:
|
whatwg-url@7.1.0:
|
||||||
resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==}
|
resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==}
|
||||||
|
|
||||||
@@ -5309,12 +5282,6 @@ snapshots:
|
|||||||
'@babel/helper-string-parser': 7.27.1
|
'@babel/helper-string-parser': 7.27.1
|
||||||
'@babel/helper-validator-identifier': 7.27.1
|
'@babel/helper-validator-identifier': 7.27.1
|
||||||
|
|
||||||
'@better-auth/utils@0.2.6':
|
|
||||||
dependencies:
|
|
||||||
uncrypto: 0.1.3
|
|
||||||
|
|
||||||
'@better-fetch/fetch@1.1.18': {}
|
|
||||||
|
|
||||||
'@biomejs/biome@2.2.2':
|
'@biomejs/biome@2.2.2':
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
'@biomejs/cli-darwin-arm64': 2.2.2
|
'@biomejs/cli-darwin-arm64': 2.2.2
|
||||||
@@ -5552,8 +5519,6 @@ snapshots:
|
|||||||
|
|
||||||
'@floating-ui/utils@0.2.10': {}
|
'@floating-ui/utils@0.2.10': {}
|
||||||
|
|
||||||
'@hexagon/base64@1.1.28': {}
|
|
||||||
|
|
||||||
'@hono/trpc-server@0.4.0(@trpc/server@11.5.0(typescript@5.9.2))(hono@4.9.6)':
|
'@hono/trpc-server@0.4.0(@trpc/server@11.5.0(typescript@5.9.2))(hono@4.9.6)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@trpc/server': 11.5.0(typescript@5.9.2)
|
'@trpc/server': 11.5.0(typescript@5.9.2)
|
||||||
@@ -5667,8 +5632,6 @@ snapshots:
|
|||||||
'@jridgewell/resolve-uri': 3.1.2
|
'@jridgewell/resolve-uri': 3.1.2
|
||||||
'@jridgewell/sourcemap-codec': 1.5.5
|
'@jridgewell/sourcemap-codec': 1.5.5
|
||||||
|
|
||||||
'@levischuck/tiny-cbor@0.2.11': {}
|
|
||||||
|
|
||||||
'@napi-rs/wasm-runtime@1.0.3':
|
'@napi-rs/wasm-runtime@1.0.3':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@emnapi/core': 1.5.0
|
'@emnapi/core': 1.5.0
|
||||||
@@ -5676,47 +5639,10 @@ snapshots:
|
|||||||
'@tybys/wasm-util': 0.10.0
|
'@tybys/wasm-util': 0.10.0
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@noble/ciphers@0.6.0': {}
|
|
||||||
|
|
||||||
'@noble/hashes@1.8.0': {}
|
|
||||||
|
|
||||||
'@oxc-project/runtime@0.82.3': {}
|
'@oxc-project/runtime@0.82.3': {}
|
||||||
|
|
||||||
'@oxc-project/types@0.82.3': {}
|
'@oxc-project/types@0.82.3': {}
|
||||||
|
|
||||||
'@peculiar/asn1-android@2.4.0':
|
|
||||||
dependencies:
|
|
||||||
'@peculiar/asn1-schema': 2.4.0
|
|
||||||
asn1js: 3.0.6
|
|
||||||
tslib: 2.8.1
|
|
||||||
|
|
||||||
'@peculiar/asn1-ecc@2.4.0':
|
|
||||||
dependencies:
|
|
||||||
'@peculiar/asn1-schema': 2.4.0
|
|
||||||
'@peculiar/asn1-x509': 2.4.0
|
|
||||||
asn1js: 3.0.6
|
|
||||||
tslib: 2.8.1
|
|
||||||
|
|
||||||
'@peculiar/asn1-rsa@2.4.0':
|
|
||||||
dependencies:
|
|
||||||
'@peculiar/asn1-schema': 2.4.0
|
|
||||||
'@peculiar/asn1-x509': 2.4.0
|
|
||||||
asn1js: 3.0.6
|
|
||||||
tslib: 2.8.1
|
|
||||||
|
|
||||||
'@peculiar/asn1-schema@2.4.0':
|
|
||||||
dependencies:
|
|
||||||
asn1js: 3.0.6
|
|
||||||
pvtsutils: 1.3.6
|
|
||||||
tslib: 2.8.1
|
|
||||||
|
|
||||||
'@peculiar/asn1-x509@2.4.0':
|
|
||||||
dependencies:
|
|
||||||
'@peculiar/asn1-schema': 2.4.0
|
|
||||||
asn1js: 3.0.6
|
|
||||||
pvtsutils: 1.3.6
|
|
||||||
tslib: 2.8.1
|
|
||||||
|
|
||||||
'@quansync/fs@0.1.5':
|
'@quansync/fs@0.1.5':
|
||||||
dependencies:
|
dependencies:
|
||||||
quansync: 0.2.11
|
quansync: 0.2.11
|
||||||
@@ -6629,18 +6555,6 @@ snapshots:
|
|||||||
'@rollup/rollup-win32-x64-msvc@4.50.0':
|
'@rollup/rollup-win32-x64-msvc@4.50.0':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@simplewebauthn/browser@13.1.2': {}
|
|
||||||
|
|
||||||
'@simplewebauthn/server@13.1.2':
|
|
||||||
dependencies:
|
|
||||||
'@hexagon/base64': 1.1.28
|
|
||||||
'@levischuck/tiny-cbor': 0.2.11
|
|
||||||
'@peculiar/asn1-android': 2.4.0
|
|
||||||
'@peculiar/asn1-ecc': 2.4.0
|
|
||||||
'@peculiar/asn1-rsa': 2.4.0
|
|
||||||
'@peculiar/asn1-schema': 2.4.0
|
|
||||||
'@peculiar/asn1-x509': 2.4.0
|
|
||||||
|
|
||||||
'@standard-schema/utils@0.3.0': {}
|
'@standard-schema/utils@0.3.0': {}
|
||||||
|
|
||||||
'@surma/rollup-plugin-off-main-thread@2.2.3':
|
'@surma/rollup-plugin-off-main-thread@2.2.3':
|
||||||
@@ -7070,6 +6984,13 @@ snapshots:
|
|||||||
normalize-path: 3.0.0
|
normalize-path: 3.0.0
|
||||||
picomatch: 2.3.1
|
picomatch: 2.3.1
|
||||||
|
|
||||||
|
appwrite@14.0.1:
|
||||||
|
dependencies:
|
||||||
|
cross-fetch: 3.1.5
|
||||||
|
isomorphic-form-data: 2.0.0
|
||||||
|
transitivePeerDependencies:
|
||||||
|
- encoding
|
||||||
|
|
||||||
aria-hidden@1.2.6:
|
aria-hidden@1.2.6:
|
||||||
dependencies:
|
dependencies:
|
||||||
tslib: 2.8.1
|
tslib: 2.8.1
|
||||||
@@ -7089,12 +7010,6 @@ snapshots:
|
|||||||
get-intrinsic: 1.3.0
|
get-intrinsic: 1.3.0
|
||||||
is-array-buffer: 3.0.5
|
is-array-buffer: 3.0.5
|
||||||
|
|
||||||
asn1js@3.0.6:
|
|
||||||
dependencies:
|
|
||||||
pvtsutils: 1.3.6
|
|
||||||
pvutils: 1.1.3
|
|
||||||
tslib: 2.8.1
|
|
||||||
|
|
||||||
assertion-error@2.0.1: {}
|
assertion-error@2.0.1: {}
|
||||||
|
|
||||||
ast-kit@2.1.2:
|
ast-kit@2.1.2:
|
||||||
@@ -7110,6 +7025,8 @@ snapshots:
|
|||||||
|
|
||||||
async@3.2.6: {}
|
async@3.2.6: {}
|
||||||
|
|
||||||
|
asynckit@0.4.0: {}
|
||||||
|
|
||||||
at-least-node@1.0.0: {}
|
at-least-node@1.0.0: {}
|
||||||
|
|
||||||
available-typed-arrays@1.0.7:
|
available-typed-arrays@1.0.7:
|
||||||
@@ -7151,31 +7068,6 @@ snapshots:
|
|||||||
|
|
||||||
balanced-match@1.0.2: {}
|
balanced-match@1.0.2: {}
|
||||||
|
|
||||||
better-auth@1.3.7(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(zod@4.1.5):
|
|
||||||
dependencies:
|
|
||||||
'@better-auth/utils': 0.2.6
|
|
||||||
'@better-fetch/fetch': 1.1.18
|
|
||||||
'@noble/ciphers': 0.6.0
|
|
||||||
'@noble/hashes': 1.8.0
|
|
||||||
'@simplewebauthn/browser': 13.1.2
|
|
||||||
'@simplewebauthn/server': 13.1.2
|
|
||||||
better-call: 1.0.16
|
|
||||||
defu: 6.1.4
|
|
||||||
jose: 5.10.0
|
|
||||||
kysely: 0.28.5
|
|
||||||
nanostores: 0.11.4
|
|
||||||
zod: 4.1.5
|
|
||||||
optionalDependencies:
|
|
||||||
react: 19.1.1
|
|
||||||
react-dom: 19.1.1(react@19.1.1)
|
|
||||||
|
|
||||||
better-call@1.0.16:
|
|
||||||
dependencies:
|
|
||||||
'@better-fetch/fetch': 1.1.18
|
|
||||||
rou3: 0.5.1
|
|
||||||
set-cookie-parser: 2.7.1
|
|
||||||
uncrypto: 0.1.3
|
|
||||||
|
|
||||||
binary-extensions@2.3.0: {}
|
binary-extensions@2.3.0: {}
|
||||||
|
|
||||||
birpc@2.5.0: {}
|
birpc@2.5.0: {}
|
||||||
@@ -7295,6 +7187,10 @@ snapshots:
|
|||||||
|
|
||||||
colorette@2.0.20: {}
|
colorette@2.0.20: {}
|
||||||
|
|
||||||
|
combined-stream@1.0.8:
|
||||||
|
dependencies:
|
||||||
|
delayed-stream: 1.0.0
|
||||||
|
|
||||||
commander@14.0.0: {}
|
commander@14.0.0: {}
|
||||||
|
|
||||||
commander@2.20.3: {}
|
commander@2.20.3: {}
|
||||||
@@ -7315,6 +7211,12 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
browserslist: 4.25.4
|
browserslist: 4.25.4
|
||||||
|
|
||||||
|
cross-fetch@3.1.5:
|
||||||
|
dependencies:
|
||||||
|
node-fetch: 2.6.7
|
||||||
|
transitivePeerDependencies:
|
||||||
|
- encoding
|
||||||
|
|
||||||
crypto-random-string@2.0.0: {}
|
crypto-random-string@2.0.0: {}
|
||||||
|
|
||||||
csstype@3.1.3: {}
|
csstype@3.1.3: {}
|
||||||
@@ -7372,6 +7274,8 @@ snapshots:
|
|||||||
|
|
||||||
defu@6.1.4: {}
|
defu@6.1.4: {}
|
||||||
|
|
||||||
|
delayed-stream@1.0.0: {}
|
||||||
|
|
||||||
detect-libc@2.0.4: {}
|
detect-libc@2.0.4: {}
|
||||||
|
|
||||||
detect-node-es@1.1.0: {}
|
detect-node-es@1.1.0: {}
|
||||||
@@ -7606,6 +7510,15 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
is-callable: 1.2.7
|
is-callable: 1.2.7
|
||||||
|
|
||||||
|
form-data@2.5.5:
|
||||||
|
dependencies:
|
||||||
|
asynckit: 0.4.0
|
||||||
|
combined-stream: 1.0.8
|
||||||
|
es-set-tostringtag: 2.1.0
|
||||||
|
hasown: 2.0.2
|
||||||
|
mime-types: 2.1.35
|
||||||
|
safe-buffer: 5.2.1
|
||||||
|
|
||||||
fs-extra@9.1.0:
|
fs-extra@9.1.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
at-least-node: 1.0.0
|
at-least-node: 1.0.0
|
||||||
@@ -7867,6 +7780,10 @@ snapshots:
|
|||||||
|
|
||||||
isbot@5.1.30: {}
|
isbot@5.1.30: {}
|
||||||
|
|
||||||
|
isomorphic-form-data@2.0.0:
|
||||||
|
dependencies:
|
||||||
|
form-data: 2.5.5
|
||||||
|
|
||||||
jake@10.9.4:
|
jake@10.9.4:
|
||||||
dependencies:
|
dependencies:
|
||||||
async: 3.2.6
|
async: 3.2.6
|
||||||
@@ -7875,8 +7792,6 @@ snapshots:
|
|||||||
|
|
||||||
jiti@2.5.1: {}
|
jiti@2.5.1: {}
|
||||||
|
|
||||||
jose@5.10.0: {}
|
|
||||||
|
|
||||||
js-tokens@4.0.0: {}
|
js-tokens@4.0.0: {}
|
||||||
|
|
||||||
js-tokens@9.0.1: {}
|
js-tokens@9.0.1: {}
|
||||||
@@ -7901,7 +7816,8 @@ snapshots:
|
|||||||
|
|
||||||
jsonpointer@5.0.1: {}
|
jsonpointer@5.0.1: {}
|
||||||
|
|
||||||
kysely@0.28.5: {}
|
kysely@0.28.5:
|
||||||
|
optional: true
|
||||||
|
|
||||||
leven@3.1.0: {}
|
leven@3.1.0: {}
|
||||||
|
|
||||||
@@ -8015,6 +7931,12 @@ snapshots:
|
|||||||
braces: 3.0.3
|
braces: 3.0.3
|
||||||
picomatch: 2.3.1
|
picomatch: 2.3.1
|
||||||
|
|
||||||
|
mime-db@1.52.0: {}
|
||||||
|
|
||||||
|
mime-types@2.1.35:
|
||||||
|
dependencies:
|
||||||
|
mime-db: 1.52.0
|
||||||
|
|
||||||
mimic-function@5.0.1: {}
|
mimic-function@5.0.1: {}
|
||||||
|
|
||||||
minimatch@3.1.2:
|
minimatch@3.1.2:
|
||||||
@@ -8039,13 +7961,21 @@ snapshots:
|
|||||||
|
|
||||||
nanoid@3.3.11: {}
|
nanoid@3.3.11: {}
|
||||||
|
|
||||||
nanostores@0.11.4: {}
|
|
||||||
|
|
||||||
next-themes@0.4.6(react-dom@19.1.1(react@19.1.1))(react@19.1.1):
|
next-themes@0.4.6(react-dom@19.1.1(react@19.1.1))(react@19.1.1):
|
||||||
dependencies:
|
dependencies:
|
||||||
react: 19.1.1
|
react: 19.1.1
|
||||||
react-dom: 19.1.1(react@19.1.1)
|
react-dom: 19.1.1(react@19.1.1)
|
||||||
|
|
||||||
|
node-appwrite@14.2.0:
|
||||||
|
dependencies:
|
||||||
|
node-fetch-native-with-agent: 1.7.2
|
||||||
|
|
||||||
|
node-fetch-native-with-agent@1.7.2: {}
|
||||||
|
|
||||||
|
node-fetch@2.6.7:
|
||||||
|
dependencies:
|
||||||
|
whatwg-url: 5.0.0
|
||||||
|
|
||||||
node-releases@2.0.19: {}
|
node-releases@2.0.19: {}
|
||||||
|
|
||||||
normalize-path@3.0.0: {}
|
normalize-path@3.0.0: {}
|
||||||
@@ -8168,12 +8098,6 @@ snapshots:
|
|||||||
|
|
||||||
punycode@2.3.1: {}
|
punycode@2.3.1: {}
|
||||||
|
|
||||||
pvtsutils@1.3.6:
|
|
||||||
dependencies:
|
|
||||||
tslib: 2.8.1
|
|
||||||
|
|
||||||
pvutils@1.1.3: {}
|
|
||||||
|
|
||||||
quansync@0.2.11: {}
|
quansync@0.2.11: {}
|
||||||
|
|
||||||
radix-ui@1.4.3(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1):
|
radix-ui@1.4.3(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1):
|
||||||
@@ -8425,8 +8349,6 @@ snapshots:
|
|||||||
'@rollup/rollup-win32-x64-msvc': 4.50.0
|
'@rollup/rollup-win32-x64-msvc': 4.50.0
|
||||||
fsevents: 2.3.3
|
fsevents: 2.3.3
|
||||||
|
|
||||||
rou3@0.5.1: {}
|
|
||||||
|
|
||||||
safe-array-concat@1.1.3:
|
safe-array-concat@1.1.3:
|
||||||
dependencies:
|
dependencies:
|
||||||
call-bind: 1.0.8
|
call-bind: 1.0.8
|
||||||
@@ -8464,8 +8386,6 @@ snapshots:
|
|||||||
|
|
||||||
seroval@1.3.2: {}
|
seroval@1.3.2: {}
|
||||||
|
|
||||||
set-cookie-parser@2.7.1: {}
|
|
||||||
|
|
||||||
set-function-length@1.2.2:
|
set-function-length@1.2.2:
|
||||||
dependencies:
|
dependencies:
|
||||||
define-data-property: 1.1.4
|
define-data-property: 1.1.4
|
||||||
@@ -8732,6 +8652,8 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
is-number: 7.0.0
|
is-number: 7.0.0
|
||||||
|
|
||||||
|
tr46@0.0.3: {}
|
||||||
|
|
||||||
tr46@1.0.1:
|
tr46@1.0.1:
|
||||||
dependencies:
|
dependencies:
|
||||||
punycode: 2.3.1
|
punycode: 2.3.1
|
||||||
@@ -8895,8 +8817,6 @@ snapshots:
|
|||||||
jiti: 2.5.1
|
jiti: 2.5.1
|
||||||
quansync: 0.2.11
|
quansync: 0.2.11
|
||||||
|
|
||||||
uncrypto@0.1.3: {}
|
|
||||||
|
|
||||||
undici-types@6.21.0: {}
|
undici-types@6.21.0: {}
|
||||||
|
|
||||||
unicode-canonical-property-names-ecmascript@2.0.1: {}
|
unicode-canonical-property-names-ecmascript@2.0.1: {}
|
||||||
@@ -9042,10 +8962,17 @@ snapshots:
|
|||||||
- tsx
|
- tsx
|
||||||
- yaml
|
- yaml
|
||||||
|
|
||||||
|
webidl-conversions@3.0.1: {}
|
||||||
|
|
||||||
webidl-conversions@4.0.2: {}
|
webidl-conversions@4.0.2: {}
|
||||||
|
|
||||||
webpack-virtual-modules@0.6.2: {}
|
webpack-virtual-modules@0.6.2: {}
|
||||||
|
|
||||||
|
whatwg-url@5.0.0:
|
||||||
|
dependencies:
|
||||||
|
tr46: 0.0.3
|
||||||
|
webidl-conversions: 3.0.1
|
||||||
|
|
||||||
whatwg-url@7.1.0:
|
whatwg-url@7.1.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
lodash.sortby: 4.7.0
|
lodash.sortby: 4.7.0
|
||||||
|
|||||||
Reference in New Issue
Block a user