Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add tRPC #614

Merged
merged 48 commits into from Sep 27, 2021
Merged
Show file tree
Hide file tree
Changes from 9 commits
Commits
Show all changes
48 commits
Select commit Hold shift + click to select a range
c022e65
add trpc
KATT Sep 9, 2021
7defa9a
trpc specific
KATT Sep 9, 2021
19fad6e
fix deps
KATT Sep 9, 2021
a551268
lint fix
KATT Sep 9, 2021
e6f2d25
upgrade prisma
KATT Sep 9, 2021
51b0c57
nativeTypes
KATT Sep 9, 2021
b566a76
nope, not needed
KATT Sep 9, 2021
e53fdfd
fix app propviders
KATT Sep 9, 2021
80127dc
Revert "upgrade prisma"
KATT Sep 9, 2021
4c37b02
Merge remote-tracking branch 'origin/main' into feature/trpc
KATT Sep 14, 2021
1f82698
rev
KATT Sep 14, 2021
d6e0eb9
Merge remote-tracking branch 'origin/main' into feature/trpc
KATT Sep 22, 2021
413aa07
up trpc
KATT Sep 22, 2021
436acf4
simplify
KATT Sep 22, 2021
9db932d
wip - bookings page with trpc
KATT Sep 22, 2021
7c35b07
bookings using trpc
KATT Sep 22, 2021
82d9fd8
fix `Shell` props
KATT Sep 22, 2021
94e7420
call it viewerRouter instead
KATT Sep 22, 2021
1551d40
cleanuop
KATT Sep 22, 2021
87636a5
ssg helper
KATT Sep 23, 2021
27df433
Merge remote-tracking branch 'origin/main' into feature/trpc
KATT Sep 23, 2021
2527c30
fix lint
KATT Sep 23, 2021
9307a3e
fix types
KATT Sep 23, 2021
a140770
Merge branch 'main' into feature/trpc
kodiakhq[bot] Sep 23, 2021
e9554c4
skip
KATT Sep 23, 2021
5042105
Merge branch 'main' into feature/trpc
kodiakhq[bot] Sep 23, 2021
c4591a9
Merge branch 'main' into feature/trpc
kodiakhq[bot] Sep 23, 2021
d01a8e0
Merge branch 'main' into feature/trpc
kodiakhq[bot] Sep 23, 2021
38dfd4a
Merge branch 'main' into feature/trpc
kodiakhq[bot] Sep 23, 2021
53973a0
Merge branch 'main' into feature/trpc
kodiakhq[bot] Sep 23, 2021
cf5e6e6
Merge branch 'main' into feature/trpc
kodiakhq[bot] Sep 23, 2021
43a9a36
Merge branch 'main' into feature/trpc
kodiakhq[bot] Sep 23, 2021
95a31ed
Merge branch 'main' into feature/trpc
kodiakhq[bot] Sep 23, 2021
8e925cb
Merge branch 'main' into feature/trpc
kodiakhq[bot] Sep 23, 2021
63489bd
Merge branch 'main' into feature/trpc
kodiakhq[bot] Sep 23, 2021
39e923f
Merge branch 'main' into feature/trpc
kodiakhq[bot] Sep 23, 2021
62b1f8c
Merge branch 'main' into feature/trpc
kodiakhq[bot] Sep 23, 2021
ed886c8
add `useRedirectToLoginIfUnauthenticated`
KATT Sep 24, 2021
881e53f
exhaustive-deps
KATT Sep 24, 2021
2028c02
fix callbackUrl
KATT Sep 24, 2021
d7211c0
rewrite `/availability` using trpc
KATT Sep 24, 2021
ebe57e8
Merge remote-tracking branch 'origin/main' into feature/trpc
KATT Sep 24, 2021
68c6bd5
Merge branch 'main' into feature/trpc
kodiakhq[bot] Sep 24, 2021
a3a6cfd
Merge branch 'main' into feature/trpc
kodiakhq[bot] Sep 24, 2021
fb10bea
Merge branch 'main' into feature/trpc
kodiakhq[bot] Sep 24, 2021
383164e
Merge remote-tracking branch 'origin/main' into feature/trpc
KATT Sep 27, 2021
e2b4b80
9.8.0
KATT Sep 27, 2021
a598cf3
remove some leftovers
KATT Sep 27, 2021
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
48 changes: 36 additions & 12 deletions lib/app-providers.tsx
@@ -1,21 +1,45 @@
import React from "react";
import { createTelemetryClient, TelemetryProvider } from "@lib/telemetry";
import { httpBatchLink } from "@trpc/client/links/httpBatchLink";
import { loggerLink } from "@trpc/client/links/loggerLink";
import { withTRPC } from "@trpc/next";
import { Provider } from "next-auth/client";
import { QueryClient, QueryClientProvider } from "react-query";
import { Hydrate } from "react-query/hydration";

export const queryClient = new QueryClient();
import { AppProps } from "next/dist/shared/lib/router/router";
import React from "react";

const AppProviders: React.FC = (props, pageProps) => {
const AppProviders = (props: AppProps) => {
return (
<TelemetryProvider value={createTelemetryClient()}>
<QueryClientProvider client={queryClient}>
<Hydrate state={pageProps.dehydratedState}>
<Provider session={pageProps.session}>{props.children}</Provider>
</Hydrate>
</QueryClientProvider>
<Provider session={props.pageProps.session}>{props.children}</Provider>
</TelemetryProvider>
);
};

export default AppProviders;
export default withTRPC({
config() {
/**
* If you want to use SSR, you need to use the server's full URL
* @link https://trpc.io/docs/ssr
*/
return {
/**
* @link https://trpc.io/docs/links
*/
links: [
// adds pretty logs to your console in development and logs errors in production
loggerLink({
enabled: (opts) =>
process.env.NODE_ENV === "development" ||
(opts.direction === "down" && opts.result instanceof Error),
}),
httpBatchLink({
url: `/api/trpc`,
}),
],
/**
* @link https://react-query.tanstack.com/reference/QueryClient
*/
queryClientConfig: { defaultOptions: { queries: { staleTime: 6000 } } },
};
},
ssr: false,
})(AppProviders);
29 changes: 29 additions & 0 deletions lib/trpc.ts
@@ -0,0 +1,29 @@
import { createReactQueryHooks } from "@trpc/react";
import type { inferProcedureOutput, inferProcedureInput } from "@trpc/server";

// ℹ️ Type-only import:
// https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-8.html#type-only-imports-and-export
import type { AppRouter } from "@server/routers/_app";

/**
* A set of strongly-typed React hooks from your `AppRouter` type signature with `createReactQueryHooks`.
* @link https://trpc.io/docs/react#3-create-trpc-hooks
*/
export const trpc = createReactQueryHooks<AppRouter>();

// export const transformer = superjson;
/**
* This is a helper method to infer the output of a query resolver
* @example type HelloOutput = inferQueryOutput<'hello'>
*/
export type inferQueryOutput<TRouteKey extends keyof AppRouter["_def"]["queries"]> = inferProcedureOutput<
AppRouter["_def"]["queries"][TRouteKey]
>;

export type inferQueryInput<TRouteKey extends keyof AppRouter["_def"]["queries"]> = inferProcedureInput<
AppRouter["_def"]["queries"][TRouteKey]
>;

export type inferMutationInput<TRouteKey extends keyof AppRouter["_def"]["mutations"]> = inferProcedureInput<
AppRouter["_def"]["mutations"][TRouteKey]
>;
9 changes: 7 additions & 2 deletions package.json
Expand Up @@ -34,6 +34,10 @@
"@radix-ui/react-switch": "^0.0.15",
"@radix-ui/react-tooltip": "^0.0.21",
"@tailwindcss/forms": "^0.3.3",
"@trpc/client": "^9.4.0",
"@trpc/next": "^9.4.0",
"@trpc/react": "^9.4.0",
"@trpc/server": "^9.4.0",
"async": "^3.2.1",
"bcryptjs": "^2.4.3",
"classnames": "^2.3.1",
Expand All @@ -59,13 +63,14 @@
"react-hot-toast": "^2.1.0",
"react-multi-email": "^0.5.3",
"react-phone-number-input": "^3.1.25",
"react-query": "^3.21.0",
"react-query": "^3.23.1",
"react-select": "^4.3.1",
"react-timezone-select": "^1.0.7",
"short-uuid": "^4.2.0",
"tsdav": "^1.0.6",
"tslog": "^3.2.1",
"uuid": "^8.3.2"
"uuid": "^8.3.2",
"zod": "^3.8.2"
},
"devDependencies": {
"@types/bcryptjs": "^2.4.2",
Expand Down
6 changes: 5 additions & 1 deletion pages/[user].tsx
Expand Up @@ -4,14 +4,18 @@ import Theme from "@components/Theme";
import { ArrowRightIcon } from "@heroicons/react/outline";
import { ClockIcon, InformationCircleIcon, UserIcon } from "@heroicons/react/solid";
import prisma from "@lib/prisma";
import { trpc } from "@lib/trpc";
import { inferSSRProps } from "@lib/types/inferSSRProps";
import { GetServerSidePropsContext } from "next";
import Link from "next/link";
import React from "react";

export default function User(props: inferSSRProps<typeof getServerSideProps>) {
const { isReady } = Theme(props.user.theme);

// FIXME delete me before merge
const query1 = trpc.useQuery(["test.hello"]);
const query2 = trpc.useQuery(["test.hello", "alex"]);
console.log("result", { query1, query2 });
KATT marked this conversation as resolved.
Show resolved Hide resolved
return (
<>
<HeadSeo
Expand Down
5 changes: 3 additions & 2 deletions pages/_app.tsx
Expand Up @@ -10,9 +10,10 @@ export type AppProps = NextAppProps & {
err?: Error;
};

function MyApp({ Component, pageProps, err }: AppProps) {
function MyApp(props: AppProps) {
const { Component, pageProps, err } = props;
return (
<AppProviders>
<AppProviders {...props}>
<DefaultSeo {...seoConfig.defaultNextSeo} />
<Component {...pageProps} err={err} />
</AppProviders>
Expand Down
35 changes: 35 additions & 0 deletions pages/api/trpc/[trpc].ts
@@ -0,0 +1,35 @@
/**
* This file contains tRPC's HTTP response handler
*/
import * as trpcNext from "@trpc/server/adapters/next";
import { appRouter } from "@server/routers/_app";
import { createContext } from "@server/createContext";

export default trpcNext.createNextApiHandler({
router: appRouter,
/**
* @link https://trpc.io/docs/context
*/
createContext,
/**
* @link https://trpc.io/docs/error-handling
*/
onError({ error }) {
if (error.code === "INTERNAL_SERVER_ERROR") {
// send to bug reporting
console.error("Something went wrong", error);
}
},
/**
* Enable query batching
*/
batching: {
enabled: true,
},
/**
* @link https://trpc.io/docs/caching#api-response-caching
*/
// responseMeta() {
// // ...
// },
});
16 changes: 9 additions & 7 deletions prisma/schema.prisma
Expand Up @@ -4,6 +4,8 @@
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")


}

generator client {
Expand Down Expand Up @@ -83,13 +85,13 @@ model User {
}

model Team {
id Int @default(autoincrement()) @id
name String?
slug String? @unique
logo String?
bio String?
hideBranding Boolean @default(false)
members Membership[]
id Int @id @default(autoincrement())
name String?
slug String? @unique
logo String?
bio String?
hideBranding Boolean @default(false)
members Membership[]
}

enum MembershipRole {
Expand Down
17 changes: 17 additions & 0 deletions server/createContext.ts
@@ -0,0 +1,17 @@
/* eslint-disable @typescript-eslint/no-unused-vars */
import * as trpc from "@trpc/server";
import * as trpcNext from "@trpc/server/adapters/next";
import prisma from "@lib/prisma";

/**
* Creates context for an incoming request
* @link https://trpc.io/docs/context
*/
export const createContext = async ({ req, res }: trpcNext.CreateNextContextOptions) => {
// for API-response caching see https://trpc.io/docs/caching
return {
prisma,
};
};

export type Context = trpc.inferAsyncReturnType<typeof createContext>;
9 changes: 9 additions & 0 deletions server/createRouter.ts
@@ -0,0 +1,9 @@
import * as trpc from "@trpc/server";
import { Context } from "./createContext";

/**
* Helper function to create a router with context
*/
export function createRouter() {
return trpc.router<Context>();
}
26 changes: 26 additions & 0 deletions server/routers/_app.ts
@@ -0,0 +1,26 @@
/**
* This file contains the root router of your tRPC-backend
*/
import { createRouter } from "../createRouter";
import { testRouter } from "./test";

/**
* Create your application's root router
* If you want to use SSG, you need export this
* @link https://trpc.io/docs/ssg
* @link https://trpc.io/docs/router
*/
export const appRouter = createRouter()
/**
* Add data transformers
* @link https://trpc.io/docs/data-transformers
*/
// .transformer(superjson)
/**
* Optionally do custom error (type safe!) formatting
* @link https://trpc.io/docs/error-formatting
*/
// .formatError(({ shape, error }) => { })
.merge("test.", testRouter);

export type AppRouter = typeof appRouter;
9 changes: 9 additions & 0 deletions server/routers/test.tsx
@@ -0,0 +1,9 @@
import { createRouter } from "../createRouter";
import { z } from "zod";

export const testRouter = createRouter().query("hello", {
input: z.string().nullish(),
resolve({ input }) {
return input ?? "world";
},
});
10 changes: 10 additions & 0 deletions server/ssg.ts
@@ -0,0 +1,10 @@
import prisma from "@lib/prisma";
import { createSSGHelpers } from "@trpc/react/ssg";
import { appRouter } from "./routers/_app";

export const ssg = createSSGHelpers({
router: appRouter,
ctx: {
prisma,
},
});
3 changes: 2 additions & 1 deletion tsconfig.json
Expand Up @@ -5,7 +5,8 @@
"baseUrl": ".",
"paths": {
"@components/*": ["components/*"],
"@lib/*": ["lib/*"]
"@lib/*": ["lib/*"],
"@server/*": ["server/*"]
},
"allowJs": true,
"skipLibCheck": true,
Expand Down
59 changes: 56 additions & 3 deletions yarn.lock
Expand Up @@ -251,6 +251,13 @@
dependencies:
regenerator-runtime "^0.13.4"

"@babel/runtime@^7.9.0":
version "7.15.4"
resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.15.4.tgz#fd17d16bfdf878e6dd02d19753a39fa8a8d9c84a"
integrity sha512-99catp6bHCaxr4sJ/DbTGgHS4+Rs2RVd2g7iOap6SLGPDknRK9ztKNsE/Fg6QhSeh1FGE5f6gHGQmvvn3I3xhw==
dependencies:
regenerator-runtime "^0.13.4"

"@babel/template@^7.14.5", "@babel/template@^7.3.3":
version "7.14.5"
resolved "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz#a9bc9d8b33354ff6e55a9c60d1109200a68974f4"
Expand Down Expand Up @@ -1165,6 +1172,41 @@
version "1.1.2"
resolved "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82"

"@trpc/client@^9.4.0":
version "9.4.0"
resolved "https://registry.npmjs.org/@trpc/client/-/client-9.4.0.tgz#8f19208ce2d33f8b3d1f4af72180964858fbcecd"
integrity sha512-6hdkArkcphIymIkl9M3qYqXWXDFHRfqokPXklV5h3iY8zUf9zAmIKe83nJOFWXkfWTszi7rNNryInGhVlcu8Uw==
dependencies:
"@babel/runtime" "^7.9.0"
"@trpc/server" "^9.4.0"

"@trpc/next@^9.4.0":
version "9.4.0"
resolved "https://registry.npmjs.org/@trpc/next/-/next-9.4.0.tgz#4cb1af430adb23445371712d1da4be47ba191c42"
integrity sha512-Z6Z4TItZi1CaSslfe8OaEUQjIocwcpQvl0LjABFJ5Br5lbgMZuTeagUid3tSx3lusg1BYlXMHvYqj3TyzH2Aaw==
dependencies:
"@babel/runtime" "^7.9.0"
"@trpc/client" "^9.4.0"
"@trpc/react" "^9.4.0"
"@trpc/server" "^9.4.0"
react-ssr-prepass "^1.4.0"

"@trpc/react@^9.4.0":
version "9.4.0"
resolved "https://registry.npmjs.org/@trpc/react/-/react-9.4.0.tgz#747a1c3dc974487ee63c56e0eea06214e2a64d7a"
integrity sha512-4LnOEz4meXXoDmc27cRZNxNoGaHSzt6i8iup6hLCwb1OC5CqU1ae4xXf6I8ot5m7gN7sv6GHTi0C4pGmeOPwQQ==
dependencies:
"@babel/runtime" "^7.9.0"
"@trpc/client" "^9.4.0"
"@trpc/server" "^9.4.0"

"@trpc/server@^9.4.0":
version "9.4.0"
resolved "https://registry.npmjs.org/@trpc/server/-/server-9.4.0.tgz#4c686be44b05526521cb178b47f0ec2f21026872"
integrity sha512-bh9f06CNTnAVXIs+g3dojq/lEDwN+dBuNBfhpjLzxbYakhUeivBtOMVD4E/vGWWTCTj6yVJxk3RC+xB6YfrAGg==
dependencies:
tslib "^2.1.0"

"@tsconfig/node10@^1.0.7":
version "1.0.8"
resolved "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz#c1e4e80d6f964fbecb3359c43bd48b40f7cadad9"
Expand Down Expand Up @@ -5783,9 +5825,10 @@ react-portal@^4.2.0:
dependencies:
prop-types "^15.5.8"

react-query@^3.21.0:
version "3.21.0"
resolved "https://registry.yarnpkg.com/react-query/-/react-query-3.21.0.tgz#2e099a7906c38eeeb750e8b9b12121a21fa8d9ef"
react-query@^3.23.1:
version "3.23.1"
resolved "https://registry.npmjs.org/react-query/-/react-query-3.23.1.tgz#cde2d268958716d34a23e62aabba668752ba8f95"
integrity sha512-pq0vEwB5PNGvkWJNUk0qPpsxcDmhzY80ZLNPLIVQJ3k2UyXoGccPTrgOIj4Kz2TrMfgvRBTNwiSxHdaW7Sl0WQ==
dependencies:
"@babel/runtime" "^7.5.5"
broadcast-channel "^3.4.1"
Expand Down Expand Up @@ -5824,6 +5867,11 @@ react-select@^4.3.1:
react-input-autosize "^3.0.0"
react-transition-group "^4.3.0"

react-ssr-prepass@^1.4.0:
version "1.4.0"
resolved "https://registry.npmjs.org/react-ssr-prepass/-/react-ssr-prepass-1.4.0.tgz#33a3db19414f0f8f9f3f781c88f760ae366b4f51"
integrity sha512-0SzdmiQUtHvhxCabHg9BI/pkJfijGkQ0jQL6fC4YFy7idaDOuaiQLsajIkkNxffFXtJFHIWFITlve2WB88e0Jw==

react-style-singleton@^2.1.0:
version "2.1.1"
resolved "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.1.1.tgz#ce7f90b67618be2b6b94902a30aaea152ce52e66"
Expand Down Expand Up @@ -7182,3 +7230,8 @@ zen-observable-ts@^1.0.0:
zen-observable@0.8.15:
version "0.8.15"
resolved "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.15.tgz#96415c512d8e3ffd920afd3889604e30b9eaac15"

zod@^3.8.2:
version "3.8.2"
resolved "https://registry.npmjs.org/zod/-/zod-3.8.2.tgz#f25b78bc76e64f31318d242e301c23d3d610b7a1"
integrity sha512-kpwVRACazsOhELVt5h4R2pC2OndrqaBK4+z134TWOsnzn7n2uOYnSyvx0QAn410pl28CgVtkSi5ew7e/AgO0oA==