diff --git a/.gitignore b/.gitignore index 9965f5ca6..d7f66a11a 100644 --- a/.gitignore +++ b/.gitignore @@ -36,3 +36,6 @@ yarn-error.log* next-env.d.ts .env .env.example + +# turborepo +.turbo \ No newline at end of file diff --git a/README.md b/README.md index 26316054f..0861312fb 100644 --- a/README.md +++ b/README.md @@ -78,8 +78,6 @@ The current project goal is to [release a production ready version](https://g - To contribute please see our [contribution guide](https://github.com/documenso/documenso/blob/main/CONTRIBUTING.md). - - # Tech Documenso is built using awesome open source tech including: @@ -123,7 +121,7 @@ Want to get up and running quickly? Follow these steps: - This will spin up a postgres database and inbucket mail server in docker containers. - Run `npm run dev` in the root directory - Want it even faster? Just use - ```sh + ```sh npm run d ``` @@ -157,10 +155,10 @@ Follow these steps to setup documenso on you local machine: --- - Optional: Seed the database using npm run db-seed to create a test user and document -- Optional: Upload and sign apps/web/ressources/example.pdf manually to test your setup +- Optional: Upload and sign apps/web/resources/example.pdf manually to test your setup - Optional: Create your own signing certificate - - A demo certificate is provided in `/app/web/ressources/certificate.p12` + - A demo certificate is provided in `/app/web/resources/certificate.p12` - To generate your own using these steps and a Linux Terminal or Windows Subsystem for Linux (WSL) see **[Create your own signing certificate](#creating-your-own-signing-certificate)**. ## Updating @@ -185,7 +183,7 @@ For the digital signature of your documents you need a signing certificate in .p 3. Combine the private key and the self-signed certificate to create the p12 certificate. You can run the following command to do this: \ openssl pkcs12 -export -out certificate.p12 -inkey private.key -in certificate.crt 4. You will be prompted to enter a password for the p12 file. Choose a strong password and remember it, as you will need it to use the certificate (**can be empty for dev certificates**) -5. Place the certificate /apps/web/ressource/certificate.p12 +5. Place the certificate /apps/web/resources/certificate.p12 # Docker diff --git a/apps/web/components/layout.tsx b/apps/web/components/layout.tsx index 06a5bb2de..aa0fad8dc 100644 --- a/apps/web/components/layout.tsx +++ b/apps/web/components/layout.tsx @@ -3,11 +3,11 @@ import Link from "next/link"; import { useRouter } from "next/router"; import { NEXT_PUBLIC_WEBAPP_URL } from "@documenso/lib/constants"; import { useSubscription } from "@documenso/lib/stripe"; +import { BillingWarning } from "./billing-warning"; import Navigation from "./navigation"; import { PaperAirplaneIcon } from "@heroicons/react/24/outline"; import { SubscriptionStatus } from "@prisma/client"; import { useSession } from "next-auth/react"; -import { BillingWarning } from "./billing-warning"; function useRedirectToLoginIfUnauthenticated() { const { data: session, status } = useSession(); diff --git a/apps/web/pages/_app.tsx b/apps/web/pages/_app.tsx index cd5541cbb..a1193a681 100644 --- a/apps/web/pages/_app.tsx +++ b/apps/web/pages/_app.tsx @@ -1,6 +1,7 @@ import { ReactElement, ReactNode } from "react"; import { NextPage } from "next"; import type { AppProps } from "next/app"; +import { Montserrat, Qwigley } from "next/font/google"; import { SubscriptionProvider } from "@documenso/lib/stripe/providers/subscription-provider"; import "../../../node_modules/placeholder-loading/src/scss/placeholder-loading.scss"; import "../../../node_modules/react-resizable/css/styles.css"; @@ -11,6 +12,20 @@ import "react-tooltip/dist/react-tooltip.css"; export { coloredConsole } from "@documenso/lib"; +const montserrat = Montserrat({ + subsets: ["latin"], + weight: ["400", "700"], + display: "swap", + variable: "--font-sans", +}); + +const qwigley = Qwigley({ + subsets: ["latin"], + weight: ["400"], + display: "swap", + variable: "--font-qwigley", +}); + export type NextPageWithLayout

= NextPage & { getLayout?: (page: ReactElement) => ReactNode; }; @@ -27,8 +42,10 @@ export default function App({ return ( - - {getLayout()} +

+ + {getLayout()} +
); diff --git a/apps/web/ressources/certificate.p12 b/apps/web/resources/certificate.p12 similarity index 100% rename from apps/web/ressources/certificate.p12 rename to apps/web/resources/certificate.p12 diff --git a/apps/web/ressources/example.pdf b/apps/web/resources/example.pdf similarity index 100% rename from apps/web/ressources/example.pdf rename to apps/web/resources/example.pdf diff --git a/apps/web/styles/tailwind.css b/apps/web/styles/tailwind.css index 2ea56f9bf..fcae13ac3 100644 --- a/apps/web/styles/tailwind.css +++ b/apps/web/styles/tailwind.css @@ -6,35 +6,3 @@ min-height: 100%; } -html, -body, -:host { - font-family: montserrat; -} - -@font-face { - font-family: "Qwigley"; - src: url("/fonts/Qwigley-Regular.ttf"); -} - -/* latin */ -@font-face { - font-family: "Montserrat"; - font-style: normal; - font-weight: 400; - font-display: swap; - src: url("/fonts/montserrat.woff2") format("woff2"); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, - U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; -} - -/* latin */ -@font-face { - font-family: "Montserrat"; - font-style: normal; - font-weight: 700; - font-display: swap; - src: url("/fonts/montserrat.woff2") format("woff2"); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, - U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; -} diff --git a/apps/web/tailwind.config.js b/apps/web/tailwind.config.js index 89d211331..ee8e474dc 100644 --- a/apps/web/tailwind.config.js +++ b/apps/web/tailwind.config.js @@ -12,8 +12,8 @@ module.exports = { theme: { extend: { fontFamily: { - monteserrat: ["Monteserrat", "serif"], - qwigley: ["Qwigley", "serif"], + sans: ["var(--font-sans)", ...defaultTheme.fontFamily.sans], + qwigley: ["var(--font-qwigley)", "serif"], }, colors: { neon: { @@ -58,6 +58,19 @@ module.exports = { 900: "#000000", 950: "#000000", }, + brand: { + DEFAULT: "#A2E771", + 100: "#F4FCEE", + 200: "#E8F9DC", + 300: "#D1F3B9", + 400: "#BBED96", + 500: "#A2E771", + 600: "#8DE151", + 700: "#76DC2E", + 800: "#63C021", + 900: "#519D1B", + 950: "#488C18", + }, }, borderRadius: { "4xl": "2rem", diff --git a/package-lock.json b/package-lock.json index 3294ac71b..4e56abc72 100644 --- a/package-lock.json +++ b/package-lock.json @@ -40,6 +40,7 @@ "npm-run-all": "^4.1.5", "prettier": "^2.8.7", "prettier-plugin-tailwindcss": "^0.2.5", + "turbo": "^1.9.9", "typescript": "4.8.4" } }, @@ -7665,6 +7666,102 @@ "node": "*" } }, + "node_modules/turbo": { + "version": "1.9.9", + "resolved": "https://registry.npmjs.org/turbo/-/turbo-1.9.9.tgz", + "integrity": "sha512-+ZS66LOT7ahKHxh6XrIdcmf2Yk9mNpAbPEj4iF2cs0cAeaDU3xLVPZFF0HbSho89Uxwhx7b5HBgPbdcjQTwQkg==", + "dev": true, + "hasInstallScript": true, + "bin": { + "turbo": "bin/turbo" + }, + "optionalDependencies": { + "turbo-darwin-64": "1.9.9", + "turbo-darwin-arm64": "1.9.9", + "turbo-linux-64": "1.9.9", + "turbo-linux-arm64": "1.9.9", + "turbo-windows-64": "1.9.9", + "turbo-windows-arm64": "1.9.9" + } + }, + "node_modules/turbo-darwin-64": { + "version": "1.9.9", + "resolved": "https://registry.npmjs.org/turbo-darwin-64/-/turbo-darwin-64-1.9.9.tgz", + "integrity": "sha512-UDGM9E21eCDzF5t1F4rzrjwWutcup33e7ZjNJcW/mJDPorazZzqXGKEPIy9kXwKhamUUXfC7668r6ZuA1WXF2Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/turbo-darwin-arm64": { + "version": "1.9.9", + "resolved": "https://registry.npmjs.org/turbo-darwin-arm64/-/turbo-darwin-arm64-1.9.9.tgz", + "integrity": "sha512-VyfkXzTJpYLTAQ9krq2myyEq7RPObilpS04lgJ4OO1piq76RNmSpX9F/t9JCaY9Pj/4TL7i0d8PM7NGhwEA5Ag==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/turbo-linux-64": { + "version": "1.9.9", + "resolved": "https://registry.npmjs.org/turbo-linux-64/-/turbo-linux-64-1.9.9.tgz", + "integrity": "sha512-Fu1MY29Odg8dHOqXcpIIGC3T63XLOGgnGfbobXMKdrC7JQDvtJv8TUCYciRsyknZYjyyKK1z6zKuYIiDjf3KeQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/turbo-linux-arm64": { + "version": "1.9.9", + "resolved": "https://registry.npmjs.org/turbo-linux-arm64/-/turbo-linux-arm64-1.9.9.tgz", + "integrity": "sha512-50LI8NafPuJxdnMCBeDdzgyt1cgjQG7FwkyY336v4e95WJPUVjrHdrKH6jYXhOUyrv9+jCJxwX1Yrg02t5yJ1g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/turbo-windows-64": { + "version": "1.9.9", + "resolved": "https://registry.npmjs.org/turbo-windows-64/-/turbo-windows-64-1.9.9.tgz", + "integrity": "sha512-9IsTReoLmQl1IRsy3WExe2j2RKWXQyXujfJ4fXF+jp08KxjVF4/tYP2CIRJx/A7UP/7keBta27bZqzAjsmbSTA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/turbo-windows-arm64": { + "version": "1.9.9", + "resolved": "https://registry.npmjs.org/turbo-windows-arm64/-/turbo-windows-arm64-1.9.9.tgz", + "integrity": "sha512-CUu4hpeQo68JjDr0V0ygTQRLbS+/sNfdqEVV+Xz9136vpKn2WMQLAuUBVZV0Sp0S/7i+zGnplskT0fED+W46wQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", @@ -13859,6 +13956,62 @@ "safe-buffer": "^5.0.1" } }, + "turbo": { + "version": "1.9.9", + "resolved": "https://registry.npmjs.org/turbo/-/turbo-1.9.9.tgz", + "integrity": "sha512-+ZS66LOT7ahKHxh6XrIdcmf2Yk9mNpAbPEj4iF2cs0cAeaDU3xLVPZFF0HbSho89Uxwhx7b5HBgPbdcjQTwQkg==", + "dev": true, + "requires": { + "turbo-darwin-64": "1.9.9", + "turbo-darwin-arm64": "1.9.9", + "turbo-linux-64": "1.9.9", + "turbo-linux-arm64": "1.9.9", + "turbo-windows-64": "1.9.9", + "turbo-windows-arm64": "1.9.9" + } + }, + "turbo-darwin-64": { + "version": "1.9.9", + "resolved": "https://registry.npmjs.org/turbo-darwin-64/-/turbo-darwin-64-1.9.9.tgz", + "integrity": "sha512-UDGM9E21eCDzF5t1F4rzrjwWutcup33e7ZjNJcW/mJDPorazZzqXGKEPIy9kXwKhamUUXfC7668r6ZuA1WXF2Q==", + "dev": true, + "optional": true + }, + "turbo-darwin-arm64": { + "version": "1.9.9", + "resolved": "https://registry.npmjs.org/turbo-darwin-arm64/-/turbo-darwin-arm64-1.9.9.tgz", + "integrity": "sha512-VyfkXzTJpYLTAQ9krq2myyEq7RPObilpS04lgJ4OO1piq76RNmSpX9F/t9JCaY9Pj/4TL7i0d8PM7NGhwEA5Ag==", + "dev": true, + "optional": true + }, + "turbo-linux-64": { + "version": "1.9.9", + "resolved": "https://registry.npmjs.org/turbo-linux-64/-/turbo-linux-64-1.9.9.tgz", + "integrity": "sha512-Fu1MY29Odg8dHOqXcpIIGC3T63XLOGgnGfbobXMKdrC7JQDvtJv8TUCYciRsyknZYjyyKK1z6zKuYIiDjf3KeQ==", + "dev": true, + "optional": true + }, + "turbo-linux-arm64": { + "version": "1.9.9", + "resolved": "https://registry.npmjs.org/turbo-linux-arm64/-/turbo-linux-arm64-1.9.9.tgz", + "integrity": "sha512-50LI8NafPuJxdnMCBeDdzgyt1cgjQG7FwkyY336v4e95WJPUVjrHdrKH6jYXhOUyrv9+jCJxwX1Yrg02t5yJ1g==", + "dev": true, + "optional": true + }, + "turbo-windows-64": { + "version": "1.9.9", + "resolved": "https://registry.npmjs.org/turbo-windows-64/-/turbo-windows-64-1.9.9.tgz", + "integrity": "sha512-9IsTReoLmQl1IRsy3WExe2j2RKWXQyXujfJ4fXF+jp08KxjVF4/tYP2CIRJx/A7UP/7keBta27bZqzAjsmbSTA==", + "dev": true, + "optional": true + }, + "turbo-windows-arm64": { + "version": "1.9.9", + "resolved": "https://registry.npmjs.org/turbo-windows-arm64/-/turbo-windows-arm64-1.9.9.tgz", + "integrity": "sha512-CUu4hpeQo68JjDr0V0ygTQRLbS+/sNfdqEVV+Xz9136vpKn2WMQLAuUBVZV0Sp0S/7i+zGnplskT0fED+W46wQ==", + "dev": true, + "optional": true + }, "tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", diff --git a/package.json b/package.json index 9c2a55c14..d5790a9e7 100644 --- a/package.json +++ b/package.json @@ -2,9 +2,9 @@ "name": "documenso-monorepo", "version": "0.0.0", "scripts": { - "dev": "npm run dev -w apps/web", - "build": "npm i && cd apps && cd web && npm i && next build", - "start": "cd apps && cd web && next start", + "dev": "turbo run dev --filter=web", + "build": "turbo run build --filter=web", + "start": "turbo run start --filter=web", "db-migrate:dev": "prisma migrate dev", "db-seed": "prisma db seed", "db-studio": "prisma studio", @@ -52,6 +52,7 @@ "npm-run-all": "^4.1.5", "prettier": "^2.8.7", "prettier-plugin-tailwindcss": "^0.2.5", + "turbo": "^1.9.9", "typescript": "4.8.4" } -} \ No newline at end of file +} diff --git a/packages/lib/server/getServerErrorFromUnknown.ts b/packages/lib/server/getServerErrorFromUnknown.ts index 8a4823082..fa53e8585 100644 --- a/packages/lib/server/getServerErrorFromUnknown.ts +++ b/packages/lib/server/getServerErrorFromUnknown.ts @@ -1,5 +1,5 @@ import { HttpError } from "@documenso/lib/server"; -import { NotFoundError, PrismaClientKnownRequestError } from "@prisma/client/runtime"; +import { PrismaClientKnownRequestError } from "@prisma/client/runtime/library"; export function getServerErrorFromUnknown(cause: unknown): HttpError { // Error was manually thrown and does not need to be parsed. @@ -18,7 +18,7 @@ export function getServerErrorFromUnknown(cause: unknown): HttpError { return new HttpError({ statusCode: 400, message: cause.message, cause }); } - if (cause instanceof NotFoundError) { + if (cause instanceof PrismaClientKnownRequestError) { return new HttpError({ statusCode: 404, message: cause.message, cause }); } diff --git a/packages/signing/addDigitalSignature.ts b/packages/signing/addDigitalSignature.ts index f4f565c8f..8bd219bb5 100644 --- a/packages/signing/addDigitalSignature.ts +++ b/packages/signing/addDigitalSignature.ts @@ -10,7 +10,7 @@ export const addDigitalSignature = async (documentAsBase64: string): Promise