feat(core-trpc): scaffold tRPC client with React Query providers

- createTRPCContext + useTRPC hook for typed client access
- NextTrpcProvider with SSR-safe absolute URL resolution
- TanstackTrpcProvider for TanStack Start apps
- /api/trpc catch-all route handler in web-next
- Wire NextTrpcProvider into app providers
- Add @repo/core-trpc to transpilePackages
This commit is contained in:
danijel-lf
2026-05-26 14:11:27 +02:00
parent bca04f4cef
commit 3ce71447b3
18 changed files with 824 additions and 13 deletions

View File

@@ -16,6 +16,7 @@ const nextConfig = {
"@repo/marketing-pages",
"@repo/media",
"@repo/navigation",
"@repo/core-trpc",
],
};

View File

@@ -19,19 +19,22 @@
"@repo/core-api": "workspace:*",
"@repo/core-cms": "workspace:*",
"@repo/core-shared": "workspace:*",
"@repo/core-trpc": "workspace:^",
"@repo/marketing-pages": "workspace:*",
"@repo/media": "workspace:*",
"@repo/navigation": "workspace:*",
"@sentry/nextjs": "^10.51.0",
"@tanstack/react-query": "^5.66.0",
"@trpc/server": "^11.0.0",
"@tailwindcss/postcss": "^4.3.0",
"@tanstack/react-query": "^5.96.2",
"@trpc/server": "^11.17.0",
"inversify": "^6.2.0",
"next": "^15.3.0",
"payload": "^3.14.0",
"react": "^19.0.0",
"react-dom": "^19.0.0",
"reflect-metadata": "^0.2.2",
"superjson": "^2.2.1"
"superjson": "^2.2.1",
"tailwindcss": "^4.1.0"
},
"devDependencies": {
"@playwright/test": "^1.50.0",

View File

@@ -0,0 +1,15 @@
import { fetchRequestHandler } from "@trpc/server/adapters/fetch";
import { appRouter } from "@repo/core-api";
import { bindAll } from "../../../../server/bind-production";
const handler = async (req: Request) => {
await bindAll();
return fetchRequestHandler({
endpoint: "/api/trpc",
req,
router: appRouter,
createContext: () => ({}),
});
};
export { handler as GET, handler as POST };

View File

@@ -1,5 +1,7 @@
"use client";
import { NextTrpcProvider } from "@repo/core-trpc/next";
export function Providers({ children }: { children: React.ReactNode }) {
return <>{children}</>;
return <NextTrpcProvider>{children}</NextTrpcProvider>;
}

View File

@@ -0,0 +1,69 @@
---
package: "@trpc/react-query"
version: "^11.0.0"
tier: core
decision: approved
date: 2026-05-14
deciders: [scaffolded]
adr: null
is-sub-processor: false
processes-pii: false
filter-results:
license: MIT
types: native
maintenance: active
boundary-fit: pass
shadow-check: pass
eu-residency: n/a
cve-scan: clean
named-consumer: pass
socketRisk: skip
verification-commands:
- pnpm audit --audit-level=moderate
- npm view @trpc/react-query license
accepted-cves: []
---
## Filter: license
MIT — on the workspace allowlist.
## Filter: types
Ships first-party TypeScript types; deeply integrated with tRPC's type inference.
## Filter: maintenance
Active. Maintained by the tRPC team alongside `@trpc/server` and `@trpc/client`.
## Filter: boundary-fit
Core package. The React Query integration bridge belongs in `core-trpc` alongside its sibling tRPC packages. No boundary rule violation.
## Filter: shadow-check
No other tRPCReact Query bridge in the workspace. No shadow.
## Filter: eu-residency
Client-side integration adapter; no vendor data transmission. n/a.
## Filter: cve-scan
No advisories at adoption time.
## Filter: named-consumer
`core-trpc` re-exports `@trpc/react-query` hooks for use in Next.js feature pages.
## Prompt: replaces
Nothing — this is the initial tRPC scaffold.
## Prompt: migration-cost-out
Hard: hooks are tRPC-procedure-typed; migrating away requires replacing all call sites.
## Prompt: alternatives-considered
This package is the canonical integration point between `@trpc/client` and `@tanstack/react-query`. No viable alternative exists.

View File

@@ -0,0 +1,69 @@
---
package: "@trpc/tanstack-react-query"
version: "^11.1.0"
tier: core
decision: approved
date: 2026-05-14
deciders: [scaffolded]
adr: null
is-sub-processor: false
processes-pii: false
filter-results:
license: MIT
types: native
maintenance: active
boundary-fit: pass
shadow-check: pass
eu-residency: n/a
cve-scan: clean
named-consumer: pass
socketRisk: skip
verification-commands:
- pnpm audit --audit-level=moderate
- npm view @trpc/tanstack-react-query license
accepted-cves: []
---
## Filter: license
MIT — on the workspace allowlist.
## Filter: types
Ships first-party TypeScript types; part of the tRPC v11 adapter suite.
## Filter: maintenance
Active. Maintained by the tRPC team as part of the v11 TanStack Start integration.
## Filter: boundary-fit
Core package. Required for the TanStack Start provider (`core-trpc/tanstack`). No boundary rule violation.
## Filter: shadow-check
No duplicate TanStack adapter in the workspace. No shadow.
## Filter: eu-residency
Client-side integration adapter; no vendor data transmission. n/a.
## Filter: cve-scan
No advisories at adoption time.
## Filter: named-consumer
`core-trpc` exposes a TanStack Start provider via `@trpc/tanstack-react-query` for `apps/web-tanstack`.
## Prompt: replaces
Nothing — this is the initial tRPC scaffold.
## Prompt: migration-cost-out
Hard: the TanStack provider is shaped around this adapter's API; replacing requires re-implementing the provider.
## Prompt: alternatives-considered
This is the official tRPC adapter for TanStack Start. No viable alternative exists.

View File

@@ -0,0 +1,3 @@
import baseConfig from "@repo/core-eslint/base";
export default baseConfig;

View File

@@ -0,0 +1,37 @@
{
"name": "@repo/core-trpc",
"private": true,
"version": "0.0.0",
"type": "module",
"exports": {
".": "./src/index.ts",
"./next": "./src/providers/next-provider.tsx",
"./tanstack": "./src/providers/tanstack-provider.tsx"
},
"scripts": {
"build": "tsc --noEmit",
"lint": "eslint .",
"typecheck": "tsc --noEmit",
"test": "vitest run --passWithNoTests"
},
"dependencies": {
"@repo/core-api": "workspace:*",
"@tanstack/react-query": "^5.66.0",
"@trpc/client": "^11.17.0",
"@trpc/react-query": "^11.17.0",
"@trpc/server": "^11.17.0",
"@trpc/tanstack-react-query": "^11.17.0",
"react": "^19.0.0",
"superjson": "^2.2.1"
},
"devDependencies": {
"@repo/core-eslint": "workspace:*",
"@repo/core-testing": "workspace:*",
"@repo/core-typescript": "workspace:*",
"@testing-library/jest-dom": "^6.5.0",
"@testing-library/react": "^16.0.0",
"@types/react": "^19.0.0",
"jsdom": "^25.0.0",
"vitest": "^3.0.0"
}
}

View File

@@ -0,0 +1,12 @@
import { describe, it, expect } from "vitest";
import { useTRPC, TRPCProvider } from "./client";
describe("core-trpc client exports", () => {
it("exports useTRPC hook", () => {
expect(useTRPC).toBeTypeOf("function");
});
it("exports TRPCProvider component", () => {
expect(TRPCProvider).toBeTypeOf("function");
});
});

View File

@@ -0,0 +1,6 @@
"use client";
import { createTRPCContext } from "@trpc/tanstack-react-query";
import type { AppRouter } from "@repo/core-api";
export const { TRPCProvider, useTRPC } = createTRPCContext<AppRouter>();

View File

@@ -0,0 +1,3 @@
export { useTRPC, TRPCProvider } from "./client";
export { getQueryClient } from "./query-client";
export type { AppRouter } from "@repo/core-api";

View File

@@ -0,0 +1,40 @@
"use client";
import { useState } from "react";
import { QueryClientProvider } from "@tanstack/react-query";
import { createTRPCClient, httpBatchLink } from "@trpc/client";
import superjson from "superjson";
import type { AppRouter } from "@repo/core-api";
import { TRPCProvider } from "../client";
import { getQueryClient } from "../query-client";
function getBaseUrl() {
if (typeof window !== "undefined") return "";
return `http://localhost:${process.env.PORT ?? 3000}`;
}
export function NextTrpcProvider({
children,
trpcUrl = "/api/trpc",
}: {
children: React.ReactNode;
trpcUrl?: string;
}) {
const [queryClient] = useState(() => getQueryClient());
const [trpcClient] = useState(() =>
createTRPCClient<AppRouter>({
links: [
httpBatchLink({
url: `${getBaseUrl()}${trpcUrl}`,
transformer: superjson,
}),
],
}),
);
return (
<TRPCProvider trpcClient={trpcClient} queryClient={queryClient}>
<QueryClientProvider client={queryClient}>{children}</QueryClientProvider>
</TRPCProvider>
);
}

View File

@@ -0,0 +1,30 @@
"use client";
import { useState } from "react";
import { QueryClientProvider } from "@tanstack/react-query";
import { createTRPCClient, httpBatchLink } from "@trpc/client";
import superjson from "superjson";
import type { AppRouter } from "@repo/core-api";
import { TRPCProvider } from "../client";
import { getQueryClient } from "../query-client";
export function TanstackTrpcProvider({
children,
trpcUrl,
}: {
children: React.ReactNode;
trpcUrl: string;
}) {
const [queryClient] = useState(() => getQueryClient());
const [trpcClient] = useState(() =>
createTRPCClient<AppRouter>({
links: [httpBatchLink({ url: trpcUrl, transformer: superjson })],
}),
);
return (
<TRPCProvider trpcClient={trpcClient} queryClient={queryClient}>
<QueryClientProvider client={queryClient}>{children}</QueryClientProvider>
</TRPCProvider>
);
}

View File

@@ -0,0 +1,22 @@
import { QueryClient } from "@tanstack/react-query";
let clientQueryClient: QueryClient | undefined;
const defaultOptions = {
queries: {
staleTime: 30 * 1000,
refetchOnWindowFocus: false,
},
};
export function getQueryClient(): QueryClient {
if (typeof window === "undefined") {
// Server: always create a new instance per request
return new QueryClient({ defaultOptions });
}
// Browser: singleton
if (!clientQueryClient) {
clientQueryClient = new QueryClient({ defaultOptions });
}
return clientQueryClient;
}

View File

@@ -0,0 +1,17 @@
{
"extends": "@repo/core-typescript/base.json",
"compilerOptions": {
"outDir": "dist",
"rootDir": ".",
"lib": ["ES2022", "DOM"],
"jsx": "preserve",
"declaration": false,
"declarationMap": false,
"types": ["vitest/globals", "@testing-library/jest-dom"],
"paths": {
"@/*": ["./src/*"]
}
},
"include": ["src/**/*"],
"exclude": ["node_modules", "dist"]
}

View File

@@ -0,0 +1,4 @@
{
"extends": ["//"],
"tags": ["core-composition"]
}

View File

@@ -0,0 +1,7 @@
import path from "node:path";
import { mergeConfig } from "vitest/config";
import { jsdomVitestConfig } from "@repo/core-typescript/vitest.base.jsdom";
export default mergeConfig(jsdomVitestConfig, {
resolve: { alias: { "@": path.resolve(__dirname, "./src") } },
});

489
pnpm-lock.yaml generated
View File

@@ -8,7 +8,7 @@ importers:
.:
devDependencies:
"@ai-hero/sandcastle":
specifier: "^0.5.10"
specifier: ^0.5.10
version: 0.5.10(@effect/cluster@0.57.0(@effect/platform@0.95.0(effect@3.21.2))(@effect/rpc@0.74.0(@effect/platform@0.95.0(effect@3.21.2))(effect@3.21.2))(@effect/sql@0.50.0(@effect/experimental@0.59.0(@effect/platform@0.95.0(effect@3.21.2))(effect@3.21.2)(ioredis@5.10.1))(@effect/platform@0.95.0(effect@3.21.2))(effect@3.21.2))(@effect/workflow@0.17.0(@effect/experimental@0.59.0(@effect/platform@0.95.0(effect@3.21.2))(effect@3.21.2)(ioredis@5.10.1))(@effect/platform@0.95.0(effect@3.21.2))(@effect/rpc@0.74.0(@effect/platform@0.95.0(effect@3.21.2))(effect@3.21.2))(effect@3.21.2))(effect@3.21.2))(@effect/rpc@0.74.0(@effect/platform@0.95.0(effect@3.21.2))(effect@3.21.2))(@effect/sql@0.50.0(@effect/experimental@0.59.0(@effect/platform@0.95.0(effect@3.21.2))(effect@3.21.2)(ioredis@5.10.1))(@effect/platform@0.95.0(effect@3.21.2))(effect@3.21.2))(@effect/typeclass@0.39.0(effect@3.21.2))
"@playwright/test":
specifier: ^1.49.0
@@ -28,6 +28,9 @@ importers:
"@typescript-eslint/parser":
specifier: ^8.25.0
version: 8.58.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3)
dotenv-cli:
specifier: ^11.0.0
version: 11.0.0
fallow:
specifier: ^2.73.0
version: 2.73.0
@@ -182,6 +185,9 @@ importers:
"@repo/core-shared":
specifier: workspace:*
version: link:../../packages/core-shared
"@repo/core-trpc":
specifier: workspace:^
version: link:../../packages/core-trpc
"@repo/marketing-pages":
specifier: workspace:*
version: link:../../packages/marketing-pages
@@ -194,12 +200,15 @@ importers:
"@sentry/nextjs":
specifier: ^10.51.0
version: 10.51.0(@opentelemetry/core@2.7.1(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.7.1(@opentelemetry/api@1.9.1))(next@15.5.14(@babel/core@7.25.9)(@opentelemetry/api@1.9.1)(@playwright/test@1.59.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.99.0))(react@19.2.4)(webpack@5.106.2)
"@tailwindcss/postcss":
specifier: ^4.3.0
version: 4.3.0
"@tanstack/react-query":
specifier: ^5.66.0
specifier: ^5.96.2
version: 5.96.2(react@19.2.4)
"@trpc/server":
specifier: ^11.0.0
version: 11.16.0(typescript@5.9.3)
specifier: ^11.17.0
version: 11.17.0(typescript@5.9.3)
inversify:
specifier: ^6.2.0
version: 6.2.2(reflect-metadata@0.2.2)
@@ -221,6 +230,9 @@ importers:
superjson:
specifier: ^2.2.1
version: 2.2.6
tailwindcss:
specifier: ^4.1.0
version: 4.2.2
devDependencies:
"@playwright/test":
specifier: ^1.50.0
@@ -389,6 +401,15 @@ importers:
"@repo/core-shared":
specifier: workspace:*
version: link:../core-shared
"@repo/core-trpc":
specifier: workspace:^
version: link:../core-trpc
"@tanstack/react-query":
specifier: ^5.66.0
version: 5.96.2(react@19.2.4)
"@trpc/client":
specifier: ^11.17.0
version: 11.17.0(@trpc/server@11.16.0(typescript@5.9.3))(typescript@5.9.3)
"@trpc/server":
specifier: ^11.0.0
version: 11.16.0(typescript@5.9.3)
@@ -398,6 +419,9 @@ importers:
payload:
specifier: ^3.14.0
version: 3.81.0(graphql@16.13.2)(typescript@5.9.3)
react:
specifier: ^19.0.0
version: 19.2.4
reflect-metadata:
specifier: ^0.2.2
version: 0.2.2
@@ -417,6 +441,9 @@ importers:
"@types/node":
specifier: ^22.0.0
version: 22.19.17
"@types/react":
specifier: ^19.0.0
version: 19.2.14
"@vitest/coverage-v8":
specifier: ^3.2.4
version: 3.2.4(vitest@3.2.4(@types/debug@4.1.13)(@types/node@22.19.17)(happy-dom@20.8.9)(jiti@2.7.0)(jsdom@25.0.1)(lightningcss@1.32.0)(sass@1.99.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.9.0))
@@ -871,6 +898,58 @@ importers:
specifier: ^5.8.0
version: 5.9.3
packages/core-trpc:
dependencies:
"@repo/core-api":
specifier: workspace:*
version: link:../core-api
"@tanstack/react-query":
specifier: ^5.66.0
version: 5.96.2(react@19.2.4)
"@trpc/client":
specifier: ^11.17.0
version: 11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3)
"@trpc/react-query":
specifier: ^11.17.0
version: 11.17.0(@tanstack/react-query@5.96.2(react@19.2.4))(@trpc/client@11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.17.0(typescript@5.9.3))(react@19.2.4)(typescript@5.9.3)
"@trpc/server":
specifier: ^11.17.0
version: 11.17.0(typescript@5.9.3)
"@trpc/tanstack-react-query":
specifier: ^11.17.0
version: 11.17.0(@tanstack/react-query@5.96.2(react@19.2.4))(@trpc/client@11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.17.0(typescript@5.9.3))(react@19.2.4)(typescript@5.9.3)
react:
specifier: ^19.0.0
version: 19.2.4
superjson:
specifier: ^2.2.1
version: 2.2.6
devDependencies:
"@repo/core-eslint":
specifier: workspace:*
version: link:../core-eslint
"@repo/core-testing":
specifier: workspace:*
version: link:../core-testing
"@repo/core-typescript":
specifier: workspace:*
version: link:../core-typescript
"@testing-library/jest-dom":
specifier: ^6.5.0
version: 6.9.1
"@testing-library/react":
specifier: ^16.0.0
version: 16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
"@types/react":
specifier: ^19.0.0
version: 19.2.14
jsdom:
specifier: ^25.0.0
version: 25.0.1
vitest:
specifier: ^3.0.0
version: 3.2.4(@types/debug@4.1.13)(@types/node@25.5.2)(happy-dom@20.8.9)(jiti@2.7.0)(jsdom@25.0.1)(lightningcss@1.32.0)(sass@1.99.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.9.0)
packages/core-typescript:
devDependencies:
"@vitest/coverage-v8":
@@ -943,6 +1022,15 @@ importers:
"@repo/core-shared":
specifier: workspace:*
version: link:../core-shared
"@repo/core-trpc":
specifier: workspace:^
version: link:../core-trpc
"@tanstack/react-query":
specifier: ^5.66.0
version: 5.96.2(react@19.2.4)
"@trpc/client":
specifier: ^11.17.0
version: 11.17.0(@trpc/server@11.16.0(typescript@5.9.3))(typescript@5.9.3)
"@trpc/server":
specifier: ^11.0.0
version: 11.16.0(typescript@5.9.3)
@@ -952,6 +1040,9 @@ importers:
payload:
specifier: ^3.14.0
version: 3.81.0(graphql@16.13.2)(typescript@5.9.3)
react:
specifier: ^19.0.0
version: 19.2.4
reflect-metadata:
specifier: ^0.2.2
version: 0.2.2
@@ -971,6 +1062,9 @@ importers:
"@types/node":
specifier: ^22.0.0
version: 22.19.17
"@types/react":
specifier: ^19.0.0
version: 19.2.14
"@vitest/coverage-v8":
specifier: ^3.2.4
version: 3.2.4(vitest@3.2.4(@types/debug@4.1.13)(@types/node@22.19.17)(happy-dom@20.8.9)(jiti@2.7.0)(jsdom@25.0.1)(lightningcss@1.32.0)(sass@1.99.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.9.0))
@@ -1023,6 +1117,15 @@ importers:
"@repo/core-shared":
specifier: workspace:*
version: link:../core-shared
"@repo/core-trpc":
specifier: workspace:^
version: link:../core-trpc
"@tanstack/react-query":
specifier: ^5.66.0
version: 5.96.2(react@19.2.4)
"@trpc/client":
specifier: ^11.17.0
version: 11.17.0(@trpc/server@11.16.0(typescript@5.9.3))(typescript@5.9.3)
"@trpc/server":
specifier: ^11.0.0
version: 11.16.0(typescript@5.9.3)
@@ -1032,6 +1135,9 @@ importers:
payload:
specifier: ^3.14.0
version: 3.81.0(graphql@16.13.2)(typescript@5.9.3)
react:
specifier: ^19.0.0
version: 19.2.4
reflect-metadata:
specifier: ^0.2.2
version: 0.2.2
@@ -1051,6 +1157,9 @@ importers:
"@types/node":
specifier: ^22.0.0
version: 22.19.17
"@types/react":
specifier: ^19.0.0
version: 19.2.14
"@vitest/coverage-v8":
specifier: ^3.2.4
version: 3.2.4(vitest@3.2.4(@types/debug@4.1.13)(@types/node@22.19.17)(happy-dom@20.8.9)(jiti@2.7.0)(jsdom@25.0.1)(lightningcss@1.32.0)(sass@1.99.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.9.0))
@@ -1099,6 +1208,13 @@ packages:
"@vercel/sandbox":
optional: true
"@alloc/quick-lru@5.2.0":
resolution:
{
integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==,
}
engines: { node: ">=10" }
"@ampproject/remapping@2.3.0":
resolution:
{
@@ -6994,6 +7110,12 @@ packages:
integrity: sha512-pXS+wJ2gZpVXqFaUEjojq7jzMpTGf8rU6ipJz5ovJV6PUGmlJ+jvIwGrzdHdQ80Sg+wmQxUFuoW1UAAwHNEdFA==,
}
"@tailwindcss/node@4.3.0":
resolution:
{
integrity: sha512-aFb4gUhFOgdh9AXo4IzBEOzBkkAxm9VigwDJnMIYv3lcfXCJVesNfbEaBl4BNgVRyid92AmdviqwBUBRKSeY3g==,
}
"@tailwindcss/oxide-android-arm64@4.2.2":
resolution:
{
@@ -7003,6 +7125,15 @@ packages:
cpu: [arm64]
os: [android]
"@tailwindcss/oxide-android-arm64@4.3.0":
resolution:
{
integrity: sha512-TJPiq67tKlLuObP6RkwvVGDoxCMBVtDgKkLfa/uyj7/FyxvQwHS+UOnVrXXgbEsfUaMgiVvC4KbJnRr26ho4Ng==,
}
engines: { node: ">= 20" }
cpu: [arm64]
os: [android]
"@tailwindcss/oxide-darwin-arm64@4.2.2":
resolution:
{
@@ -7012,6 +7143,15 @@ packages:
cpu: [arm64]
os: [darwin]
"@tailwindcss/oxide-darwin-arm64@4.3.0":
resolution:
{
integrity: sha512-oMN/WZRb+SO37BmUElEgeEWuU8E/HXRkiODxJxLe1UTHVXLrdVSgfaJV7pSlhRGMSOiXLuxTIjfsF3wYvz8cgQ==,
}
engines: { node: ">= 20" }
cpu: [arm64]
os: [darwin]
"@tailwindcss/oxide-darwin-x64@4.2.2":
resolution:
{
@@ -7021,6 +7161,15 @@ packages:
cpu: [x64]
os: [darwin]
"@tailwindcss/oxide-darwin-x64@4.3.0":
resolution:
{
integrity: sha512-N6CUmu4a6bKVADfw77p+iw6Yd9Q3OBhe0veaDX+QazfuVYlQsHfDgxBrsjQ/IW+zywL8mTrNd0SdJT/zgtvMdA==,
}
engines: { node: ">= 20" }
cpu: [x64]
os: [darwin]
"@tailwindcss/oxide-freebsd-x64@4.2.2":
resolution:
{
@@ -7030,6 +7179,15 @@ packages:
cpu: [x64]
os: [freebsd]
"@tailwindcss/oxide-freebsd-x64@4.3.0":
resolution:
{
integrity: sha512-zDL5hBkQdH5C6MpqbK3gQAgP80tsMwSI26vjOzjJtNCMUo0lFgOItzHKBIupOZNQxt3ouPH7RPhvNhiTfCe5CQ==,
}
engines: { node: ">= 20" }
cpu: [x64]
os: [freebsd]
"@tailwindcss/oxide-linux-arm-gnueabihf@4.2.2":
resolution:
{
@@ -7039,6 +7197,15 @@ packages:
cpu: [arm]
os: [linux]
"@tailwindcss/oxide-linux-arm-gnueabihf@4.3.0":
resolution:
{
integrity: sha512-R06HdNi7A7OEoMsf6d4tjZ71RCWnZQPHj2mnotSFURjNLdBC+cIgXQ7l81CqeoiQftjf6OOblxXMInMgN2VzMA==,
}
engines: { node: ">= 20" }
cpu: [arm]
os: [linux]
"@tailwindcss/oxide-linux-arm64-gnu@4.2.2":
resolution:
{
@@ -7048,6 +7215,15 @@ packages:
cpu: [arm64]
os: [linux]
"@tailwindcss/oxide-linux-arm64-gnu@4.3.0":
resolution:
{
integrity: sha512-qTJHELX8jetjhRQHCLilkVLmybpzNQAtaI/gaoVoidn/ufbNDbAo8KlK2J+yPoc8wQxvDxCmh/5lr8nC1+lTbg==,
}
engines: { node: ">= 20" }
cpu: [arm64]
os: [linux]
"@tailwindcss/oxide-linux-arm64-musl@4.2.2":
resolution:
{
@@ -7057,6 +7233,15 @@ packages:
cpu: [arm64]
os: [linux]
"@tailwindcss/oxide-linux-arm64-musl@4.3.0":
resolution:
{
integrity: sha512-Z6sukiQsngnWO+l39X4pPbiWT81IC+PLKF+PHxIlyZbGNb9MODfYlXEVlFvej5BOZInWX01kVyzeLvHsXhfczQ==,
}
engines: { node: ">= 20" }
cpu: [arm64]
os: [linux]
"@tailwindcss/oxide-linux-x64-gnu@4.2.2":
resolution:
{
@@ -7066,6 +7251,15 @@ packages:
cpu: [x64]
os: [linux]
"@tailwindcss/oxide-linux-x64-gnu@4.3.0":
resolution:
{
integrity: sha512-DRNdQRpSGzRGfARVuVkxvM8Q12nh19l4BF/G7zGA1oe+9wcC6saFBHTISrpIcKzhiXtSrlSrluCfvMuledoCTQ==,
}
engines: { node: ">= 20" }
cpu: [x64]
os: [linux]
"@tailwindcss/oxide-linux-x64-musl@4.2.2":
resolution:
{
@@ -7075,6 +7269,15 @@ packages:
cpu: [x64]
os: [linux]
"@tailwindcss/oxide-linux-x64-musl@4.3.0":
resolution:
{
integrity: sha512-Z0IADbDo8bh6I7h2IQMx601AdXBLfFpEdUotft86evd/8ZPflZe9COPO8Q1vw+pfLWIUo9zN/JGZvwuAJqduqg==,
}
engines: { node: ">= 20" }
cpu: [x64]
os: [linux]
"@tailwindcss/oxide-wasm32-wasi@4.2.2":
resolution:
{
@@ -7090,6 +7293,21 @@ packages:
- "@emnapi/wasi-threads"
- tslib
"@tailwindcss/oxide-wasm32-wasi@4.3.0":
resolution:
{
integrity: sha512-HNZGOUxEmElksYR7S6sC5jTeNGpobAsy9u7Gu0AskJ8/20FR9GqebUyB+HBcU/ax6BHuiuJi+Oda4B+YX6H1yA==,
}
engines: { node: ">=14.0.0" }
cpu: [wasm32]
bundledDependencies:
- "@napi-rs/wasm-runtime"
- "@emnapi/core"
- "@emnapi/runtime"
- "@tybys/wasm-util"
- "@emnapi/wasi-threads"
- tslib
"@tailwindcss/oxide-win32-arm64-msvc@4.2.2":
resolution:
{
@@ -7099,6 +7317,15 @@ packages:
cpu: [arm64]
os: [win32]
"@tailwindcss/oxide-win32-arm64-msvc@4.3.0":
resolution:
{
integrity: sha512-Pe+RPVTi1T+qymuuRpcdvwSVZjnll/f7n8gBxMMh3xLTctMDKqpdfGimbMyioqtLhUYZxdJ9wGNhV7MKHvgZsQ==,
}
engines: { node: ">= 20" }
cpu: [arm64]
os: [win32]
"@tailwindcss/oxide-win32-x64-msvc@4.2.2":
resolution:
{
@@ -7108,6 +7335,15 @@ packages:
cpu: [x64]
os: [win32]
"@tailwindcss/oxide-win32-x64-msvc@4.3.0":
resolution:
{
integrity: sha512-Mvrf2kXW/yeW/OTezZlCGOirXRcUuLIBx/5Y12BaPM7wJoryG6dfS/NJL8aBPqtTEx/Vm4T4vKzFUcKDT+TKUA==,
}
engines: { node: ">= 20" }
cpu: [x64]
os: [win32]
"@tailwindcss/oxide@4.2.2":
resolution:
{
@@ -7115,6 +7351,19 @@ packages:
}
engines: { node: ">= 20" }
"@tailwindcss/oxide@4.3.0":
resolution:
{
integrity: sha512-F7HZGBeN9I0/AuuJS5PwcD8xayx5ri5GhjYUDBEVYUkexyA/giwbDNjRVrxSezE3T250OU2K/wp/ltWx3UOefg==,
}
engines: { node: ">= 20" }
"@tailwindcss/postcss@4.3.0":
resolution:
{
integrity: sha512-Jm05Tjx+9yCLGv5qw1c+84Psds8MnyrEQYCB+FFk2lgGiUjlRqdxke4mVTuYrj2xnVZqKim2Apr5ySuQRYAw/w==,
}
"@tailwindcss/vite@4.2.2":
resolution:
{
@@ -7569,6 +7818,28 @@ packages:
"@trpc/server": 11.16.0
typescript: ">=5.7.2"
"@trpc/client@11.17.0":
resolution:
{
integrity: sha512-KpJBFrbKTDeVCFv/3ckL1XBBH5Yssn8hethI/rUy7GIpTj+VzjtPjykDqJpzobuVOz+d26cXCSu1t4I6MYI5Zg==,
}
hasBin: true
peerDependencies:
"@trpc/server": 11.17.0
typescript: ">=5.7.2"
"@trpc/react-query@11.17.0":
resolution:
{
integrity: sha512-AGcl5YAF8NnhBmyJ6PqJqKb1M5VTGSoNRNqJ3orct4o4epdcg0GWhW+qT9q6gPzs/2ImIwYCdfFpgNGdZ9yLHA==,
}
peerDependencies:
"@tanstack/react-query": ^5.80.3
"@trpc/client": 11.17.0
"@trpc/server": 11.17.0
react: ">=18.2.0"
typescript: ">=5.7.2"
"@trpc/server@11.16.0":
resolution:
{
@@ -7578,6 +7849,28 @@ packages:
peerDependencies:
typescript: ">=5.7.2"
"@trpc/server@11.17.0":
resolution:
{
integrity: sha512-jbAOUe0PpUTCYqziyu+8vYXZdDXPudZgnEhWCQ2NjKnVEjfE93RqHTt1oycZJv/HNf51YlRXfEEwSIAbb161rw==,
}
hasBin: true
peerDependencies:
typescript: ">=5.7.2"
"@trpc/tanstack-react-query@11.17.0":
resolution:
{
integrity: sha512-OFxjvCgisP0yaCj7lgP6qPaFwJvJDgnrAUxH3cNIPPR89TpYbndn5vsdKNkc7EnvER9b6wq9Yz8aCcPcOBpDXg==,
}
hasBin: true
peerDependencies:
"@tanstack/react-query": ^5.80.3
"@trpc/client": 11.17.0
"@trpc/server": 11.17.0
react: ">=18.2.0"
typescript: ">=5.7.2"
"@turbo/darwin-64@2.9.4":
resolution:
{
@@ -9914,6 +10207,20 @@ packages:
}
engines: { node: ">=20" }
dotenv-cli@11.0.0:
resolution:
{
integrity: sha512-r5pA8idbk7GFWuHEU7trSTflWcdBpQEK+Aw17UrSHjS6CReuhrrPcyC3zcQBPQvhArRHnBo/h6eLH1fkCvNlww==,
}
hasBin: true
dotenv-expand@12.0.3:
resolution:
{
integrity: sha512-uc47g4b+4k/M/SeaW1y4OApx+mtLWl92l5LMPP0GNXctZqELk+YGgOPIIC5elYmUH4OuoK3JLhuRUYegeySiFA==,
}
engines: { node: ">=12" }
dotenv@16.0.3:
resolution:
{
@@ -10131,6 +10438,13 @@ packages:
}
engines: { node: ">=10.13.0" }
enhanced-resolve@5.22.0:
resolution:
{
integrity: sha512-xYcDWrpELkFzz9SpZ3PlI6Eu6eD93Yf0WLDRxikGhWJ3MAir2SNZTIVCVZqZ/NUyx8AdMc2gT9C0gPiw18kG+A==,
}
engines: { node: ">=10.13.0" }
entities@1.1.2:
resolution:
{
@@ -13301,6 +13615,14 @@ packages:
engines: { node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1 }
hasBin: true
nanoid@3.3.12:
resolution:
{
integrity: sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==,
}
engines: { node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1 }
hasBin: true
natural-compare@1.4.0:
resolution:
{
@@ -14032,6 +14354,13 @@ packages:
}
engines: { node: ^10 || ^12 || >=14 }
postcss@8.5.15:
resolution:
{
integrity: sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==,
}
engines: { node: ^10 || ^12 || >=14 }
postcss@8.5.8:
resolution:
{
@@ -15472,6 +15801,12 @@ packages:
integrity: sha512-KWBIxs1Xb6NoLdMVqhbhgwZf2PGBpPEiwOqgI4pFIYbNTfBXiKYyWoTsXgBQ9WFg/OlhnvHaY+AEpW7wSmFo2Q==,
}
tailwindcss@4.3.0:
resolution:
{
integrity: sha512-y6nxMGB1nMW9R6k96e5gdIFzcfL/gTJRNaqGes1YvkLnPVXzWgbqFF2yLC0T8G774n24cx3Pe8XrKoniCOAH+Q==,
}
tapable@2.3.2:
resolution:
{
@@ -15479,6 +15814,13 @@ packages:
}
engines: { node: ">=6" }
tapable@2.3.3:
resolution:
{
integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==,
}
engines: { node: ">=6" }
tar-stream@3.2.0:
resolution:
{
@@ -16822,6 +17164,8 @@ snapshots:
- bufferutil
- utf-8-validate
"@alloc/quick-lru@5.2.0": {}
"@ampproject/remapping@2.3.0":
dependencies:
"@jridgewell/gen-mapping": 0.3.13
@@ -21111,42 +21455,88 @@ snapshots:
source-map-js: 1.2.1
tailwindcss: 4.2.2
"@tailwindcss/node@4.3.0":
dependencies:
"@jridgewell/remapping": 2.3.5
enhanced-resolve: 5.22.0
jiti: 2.7.0
lightningcss: 1.32.0
magic-string: 0.30.21
source-map-js: 1.2.1
tailwindcss: 4.3.0
"@tailwindcss/oxide-android-arm64@4.2.2":
optional: true
"@tailwindcss/oxide-android-arm64@4.3.0":
optional: true
"@tailwindcss/oxide-darwin-arm64@4.2.2":
optional: true
"@tailwindcss/oxide-darwin-arm64@4.3.0":
optional: true
"@tailwindcss/oxide-darwin-x64@4.2.2":
optional: true
"@tailwindcss/oxide-darwin-x64@4.3.0":
optional: true
"@tailwindcss/oxide-freebsd-x64@4.2.2":
optional: true
"@tailwindcss/oxide-freebsd-x64@4.3.0":
optional: true
"@tailwindcss/oxide-linux-arm-gnueabihf@4.2.2":
optional: true
"@tailwindcss/oxide-linux-arm-gnueabihf@4.3.0":
optional: true
"@tailwindcss/oxide-linux-arm64-gnu@4.2.2":
optional: true
"@tailwindcss/oxide-linux-arm64-gnu@4.3.0":
optional: true
"@tailwindcss/oxide-linux-arm64-musl@4.2.2":
optional: true
"@tailwindcss/oxide-linux-arm64-musl@4.3.0":
optional: true
"@tailwindcss/oxide-linux-x64-gnu@4.2.2":
optional: true
"@tailwindcss/oxide-linux-x64-gnu@4.3.0":
optional: true
"@tailwindcss/oxide-linux-x64-musl@4.2.2":
optional: true
"@tailwindcss/oxide-linux-x64-musl@4.3.0":
optional: true
"@tailwindcss/oxide-wasm32-wasi@4.2.2":
optional: true
"@tailwindcss/oxide-wasm32-wasi@4.3.0":
optional: true
"@tailwindcss/oxide-win32-arm64-msvc@4.2.2":
optional: true
"@tailwindcss/oxide-win32-arm64-msvc@4.3.0":
optional: true
"@tailwindcss/oxide-win32-x64-msvc@4.2.2":
optional: true
"@tailwindcss/oxide-win32-x64-msvc@4.3.0":
optional: true
"@tailwindcss/oxide@4.2.2":
optionalDependencies:
"@tailwindcss/oxide-android-arm64": 4.2.2
@@ -21162,6 +21552,29 @@ snapshots:
"@tailwindcss/oxide-win32-arm64-msvc": 4.2.2
"@tailwindcss/oxide-win32-x64-msvc": 4.2.2
"@tailwindcss/oxide@4.3.0":
optionalDependencies:
"@tailwindcss/oxide-android-arm64": 4.3.0
"@tailwindcss/oxide-darwin-arm64": 4.3.0
"@tailwindcss/oxide-darwin-x64": 4.3.0
"@tailwindcss/oxide-freebsd-x64": 4.3.0
"@tailwindcss/oxide-linux-arm-gnueabihf": 4.3.0
"@tailwindcss/oxide-linux-arm64-gnu": 4.3.0
"@tailwindcss/oxide-linux-arm64-musl": 4.3.0
"@tailwindcss/oxide-linux-x64-gnu": 4.3.0
"@tailwindcss/oxide-linux-x64-musl": 4.3.0
"@tailwindcss/oxide-wasm32-wasi": 4.3.0
"@tailwindcss/oxide-win32-arm64-msvc": 4.3.0
"@tailwindcss/oxide-win32-x64-msvc": 4.3.0
"@tailwindcss/postcss@4.3.0":
dependencies:
"@alloc/quick-lru": 5.2.0
"@tailwindcss/node": 4.3.0
"@tailwindcss/oxide": 4.3.0
postcss: 8.5.15
tailwindcss: 4.3.0
"@tailwindcss/vite@4.2.2(vite@6.4.2(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.99.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.9.0))":
dependencies:
"@tailwindcss/node": 4.2.2
@@ -21908,10 +22321,40 @@ snapshots:
"@trpc/server": 11.16.0(typescript@5.9.3)
typescript: 5.9.3
"@trpc/client@11.17.0(@trpc/server@11.16.0(typescript@5.9.3))(typescript@5.9.3)":
dependencies:
"@trpc/server": 11.16.0(typescript@5.9.3)
typescript: 5.9.3
"@trpc/client@11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3)":
dependencies:
"@trpc/server": 11.17.0(typescript@5.9.3)
typescript: 5.9.3
"@trpc/react-query@11.17.0(@tanstack/react-query@5.96.2(react@19.2.4))(@trpc/client@11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.17.0(typescript@5.9.3))(react@19.2.4)(typescript@5.9.3)":
dependencies:
"@tanstack/react-query": 5.96.2(react@19.2.4)
"@trpc/client": 11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3)
"@trpc/server": 11.17.0(typescript@5.9.3)
react: 19.2.4
typescript: 5.9.3
"@trpc/server@11.16.0(typescript@5.9.3)":
dependencies:
typescript: 5.9.3
"@trpc/server@11.17.0(typescript@5.9.3)":
dependencies:
typescript: 5.9.3
"@trpc/tanstack-react-query@11.17.0(@tanstack/react-query@5.96.2(react@19.2.4))(@trpc/client@11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.17.0(typescript@5.9.3))(react@19.2.4)(typescript@5.9.3)":
dependencies:
"@tanstack/react-query": 5.96.2(react@19.2.4)
"@trpc/client": 11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3)
"@trpc/server": 11.17.0(typescript@5.9.3)
react: 19.2.4
typescript: 5.9.3
"@turbo/darwin-64@2.9.4":
optional: true
@@ -22845,7 +23288,7 @@ snapshots:
dotenv: 17.4.2
exsolve: 1.0.8
giget: 3.2.0
jiti: 2.6.1
jiti: 2.7.0
ohash: 2.0.11
pathe: 2.0.3
perfect-debounce: 2.1.0
@@ -23371,6 +23814,17 @@ snapshots:
dependencies:
type-fest: 5.6.0
dotenv-cli@11.0.0:
dependencies:
cross-spawn: 7.0.6
dotenv: 17.4.2
dotenv-expand: 12.0.3
minimist: 1.2.8
dotenv-expand@12.0.3:
dependencies:
dotenv: 16.6.1
dotenv@16.0.3: {}
dotenv@16.6.1: {}
@@ -23444,6 +23898,11 @@ snapshots:
graceful-fs: 4.2.11
tapable: 2.3.2
enhanced-resolve@5.22.0:
dependencies:
graceful-fs: 4.2.11
tapable: 2.3.3
entities@1.1.2: {}
entities@2.2.0: {}
@@ -25287,7 +25746,7 @@ snapshots:
get-port-please: 3.2.0
h3: 1.15.11
http-shutdown: 1.2.2
jiti: 2.6.1
jiti: 2.7.0
mlly: 1.8.2
node-forge: 1.4.0
pathe: 2.0.3
@@ -25758,6 +26217,8 @@ snapshots:
nanoid@3.3.11: {}
nanoid@3.3.12: {}
natural-compare@1.4.0: {}
neo-async@2.6.2: {}
@@ -26352,6 +26813,12 @@ snapshots:
picocolors: 1.1.1
source-map-js: 1.2.1
postcss@8.5.15:
dependencies:
nanoid: 3.3.12
picocolors: 1.1.1
source-map-js: 1.2.1
postcss@8.5.8:
dependencies:
nanoid: 3.3.11
@@ -27262,8 +27729,12 @@ snapshots:
tailwindcss@4.2.2: {}
tailwindcss@4.3.0: {}
tapable@2.3.2: {}
tapable@2.3.3: {}
tar-stream@3.2.0:
dependencies:
b4a: 1.8.1
@@ -27623,7 +28094,7 @@ snapshots:
dependencies:
citty: 0.1.6
defu: 6.1.7
jiti: 2.6.1
jiti: 2.7.0
knitwork: 1.3.0
scule: 1.3.0
@@ -28012,7 +28483,7 @@ snapshots:
acorn-import-phases: 1.0.4(acorn@8.16.0)
browserslist: 4.28.2
chrome-trace-event: 1.0.4
enhanced-resolve: 5.20.1
enhanced-resolve: 5.22.0
es-module-lexer: 2.1.0
eslint-scope: 5.1.1
events: 3.3.0
@@ -28022,7 +28493,7 @@ snapshots:
mime-db: 1.54.0
neo-async: 2.6.2
schema-utils: 4.3.3
tapable: 2.3.2
tapable: 2.3.3
terser-webpack-plugin: 5.5.0(webpack@5.106.2)
watchpack: 2.5.1
webpack-sources: 3.4.1