build: migrate from npm to pnpm with workspace catalogs

- Switch package manager to pnpm 10 via corepack
- Add pnpm-workspace.yaml with 54+ shared dependency catalogs
- Convert all workspace packages to catalog: and workspace:* protocols
- Upgrade Turborepo from 1.x to 2.8.12 (pipeline -> tasks)
- Upgrade apps/openpage-api from Next 15 to Next 16
- Update Docker, CI workflows, and GitHub Actions for pnpm
- Convert patch file to pnpm native format
- Replace deprecated next lint with standalone eslint
- Update all documentation references from npm to pnpm
- Fix stale dependabot config and documentation paths
This commit is contained in:
Lucas Smith 2026-03-01 00:01:57 +11:00
parent 1ff8680c32
commit 960217c78d
54 changed files with 23522 additions and 37744 deletions

View file

@ -1,4 +1,4 @@
name: 'Setup node and cache node_modules'
name: 'Setup node and install dependencies with pnpm'
inputs:
node_version:
required: false
@ -7,33 +7,19 @@ inputs:
runs:
using: 'composite'
steps:
- name: Install pnpm
uses: pnpm/action-setup@v4
- name: Set up Node ${{ inputs.node_version }}
uses: actions/setup-node@v4
with:
node-version: ${{ inputs.node_version }}
- name: Cache npm
uses: actions/cache@v3
with:
path: ~/.npm
key: npm-${{ hashFiles('package-lock.json') }}
restore-keys: npm-
- name: Cache node_modules
uses: actions/cache@v3
id: cache-node-modules
with:
path: |
node_modules
packages/*/node_modules
apps/*/node_modules
key: modules-${{ hashFiles('package-lock.json') }}
cache: 'pnpm'
- name: Install dependencies
if: steps.cache-node-modules.outputs.cache-hit != 'true'
shell: bash
run: |
npm ci --no-audit
npm run prisma:generate
pnpm install --frozen-lockfile
pnpm run prisma:generate
env:
HUSKY: '0'

View file

@ -10,10 +10,10 @@ runs:
path: |
~/.cache/ms-playwright
${{ github.workspace }}/node_modules/playwright
key: playwright-${{ hashFiles('**/package-lock.json') }}
key: playwright-${{ hashFiles('**/pnpm-lock.yaml') }}
restore-keys: playwright-
- name: Install playwright
if: steps.cache-playwright.outputs.cache-hit != 'true'
run: npx playwright install --with-deps
run: pnpm exec playwright install --with-deps
shell: bash

View file

@ -12,11 +12,10 @@ updates:
open-pull-requests-limit: 0
- package-ecosystem: 'npm'
directory: '/apps/web'
directory: '/'
schedule:
interval: 'weekly'
target-branch: 'main'
labels:
- 'npm dependencies'
- 'frontend'
- 'dependencies'
open-pull-requests-limit: 0

View file

@ -27,7 +27,7 @@ jobs:
run: cp .env.example .env
- name: Build app
run: npm run build
run: pnpm run build
build_docker:
name: Build Docker Image

View file

@ -31,7 +31,7 @@ jobs:
- uses: ./.github/actions/node-install
- name: Build app
run: npm run build
run: pnpm run build
- name: Initialize CodeQL
uses: github/codeql-action/init@v3

View file

@ -23,21 +23,21 @@ jobs:
- uses: ./.github/actions/node-install
- name: Start Services
run: npm run dx:up
run: pnpm run dx:up
- uses: ./.github/actions/playwright-install
- name: Create the database
run: npm run prisma:migrate-dev
run: pnpm run prisma:migrate-dev
- name: Seed the database
run: npm run prisma:seed
run: pnpm run prisma:seed
- name: Install playwright browsers
run: npx playwright install --with-deps
run: pnpm exec playwright install --with-deps
- name: Run Playwright tests
run: npm run ci
run: pnpm run ci
env:
# Needed since we use next start which will set the NODE_ENV to production
NEXT_PRIVATE_SIGNING_LOCAL_FILE_PATH: './example/cert.p12'

View file

@ -20,8 +20,6 @@ jobs:
uses: actions/setup-node@v4
with:
node-version: '18'
cache: npm
- name: Install Octokit
run: npm install @octokit/rest@18

View file

@ -20,7 +20,6 @@ jobs:
uses: actions/setup-node@v4
with:
node-version: '18'
cache: npm
- name: Install Octokit
run: npm install @octokit/rest@18

View file

@ -29,7 +29,7 @@ jobs:
- name: Compile translations
id: compile_translations
run: npm run translate:compile -- -- --strict
run: pnpm run translate:compile -- -- --strict
continue-on-error: true
- name: Pull translations from Crowdin

View file

@ -25,7 +25,7 @@ jobs:
- uses: ./.github/actions/node-install
- name: Extract translations
run: npm run translate:extract
run: pnpm run translate:extract
- name: Commit changes and push to reserved branch
env:
@ -78,7 +78,7 @@ jobs:
- name: Compile translations
id: compile_translations
run: npm run translate:compile -- -- --strict
run: pnpm run translate:compile -- -- --strict
continue-on-error: true
- name: Upload missing translations

4
.gitignore vendored
View file

@ -20,9 +20,7 @@ build
*.pem
# debug
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
# local env files
.env

5
.npmrc
View file

@ -1,2 +1,3 @@
legacy-peer-deps = true
prefer-dedupe = true
# Hoist packages that expect to be resolvable from any workspace.
# Start strict, add patterns here only as needed.
shamefully-hoist=true

View file

@ -24,8 +24,8 @@ Run these commands to understand where the previous session left off:
```bash
git status # See uncommitted changes
git log --oneline -10 # See recent commits
npm run typecheck -w @documenso/remix # Check for type errors
npm run lint:fix # Check for linting issues
pnpm run typecheck -w @documenso/remix # Check for type errors
pnpm run lint:fix # Check for linting issues
```
Review the code that's already been written to understand:
@ -67,9 +67,9 @@ Review the code that's already been written to understand:
Work continuously through these steps:
1. **Implement** - Write the code for the current task
2. **Typecheck** - Run `npm run typecheck -w @documenso/remix` to verify types
3. **Lint** - Run `npm run lint:fix` to fix linting issues
4. **Test** - If non-trivial, run E2E tests: `npm run test:dev -w @documenso/app-tests`
2. **Typecheck** - Run `pnpm run typecheck -w @documenso/remix` to verify types
3. **Lint** - Run `pnpm run lint:fix` to fix linting issues
4. **Test** - If non-trivial, run E2E tests: `pnpm run test:dev -w @documenso/app-tests`
5. **Fix** - If tests fail, fix and re-run
6. **Repeat** - Move to next task
@ -93,18 +93,18 @@ Work continuously through these steps:
```bash
# Type checking
npm run typecheck -w @documenso/remix
pnpm run typecheck -w @documenso/remix
# Linting
npm run lint:fix
pnpm run lint:fix
# E2E Tests (only for non-trivial work)
npm run test:dev -w @documenso/app-tests # Run E2E tests in dev mode
npm run test-ui:dev -w @documenso/app-tests # Run E2E tests with UI
npm run test:e2e # Run full E2E test suite
pnpm run test:dev -w @documenso/app-tests # Run E2E tests in dev mode
pnpm run test-ui:dev -w @documenso/app-tests # Run E2E tests with UI
pnpm run test:e2e # Run full E2E test suite
# Development
npm run dev # Start dev server
pnpm run dev # Start dev server
```
## Begin

View file

@ -14,6 +14,7 @@ You are creating a new justification file in the `.agents/justifications/` direc
## Usage
The script will automatically:
- Generate a unique three-word ID (e.g., `swift-emerald-river`)
- Create frontmatter with current date and formatted title
- Save the file as `{id}-{slug}.md` in `.agents/justifications/`
@ -25,7 +26,7 @@ The script will automatically:
If you have the content ready, run:
```bash
npx tsx scripts/create-justification.ts "$ARGUMENTS" "Your justification content here"
pnpm exec tsx scripts/create-justification.ts "$ARGUMENTS" "Your justification content here"
```
### Option 2: Multi-line Content (Heredoc)
@ -33,7 +34,7 @@ npx tsx scripts/create-justification.ts "$ARGUMENTS" "Your justification content
For multi-line content, use heredoc:
```bash
npx tsx scripts/create-justification.ts "$ARGUMENTS" << HEREDOC
pnpm exec tsx scripts/create-justification.ts "$ARGUMENTS" << HEREDOC
Your multi-line
justification content
goes here
@ -45,7 +46,7 @@ HEREDOC
You can also pipe content:
```bash
echo "Your content" | npx tsx scripts/create-justification.ts "$ARGUMENTS"
echo "Your content" | pnpm exec tsx scripts/create-justification.ts "$ARGUMENTS"
```
## File Format

View file

@ -26,7 +26,7 @@ The script will automatically:
If you have the content ready, run:
```bash
npx tsx scripts/create-plan.ts "$ARGUMENTS" "Your plan content here"
pnpm exec tsx scripts/create-plan.ts "$ARGUMENTS" "Your plan content here"
```
### Option 2: Multi-line Content (Heredoc)
@ -34,7 +34,7 @@ npx tsx scripts/create-plan.ts "$ARGUMENTS" "Your plan content here"
For multi-line content, use heredoc:
```bash
npx tsx scripts/create-plan.ts "$ARGUMENTS" << HEREDOC
pnpm exec tsx scripts/create-plan.ts "$ARGUMENTS" << HEREDOC
Your multi-line
plan content
goes here
@ -46,7 +46,7 @@ HEREDOC
You can also pipe content:
```bash
echo "Your content" | npx tsx scripts/create-plan.ts "$ARGUMENTS"
echo "Your content" | pnpm exec tsx scripts/create-plan.ts "$ARGUMENTS"
```
## File Format

View file

@ -14,6 +14,7 @@ You are creating a new scratch file in the `.agents/scratches/` directory.
## Usage
The script will automatically:
- Generate a unique three-word ID (e.g., `calm-teal-cloud`)
- Create frontmatter with current date and formatted title
- Save the file as `{id}-{slug}.md` in `.agents/scratches/`
@ -25,7 +26,7 @@ The script will automatically:
If you have the content ready, run:
```bash
npx tsx scripts/create-scratch.ts "$ARGUMENTS" "Your scratch content here"
pnpm exec tsx scripts/create-scratch.ts "$ARGUMENTS" "Your scratch content here"
```
### Option 2: Multi-line Content (Heredoc)
@ -33,7 +34,7 @@ npx tsx scripts/create-scratch.ts "$ARGUMENTS" "Your scratch content here"
For multi-line content, use heredoc:
```bash
npx tsx scripts/create-scratch.ts "$ARGUMENTS" << HEREDOC
pnpm exec tsx scripts/create-scratch.ts "$ARGUMENTS" << HEREDOC
Your multi-line
scratch content
goes here
@ -45,7 +46,7 @@ HEREDOC
You can also pipe content:
```bash
echo "Your content" | npx tsx scripts/create-scratch.ts "$ARGUMENTS"
echo "Your content" | pnpm exec tsx scripts/create-scratch.ts "$ARGUMENTS"
```
## File Format

View file

@ -17,8 +17,8 @@ You are creating proper MDX documentation for a module or feature in Documenso u
Create documentation in the appropriate location:
- **Developer docs**: `apps/documentation/pages/developers/`
- **User docs**: `apps/documentation/pages/users/`
- **Developer docs**: `apps/docs/`
- **User docs**: `apps/docs/`
### File Format
@ -66,7 +66,7 @@ Brief description of what this module/feature does and when to use it.
If there are specific packages or imports needed:
```bash
npm install @documenso/package-name
pnpm install @documenso/package-name
```
## Quick Start

View file

@ -55,9 +55,9 @@ You are implementing a specification from the `.agents/plans/` directory. Work a
Work continuously through these steps:
1. **Implement** - Write the code for the current task
2. **Typecheck** - Run `npm run typecheck -w @documenso/remix` to verify types
3. **Lint** - Run `npm run lint:fix` to fix linting issues
4. **Test** - If non-trivial, run E2E tests: `npm run test:dev -w @documenso/app-tests`
2. **Typecheck** - Run `pnpm run typecheck -w @documenso/remix` to verify types
3. **Lint** - Run `pnpm run lint:fix` to fix linting issues
4. **Test** - If non-trivial, run E2E tests: `pnpm run test:dev -w @documenso/app-tests`
5. **Fix** - If tests fail, fix and re-run
6. **Repeat** - Move to next task
@ -81,18 +81,18 @@ Work continuously through these steps:
```bash
# Type checking
npm run typecheck -w @documenso/remix
pnpm run typecheck -w @documenso/remix
# Linting
npm run lint:fix
pnpm run lint:fix
# E2E Tests (only for non-trivial work)
npm run test:dev -w @documenso/app-tests # Run E2E tests in dev mode
npm run test-ui:dev -w @documenso/app-tests # Run E2E tests with UI
npm run test:e2e # Run full E2E test suite
pnpm run test:dev -w @documenso/app-tests # Run E2E tests in dev mode
pnpm run test-ui:dev -w @documenso/app-tests # Run E2E tests with UI
pnpm run test:e2e # Run full E2E test suite
# Development
npm run dev # Start dev server
pnpm run dev # Start dev server
```
## Begin

View file

@ -21,13 +21,13 @@ I help you create new justification files in the `.agents/justifications/` direc
Run the script with a slug and content:
```bash
npx tsx scripts/create-justification.ts "decision-name" "Justification content here"
pnpm exec tsx scripts/create-justification.ts "decision-name" "Justification content here"
```
Or use heredoc for multi-line content:
```bash
npx tsx scripts/create-justification.ts "decision-name" << HEREDOC
pnpm exec tsx scripts/create-justification.ts "decision-name" << HEREDOC
Multi-line
justification content
goes here

View file

@ -21,13 +21,13 @@ I help you create new plan files in the `.agents/plans/` directory. Each plan fi
Run the script with a slug and content:
```bash
npx tsx scripts/create-plan.ts "feature-name" "Plan content here"
pnpm exec tsx scripts/create-plan.ts "feature-name" "Plan content here"
```
Or use heredoc for multi-line content:
```bash
npx tsx scripts/create-plan.ts "feature-name" << HEREDOC
pnpm exec tsx scripts/create-plan.ts "feature-name" << HEREDOC
Multi-line
plan content
goes here

View file

@ -21,13 +21,13 @@ I help you create new scratch files in the `.agents/scratches/` directory. Each
Run the script with a slug and content:
```bash
npx tsx scripts/create-scratch.ts "note-name" "Scratch content here"
pnpm exec tsx scripts/create-scratch.ts "note-name" "Scratch content here"
```
Or use heredoc for multi-line content:
```bash
npx tsx scripts/create-scratch.ts "note-name" << HEREDOC
pnpm exec tsx scripts/create-scratch.ts "note-name" << HEREDOC
Multi-line
scratch content
goes here

View file

@ -2,16 +2,16 @@
## Build/Test/Lint Commands
- `npm run build` - Build all packages
- `npm run lint` - Lint all packages
- `npm run lint:fix` - Auto-fix linting issues
- `npm run test:e2e` - Run E2E tests with Playwright
- `npm run test:dev -w @documenso/app-tests` - Run single E2E test in dev mode
- `npm run test-ui:dev -w @documenso/app-tests` - Run E2E tests with UI
- `npm run format` - Format code with Prettier
- `npm run dev` - Start development server for Remix app
- `pnpm run build` - Build all packages
- `pnpm run lint` - Lint all packages
- `pnpm run lint:fix` - Auto-fix linting issues
- `pnpm run test:e2e` - Run E2E tests with Playwright
- `pnpm run test:dev -w @documenso/app-tests` - Run single E2E test in dev mode
- `pnpm run test-ui:dev -w @documenso/app-tests` - Run E2E tests with UI
- `pnpm run format` - Format code with Prettier
- `pnpm run dev` - Start development server for Remix app
**Important:** Do not run `npm run build` to verify changes unless explicitly asked. Builds take a long time (~2 minutes). Use `npx tsc --noEmit` for type checking specific packages if needed.
**Important:** Do not run `pnpm run build` to verify changes unless explicitly asked. Builds take a long time (~2 minutes). Use `pnpm exec tsc --noEmit` for type checking specific packages if needed.
## Code Style Guidelines

View file

@ -4,7 +4,7 @@ This document provides a high-level overview of the Documenso codebase to help h
## Overview
Documenso is an open-source document signing platform built as a **monorepo** using npm workspaces and Turborepo. The application enables users to create, send, and sign documents electronically.
Documenso is an open-source document signing platform built as a **monorepo** using pnpm workspaces and Turborepo. The application enables users to create, send, and sign documents electronically.
```
┌─────────────────────────────────────────────────────────────────────────────┐
@ -324,19 +324,19 @@ documenso/
```bash
# Full setup (install, docker, migrate, seed, dev)
npm run d
pnpm run d
# Start development server
npm run dev
pnpm run dev
# Database GUI
npm run prisma:studio
pnpm run prisma:studio
# Type checking (faster than build)
npx tsc --noEmit
pnpm exec tsc --noEmit
# E2E tests
npm run test:e2e
pnpm run test:e2e
```
### Docker Services (Development)

View file

@ -50,7 +50,7 @@ The development branch is <code>main</code>. All pull requests should be made ag
You can build the project with:
```bash
npm run build
pnpm run build
```
## AI-Assisted Development with OpenCode

View file

@ -119,16 +119,15 @@ git clone https://github.com/<your-username>/documenso
2. Set up your `.env` file using the recommendations in the `.env.example` file. Alternatively, just run `cp .env.example .env` to get started with our handpicked defaults.
3. Run `npm run dx` in the root directory
3. Run `pnpm run dx` in the root directory
- This will spin up a postgres database and inbucket mailserver in a docker container.
4. Run `npm run dev` in the root directory
4. Run `pnpm run dev` in the root directory
5. Want it even faster? Just use
```sh
npm run d
pnpm run d
```
#### Access Points for Your Application
@ -136,7 +135,6 @@ npm run d
1. **App** - http://localhost:3000
2. **Incoming Mail Access** - http://localhost:9000
3. **Database Connection Details**
- **Port**: 54320
- **Connection**: Use your favorite database client to connect using the provided port.
@ -156,12 +154,11 @@ After forking the repository, clone it to your local device by using the followi
git clone https://github.com/<your-username>/documenso
```
2. Run `npm i` in the root directory
2. Run `pnpm install` in the root directory
3. Create your `.env` from the `.env.example`. You can use `cp .env.example .env` to get started with our handpicked defaults.
4. Set the following environment variables:
- NEXTAUTH_SECRET
- NEXT_PUBLIC_WEBAPP_URL
- NEXT_PRIVATE_DATABASE_URL
@ -169,17 +166,17 @@ git clone https://github.com/<your-username>/documenso
- NEXT_PRIVATE_SMTP_FROM_NAME
- NEXT_PRIVATE_SMTP_FROM_ADDRESS
5. Create the database schema by running `npm run prisma:migrate-dev`
5. Create the database schema by running `pnpm run prisma:migrate-dev`
6. Run `npm run translate:compile` in the root directory to compile lingui
6. Run `pnpm run translate:compile` in the root directory to compile lingui
7. Run `npm run dev` in the root directory to start
7. Run `pnpm run dev` in the root directory to start
8. Register a new user at http://localhost:3000/signup
---
- Optional: Seed the database using `npm run prisma:seed -w @documenso/prisma` to create a test user and document.
- Optional: Seed the database using `pnpm run prisma:seed -w @documenso/prisma` to create a test user and document.
- Optional: Create your own signing certificate.
- To generate your own using these steps and a Linux Terminal or Windows Subsystem for Linux (WSL), see **[Create your own signing certificate](./SIGNING.md)**.
@ -244,16 +241,16 @@ The following environment variables must be set:
Now you can install the dependencies and build it:
```
npm i
npm run build
npm run prisma:migrate-deploy
pnpm install
pnpm run build
pnpm run prisma:migrate-deploy
```
Finally, you can start it with:
```
cd apps/remix
npm run start
pnpm run start
```
This will start the server on `localhost:3000`. For now, any reverse proxy can then do the frontend and SSL termination.
@ -313,7 +310,7 @@ If you are deploying to a cluster that uses only IPv6, You can use a custom comm
For local docker run
```bash
docker run -it documenso:latest npm run start -- -H ::
docker run -it documenso:latest pnpm run start -- -H ::
```
For k8s or docker-compose
@ -324,7 +321,7 @@ containers:
image: documenso:latest
imagePullPolicy: IfNotPresent
command:
- npm
- pnpm
args:
- run
- start
@ -338,13 +335,13 @@ containers:
Wrap your package script with the `with:env` script like such:
```
npm run with:env -- npm run myscript
pnpm run with:env -- pnpm run myscript
```
The same can be done when using `npx` for one of the bin scripts:
The same can be done when using `pnpm exec` for one of the bin scripts:
```
npm run with:env -- npx myscript
pnpm run with:env -- pnpm exec myscript
```
This will load environment variables from your `.env` and `.env.local` files.

View file

@ -6,17 +6,17 @@
"dev": "next dev -p 3003",
"build": "next build",
"start": "next start -p 3003",
"lint:fix": "next lint --fix",
"lint:fix": "eslint . --fix",
"clean": "rimraf .next && rimraf node_modules"
},
"dependencies": {
"@documenso/prisma": "*",
"luxon": "^3.7.2",
"next": "15.5.12"
"@documenso/prisma": "workspace:*",
"luxon": "catalog:",
"next": "16.1.6"
},
"devDependencies": {
"@types/node": "^20",
"@types/react": "18.3.27",
"typescript": "5.6.2"
"@types/node": "catalog:",
"@types/react": "catalog:",
"typescript": "catalog:"
}
}

View file

@ -17,13 +17,13 @@ cd "$WEB_APP_DIR"
start_time=$(date +%s)
echo "[Build]: Extracting and compiling translations"
npm run translate --prefix ../../
pnpm run --filter @documenso/root translate
echo "[Build]: Building app"
npm run build:app
pnpm run build:app
echo "[Build]: Building server"
npm run build:server
pnpm run build:server
# Copy over the entry point for the server.
cp server/main.js build/server/main.js

View file

@ -1,26 +0,0 @@
FROM node:20-alpine AS dependencies-env
RUN npm i -g pnpm
COPY . /app
FROM dependencies-env AS development-dependencies-env
COPY ./package.json pnpm-lock.yaml /app/
WORKDIR /app
RUN pnpm i --frozen-lockfile
FROM dependencies-env AS production-dependencies-env
COPY ./package.json pnpm-lock.yaml /app/
WORKDIR /app
RUN pnpm i --prod --frozen-lockfile
FROM dependencies-env AS build-env
COPY ./package.json pnpm-lock.yaml /app/
COPY --from=development-dependencies-env /app/node_modules /app/node_modules
WORKDIR /app
RUN pnpm build
FROM dependencies-env
COPY ./package.json pnpm-lock.yaml /app/
COPY --from=production-dependencies-env /app/node_modules /app/node_modules
COPY --from=build-env /app/build /app/build
WORKDIR /app
CMD ["pnpm", "start"]

View file

@ -4,73 +4,73 @@
"type": "module",
"scripts": {
"build": "./.bin/build.sh",
"build:app": "npm run typecheck && cross-env NODE_ENV=production react-router build",
"build:app": "pnpm run typecheck && cross-env NODE_ENV=production react-router build",
"build:server": "cross-env NODE_ENV=production rollup -c rollup.config.mjs",
"dev": "npm run with:env -- react-router dev",
"dev": "pnpm run with:env -- react-router dev",
"dev:billing": "bash .bin/stripe-dev.sh",
"start": "npm run with:env -- cross-env NODE_ENV=production node build/server/main.js",
"start": "pnpm run with:env -- cross-env NODE_ENV=production node build/server/main.js",
"clean": "rimraf .react-router && rimraf node_modules",
"typecheck": "react-router typegen && tsc",
"with:env": "dotenv -e ../../.env -e ../../.env.local --"
},
"dependencies": {
"@cantoo/pdf-lib": "^2.5.3",
"@documenso/api": "*",
"@documenso/assets": "*",
"@documenso/auth": "*",
"@documenso/ee": "*",
"@documenso/lib": "*",
"@documenso/prisma": "*",
"@documenso/tailwind-config": "*",
"@documenso/trpc": "*",
"@documenso/ui": "*",
"@documenso/api": "workspace:*",
"@documenso/assets": "workspace:*",
"@documenso/auth": "workspace:*",
"@documenso/ee": "workspace:*",
"@documenso/lib": "workspace:*",
"@documenso/prisma": "workspace:*",
"@documenso/tailwind-config": "workspace:*",
"@documenso/trpc": "workspace:*",
"@documenso/ui": "workspace:*",
"@epic-web/remember": "^1.1.0",
"@faker-js/faker": "^10.1.0",
"@hono/node-server": "^1.19.6",
"@hono/standard-validator": "^0.2.0",
"@hono/standard-validator": "catalog:",
"@hono/trpc-server": "^0.4.0",
"@hookform/resolvers": "^3",
"@lingui/core": "^5.6.0",
"@hookform/resolvers": "catalog:",
"@lingui/core": "catalog:",
"@lingui/detect-locale": "^5.6.0",
"@lingui/macro": "^5.6.0",
"@lingui/react": "^5.6.0",
"@oslojs/crypto": "^1.0.1",
"@oslojs/encoding": "^1.1.0",
"@lingui/macro": "catalog:",
"@lingui/react": "catalog:",
"@oslojs/crypto": "catalog:",
"@oslojs/encoding": "catalog:",
"@react-router/node": "^7.12.0",
"@react-router/serve": "^7.12.0",
"@simplewebauthn/browser": "^13.2.2",
"@simplewebauthn/server": "^13.2.2",
"@tanstack/react-query": "5.90.10",
"autoprefixer": "^10.4.22",
"@simplewebauthn/server": "catalog:",
"@tanstack/react-query": "catalog:",
"autoprefixer": "catalog:",
"colord": "^2.9.3",
"content-disposition": "^1.0.1",
"framer-motion": "^12.23.24",
"hono": "^4.12.2",
"framer-motion": "catalog:",
"hono": "catalog:",
"hono-react-router-adapter": "^0.6.5",
"input-otp": "^1.4.2",
"isbot": "^5.1.32",
"konva": "^10.0.9",
"lucide-react": "^0.554.0",
"luxon": "^3.7.2",
"nanoid": "^5.1.6",
"konva": "catalog:",
"lucide-react": "catalog:",
"luxon": "catalog:",
"nanoid": "catalog:",
"papaparse": "^5.5.3",
"posthog-js": "^1.297.2",
"posthog-node": "4.18.0",
"react": "^18",
"posthog-js": "catalog:",
"posthog-node": "catalog:",
"react": "catalog:",
"react-call": "^1.8.1",
"react-dom": "^18",
"react-dom": "catalog:",
"react-dropzone": "^14.3.8",
"react-hook-form": "^7.66.1",
"react-hook-form": "catalog:",
"react-hotkeys-hook": "^4.6.2",
"react-icons": "^5.5.0",
"react-rnd": "^10.5.2",
"react-rnd": "catalog:",
"react-router": "^7.12.0",
"recharts": "^2.15.4",
"remeda": "^2.32.0",
"remeda": "catalog:",
"remix-themes": "^2.0.4",
"satori": "^0.18.3",
"tailwindcss": "^3.4.18",
"ts-pattern": "^5.9.0",
"tailwindcss": "catalog:",
"ts-pattern": "catalog:",
"ua-parser-js": "^1.0.41",
"uqr": "^0.1.2"
},
@ -88,20 +88,20 @@
"@rollup/plugin-node-resolve": "^16.0.3",
"@rollup/plugin-typescript": "^12.3.0",
"@types/content-disposition": "^0.5.9",
"@types/formidable": "^3.4.6",
"@types/luxon": "^3.7.1",
"@types/node": "^20",
"@types/formidable": "catalog:",
"@types/luxon": "catalog:",
"@types/node": "catalog:",
"@types/papaparse": "^5.5.0",
"@types/react": "18.3.27",
"@types/react-dom": "^18",
"@types/react": "catalog:",
"@types/react-dom": "catalog:",
"@types/ua-parser-js": "^0.7.39",
"cross-env": "^10.1.0",
"esbuild": "^0.27.0",
"remix-flat-routes": "^0.8.5",
"rollup": "^4.53.3",
"tsx": "^4.20.6",
"typescript": "5.6.2",
"vite": "^7.2.4",
"tsx": "catalog:",
"typescript": "catalog:",
"vite": "catalog:",
"vite-plugin-babel-macros": "^1.0.6",
"vite-tsconfig-paths": "^5.1.4"
},

View file

@ -5,6 +5,7 @@ FROM node:22-alpine3.22 AS base
RUN apk add --no-cache openssl
RUN apk add --no-cache font-freefont
RUN corepack enable pnpm
###########################
@ -19,11 +20,9 @@ WORKDIR /app
COPY . .
RUN npm install -g "turbo@^1.9.3"
# Outputs to the /out folder
# source: https://turbo.build/repo/docs/reference/command-line-reference/prune#--docker
RUN turbo prune --scope=@documenso/remix --docker
RUN pnpm exec turbo prune @documenso/remix --docker
###########################
# INSTALLER CONTAINER #
@ -67,21 +66,20 @@ ENV NEXT_PRIVATE_TELEMETRY_HOST="$NEXT_PRIVATE_TELEMETRY_HOST"
# First install the dependencies (as they change less often)
COPY .gitignore .gitignore
COPY --from=builder /app/out/json/ .
COPY --from=builder /app/out/package-lock.json ./package-lock.json
COPY --from=builder /app/out/pnpm-lock.yaml ./pnpm-lock.yaml
COPY --from=builder /app/lingui.config.ts ./lingui.config.ts
COPY --from=builder /app/patches ./patches
COPY --from=builder /app/pnpm-workspace.yaml ./pnpm-workspace.yaml
RUN npm ci
RUN pnpm install --frozen-lockfile
# Then copy all the source code (as it changes more often)
COPY --from=builder /app/out/full/ .
# Finally copy the turbo.json file so that we can run turbo commands
COPY turbo.json turbo.json
RUN npm install -g "turbo@^1.9.3"
RUN turbo run build --filter=@documenso/remix...
RUN pnpm exec turbo run build --filter=@documenso/remix...
###########################
# RUNNER CONTAINER #
@ -111,8 +109,10 @@ COPY --from=builder --chown=nodejs:nodejs /app/out/json/ .
COPY --from=builder --chown=nodejs:nodejs /app/out/full/packages/tailwind-config ./packages/tailwind-config
# Copy the patches across
COPY --from=builder --chown=nodejs:nodejs /app/patches ./patches
# Copy workspace config
COPY --from=builder --chown=nodejs:nodejs /app/pnpm-workspace.yaml ./pnpm-workspace.yaml
RUN npm ci --only=production
RUN pnpm install --frozen-lockfile --prod
# Automatically leverage output traces to reduce image size
# https://nodejs.org/docs/advanced-features/output-file-tracing
@ -124,7 +124,7 @@ COPY --from=installer --chown=nodejs:nodejs /app/packages/prisma/schema.prisma .
COPY --from=installer --chown=nodejs:nodejs /app/packages/prisma/migrations ./packages/prisma/migrations
# Generate the prisma client again
RUN npx prisma generate --schema ./packages/prisma/schema.prisma
RUN pnpm exec prisma generate --schema ./packages/prisma/schema.prisma
# Get the start script from docker/

View file

@ -25,7 +25,7 @@ printf "📊 Certificate status: http://localhost:3000/api/certificate-status\n"
printf "👥 Community: https://github.com/documenso/documenso\n\n"
printf "🗄️ Running database migrations...\n"
npx prisma migrate deploy --schema ../../packages/prisma/schema.prisma
pnpm exec prisma migrate deploy --schema ../../packages/prisma/schema.prisma
printf "🌟 Starting Documenso server...\n"
HOSTNAME=0.0.0.0 node build/server/main.js

37285
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -1,13 +1,8 @@
{
"private": true,
"name": "@documenso/root",
"workspaces": [
"apps/*",
"packages/*"
],
"version": "2.7.1",
"scripts": {
"postinstall": "patch-package",
"build": "turbo run build",
"dev": "npm run translate:compile && turbo run dev --filter=@documenso/remix",
"dev:remix": "npm run translate:compile && turbo run dev --filter=@documenso/remix",
@ -20,92 +15,109 @@
"prepare": "husky && husky install || true",
"commitlint": "commitlint --edit",
"clean": "turbo run clean && rimraf node_modules",
"d": "npm run dx && npm run translate:compile && npm run dev",
"dx": "npm ci && npm run dx:up && npm run prisma:migrate-dev && npm run prisma:seed",
"d": "pnpm run dx && pnpm run translate:compile && pnpm run dev",
"dx": "pnpm install --frozen-lockfile && pnpm run dx:up && pnpm run prisma:migrate-dev && pnpm run prisma:seed",
"dx:up": "docker compose -f docker/development/compose.yml up -d",
"dx:down": "docker compose -f docker/development/compose.yml down",
"ci": "turbo run build --filter=@documenso/remix && turbo run test:e2e",
"prisma:generate": "npm run with:env -- npm run prisma:generate -w @documenso/prisma",
"prisma:migrate-dev": "npm run with:env -- npm run prisma:migrate-dev -w @documenso/prisma",
"prisma:migrate-deploy": "npm run with:env -- npm run prisma:migrate-deploy -w @documenso/prisma",
"prisma:migrate-reset": "npm run with:env -- npm run prisma:migrate-reset -w @documenso/prisma",
"prisma:seed": "npm run with:env -- npm run prisma:seed -w @documenso/prisma",
"prisma:studio": "npm run with:env -- npm run prisma:studio -w @documenso/prisma",
"prisma:generate": "pnpm run with:env -- pnpm run --filter @documenso/prisma prisma:generate",
"prisma:migrate-dev": "pnpm run with:env -- pnpm run --filter @documenso/prisma prisma:migrate-dev",
"prisma:migrate-deploy": "pnpm run with:env -- pnpm run --filter @documenso/prisma prisma:migrate-deploy",
"prisma:migrate-reset": "pnpm run with:env -- pnpm run --filter @documenso/prisma prisma:migrate-reset",
"prisma:seed": "pnpm run with:env -- pnpm run --filter @documenso/prisma prisma:seed",
"prisma:studio": "pnpm run with:env -- pnpm run --filter @documenso/prisma prisma:studio",
"with:env": "dotenv -e .env -e .env.local --",
"reset:hard": "npm run clean && npm i && npm run prisma:generate",
"precommit": "npm install && git add package.json package-lock.json",
"trigger:dev": "npm run with:env -- npx trigger-cli dev --handler-path=\"/api/jobs\"",
"reset:hard": "pnpm run clean && pnpm install && pnpm run prisma:generate",
"precommit": "pnpm install && git add package.json pnpm-lock.yaml",
"trigger:dev": "pnpm run with:env -- pnpm dlx trigger-cli dev --handler-path=\"/api/jobs\"",
"inngest:dev": "inngest dev -u http://localhost:3000/api/jobs",
"make:version": "npm version --workspace @documenso/remix --include-workspace-root --no-git-tag-version -m \"v%s\"",
"translate": "npm run translate:extract && npm run translate:compile",
"make:version": "pnpm version --filter @documenso/remix --include-workspace-root --no-git-tag-version -m \"v%s\"",
"translate": "pnpm run translate:extract && pnpm run translate:compile",
"translate:extract": "lingui extract --clean",
"translate:compile": "lingui compile"
},
"packageManager": "npm@10.7.0",
"packageManager": "pnpm@10.30.3+sha512.c961d1e0a2d8e354ecaa5166b822516668b7f44cb5bd95122d590dd81922f606f5473b6d23ec4a5be05e7fcd18e8488d47d978bbe981872f1145d06e9a740017",
"engines": {
"npm": ">=10.7.0",
"node": ">=22.0.0"
},
"devDependencies": {
"@commitlint/cli": "^20.1.0",
"@commitlint/config-conventional": "^20.0.0",
"@lingui/cli": "^5.6.0",
"@prisma/client": "^6.19.0",
"@trpc/client": "11.8.1",
"@trpc/react-query": "11.8.1",
"@trpc/server": "11.8.1",
"@ts-rest/core": "^3.52.1",
"@ts-rest/open-api": "^3.52.1",
"@ts-rest/serverless": "^3.52.1",
"@prisma/client": "catalog:",
"@trpc/client": "catalog:",
"@trpc/react-query": "catalog:",
"@trpc/server": "catalog:",
"@ts-rest/core": "catalog:",
"@ts-rest/open-api": "catalog:",
"@ts-rest/serverless": "catalog:",
"dotenv": "^17.2.3",
"dotenv-cli": "^11.0.0",
"eslint": "^8.57.0",
"eslint": "catalog:",
"husky": "^9.1.7",
"inngest-cli": "^1.16.1",
"lint-staged": "^16.2.7",
"nanoid": "^5.1.6",
"nanoid": "catalog:",
"nodemailer": "^7.0.10",
"pdfjs-dist": "5.4.296",
"pino": "^9.14.0",
"pino-pretty": "^13.1.2",
"playwright": "1.56.1",
"prettier": "^3.6.2",
"prisma": "^6.19.0",
"prettier": "catalog:",
"prisma": "catalog:",
"prisma-extension-kysely": "^3.0.0",
"prisma-json-types-generator": "^3.6.2",
"prisma-kysely": "^2.3.0",
"rimraf": "^6.1.2",
"superjson": "^2.2.5",
"syncpack": "^14.0.0-alpha.27",
"turbo": "^1.13.4",
"vite": "^7.2.4",
"superjson": "catalog:",
"turbo": "^2.8.12",
"vite": "catalog:",
"vite-plugin-static-copy": "^3.1.4",
"zod-openapi": "^4.2.4",
"zod-prisma-types": "3.3.5"
},
"dependencies": {
"@ai-sdk/google-vertex": "3.0.81",
"@documenso/prisma": "*",
"@documenso/prisma": "workspace:*",
"@libpdf/core": "^0.2.12",
"@lingui/conf": "^5.6.0",
"@lingui/core": "^5.6.0",
"@lingui/core": "catalog:",
"@prisma/extension-read-replicas": "^0.4.1",
"ai": "^5.0.104",
"cron-parser": "^5.5.0",
"luxon": "^3.7.2",
"patch-package": "^8.0.1",
"posthog-node": "4.18.0",
"react": "^18",
"typescript": "5.6.2",
"zod": "^3.25.76"
"luxon": "catalog:",
"posthog-node": "catalog:",
"react": "catalog:",
"typescript": "catalog:",
"zod": "catalog:"
},
"overrides": {
"lodash": "4.17.23",
"pdfjs-dist": "5.4.296",
"typescript": "5.6.2",
"zod": "$zod",
"fumadocs-mdx": {
"zod": "^4.3.5"
}
"pnpm": {
"overrides": {
"lodash": "4.17.23",
"pdfjs-dist": "5.4.296",
"typescript": "5.6.2",
"zod": "$zod",
"fumadocs-mdx>zod": "^4.3.5",
"@types/react": "18.3.27",
"@types/node": "20.19.25",
"jiti": "2.6.1"
},
"patchedDependencies": {
"@ai-sdk/google-vertex@3.0.81": "patches/@ai-sdk__google-vertex@3.0.81.patch"
},
"onlyBuiltDependencies": [
"@playwright/browser-chromium",
"@prisma/client",
"@prisma/engines",
"aws-crt",
"core-js",
"esbuild",
"inngest-cli",
"prisma",
"protobufjs",
"sharp",
"skia-canvas",
"unrs-resolver"
]
}
}

View file

@ -15,15 +15,15 @@
"v1/"
],
"dependencies": {
"@documenso/lib": "*",
"@documenso/prisma": "*",
"@ts-rest/core": "^3.52.1",
"@ts-rest/open-api": "^3.52.1",
"@ts-rest/serverless": "^3.52.1",
"@documenso/lib": "workspace:*",
"@documenso/prisma": "workspace:*",
"@ts-rest/core": "catalog:",
"@ts-rest/open-api": "catalog:",
"@ts-rest/serverless": "catalog:",
"@types/swagger-ui-react": "^5.18.0",
"luxon": "^3.7.2",
"superjson": "^2.2.5",
"ts-pattern": "^5.9.0",
"zod": "^3.25.76"
"luxon": "catalog:",
"superjson": "catalog:",
"ts-pattern": "catalog:",
"zod": "catalog:"
}
}
}

View file

@ -7,16 +7,16 @@
"scripts": {
"test:dev": "NODE_OPTIONS=--experimental-require-module playwright test",
"test-ui:dev": "NODE_OPTIONS=--experimental-require-module playwright test --ui",
"test:e2e": "NODE_OPTIONS=--experimental-require-module NODE_ENV=test NEXT_PRIVATE_LOGGER_FILE_PATH=./logs.json start-server-and-test \"npm run start -w @documenso/remix\" http://localhost:3000 \"playwright test $E2E_TEST_PATH\""
"test:e2e": "NODE_OPTIONS=--experimental-require-module NODE_ENV=test NEXT_PRIVATE_LOGGER_FILE_PATH=./logs.json start-server-and-test \"pnpm run --filter @documenso/remix start\" http://localhost:3000 \"playwright test $E2E_TEST_PATH\""
},
"keywords": [],
"author": "",
"devDependencies": {
"@documenso/lib": "*",
"@documenso/prisma": "*",
"@napi-rs/canvas": "^0.1.83",
"@documenso/lib": "workspace:*",
"@documenso/prisma": "workspace:*",
"@napi-rs/canvas": "catalog:",
"@playwright/test": "1.56.1",
"@types/node": "^20",
"@types/node": "catalog:",
"@types/pngjs": "^6.0.5",
"pixelmatch": "^7.1.0",
"pngjs": "^7.0.0"
@ -24,4 +24,4 @@
"dependencies": {
"start-server-and-test": "^2.1.3"
}
}
}

View file

@ -10,17 +10,17 @@
"clean": "rimraf node_modules"
},
"dependencies": {
"@documenso/lib": "*",
"@documenso/prisma": "*",
"@hono/standard-validator": "^0.2.0",
"@oslojs/crypto": "^1.0.1",
"@oslojs/encoding": "^1.1.0",
"@simplewebauthn/server": "^13.2.2",
"@documenso/lib": "workspace:*",
"@documenso/prisma": "workspace:*",
"@hono/standard-validator": "catalog:",
"@oslojs/crypto": "catalog:",
"@oslojs/encoding": "catalog:",
"@simplewebauthn/server": "catalog:",
"arctic": "^3.7.0",
"hono": "^4.12.2",
"luxon": "^3.7.2",
"nanoid": "^5.1.6",
"ts-pattern": "^5.9.0",
"zod": "^3.25.76"
"hono": "catalog:",
"luxon": "catalog:",
"nanoid": "catalog:",
"ts-pattern": "catalog:",
"zod": "catalog:"
}
}

View file

@ -13,12 +13,12 @@
"clean": "rimraf node_modules"
},
"dependencies": {
"@aws-sdk/client-sesv2": "^3.998.0",
"@documenso/lib": "*",
"@documenso/prisma": "*",
"luxon": "^3.7.2",
"react": "^18",
"ts-pattern": "^5.9.0",
"zod": "^3.25.76"
"@aws-sdk/client-sesv2": "catalog:",
"@documenso/lib": "workspace:*",
"@documenso/prisma": "workspace:*",
"luxon": "catalog:",
"react": "catalog:",
"ts-pattern": "catalog:",
"zod": "catalog:"
}
}

View file

@ -16,7 +16,7 @@
"clean": "rimraf node_modules"
},
"dependencies": {
"@documenso/tailwind-config": "*",
"@documenso/tailwind-config": "workspace:*",
"@documenso/nodemailer-resend": "4.0.0",
"@react-email/body": "0.2.0",
"@react-email/button": "0.2.0",
@ -42,7 +42,7 @@
"resend": "^6.5.2"
},
"devDependencies": {
"@documenso/tsconfig": "*",
"@documenso/tsconfig": "workspace:*",
"@types/nodemailer": "^7.0.4"
}
}

View file

@ -9,12 +9,12 @@
"dependencies": {
"@typescript-eslint/eslint-plugin": "^7.18.0",
"@typescript-eslint/parser": "^7.18.0",
"eslint": "^8.57.0",
"eslint": "catalog:",
"eslint-config-next": "^15",
"eslint-config-turbo": "^1.13.4",
"eslint-config-turbo": "^2.8.12",
"eslint-plugin-package-json": "^0.85.0",
"eslint-plugin-react": "^7.37.5",
"eslint-plugin-unused-imports": "^4.3.0",
"typescript": "5.6.2"
"typescript": "catalog:"
}
}
}

View file

@ -1,5 +1,5 @@
/* eslint-disable @typescript-eslint/consistent-type-assertions */
import { RefObject, useEffect, useState } from 'react';
import { useEffect, useState } from 'react';
/**
* Calculate the width and height of a text element.

View file

@ -16,25 +16,25 @@
},
"dependencies": {
"@ai-sdk/google-vertex": "3.0.81",
"@aws-sdk/client-s3": "^3.998.0",
"@aws-sdk/client-sesv2": "^3.998.0",
"@aws-sdk/cloudfront-signer": "^3.998.0",
"@aws-sdk/s3-request-presigner": "^3.998.0",
"@aws-sdk/signature-v4-crt": "^3.998.0",
"@documenso/assets": "*",
"@documenso/email": "*",
"@documenso/prisma": "*",
"@documenso/signing": "*",
"@lingui/core": "^5.6.0",
"@lingui/macro": "^5.6.0",
"@lingui/react": "^5.6.0",
"@napi-rs/canvas": "^0.1.83",
"@aws-sdk/client-s3": "catalog:",
"@aws-sdk/client-sesv2": "catalog:",
"@aws-sdk/cloudfront-signer": "catalog:",
"@aws-sdk/s3-request-presigner": "catalog:",
"@aws-sdk/signature-v4-crt": "catalog:",
"@documenso/assets": "workspace:*",
"@documenso/email": "workspace:*",
"@documenso/prisma": "workspace:*",
"@documenso/signing": "workspace:*",
"@lingui/core": "catalog:",
"@lingui/macro": "catalog:",
"@lingui/react": "catalog:",
"@napi-rs/canvas": "catalog:",
"@noble/ciphers": "0.6.0",
"@noble/hashes": "1.8.0",
"@node-rs/bcrypt": "^1.10.7",
"@pdf-lib/fontkit": "^1.1.1",
"@scure/base": "^1.2.6",
"@simplewebauthn/server": "^13.2.2",
"@scure/base": "catalog:",
"@simplewebauthn/server": "catalog:",
"@sindresorhus/slugify": "^3.0.0",
"@team-plain/typescript-sdk": "^5.11.0",
"@vvo/tzdb": "^6.196.0",
@ -42,29 +42,29 @@
"csv-parse": "^6.1.0",
"inngest": "^3.45.1",
"jose": "^6.1.2",
"konva": "^10.0.9",
"kysely": "0.28.8",
"luxon": "^3.7.2",
"nanoid": "^5.1.6",
"konva": "catalog:",
"kysely": "catalog:",
"luxon": "catalog:",
"nanoid": "catalog:",
"oslo": "^0.17.0",
"p-map": "^7.0.4",
"pg": "^8.16.3",
"pino": "^9.14.0",
"pino-pretty": "^13.1.2",
"playwright": "1.56.1",
"posthog-js": "^1.297.2",
"posthog-node": "4.18.0",
"react": "^18",
"remeda": "^2.32.0",
"posthog-js": "catalog:",
"posthog-node": "catalog:",
"react": "catalog:",
"remeda": "catalog:",
"sharp": "0.34.5",
"skia-canvas": "^3.0.8",
"stripe": "^12.18.0",
"ts-pattern": "^5.9.0",
"zod": "^3.25.76"
"ts-pattern": "catalog:",
"zod": "catalog:"
},
"devDependencies": {
"@playwright/browser-chromium": "1.56.1",
"@types/luxon": "^3.7.1",
"@types/luxon": "catalog:",
"@types/pg": "^8.15.6"
}
}

View file

@ -8,8 +8,8 @@
},
"dependencies": {
"@trivago/prettier-plugin-sort-imports": "^4.3.0",
"prettier": "^3.6.2",
"prettier": "catalog:",
"prettier-plugin-tailwindcss": "^0.7.1"
},
"devDependencies": {}
}
}

View file

@ -21,21 +21,21 @@
"seed": "tsx ./seed-database.ts"
},
"dependencies": {
"@prisma/client": "^6.19.0",
"kysely": "0.28.8",
"nanoid": "^5.1.6",
"prisma": "^6.19.0",
"@prisma/client": "catalog:",
"kysely": "catalog:",
"nanoid": "catalog:",
"prisma": "catalog:",
"prisma-extension-kysely": "^3.0.0",
"prisma-kysely": "^2.3.0",
"prisma-json-types-generator": "^3.6.2",
"ts-pattern": "^5.9.0",
"zod": "^3.25.76",
"ts-pattern": "catalog:",
"zod": "catalog:",
"zod-prisma-types": "3.3.5"
},
"devDependencies": {
"dotenv": "^17.2.3",
"dotenv-cli": "^11.0.0",
"tsx": "^4.20.6",
"typescript": "5.6.2"
"tsx": "catalog:",
"typescript": "catalog:"
}
}

View file

@ -14,9 +14,9 @@
"dependencies": {
"@google-cloud/kms": "^5.2.1",
"@google-cloud/secret-manager": "^6.1.1",
"ts-pattern": "^5.9.0"
"ts-pattern": "catalog:"
},
"devDependencies": {
"@documenso/tsconfig": "*"
"@documenso/tsconfig": "workspace:*"
}
}
}

View file

@ -10,13 +10,13 @@
"dependencies": {
"@tailwindcss/container-queries": "^0.1.1",
"@tailwindcss/typography": "^0.5.19",
"autoprefixer": "^10.4.22",
"autoprefixer": "catalog:",
"postcss": "^8.5.6",
"tailwindcss": "^3.4.18",
"tailwindcss-animate": "^1.0.7"
"tailwindcss": "catalog:",
"tailwindcss-animate": "catalog:"
},
"devDependencies": {},
"publishConfig": {
"access": "public"
}
}
}

View file

@ -10,24 +10,24 @@
"clean": "rimraf node_modules"
},
"dependencies": {
"@documenso/lib": "*",
"@documenso/prisma": "*",
"@simplewebauthn/server": "^13.2.2",
"@tanstack/react-query": "5.90.10",
"@trpc/client": "11.8.1",
"@trpc/react-query": "11.8.1",
"@trpc/server": "11.8.1",
"@ts-rest/core": "^3.52.1",
"@documenso/lib": "workspace:*",
"@documenso/prisma": "workspace:*",
"@simplewebauthn/server": "catalog:",
"@tanstack/react-query": "catalog:",
"@trpc/client": "catalog:",
"@trpc/react-query": "catalog:",
"@trpc/server": "catalog:",
"@ts-rest/core": "catalog:",
"formidable": "^3.5.4",
"luxon": "^3.7.2",
"superjson": "^2.2.5",
"luxon": "catalog:",
"superjson": "catalog:",
"trpc-to-openapi": "^2.1.5",
"ts-pattern": "^5.9.0",
"zod": "^3.25.76",
"ts-pattern": "catalog:",
"zod": "catalog:",
"zod-form-data": "^2.0.8",
"zod-openapi": "^4.2.4"
},
"devDependencies": {
"@types/formidable": "^3.4.6"
"@types/formidable": "catalog:"
}
}

View file

@ -1,4 +1,4 @@
import { Prisma, WebhookCallStatus, WebhookTriggerEvents } from '@prisma/client';
import type { Prisma, WebhookCallStatus, WebhookTriggerEvents } from '@prisma/client';
import { TEAM_MEMBER_ROLE_PERMISSIONS_MAP } from '@documenso/lib/constants/teams';
import { AppError, AppErrorCode } from '@documenso/lib/errors/app-error';

View file

@ -1,8 +1,7 @@
import { Prisma, WebhookCallStatus, WebhookTriggerEvents } from '@prisma/client';
import { Prisma, WebhookCallStatus } from '@prisma/client';
import { TEAM_MEMBER_ROLE_PERMISSIONS_MAP } from '@documenso/lib/constants/teams';
import { AppError, AppErrorCode } from '@documenso/lib/errors/app-error';
import type { FindResultResponse } from '@documenso/lib/types/search-params';
import { buildTeamWhereQuery } from '@documenso/lib/utils/teams';
import { prisma } from '@documenso/prisma';

View file

@ -1,4 +1,3 @@
import { WebhookCallStatus, WebhookTriggerEvents } from '@prisma/client';
import { z } from 'zod';
import WebhookCallSchema from '@documenso/prisma/generated/zod/modelSchema/WebhookCallSchema';

View file

@ -17,20 +17,20 @@
"clean": "rimraf node_modules"
},
"devDependencies": {
"@documenso/tailwind-config": "*",
"@documenso/tsconfig": "*",
"@types/luxon": "^3.7.1",
"@types/react": "18.3.27",
"@types/react-dom": "^18",
"react": "^18",
"typescript": "5.6.2"
"@documenso/tailwind-config": "workspace:*",
"@documenso/tsconfig": "workspace:*",
"@types/luxon": "catalog:",
"@types/react": "catalog:",
"@types/react-dom": "catalog:",
"react": "catalog:",
"typescript": "catalog:"
},
"dependencies": {
"@documenso/lib": "*",
"@documenso/lib": "workspace:*",
"@hello-pangea/dnd": "^16.6.0",
"@hookform/resolvers": "^3",
"@lingui/macro": "^5.6.0",
"@lingui/react": "^5.6.0",
"@hookform/resolvers": "catalog:",
"@lingui/macro": "catalog:",
"@lingui/react": "catalog:",
"@radix-ui/react-accordion": "^1.2.12",
"@radix-ui/react-alert-dialog": "^1.1.15",
"@radix-ui/react-aspect-ratio": "^1.1.8",
@ -58,26 +58,26 @@
"@radix-ui/react-toggle": "^1.1.10",
"@radix-ui/react-toggle-group": "^1.1.11",
"@radix-ui/react-tooltip": "^1.2.8",
"@scure/base": "^1.2.6",
"@scure/base": "catalog:",
"@tanstack/react-table": "^8.21.3",
"class-variance-authority": "^0.7.1",
"clsx": "^1.2.1",
"cmdk": "^0.2.1",
"framer-motion": "^12.23.24",
"lucide-react": "^0.554.0",
"luxon": "^3.7.2",
"pdfjs-dist": "5.4.296",
"framer-motion": "catalog:",
"lucide-react": "catalog:",
"luxon": "catalog:",
"perfect-freehand": "^1.2.2",
"react": "^18",
"pdfjs-dist": "5.4.296",
"react": "catalog:",
"react-colorful": "^5.6.1",
"react-day-picker": "^8.10.1",
"react-dom": "^18",
"react-hook-form": "^7.66.1",
"react-rnd": "^10.5.2",
"remeda": "^2.32.0",
"react-dom": "catalog:",
"react-hook-form": "catalog:",
"react-rnd": "catalog:",
"remeda": "catalog:",
"tailwind-merge": "^1.14.0",
"tailwindcss-animate": "^1.0.7",
"ts-pattern": "^5.9.0",
"zod": "^3.25.76"
"tailwindcss-animate": "catalog:",
"ts-pattern": "catalog:",
"zod": "catalog:"
}
}

File diff suppressed because one or more lines are too long

23016
pnpm-lock.yaml Normal file

File diff suppressed because it is too large Load diff

82
pnpm-workspace.yaml Normal file
View file

@ -0,0 +1,82 @@
packages:
- 'apps/*'
- 'packages/*'
catalog:
# Core
react: ^18
react-dom: ^18
typescript: 5.6.2
zod: ^3.25.76
# Shared utilities
ts-pattern: ^5.9.0
luxon: ^3.7.2
nanoid: ^5.1.6
remeda: ^2.32.0
superjson: ^2.2.5
# AWS
'@aws-sdk/client-s3': ^3.998.0
'@aws-sdk/client-sesv2': ^3.998.0
'@aws-sdk/cloudfront-signer': ^3.998.0
'@aws-sdk/s3-request-presigner': ^3.998.0
'@aws-sdk/signature-v4-crt': ^3.998.0
# Framework
hono: ^4.12.2
'@hono/standard-validator': ^0.2.0
'@tanstack/react-query': 5.90.10
'@trpc/client': 11.8.1
'@trpc/react-query': 11.8.1
'@trpc/server': 11.8.1
'@ts-rest/core': ^3.52.1
'@ts-rest/open-api': ^3.52.1
'@ts-rest/serverless': ^3.52.1
# UI
framer-motion: ^12.23.24
lucide-react: ^0.554.0
react-hook-form: ^7.66.1
'@hookform/resolvers': ^3
react-rnd: ^10.5.2
konva: ^10.0.9
'@napi-rs/canvas': ^0.1.83
tailwindcss: ^3.4.18
autoprefixer: ^10.4.22
tailwindcss-animate: ^1.0.7
# i18n
'@lingui/core': ^5.6.0
'@lingui/macro': ^5.6.0
'@lingui/react': ^5.6.0
# Auth
'@simplewebauthn/server': ^13.2.2
'@oslojs/crypto': ^1.0.1
'@oslojs/encoding': ^1.1.0
# Crypto
'@scure/base': ^1.2.6
# Observability
posthog-node: 4.18.0
posthog-js: ^1.297.2
# Database
kysely: 0.28.8
'@prisma/client': ^6.19.0
prisma: ^6.19.0
# Build tools
tsx: ^4.20.6
vite: ^7.2.4
eslint: ^8.57.0
prettier: ^3.6.2
# Types
'@types/react': 18.3.27
'@types/react-dom': ^18
'@types/node': ^20
'@types/luxon': ^3.7.1
'@types/formidable': ^3.4.6

View file

@ -1,6 +1,7 @@
{
"$schema": "https://turbo.build/schema.json",
"pipeline": {
"ui": "stream",
"tasks": {
"build": {
"dependsOn": ["prebuild", "^build"],
"outputs": [".next/**", "!.next/cache/**"]