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
+7 -7
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:"
}
}
+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"]
+45 -45
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"
},