Compare commits

...

11 Commits

Author SHA1 Message Date
Lucas Smith 1b171f7d1b fix: update dockerfile 2026-03-06 15:10:06 +11:00
Lucas Smith d05d051053 fix: update dockerfile 2026-03-06 15:06:50 +11:00
Lucas Smith 30c5cf6d70 fix: update dockerfile 2026-03-06 14:57:25 +11:00
Lucas Smith dfac91916c fix: react19 errors 2026-03-06 14:46:42 +11:00
Lucas Smith a5a795cb7b fix: update ci 2026-03-06 14:29:43 +11:00
Lucas Smith b6da33282e fix: make prisma work 2026-03-06 14:29:41 +11:00
Lucas Smith 0d1496bc26 fix: set explicit prisma client output for pnpm compatibility
pnpm's strict node_modules layout causes prisma generate to output to
a deeply nested .pnpm directory, but @prisma/client resolves .prisma/client
from the root node_modules. Setting an explicit output path ensures the
generated client is always found at the expected location.
2026-03-06 14:28:59 +11:00
Lucas Smith b5e1874ced fix: remove remaining double-dash issues in CI and docs
The translate:compile CI scripts had a double `--` that
would pass a spurious `--` to lingui. CLAUDE.md still
referenced the old `with:env --` pattern.
2026-03-06 14:28:59 +11:00
Lucas Smith 0b8d107291 fix: remove double-dash in pnpm with:env script calls
pnpm does not consume `--` the way npm did when passing
args to scripts. The extra `--` was being forwarded to
dotenv-cli which tried to spawn it as a command, causing
ENOENT errors in CI.
2026-03-06 14:28:59 +11:00
Lucas Smith f66f01a09a build: standardise on react 19 and deduplicate deps
Eliminates dual React ecosystems and reduces dependency
duplication by consolidating on a single React version and
expanding the pnpm workspace catalog.

- Upgrade all packages from React 18 to React 19
- Remove @types/react and @types/node overrides (no longer
  needed with single React version)
- Standardise @types/node to ^22 across all packages
- Add prisma-kysely>@prisma/internals override to eliminate
  old prisma 6.16.x subtree
- Fix React 19 type changes: useRef requires initial value,
  JSX namespace needs explicit import, RefObject includes null
- Expand catalog with 14 new entries (ai, dotenv, pino,
  playwright, prisma tooling, nodemailer, pdfjs-dist, etc.)
- Catalog radix-ui, next, lucide-react, postcss, and
  typescript for docs/openpage-api alignment
- Run pnpm dedupe to collapse peer-dep context duplicates
2026-03-06 14:28:58 +11:00
Lucas Smith 960217c78d 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
2026-03-06 14:28:12 +11:00
64 changed files with 23285 additions and 37858 deletions
+7 -21
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'
@@ -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
+2 -3
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
+1 -1
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
+1 -1
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
+5 -5
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'
+5 -3
View File
@@ -16,14 +16,16 @@ jobs:
uses: actions/checkout@v4
with:
fetch-depth: 2
- name: Install pnpm
uses: pnpm/action-setup@v4
- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: '18'
cache: npm
- name: Install Octokit
run: npm install @octokit/rest@18
run: pnpm install @octokit/rest@18
- name: Check Assigned User's Issue Count
id: parse-comment
+5 -2
View File
@@ -16,14 +16,17 @@ jobs:
uses: actions/checkout@v4
with:
fetch-depth: 2
- name: Install pnpm
uses: pnpm/action-setup@v4
- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: '18'
cache: npm
- name: Install Octokit
run: npm install @octokit/rest@18
run: pnpm install @octokit/rest@18
- name: Check user's PRs awaiting review
id: parse-prs
+1 -1
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
+2 -2
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
+1 -3
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
+3 -2
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
+11 -11
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
+4 -3
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
+3 -3
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
+4 -3
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
+3 -3
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
+9 -9
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
@@ -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
+2 -2
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
+2 -2
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
+9 -9
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
+6 -6
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)
+1 -1
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
+17 -20
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.
+11 -11
View File
@@ -10,27 +10,27 @@
"postinstall": "fumadocs-mdx"
},
"dependencies": {
"@radix-ui/react-tabs": "^1.1.13",
"@radix-ui/react-tabs": "catalog:",
"fumadocs-core": "16.5.0",
"fumadocs-mdx": "14.2.6",
"fumadocs-ui": "16.5.0",
"lucide-react": "^0.563.0",
"mermaid": "^11.12.2",
"next": "16.1.6",
"lucide-react": "catalog:",
"mermaid": "^11.12.3",
"next": "catalog:",
"next-plausible": "^3.12.5",
"next-themes": "^0.4.6",
"react": "^19.2.4",
"react-dom": "^19.2.4",
"react": "catalog:",
"react-dom": "catalog:",
"tailwind-merge": "^3.4.0"
},
"devDependencies": {
"@tailwindcss/postcss": "^4.1.18",
"@types/mdx": "^2.0.13",
"@types/node": "^25.1.0",
"@types/react": "^19.2.10",
"@types/react-dom": "^19.2.3",
"postcss": "^8.5.6",
"@types/node": "catalog:",
"@types/react": "catalog:",
"@types/react-dom": "catalog:",
"postcss": "catalog:",
"tailwindcss": "^4.1.18",
"typescript": "^5.9.3"
"typescript": "catalog:"
}
}
+9 -7
View File
@@ -6,17 +6,19 @@
"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": "catalog:",
"react": "catalog:",
"react-dom": "catalog:"
},
"devDependencies": {
"@types/node": "^20",
"@types/react": "18.3.27",
"typescript": "5.6.2"
"@types/node": "catalog:",
"@types/react": "catalog:",
"typescript": "catalog:"
}
}
+19 -5
View File
@@ -1,7 +1,11 @@
{
"compilerOptions": {
"target": "ES2017",
"lib": ["dom", "dom.iterable", "esnext"],
"lib": [
"dom",
"dom.iterable",
"esnext"
],
"allowJs": true,
"skipLibCheck": true,
"strict": true,
@@ -11,7 +15,7 @@
"moduleResolution": "bundler",
"resolveJsonModule": true,
"isolatedModules": true,
"jsx": "preserve",
"jsx": "react-jsx",
"incremental": true,
"plugins": [
{
@@ -19,9 +23,19 @@
}
],
"paths": {
"@/*": ["./*"]
"@/*": [
"./*"
]
}
},
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
"exclude": ["node_modules"]
"include": [
"next-env.d.ts",
"**/*.ts",
"**/*.tsx",
".next/types/**/*.ts",
".next/dev/types/**/*.ts"
],
"exclude": [
"node_modules"
]
}
+3 -3
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
-26
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"]
@@ -162,7 +162,7 @@ export const PDFViewer = ({
if (!data) {
return (
<div ref={$el} className={cn('h-full w-full', className)} {...props}>
<p className="py-32 text-center text-sm text-muted-foreground">
<p className="text-muted-foreground py-32 text-center text-sm">
<Trans>No document found</Trans>
</p>
</div>
@@ -194,7 +194,7 @@ export const PDFViewer = ({
type VirtualizedPageListProps = {
scrollParentRef: ScrollTarget;
constraintRef: React.RefObject<HTMLDivElement>;
constraintRef: React.RefObject<HTMLDivElement | null>;
pages: PageMeta[];
numPages: number;
pdf: pdfjsLib.PDFDocumentProxy;
@@ -278,7 +278,7 @@ const VirtualizedPageList = ({
customPageRenderer={customPageRenderer}
/>
<p className="my-2 text-center text-[11px] text-muted-foreground/80">
<p className="text-muted-foreground/80 my-2 text-center text-[11px]">
<Trans>
Page {pageNumber} of {numPages}
</Trans>
@@ -323,7 +323,7 @@ const PdfViewerPage = ({
return (
<div
className="relative w-full rounded border border-border"
className="border-border relative w-full rounded border"
style={{ width: scaledWidth, height: scaledHeight }}
>
{CustomPageRenderer && imageLoadingState === 'loaded' && (
+46 -46
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/node-server": "catalog:",
"@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"
},
+3
View File
@@ -93,6 +93,9 @@ export default defineConfig({
* See rollup.config.mjs which is used for that.
*/
build: {
commonjsOptions: {
include: [/node_modules/],
},
rollupOptions: {
external: [
'@napi-rs/canvas',
+34 -34
View File
@@ -6,42 +6,41 @@ FROM node:22-alpine3.22 AS base
RUN apk add --no-cache openssl
RUN apk add --no-cache font-freefont
RUN npm install -g pnpm
###########################
# BUILDER CONTAINER #
###########################
FROM base AS builder
#############################
# DEVELOPMENT CONTAINER #
#############################
FROM base AS development
ENV HUSKY 0
ENV DOCKER_OUTPUT 1
# Check https://github.com/nodejs/docker-node/tree/b4117f9333da4138b03a546ec926ef50a31506c3#nodealpine to understand why libc6-compat might be needed.
RUN apk add --no-cache libc6-compat
RUN apk add --no-cache jq
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
###########################
# INSTALLER CONTAINER #
###########################
FROM base AS installer
# Check https://github.com/nodejs/docker-node/tree/b4117f9333da4138b03a546ec926ef50a31506c3#nodealpine to understand why libc6-compat might be needed.
RUN apk add --no-cache libc6-compat
RUN apk add --no-cache jq
# Required for node_modules/aws-crt
RUN apk add --no-cache make cmake g++ openssl bash
WORKDIR /app
# Disable husky from installing hooks
ENV HUSKY 0
ENV DOCKER_OUTPUT 1
ENV NEXT_TELEMETRY_DISABLED 1
###########################
# BUILDER CONTAINER #
###########################
FROM development AS builder
COPY . .
RUN pnpm install --frozen-lockfile
# Outputs to the /out folder
# source: https://turbo.build/repo/docs/reference/command-line-reference/prune#--docker
RUN pnpm exec turbo prune @documenso/remix --docker
###########################
# INSTALLER CONTAINER #
###########################
FROM development AS installer
# Encryption keys
ARG NEXT_PRIVATE_ENCRYPTION_KEY="CAFEBABE"
@@ -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/
+1 -1
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
View File
File diff suppressed because it is too large Load Diff
+77 -66
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,108 @@
"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",
"dotenv": "^17.2.3",
"dotenv-cli": "^11.0.0",
"eslint": "^8.57.0",
"@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": "catalog:",
"dotenv-cli": "catalog:",
"eslint": "catalog:",
"husky": "^9.1.7",
"inngest-cli": "^1.16.1",
"inngest-cli": "^1.17.2",
"lint-staged": "^16.2.7",
"nanoid": "^5.1.6",
"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",
"prisma-extension-kysely": "^3.0.0",
"prisma-json-types-generator": "^3.6.2",
"prisma-kysely": "^2.3.0",
"nanoid": "catalog:",
"nodemailer": "catalog:",
"pdfjs-dist": "catalog:",
"pino": "catalog:",
"pino-pretty": "catalog:",
"playwright": "catalog:",
"prettier": "catalog:",
"prisma": "catalog:",
"prisma-extension-kysely": "catalog:",
"prisma-json-types-generator": "catalog:",
"prisma-kysely": "catalog:",
"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"
"zod-openapi": "catalog:",
"zod-prisma-types": "catalog:"
},
"dependencies": {
"@ai-sdk/google-vertex": "3.0.81",
"@documenso/prisma": "*",
"@ai-sdk/google-vertex": "catalog:",
"@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",
"ai": "catalog:",
"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": "$pdfjs-dist",
"typescript": "5.6.2",
"zod": "$zod",
"fumadocs-mdx>zod": "^4.3.5",
"jiti": "2.6.1",
"prisma-kysely>@prisma/internals": "^6.19.0"
},
"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"
]
}
}
+10 -10
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:"
}
}
}
+6 -6
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"
}
}
}
+11 -11
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:"
}
}
+7 -7
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:"
}
}
+3 -3
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",
@@ -37,12 +37,12 @@
"@react-email/section": "0.0.16",
"@react-email/tailwind": "^2.0.1",
"@react-email/text": "0.1.5",
"nodemailer": "^7.0.10",
"nodemailer": "catalog:",
"react-email": "^5.0.6",
"resend": "^6.5.2"
},
"devDependencies": {
"@documenso/tsconfig": "*",
"@documenso/tsconfig": "workspace:*",
"@types/nodemailer": "^7.0.4"
}
}
+4 -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:"
}
}
}
@@ -11,7 +11,7 @@ export const useAutoSave = <T, R = void>(
) => {
const { delay = 2000 } = options;
const saveTimeoutRef = useRef<NodeJS.Timeout>();
const saveTimeoutRef = useRef<NodeJS.Timeout>(undefined);
const saveQueueRef = useRef<SaveRequest<T, R>[]>([]);
const isProcessingRef = useRef(false);
@@ -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.
+31 -31
View File
@@ -15,56 +15,56 @@
"clean": "rimraf node_modules"
},
"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",
"@ai-sdk/google-vertex": "catalog:",
"@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",
"ai": "^5.0.104",
"ai": "catalog:",
"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",
"pino": "catalog:",
"pino-pretty": "catalog:",
"playwright": "catalog:",
"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"
}
}
+4
View File
@@ -1,3 +1,5 @@
const path = require('path');
/** @type {import('prettier').Config} */
module.exports = {
arrowParens: 'always',
@@ -22,6 +24,8 @@ module.exports = {
// importOrderMergeDuplicateImports: true,
// importOrderCombineTypeAndValueImports: true,
// tailwindStylesheet: path.join(__dirname, '../ui/styles/theme.css'),
plugins: [
'@trivago/prettier-plugin-sort-imports',
// !: Disabled until Prettier 3.x is supported.
+4 -3
View File
@@ -8,8 +8,9 @@
},
"dependencies": {
"@trivago/prettier-plugin-sort-imports": "^4.3.0",
"prettier": "^3.6.2",
"prettier-plugin-tailwindcss": "^0.7.1"
"prettier": "catalog:",
"prettier-plugin-tailwindcss": "0.6.11",
"tailwindcss": "catalog:"
},
"devDependencies": {}
}
}
+14 -14
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-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",
"zod-prisma-types": "3.3.5"
"@prisma/client": "catalog:",
"kysely": "catalog:",
"nanoid": "catalog:",
"prisma": "catalog:",
"prisma-extension-kysely": "catalog:",
"prisma-kysely": "catalog:",
"prisma-json-types-generator": "catalog:",
"ts-pattern": "catalog:",
"zod": "catalog:",
"zod-prisma-types": "catalog:"
},
"devDependencies": {
"dotenv": "^17.2.3",
"dotenv-cli": "^11.0.0",
"tsx": "^4.20.6",
"typescript": "5.6.2"
"dotenv": "catalog:",
"dotenv-cli": "catalog:",
"tsx": "catalog:",
"typescript": "catalog:"
}
}
+5
View File
@@ -6,6 +6,11 @@ generator client {
provider = "prisma-client-js"
}
generator client_node_modules {
provider = "prisma-client-js"
output = "../../node_modules/.prisma/client"
}
generator json {
provider = "prisma-json-types-generator"
}
+3 -3
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:*"
}
}
}
+5 -5
View File
@@ -10,13 +10,13 @@
"dependencies": {
"@tailwindcss/container-queries": "^0.1.1",
"@tailwindcss/typography": "^0.5.19",
"autoprefixer": "^10.4.22",
"postcss": "^8.5.6",
"tailwindcss": "^3.4.18",
"tailwindcss-animate": "^1.0.7"
"autoprefixer": "catalog:",
"postcss": "catalog:",
"tailwindcss": "catalog:",
"tailwindcss-animate": "catalog:"
},
"devDependencies": {},
"publishConfig": {
"access": "public"
}
}
}
+14 -14
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"
"zod-openapi": "catalog:"
},
"devDependencies": {
"@types/formidable": "^3.4.6"
"@types/formidable": "catalog:"
}
}
@@ -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';
@@ -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';
@@ -1,4 +1,3 @@
import { WebhookCallStatus, WebhookTriggerEvents } from '@prisma/client';
import { z } from 'zod';
import WebhookCallSchema from '@documenso/prisma/generated/zod/modelSchema/WebhookCallSchema';
+3 -3
View File
@@ -48,7 +48,7 @@ export const SigningCard3D = ({
const [trackMouse, setTrackMouse] = useState(false);
const timeoutRef = useRef<number | undefined>();
const timeoutRef = useRef<number | undefined>(undefined);
const cardX = useMotionValue(0);
const cardY = useMotionValue(0);
@@ -184,7 +184,7 @@ const SigningCardContent = ({ className, name, signature }: SigningCardContentPr
))
.with({ typedSignature: P.string }, (signature) => (
<span
className="text-muted-foreground/60 group-hover:text-primary/80 break-all font-semibold duration-300"
className="text-muted-foreground/60 group-hover:text-primary/80 font-semibold break-all duration-300"
style={{
fontSize: `max(min(4rem, ${(100 / signature.typedSignature.length / 2).toFixed(
4,
@@ -196,7 +196,7 @@ const SigningCardContent = ({ className, name, signature }: SigningCardContentPr
))
.otherwise(() => (
<span
className="text-muted-foreground/60 group-hover:text-primary/80 break-all font-semibold duration-300"
className="text-muted-foreground/60 group-hover:text-primary/80 font-semibold break-all duration-300"
style={{
fontSize: `max(min(4rem, ${(100 / name.length / 2).toFixed(4)}cqw), 1.875rem)`,
}}
+51 -51
View File
@@ -17,67 +17,67 @@
"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",
"@radix-ui/react-accordion": "^1.2.12",
"@radix-ui/react-alert-dialog": "^1.1.15",
"@radix-ui/react-aspect-ratio": "^1.1.8",
"@radix-ui/react-avatar": "^1.1.11",
"@radix-ui/react-checkbox": "^1.3.3",
"@radix-ui/react-collapsible": "^1.1.12",
"@radix-ui/react-context-menu": "^2.2.16",
"@radix-ui/react-dialog": "^1.1.15",
"@radix-ui/react-dropdown-menu": "^2.1.16",
"@radix-ui/react-hover-card": "^1.1.15",
"@radix-ui/react-label": "^2.1.8",
"@radix-ui/react-menubar": "^1.1.16",
"@radix-ui/react-navigation-menu": "^1.2.14",
"@radix-ui/react-popover": "^1.1.15",
"@radix-ui/react-progress": "^1.1.8",
"@radix-ui/react-radio-group": "^1.3.8",
"@radix-ui/react-scroll-area": "^1.2.10",
"@radix-ui/react-select": "^2.2.6",
"@radix-ui/react-separator": "^1.1.8",
"@radix-ui/react-slider": "^1.3.6",
"@radix-ui/react-slot": "^1.2.4",
"@radix-ui/react-switch": "^1.2.6",
"@radix-ui/react-tabs": "^1.1.13",
"@radix-ui/react-toast": "^1.2.15",
"@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",
"@hookform/resolvers": "catalog:",
"@lingui/macro": "catalog:",
"@lingui/react": "catalog:",
"@radix-ui/react-accordion": "catalog:",
"@radix-ui/react-alert-dialog": "catalog:",
"@radix-ui/react-aspect-ratio": "catalog:",
"@radix-ui/react-avatar": "catalog:",
"@radix-ui/react-checkbox": "catalog:",
"@radix-ui/react-collapsible": "catalog:",
"@radix-ui/react-context-menu": "catalog:",
"@radix-ui/react-dialog": "catalog:",
"@radix-ui/react-dropdown-menu": "catalog:",
"@radix-ui/react-hover-card": "catalog:",
"@radix-ui/react-label": "catalog:",
"@radix-ui/react-menubar": "catalog:",
"@radix-ui/react-navigation-menu": "catalog:",
"@radix-ui/react-popover": "catalog:",
"@radix-ui/react-progress": "catalog:",
"@radix-ui/react-radio-group": "catalog:",
"@radix-ui/react-scroll-area": "catalog:",
"@radix-ui/react-select": "catalog:",
"@radix-ui/react-separator": "catalog:",
"@radix-ui/react-slider": "catalog:",
"@radix-ui/react-slot": "catalog:",
"@radix-ui/react-switch": "catalog:",
"@radix-ui/react-tabs": "catalog:",
"@radix-ui/react-toast": "catalog:",
"@radix-ui/react-toggle": "catalog:",
"@radix-ui/react-toggle-group": "catalog:",
"@radix-ui/react-tooltip": "catalog:",
"@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": "catalog:",
"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:"
}
}
@@ -1,7 +1,9 @@
import React from 'react';
import type { RecipientRole } from '@prisma/client';
import { BadgeCheck, Copy, Eye, PencilLine, User } from 'lucide-react';
export const ROLE_ICONS: Record<RecipientRole, JSX.Element> = {
export const ROLE_ICONS: Record<RecipientRole, React.ReactNode> = {
SIGNER: <PencilLine className="h-4 w-4" />,
APPROVER: <BadgeCheck className="h-4 w-4" />,
CC: <Copy className="h-4 w-4" />,
@@ -17,7 +17,7 @@ import { getSvgPathFromStroke } from './helper';
import { Point } from './point';
import { SignaturePadColorPicker } from './signature-pad-color-picker';
const checkSignatureValidity = (element: RefObject<HTMLCanvasElement>) => {
const checkSignatureValidity = (element: RefObject<HTMLCanvasElement | null>) => {
if (!element.current) {
return false;
}
@@ -291,10 +291,10 @@ export const SignaturePadDraw = ({
<SignaturePadColorPicker selectedColor={selectedColor} setSelectedColor={setSelectedColor} />
<div className="absolute bottom-3 right-3 flex gap-2">
<div className="absolute right-3 bottom-3 flex gap-2">
<button
type="button"
className="rounded-full p-0 text-[0.688rem] text-muted-foreground/60 ring-offset-background hover:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
className="text-muted-foreground/60 ring-offset-background hover:text-muted-foreground focus-visible:ring-ring rounded-full p-0 text-[0.688rem] focus-visible:ring-2 focus-visible:outline-none"
onClick={() => onClearClick()}
>
<Trans>Clear Signature</Trans>
@@ -303,7 +303,7 @@ export const SignaturePadDraw = ({
{isSignatureValid === false && (
<div className="absolute bottom-4 left-4 flex gap-2">
<span className="text-xs text-destructive">
<span className="text-destructive text-xs">
<Trans>Signature is too small</Trans>
</span>
</div>
@@ -314,7 +314,7 @@ export const SignaturePadDraw = ({
<button
type="button"
title="undo"
className="rounded-full p-0 text-[0.688rem] text-muted-foreground/60 ring-offset-background hover:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
className="text-muted-foreground/60 ring-offset-background hover:text-muted-foreground focus-visible:ring-ring rounded-full p-0 text-[0.688rem] focus-visible:ring-2 focus-visible:outline-none"
onClick={onUndoClick}
>
<Undo2 className="h-4 w-4" />
File diff suppressed because one or more lines are too long
+22573
View File
File diff suppressed because it is too large Load Diff
+136
View File
@@ -0,0 +1,136 @@
packages:
- 'apps/*'
- 'packages/*'
catalog:
# Core
react: ^19.2.4
react-dom: ^19.2.4
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
next: 16.1.6
hono: ^4.12.4
'@hono/node-server': ^1.19.10
'@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.563.0
react-hook-form: ^7.66.1
'@hookform/resolvers': ^3
'@radix-ui/react-accordion': ^1.2.12
'@radix-ui/react-alert-dialog': ^1.1.15
'@radix-ui/react-aspect-ratio': ^1.1.8
'@radix-ui/react-avatar': ^1.1.11
'@radix-ui/react-checkbox': ^1.3.3
'@radix-ui/react-collapsible': ^1.1.12
'@radix-ui/react-context-menu': ^2.2.16
'@radix-ui/react-dialog': ^1.1.15
'@radix-ui/react-dropdown-menu': ^2.1.16
'@radix-ui/react-hover-card': ^1.1.15
'@radix-ui/react-label': ^2.1.8
'@radix-ui/react-menubar': ^1.1.16
'@radix-ui/react-navigation-menu': ^1.2.14
'@radix-ui/react-popover': ^1.1.15
'@radix-ui/react-progress': ^1.1.8
'@radix-ui/react-radio-group': ^1.3.8
'@radix-ui/react-scroll-area': ^1.2.10
'@radix-ui/react-select': ^2.2.6
'@radix-ui/react-separator': ^1.1.8
'@radix-ui/react-slider': ^1.3.6
'@radix-ui/react-slot': ^1.2.4
'@radix-ui/react-switch': ^1.2.6
'@radix-ui/react-tabs': ^1.1.13
'@radix-ui/react-toast': ^1.2.15
'@radix-ui/react-toggle': ^1.1.10
'@radix-ui/react-toggle-group': ^1.1.11
'@radix-ui/react-tooltip': ^1.2.8
react-rnd: ^10.5.2
konva: ^10.0.9
'@napi-rs/canvas': ^0.1.83
postcss: ^8.5.6
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
# AI
'@ai-sdk/google-vertex': 3.0.81
ai: ^5.0.104
# Email
nodemailer: ^7.0.10
# Observability
posthog-node: 4.18.0
posthog-js: ^1.297.2
pino: ^9.14.0
pino-pretty: ^13.1.2
# Database
kysely: 0.28.8
'@prisma/client': ^6.19.0
prisma: ^6.19.0
prisma-extension-kysely: ^3.0.0
prisma-json-types-generator: ^3.6.2
prisma-kysely: ^2.3.0
zod-prisma-types: 3.3.5
# Build tools
tsx: ^4.20.6
vite: ^7.2.4
eslint: ^8.57.0
prettier: ^3.6.2
dotenv: ^17.2.3
dotenv-cli: ^11.0.0
# PDF / Documents
pdfjs-dist: 5.4.296
# Testing
playwright: 1.56.1
# API
zod-openapi: ^4.2.4
# Types
'@types/react': ^19
'@types/react-dom': ^19
'@types/node': ^22
'@types/luxon': ^3.7.1
'@types/formidable': ^3.4.6
+2 -1
View File
@@ -1,6 +1,7 @@
{
"$schema": "https://turbo.build/schema.json",
"pipeline": {
"ui": "stream",
"tasks": {
"build": {
"dependsOn": ["prebuild", "^build"],
"outputs": [".next/**", "!.next/cache/**"]