diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml
new file mode 100644
index 000000000..862f248fe
--- /dev/null
+++ b/.github/workflows/publish.yml
@@ -0,0 +1,42 @@
+name: Publish Docker
+
+on:
+ push:
+ branches: ['release']
+
+jobs:
+ build:
+ runs-on: ${{ matrix.os }}
+ strategy:
+ fail-fast: false
+ matrix:
+ os:
+ - warp-ubuntu-latest-x64-4x
+ - warp-ubuntu-latest-arm64-4x
+
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ fetch-tags: true
+
+ - name: Login to DockerHub
+ uses: docker/login-action@v3
+ with:
+ username: ${{ secrets.DOCKERHUB_USERNAME }}
+ password: ${{ secrets.DOCKERHUB_TOKEN }}
+
+ - name: Login to GitHub Container Registry
+ uses: docker/login-action@v3
+ with:
+ registry: ghcr.io
+ username: ${{ github.repository_owner }}
+ password: ${{ secrets.GH_TOKEN }}
+
+ - name: Build the docker image
+ run: ./docker/build.sh
+
+ - name: Push the docker image to DockerHub
+ run: docker push --all-tags documenso/documenso
+
+ - name: Push the docker image to GitHub Container Registry
+ run: docker push --all-tags ghcr.io/documenso/documenso
diff --git a/README.md b/README.md
index cdb687264..62413a5d3 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,3 @@
-> 🚨 It is Launch Week #2 - Day 1: We launches teams 🎉 https://documen.so/day1
-
diff --git a/apps/marketing/next.config.js b/apps/marketing/next.config.js
index 9c61e4ada..0a0032868 100644
--- a/apps/marketing/next.config.js
+++ b/apps/marketing/next.config.js
@@ -21,6 +21,7 @@ const FONT_CAVEAT_BYTES = fs.readFileSync(
const config = {
experimental: {
outputFileTracingRoot: path.join(__dirname, '../../'),
+ serverComponentsExternalPackages: ['@node-rs/bcrypt'],
serverActions: {
bodySizeLimit: '50mb',
},
diff --git a/apps/marketing/src/app/(marketing)/open/cap-table.tsx b/apps/marketing/src/app/(marketing)/open/cap-table.tsx
index ca63bd7bf..ba6a12dc4 100644
--- a/apps/marketing/src/app/(marketing)/open/cap-table.tsx
+++ b/apps/marketing/src/app/(marketing)/open/cap-table.tsx
@@ -1,6 +1,7 @@
'use client';
-import { HTMLAttributes, useEffect, useState } from 'react';
+import type { HTMLAttributes } from 'react';
+import { useEffect, useState } from 'react';
import { Cell, Legend, Pie, PieChart, Tooltip } from 'recharts';
diff --git a/apps/marketing/src/app/(marketing)/open/monthly-new-users-chart.tsx b/apps/marketing/src/app/(marketing)/open/monthly-new-users-chart.tsx
index b96bbf50d..0df73e30c 100644
--- a/apps/marketing/src/app/(marketing)/open/monthly-new-users-chart.tsx
+++ b/apps/marketing/src/app/(marketing)/open/monthly-new-users-chart.tsx
@@ -14,7 +14,7 @@ export type MonthlyNewUsersChartProps = {
export const MonthlyNewUsersChart = ({ className, data }: MonthlyNewUsersChartProps) => {
const formattedData = [...data].reverse().map(({ month, count }) => {
return {
- month: DateTime.fromFormat(month, 'yyyy-MM').toFormat('LLL'),
+ month: DateTime.fromFormat(month, 'yyyy-MM').toFormat('LLLL'),
count: Number(count),
};
});
@@ -32,6 +32,9 @@ export const MonthlyNewUsersChart = ({ className, data }: MonthlyNewUsersChartPr
[Number(value).toLocaleString('en-US'), 'New Users']}
cursor={{ fill: 'hsl(var(--primary) / 10%)' }}
/>
diff --git a/apps/marketing/src/app/(marketing)/open/monthly-total-users-chart.tsx b/apps/marketing/src/app/(marketing)/open/monthly-total-users-chart.tsx
index e31bb9def..96ce34556 100644
--- a/apps/marketing/src/app/(marketing)/open/monthly-total-users-chart.tsx
+++ b/apps/marketing/src/app/(marketing)/open/monthly-total-users-chart.tsx
@@ -14,7 +14,7 @@ export type MonthlyTotalUsersChartProps = {
export const MonthlyTotalUsersChart = ({ className, data }: MonthlyTotalUsersChartProps) => {
const formattedData = [...data].reverse().map(({ month, cume_count: count }) => {
return {
- month: DateTime.fromFormat(month, 'yyyy-MM').toFormat('LLL'),
+ month: DateTime.fromFormat(month, 'yyyy-MM').toFormat('LLLL'),
count: Number(count),
};
});
@@ -32,6 +32,9 @@ export const MonthlyTotalUsersChart = ({ className, data }: MonthlyTotalUsersCha
[Number(value).toLocaleString('en-US'), 'Total Users']}
cursor={{ fill: 'hsl(var(--primary) / 10%)' }}
/>
diff --git a/apps/marketing/src/app/(marketing)/open/page.tsx b/apps/marketing/src/app/(marketing)/open/page.tsx
index 76de85fcf..8fef81134 100644
--- a/apps/marketing/src/app/(marketing)/open/page.tsx
+++ b/apps/marketing/src/app/(marketing)/open/page.tsx
@@ -15,6 +15,7 @@ import { MonthlyNewUsersChart } from './monthly-new-users-chart';
import { MonthlyTotalUsersChart } from './monthly-total-users-chart';
import { TeamMembers } from './team-members';
import { OpenPageTooltip } from './tooltip';
+import { Typefully } from './typefully';
export const metadata: Metadata = {
title: 'Open Startup',
@@ -237,6 +238,8 @@ export default async function OpenPage() {
+
+
Where's the rest?
diff --git a/apps/marketing/src/app/(marketing)/open/typefully.tsx b/apps/marketing/src/app/(marketing)/open/typefully.tsx
new file mode 100644
index 000000000..a233904db
--- /dev/null
+++ b/apps/marketing/src/app/(marketing)/open/typefully.tsx
@@ -0,0 +1,39 @@
+'use client';
+
+import type { HTMLAttributes } from 'react';
+
+import Link from 'next/link';
+
+import { FaXTwitter } from 'react-icons/fa6';
+
+import { cn } from '@documenso/ui/lib/utils';
+import { Button } from '@documenso/ui/primitives/button';
+
+export type TypefullyProps = HTMLAttributes
;
+
+export const Typefully = ({ className, ...props }: TypefullyProps) => {
+ return (
+
+
Twitter Stats
+
+
+
+
+
+
Documenso on X
+
+
+
+
+
+
+ );
+};
diff --git a/apps/web/next.config.js b/apps/web/next.config.js
index 7a42cb46a..1a48e29e3 100644
--- a/apps/web/next.config.js
+++ b/apps/web/next.config.js
@@ -22,6 +22,7 @@ const config = {
output: process.env.DOCKER_OUTPUT ? 'standalone' : undefined,
experimental: {
outputFileTracingRoot: path.join(__dirname, '../../'),
+ serverComponentsExternalPackages: ['@node-rs/bcrypt'],
serverActions: {
bodySizeLimit: '50mb',
},
diff --git a/apps/web/package.json b/apps/web/package.json
index b01048047..aad321987 100644
--- a/apps/web/package.json
+++ b/apps/web/package.json
@@ -19,7 +19,6 @@
"@documenso/ee": "*",
"@documenso/lib": "*",
"@documenso/prisma": "*",
- "@documenso/tailwind-config": "*",
"@documenso/trpc": "*",
"@documenso/ui": "*",
"@hookform/resolvers": "^3.1.0",
@@ -48,19 +47,20 @@
"remeda": "^1.27.1",
"sharp": "0.33.1",
"ts-pattern": "^5.0.5",
- "typescript": "5.2.2",
"ua-parser-js": "^1.0.37",
"uqr": "^0.1.2",
"zod": "^3.22.4"
},
"devDependencies": {
+ "@documenso/tailwind-config": "*",
"@simplewebauthn/types": "^9.0.1",
"@types/formidable": "^2.0.6",
"@types/luxon": "^3.3.1",
"@types/node": "20.1.0",
"@types/react": "18.2.18",
"@types/react-dom": "18.2.7",
- "@types/ua-parser-js": "^0.7.39"
+ "@types/ua-parser-js": "^0.7.39",
+ "typescript": "5.2.2"
},
"overrides": {
"next-auth": {
@@ -70,4 +70,4 @@
"next": "$next"
}
}
-}
+}
\ No newline at end of file
diff --git a/docker/Dockerfile b/docker/Dockerfile
index 4952b0bbd..0d6f42e1f 100644
--- a/docker/Dockerfile
+++ b/docker/Dockerfile
@@ -32,6 +32,7 @@ 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++
+
WORKDIR /app
# Disable husky from installing hooks
@@ -80,6 +81,7 @@ WORKDIR /app
# Don't run production as root
RUN addgroup --system --gid 1001 nodejs
RUN adduser --system --uid 1001 nextjs
+
USER nextjs
COPY --from=installer /app/apps/web/next.config.js .
@@ -91,4 +93,18 @@ COPY --from=installer --chown=nextjs:nodejs /app/apps/web/.next/standalone ./
COPY --from=installer --chown=nextjs:nodejs /app/apps/web/.next/static ./apps/web/.next/static
COPY --from=installer --chown=nextjs:nodejs /app/apps/web/public ./apps/web/public
-CMD node apps/web/server.js
+# Copy the prisma binary, schema and migrations
+COPY --from=installer --chown=nextjs:nodejs /app/packages/prisma/schema.prisma ./packages/prisma/schema.prisma
+COPY --from=installer --chown=nextjs:nodejs /app/packages/prisma/migrations ./packages/prisma/migrations
+COPY --from=installer --chown=nextjs:nodejs /app/node_modules/prisma/ ./node_modules/prisma/
+COPY --from=installer --chown=nextjs:nodejs /app/node_modules/@prisma/ ./node_modules/@prisma/
+
+# Symlink the prisma binary
+RUN mkdir node_modules/.bin
+RUN ln -s /app/node_modules/prisma/build/index.js ./node_modules/.bin/prisma
+
+
+# Get the start script from docker/start.sh
+COPY --chown=nextjs:nodejs ./docker/start.sh ./start.sh
+
+CMD ["sh", "start.sh"]
diff --git a/docker/README.md b/docker/README.md
new file mode 100644
index 000000000..addb278c4
--- /dev/null
+++ b/docker/README.md
@@ -0,0 +1,128 @@
+# Docker Setup for Documenso
+
+The following guide will walk you through setting up Documenso using Docker. You can choose between a production setup using Docker Compose or a standalone container.
+
+## Prerequisites
+
+Before you begin, ensure that you have the following installed:
+
+- Docker
+- Docker Compose (if using the Docker Compose setup)
+
+## Option 1: Production Docker Compose Setup
+
+This setup includes a PostgreSQL database and the Documenso application. You will need to provide your own SMTP details via environment variables.
+
+1. Download the Docker Compose file from the Documenso repository: [compose.yml](https://raw.githubusercontent.com/documenso/documenso/release/docker/production/compose.yml)
+2. Navigate to the directory containing the `compose.yml` file.
+3. Create a `.env` file in the same directory and add your SMTP details as well as a few extra environment variables, following the example below:
+
+```
+NEXTAUTH_SECRET=""
+NEXT_PRIVATE_ENCRYPTION_KEY=""
+NEXT_PRIVATE_ENCRYPTION_SECONDARY_KEY=""
+NEXT_PUBLIC_WEBAPP_URL=""
+NEXT_PRIVATE_SMTP_TRANSPORT="smtp-auth"
+NEXT_PRIVATE_SMTP_HOST=""
+NEXT_PRIVATE_SMTP_PORT=
+NEXT_PRIVATE_SMTP_USERNAME=""
+NEXT_PRIVATE_SMTP_PASSWORD=""
+```
+
+4. Run the following command to start the containers:
+
+```
+docker-compose --env-file ./.env -d up
+```
+
+This will start the PostgreSQL database and the Documenso application containers.
+
+5. Access the Documenso application by visiting `http://localhost:3000` in your web browser.
+
+## Option 2: Standalone Docker Container
+
+If you prefer to host the Documenso application on your container provider of choice, you can use the pre-built Docker image from DockerHub or GitHub's Package Registry. Note that you will need to provide your own database and SMTP host.
+
+1. Pull the Documenso Docker image:
+
+```
+docker pull documenso/documenso
+```
+
+Or, if using GitHub's Package Registry:
+
+```
+docker pull ghcr.io/documenso/documenso
+```
+
+2. Run the Docker container, providing the necessary environment variables for your database and SMTP host:
+
+```
+docker run -d \
+ -p 3000:3000 \
+ -e POSTGRES_USER=""
+ -e POSTGRES_PASSWORD=""
+ -e POSTGRES_DB=""
+ -e NEXTAUTH_URL=""
+ -e NEXTAUTH_SECRET=""
+ -e NEXT_PRIVATE_ENCRYPTION_KEY=""
+ -e NEXT_PRIVATE_ENCRYPTION_SECONDARY_KEY=""
+ -e NEXT_PUBLIC_WEBAPP_URL=""
+ -e NEXT_PRIVATE_DATABASE_URL=""
+ -e NEXT_PRIVATE_SMTP_TRANSPORT=""
+ -e NEXT_PRIVATE_SMTP_FROM_NAME=""
+ -e NEXT_PRIVATE_SMTP_FROM_ADDRESS=""
+ documenso/documenso
+```
+
+Replace the placeholders with your actual database and SMTP details.
+
+1. Access the Documenso application by visiting the URL you provided in the `NEXT_PUBLIC_WEBAPP_URL` environment variable in your web browser.
+
+## Success
+
+You have now successfully set up Documenso using Docker. You can start organizing and managing your documents efficiently. If you encounter any issues or have further questions, please refer to the official Documenso documentation or seek assistance from the community.
+
+## Advanced Configuration
+
+The environment variables listed above are a subset of those that are available for configuring Documenso. For a complete list of environment variables and their descriptions, refer to the table below:
+
+Here's a markdown table documenting all the provided environment variables:
+
+| Variable | Description |
+| -------------------------------------------- | --------------------------------------------------------------------------------------------------- |
+| `PORT` | The port to run the Documenso application on, defaults to `3000`. |
+| `NEXTAUTH_URL` | The URL for the NextAuth.js authentication service. |
+| `NEXTAUTH_SECRET` | The secret key used by NextAuth.js for encryption and signing. |
+| `NEXT_PRIVATE_ENCRYPTION_KEY` | The primary encryption key for symmetric encryption and decryption (at least 32 characters). |
+| `NEXT_PRIVATE_ENCRYPTION_SECONDARY_KEY` | The secondary encryption key for symmetric encryption and decryption (at least 32 characters). |
+| `NEXT_PRIVATE_GOOGLE_CLIENT_ID` | The Google client ID for Google authentication (optional). |
+| `NEXT_PRIVATE_GOOGLE_CLIENT_SECRET` | The Google client secret for Google authentication (optional). |
+| `NEXT_PUBLIC_WEBAPP_URL` | The URL for the web application. |
+| `NEXT_PRIVATE_DATABASE_URL` | The URL for the primary database connection (with connection pooling). |
+| `NEXT_PRIVATE_DIRECT_DATABASE_URL` | The URL for the direct database connection (without connection pooling). |
+| `NEXT_PUBLIC_UPLOAD_TRANSPORT` | The transport to use for file uploads (database or s3). |
+| `NEXT_PRIVATE_UPLOAD_ENDPOINT` | The endpoint for the S3 storage transport (for third-party S3-compatible providers). |
+| `NEXT_PRIVATE_UPLOAD_REGION` | The region for the S3 storage transport (defaults to us-east-1). |
+| `NEXT_PRIVATE_UPLOAD_BUCKET` | The bucket to use for the S3 storage transport. |
+| `NEXT_PRIVATE_UPLOAD_ACCESS_KEY_ID` | The access key ID for the S3 storage transport. |
+| `NEXT_PRIVATE_UPLOAD_SECRET_ACCESS_KEY` | The secret access key for the S3 storage transport. |
+| `NEXT_PRIVATE_SMTP_TRANSPORT` | The transport to use for sending emails (smtp-auth, smtp-api, resend, or mailchannels). |
+| `NEXT_PRIVATE_SMTP_HOST` | The host for the SMTP server for SMTP transports. |
+| `NEXT_PRIVATE_SMTP_PORT` | The port for the SMTP server for SMTP transports. |
+| `NEXT_PRIVATE_SMTP_USERNAME` | The username for the SMTP server for the `smtp-auth` transport. |
+| `NEXT_PRIVATE_SMTP_PASSWORD` | The password for the SMTP server for the `smtp-auth` transport. |
+| `NEXT_PRIVATE_SMTP_APIKEY_USER` | The API key user for the SMTP server for the `smtp-api` transport. |
+| `NEXT_PRIVATE_SMTP_APIKEY` | The API key for the SMTP server for the `smtp-api` transport. |
+| `NEXT_PRIVATE_SMTP_SECURE` | Whether to force the use of TLS for the SMTP server for SMTP transports. |
+| `NEXT_PRIVATE_SMTP_FROM_ADDRESS` | The email address for the "from" address. |
+| `NEXT_PRIVATE_SMTP_FROM_NAME` | The sender name for the "from" address. |
+| `NEXT_PRIVATE_RESEND_API_KEY` | The API key for Resend.com for the `resend` transport. |
+| `NEXT_PRIVATE_MAILCHANNELS_API_KEY` | The optional API key for MailChannels (if using a proxy) for the `mailchannels` transport. |
+| `NEXT_PRIVATE_MAILCHANNELS_ENDPOINT` | The optional endpoint for the MailChannels API (if using a proxy) for the `mailchannels` transport. |
+| `NEXT_PRIVATE_MAILCHANNELS_DKIM_DOMAIN` | The domain for DKIM signing with MailChannels for the `mailchannels` transport. |
+| `NEXT_PRIVATE_MAILCHANNELS_DKIM_SELECTOR` | The selector for DKIM signing with MailChannels for the `mailchannels` transport. |
+| `NEXT_PRIVATE_MAILCHANNELS_DKIM_PRIVATE_KEY` | The private key for DKIM signing with MailChannels for the `mailchannels` transport. |
+| `NEXT_PUBLIC_DOCUMENT_SIZE_UPLOAD_LIMIT` | The maximum document upload limit displayed to the user (in MB). |
+| `NEXT_PUBLIC_POSTHOG_KEY` | The optional PostHog key for analytics and feature flags. |
+| `NEXT_PUBLIC_DISABLE_SIGNUP` | Whether to disable user signups through the /signup page. |
diff --git a/docker/build.sh b/docker/build.sh
index aa2068910..ca99ae8a9 100755
--- a/docker/build.sh
+++ b/docker/build.sh
@@ -5,15 +5,10 @@ command -v docker >/dev/null 2>&1 || {
exit 1
}
-command -v jq >/dev/null 2>&1 || {
- echo "jq is not installed. Please install jq and try again."
- exit 1
-}
-
SCRIPT_DIR="$(readlink -f "$(dirname "$0")")"
MONOREPO_ROOT="$(readlink -f "$SCRIPT_DIR/../")"
-APP_VERSION="$(jq -r '.version' "$MONOREPO_ROOT/apps/web/package.json")"
+APP_VERSION="$(git name-rev --tags --name-only $(git rev-parse HEAD) | head -n 1 | sed 's/\^0//')"
GIT_SHA="$(git rev-parse HEAD)"
echo "Building docker image for monorepo at $MONOREPO_ROOT"
@@ -22,7 +17,10 @@ echo "Git SHA: $GIT_SHA"
docker build -f "$SCRIPT_DIR/Dockerfile" \
--progress=plain \
- -t "documenso:latest" \
- -t "documenso:$GIT_SHA" \
- -t "documenso:$APP_VERSION" \
+ -t "documenso/documenso:latest" \
+ -t "documenso/documenso:$GIT_SHA" \
+ -t "documenso/documenso:$APP_VERSION" \
+ -t "ghcr.io/documenso/documenso:latest" \
+ -t "ghcr.io/documenso/documenso:$GIT_SHA" \
+ -t "ghcr.io/documenso/documenso:$APP_VERSION" \
"$MONOREPO_ROOT"
diff --git a/docker/buildx-and-push.sh b/docker/buildx-and-push.sh
new file mode 100755
index 000000000..9665a8aa5
--- /dev/null
+++ b/docker/buildx-and-push.sh
@@ -0,0 +1,35 @@
+#!/usr/bin/env bash
+
+command -v docker >/dev/null 2>&1 || {
+ echo "Docker is not running. Please start Docker and try again."
+ exit 1
+}
+
+SCRIPT_DIR="$(readlink -f "$(dirname "$0")")"
+MONOREPO_ROOT="$(readlink -f "$SCRIPT_DIR/../")"
+
+# Get the platform from environment variable or set to linux/amd64 if not set
+# quote the string to prevent word splitting
+if [ -z "$PLATFORM" ]; then
+ PLATFORM="linux/amd64"
+fi
+
+APP_VERSION="$(git name-rev --tags --name-only $(git rev-parse HEAD) | head -n 1 | sed 's/\^0//')"
+GIT_SHA="$(git rev-parse HEAD)"
+
+echo "Building docker image for monorepo at $MONOREPO_ROOT"
+echo "App version: $APP_VERSION"
+echo "Git SHA: $GIT_SHA"
+
+docker buildx build \
+ -f "$SCRIPT_DIR/Dockerfile" \
+ --platform=$PLATFORM \
+ --progress=plain \
+ -t "documenso/documenso:latest" \
+ -t "documenso/documenso:$GIT_SHA" \
+ -t "documenso/documenso:$APP_VERSION" \
+ -t "ghcr.io/documenso/documenso:latest" \
+ -t "ghcr.io/documenso/documenso:$GIT_SHA" \
+ -t "ghcr.io/documenso/documenso:$APP_VERSION" \
+ --push \
+ "$MONOREPO_ROOT"
diff --git a/docker/buildx.sh b/docker/buildx.sh
new file mode 100755
index 000000000..c5442107d
--- /dev/null
+++ b/docker/buildx.sh
@@ -0,0 +1,34 @@
+#!/usr/bin/env bash
+
+command -v docker >/dev/null 2>&1 || {
+ echo "Docker is not running. Please start Docker and try again."
+ exit 1
+}
+
+SCRIPT_DIR="$(readlink -f "$(dirname "$0")")"
+MONOREPO_ROOT="$(readlink -f "$SCRIPT_DIR/../")"
+
+# Get the platform from environment variable or set to linux/amd64 if not set
+# quote the string to prevent word splitting
+if [ -z "$PLATFORM" ]; then
+ PLATFORM="linux/amd64"
+fi
+
+APP_VERSION="$(git name-rev --tags --name-only $(git rev-parse HEAD) | head -n 1 | sed 's/\^0//')"
+GIT_SHA="$(git rev-parse HEAD)"
+
+echo "Building docker image for monorepo at $MONOREPO_ROOT"
+echo "App version: $APP_VERSION"
+echo "Git SHA: $GIT_SHA"
+
+docker buildx build \
+ -f "$SCRIPT_DIR/Dockerfile" \
+ --platform=$PLATFORM \
+ --progress=plain \
+ -t "documenso/documenso:latest" \
+ -t "documenso/documenso:$GIT_SHA" \
+ -t "documenso/documenso:$APP_VERSION" \
+ -t "ghcr.io/documenso/documenso:latest" \
+ -t "ghcr.io/documenso/documenso:$GIT_SHA" \
+ -t "ghcr.io/documenso/documenso:$APP_VERSION" \
+ "$MONOREPO_ROOT"
diff --git a/docker/compose-entrypoint.sh b/docker/compose-entrypoint.sh
deleted file mode 100755
index 2cf49a304..000000000
--- a/docker/compose-entrypoint.sh
+++ /dev/null
@@ -1,12 +0,0 @@
-#!/usr/bin/env bash
-
-SCRIPT_DIR="$(readlink -f "$(dirname "$0")")"
-MONOREPO_ROOT="$(readlink -f "$SCRIPT_DIR/../")"
-
-cd "$MONOREPO_ROOT"
-
-npm ci
-
-npm run prisma:migrate-dev
-
-npm run dev
diff --git a/docker/compose-test.yml b/docker/compose-test.yml
deleted file mode 100644
index e401aaf8f..000000000
--- a/docker/compose-test.yml
+++ /dev/null
@@ -1,32 +0,0 @@
-name: documenso_test
-services:
- database:
- image: postgres:15
- environment:
- - POSTGRES_USER=documenso
- - POSTGRES_PASSWORD=password
- - POSTGRES_DB=documenso
- ports:
- - 54322:5432
-
- inbucket:
- image: inbucket/inbucket
- # ports:
- # - 9000:9000
- # - 2500:2500
- # - 1100:1100
-
- documenso:
- build:
- context: ../
- dockerfile: docker/Dockerfile
- depends_on:
- - database
- - inbucket
- env_file:
- - ../.env.example
- environment:
- - NEXT_PRIVATE_DATABASE_URL=postgres://documenso:password@database:5432/documenso
- - NEXT_PRIVATE_DIRECT_DATABASE_URL=postgres://documenso:password@database:5432/documenso
- ports:
- - 3000:3000
diff --git a/docker/compose-without-app.yml b/docker/compose-without-app.yml
deleted file mode 100644
index e0b566e96..000000000
--- a/docker/compose-without-app.yml
+++ /dev/null
@@ -1,19 +0,0 @@
-name: documenso
-services:
- database:
- image: postgres:15
- container_name: database
- environment:
- - POSTGRES_USER=documenso
- - POSTGRES_PASSWORD=password
- - POSTGRES_DB=documenso
- ports:
- - 54320:5432
-
- inbucket:
- image: inbucket/inbucket
- container_name: mailserver
- ports:
- - 9000:9000
- - 2500:2500
- - 1100:1100
diff --git a/docker/compose.yml b/docker/compose.yml
deleted file mode 100644
index a48702bf9..000000000
--- a/docker/compose.yml
+++ /dev/null
@@ -1,40 +0,0 @@
-services:
- database:
- image: postgres:15
- environment:
- - POSTGRES_USER=documenso
- - POSTGRES_PASSWORD=password
- - POSTGRES_DB=documenso
- ports:
- - 5432:5432
-
- inbucket:
- image: inbucket/inbucket
- ports:
- - 9000:9000
- - 2500:2500
- - 1100:1100
-
- documenso:
- image: node:18
- working_dir: /app
- command: ./docker/compose-entrypoint.sh
- depends_on:
- - database
- - inbucket
- environment:
- - NEXT_PRIVATE_DATABASE_URL=postgres://documenso:password@database:5432/documenso
- - NEXT_PRIVATE_DIRECT_DATABASE_URL=postgres://documenso:password@database:5432/documenso
- - NEXT_PUBLIC_WEBAPP_URL=http://localhost:3000
- - NEXTAUTH_SECRET=my-super-secure-secret
- - NEXTAUTH_URL=http://localhost:3000
- - SENDGRID_API_KEY=
- - SMTP_MAIL_HOST=inbucket
- - SMTP_MAIL_PORT=2500
- - SMTP_MAIL_USER=username
- - SMTP_MAIL_PASSWORD=password
- - MAIL_FROM=admin@example.com
- ports:
- - 3000:3000
- volumes:
- - ../:/app
diff --git a/docker/compose-services.yml b/docker/development/compose.yml
similarity index 96%
rename from docker/compose-services.yml
rename to docker/development/compose.yml
index 85f06a8d7..15323d981 100644
--- a/docker/compose-services.yml
+++ b/docker/development/compose.yml
@@ -1,4 +1,5 @@
-name: documenso-services
+name: documenso-development
+
services:
database:
image: postgres:15
diff --git a/docker/production/compose.yml b/docker/production/compose.yml
new file mode 100644
index 000000000..08abcf050
--- /dev/null
+++ b/docker/production/compose.yml
@@ -0,0 +1,64 @@
+name: documenso-production
+
+services:
+ database:
+ image: postgres:15
+ environment:
+ - POSTGRES_USER=${POSTGRES_USER:?err}
+ - POSTGRES_PASSWORD=${POSTGRES_PASSWORD:?err}
+ - POSTGRES_DB=${POSTGRES_DB:?err}
+ healthcheck:
+ test: ['CMD-SHELL', 'pg_isready -U ${POSTGRES_USER}']
+ interval: 10s
+ timeout: 5s
+ retries: 5
+ volumes:
+ - database:/var/lib/postgresql/data
+
+ documenso:
+ image: documenso/documenso:latest
+ depends_on:
+ database:
+ condition: service_healthy
+ environment:
+ - PORT=${PORT:-3000}
+ - NEXTAUTH_URL=${NEXTAUTH_URL:-${NEXT_PUBLIC_WEBAPP_URL}}
+ - NEXTAUTH_SECRET=${NEXTAUTH_SECRET:?err}
+ - NEXT_PRIVATE_ENCRYPTION_KEY=${NEXT_PRIVATE_ENCRYPTION_KEY:?err}
+ - NEXT_PRIVATE_ENCRYPTION_SECONDARY_KEY=${NEXT_PRIVATE_ENCRYPTION_SECONDARY_KEY:?err}
+ - NEXT_PRIVATE_GOOGLE_CLIENT_ID=${NEXT_PRIVATE_GOOGLE_CLIENT_ID}
+ - NEXT_PRIVATE_GOOGLE_CLIENT_SECRET=${NEXT_PRIVATE_GOOGLE_CLIENT_SECRET}
+ - NEXT_PUBLIC_WEBAPP_URL=${NEXT_PUBLIC_WEBAPP_URL:?err}
+ - NEXT_PUBLIC_MARKETING_URL=${NEXT_PUBLIC_MARKETING_URL:-https://documenso.com}
+ - NEXT_PRIVATE_DATABASE_URL=${NEXT_PRIVATE_DATABASE_URL:?err}
+ - NEXT_PRIVATE_DIRECT_DATABASE_URL=${NEXT_PRIVATE_DIRECT_DATABASE_URL:-${NEXT_PRIVATE_DATABASE_URL}}
+ - NEXT_PUBLIC_UPLOAD_TRANSPORT=${NEXT_PUBLIC_UPLOAD_TRANSPORT:-database}
+ - NEXT_PRIVATE_UPLOAD_ENDPOINT=${NEXT_PRIVATE_UPLOAD_ENDPOINT}
+ - NEXT_PRIVATE_UPLOAD_REGION=${NEXT_PRIVATE_UPLOAD_REGION}
+ - NEXT_PRIVATE_UPLOAD_BUCKET=${NEXT_PRIVATE_UPLOAD_BUCKET}
+ - NEXT_PRIVATE_UPLOAD_ACCESS_KEY_ID=${NEXT_PRIVATE_UPLOAD_ACCESS_KEY_ID}
+ - NEXT_PRIVATE_UPLOAD_SECRET_ACCESS_KEY=${NEXT_PRIVATE_UPLOAD_SECRET_ACCESS_KEY}
+ - NEXT_PRIVATE_SMTP_TRANSPORT=${NEXT_PRIVATE_SMTP_TRANSPORT:?err}
+ - NEXT_PRIVATE_SMTP_HOST=${NEXT_PRIVATE_SMTP_HOST}
+ - NEXT_PRIVATE_SMTP_PORT=${NEXT_PRIVATE_SMTP_PORT}
+ - NEXT_PRIVATE_SMTP_USERNAME=${NEXT_PRIVATE_SMTP_USERNAME}
+ - NEXT_PRIVATE_SMTP_PASSWORD=${NEXT_PRIVATE_SMTP_PASSWORD}
+ - NEXT_PRIVATE_SMTP_APIKEY_USER=${NEXT_PRIVATE_SMTP_APIKEY_USER}
+ - NEXT_PRIVATE_SMTP_APIKEY=${NEXT_PRIVATE_SMTP_APIKEY}
+ - NEXT_PRIVATE_SMTP_SECURE=${NEXT_PRIVATE_SMTP_SECURE}
+ - NEXT_PRIVATE_SMTP_FROM_NAME=${NEXT_PRIVATE_SMTP_FROM_NAME:?err}
+ - NEXT_PRIVATE_SMTP_FROM_ADDRESS=${NEXT_PRIVATE_SMTP_FROM_ADDRESS:?err}
+ - NEXT_PRIVATE_RESEND_API_KEY=${NEXT_PRIVATE_RESEND_API_KEY}
+ - NEXT_PRIVATE_MAILCHANNELS_API_KEY=${NEXT_PRIVATE_MAILCHANNELS_API_KEY}
+ - NEXT_PRIVATE_MAILCHANNELS_ENDPOINT=${NEXT_PRIVATE_MAILCHANNELS_ENDPOINT}
+ - NEXT_PRIVATE_MAILCHANNELS_DKIM_DOMAIN=${NEXT_PRIVATE_MAILCHANNELS_DKIM_DOMAIN}
+ - NEXT_PRIVATE_MAILCHANNELS_DKIM_SELECTOR=${NEXT_PRIVATE_MAILCHANNELS_DKIM_SELECTOR}
+ - NEXT_PRIVATE_MAILCHANNELS_DKIM_PRIVATE_KEY=${NEXT_PRIVATE_MAILCHANNELS_DKIM_PRIVATE_KEY}
+ - NEXT_PUBLIC_DOCUMENT_SIZE_UPLOAD_LIMIT=${NEXT_PUBLIC_DOCUMENT_SIZE_UPLOAD_LIMIT}
+ - NEXT_PUBLIC_POSTHOG_KEY=${NEXT_PUBLIC_POSTHOG_KEY}
+ - NEXT_PUBLIC_DISABLE_SIGNUP=${NEXT_PUBLIC_DISABLE_SIGNUP}
+ ports:
+ - ${PORT:-3000}:${PORT:-3000}
+
+volumes:
+ database:
diff --git a/docker/start.sh b/docker/start.sh
new file mode 100755
index 000000000..e8d3be2e6
--- /dev/null
+++ b/docker/start.sh
@@ -0,0 +1,7 @@
+#!/bin/sh
+
+set -x
+
+npx prisma migrate deploy --schema ./packages/prisma/schema.prisma
+
+node apps/web/server.js
diff --git a/docker/testing/compose.yml b/docker/testing/compose.yml
new file mode 100644
index 000000000..cecb5bf14
--- /dev/null
+++ b/docker/testing/compose.yml
@@ -0,0 +1,51 @@
+name: documenso-test
+
+services:
+ database:
+ image: postgres:15
+ environment:
+ - POSTGRES_USER=documenso
+ - POSTGRES_PASSWORD=password
+ - POSTGRES_DB=documenso
+ healthcheck:
+ test: ['CMD-SHELL', 'pg_isready -U documenso']
+ interval: 1s
+ timeout: 5s
+ retries: 5
+ ports:
+ - 54322:5432
+
+ inbucket:
+ image: inbucket/inbucket
+ ports:
+ - 9000:9000
+ - 2500:2500
+ - 1100:1100
+
+ documenso:
+ build:
+ context: ../../
+ dockerfile: docker/Dockerfile
+ depends_on:
+ database:
+ condition: service_healthy
+ inbucket:
+ condition: service_started
+ env_file:
+ - ../../.env.example
+ environment:
+ - NEXTAUTH_SECRET=secret
+ - NEXT_PRIVATE_ENCRYPTION_KEY=CAFEBABE
+ - NEXT_PRIVATE_ENCRYPTION_SECONDARY_KEY=DEADBEEF
+ - NEXT_PRIVATE_DATABASE_URL=postgres://documenso:password@database:5432/documenso
+ - NEXT_PRIVATE_DIRECT_DATABASE_URL=postgres://documenso:password@database:5432/documenso
+ - NEXT_PUBLIC_UPLOAD_TRANSPORT=database
+ - NEXT_PRIVATE_SMTP_TRANSPORT=smtp-auth
+ - NEXT_PRIVATE_SMTP_HOST=inbucket
+ - NEXT_PRIVATE_SMTP_PORT=2500
+ - NEXT_PRIVATE_SMTP_USERNAME=documenso
+ - NEXT_PRIVATE_SMTP_PASSWORD=password
+ - NEXT_PRIVATE_SMTP_FROM_NAME="No Reply @ Documenso"
+ - NEXT_PRIVATE_SMTP_FROM_ADDRESS=noreply@documenso.com
+ ports:
+ - 3000:3000
diff --git a/package-lock.json b/package-lock.json
index 2144c38dd..6c1606717 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -135,7 +135,6 @@
"@documenso/ee": "*",
"@documenso/lib": "*",
"@documenso/prisma": "*",
- "@documenso/tailwind-config": "*",
"@documenso/trpc": "*",
"@documenso/ui": "*",
"@hookform/resolvers": "^3.1.0",
@@ -164,19 +163,20 @@
"remeda": "^1.27.1",
"sharp": "0.33.1",
"ts-pattern": "^5.0.5",
- "typescript": "5.2.2",
"ua-parser-js": "^1.0.37",
"uqr": "^0.1.2",
"zod": "^3.22.4"
},
"devDependencies": {
+ "@documenso/tailwind-config": "*",
"@simplewebauthn/types": "^9.0.1",
"@types/formidable": "^2.0.6",
"@types/luxon": "^3.3.1",
"@types/node": "20.1.0",
"@types/react": "18.2.18",
"@types/react-dom": "18.2.7",
- "@types/ua-parser-js": "^0.7.39"
+ "@types/ua-parser-js": "^0.7.39",
+ "typescript": "5.2.2"
}
},
"apps/web/node_modules/@types/node": {
@@ -228,6 +228,7 @@
"version": "5.2.2",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz",
"integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==",
+ "dev": true,
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"
@@ -2010,6 +2011,15 @@
"resolved": "https://registry.npmjs.org/@effect-ts/system/-/system-0.57.5.tgz",
"integrity": "sha512-/crHGujo0xnuHIYNc1VgP0HGJGFSoSqq88JFXe6FmFyXPpWt8Xu39LyLg7rchsxfXFeEdA9CrIZvLV5eswXV5g=="
},
+ "node_modules/@emnapi/core": {
+ "version": "0.45.0",
+ "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-0.45.0.tgz",
+ "integrity": "sha512-DPWjcUDQkCeEM4VnljEOEcXdAD7pp8zSZsgOujk/LGIwCXWbXJngin+MO4zbH429lzeC3WbYLGjE2MaUOwzpyw==",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
"node_modules/@emnapi/runtime": {
"version": "0.44.0",
"resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-0.44.0.tgz",
@@ -2983,6 +2993,7 @@
"version": "1.0.11",
"resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz",
"integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==",
+ "optional": true,
"dependencies": {
"detect-libc": "^2.0.0",
"https-proxy-agent": "^5.0.0",
@@ -3002,6 +3013,7 @@
"version": "2.7.0",
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
"integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
+ "optional": true,
"dependencies": {
"whatwg-url": "^5.0.0"
},
@@ -3021,6 +3033,7 @@
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
"integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "optional": true,
"dependencies": {
"glob": "^7.1.3"
},
@@ -3076,6 +3089,26 @@
"url": "https://opencollective.com/unified"
}
},
+ "node_modules/@napi-rs/wasm-runtime": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.1.1.tgz",
+ "integrity": "sha512-ATj9ua659JgrkICjJscaeZdmPr44cb/KFjNWuD0N6pux0SpzaM7+iOuuK11mAnQM2N9q0DT4REu6NkL8ZEhopw==",
+ "optional": true,
+ "dependencies": {
+ "@emnapi/core": "^0.45.0",
+ "@emnapi/runtime": "^0.45.0",
+ "@tybys/wasm-util": "^0.8.1"
+ }
+ },
+ "node_modules/@napi-rs/wasm-runtime/node_modules/@emnapi/runtime": {
+ "version": "0.45.0",
+ "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-0.45.0.tgz",
+ "integrity": "sha512-Txumi3td7J4A/xTTwlssKieHKTGl3j4A1tglBx72auZ49YK7ePY6XZricgIg9mnZT4xPfA+UPCUdnhRuEFDL+w==",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
"node_modules/@next-auth/prisma-adapter": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/@next-auth/prisma-adapter/-/prisma-adapter-1.0.7.tgz",
@@ -3252,6 +3285,244 @@
"url": "https://paulmillr.com/funding/"
}
},
+ "node_modules/@node-rs/bcrypt": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/@node-rs/bcrypt/-/bcrypt-1.10.0.tgz",
+ "integrity": "sha512-RMa5qSq5mueYhyQvonUqDjRM5NUdDF3aTQwxvAYNythUhAspYm/k1G+3RIpQIyN7BJDra/JMgmjY2t6gx2n6CQ==",
+ "engines": {
+ "node": ">= 10"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/Brooooooklyn"
+ },
+ "optionalDependencies": {
+ "@node-rs/bcrypt-android-arm-eabi": "1.10.0",
+ "@node-rs/bcrypt-android-arm64": "1.10.0",
+ "@node-rs/bcrypt-darwin-arm64": "1.10.0",
+ "@node-rs/bcrypt-darwin-x64": "1.10.0",
+ "@node-rs/bcrypt-freebsd-x64": "1.10.0",
+ "@node-rs/bcrypt-linux-arm-gnueabihf": "1.10.0",
+ "@node-rs/bcrypt-linux-arm64-gnu": "1.10.0",
+ "@node-rs/bcrypt-linux-arm64-musl": "1.10.0",
+ "@node-rs/bcrypt-linux-x64-gnu": "1.10.0",
+ "@node-rs/bcrypt-linux-x64-musl": "1.10.0",
+ "@node-rs/bcrypt-wasm32-wasi": "1.10.0",
+ "@node-rs/bcrypt-win32-arm64-msvc": "1.10.0",
+ "@node-rs/bcrypt-win32-ia32-msvc": "1.10.0",
+ "@node-rs/bcrypt-win32-x64-msvc": "1.10.0"
+ }
+ },
+ "node_modules/@node-rs/bcrypt-android-arm-eabi": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-android-arm-eabi/-/bcrypt-android-arm-eabi-1.10.0.tgz",
+ "integrity": "sha512-rQ+LPDYg4FG6xs2pB5/e+RgbUudXyoLNaOwCmnW+GDzCrFxoZeypaqlDiQq3XfeFSmL1FLbrtgXm67kplGLJ7Q==",
+ "cpu": [
+ "arm"
+ ],
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@node-rs/bcrypt-android-arm64": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-android-arm64/-/bcrypt-android-arm64-1.10.0.tgz",
+ "integrity": "sha512-OCKtivGEtqoljZuxmWvQ4i7x68T5A/MZZWqiqYLJONjpnpCLuqlyJ/UbVW28Xkw2kCAARYwVoHKBODacFfHS4w==",
+ "cpu": [
+ "arm64"
+ ],
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@node-rs/bcrypt-darwin-arm64": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-darwin-arm64/-/bcrypt-darwin-arm64-1.10.0.tgz",
+ "integrity": "sha512-ryi/FOlQu9KUSAsuUPLA6FacluOGomU/9A/k4o+4AR2dOjfjZMrkcGa4ioZf8aCZU0Ed6zZ/iPNcxPL8DEyRZQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@node-rs/bcrypt-darwin-x64": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-darwin-x64/-/bcrypt-darwin-x64-1.10.0.tgz",
+ "integrity": "sha512-EMrdK7Ghyc+DwEXYvnJ0lRSSZGoTaOCnST53ySR9Zsan4VfSZw26PEXJ2hk3Bzj2/95N8kwvzaJtMLTqee44Ag==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@node-rs/bcrypt-freebsd-x64": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-freebsd-x64/-/bcrypt-freebsd-x64-1.10.0.tgz",
+ "integrity": "sha512-UjT1+zBhMmq0yxnWjdgVwq4OXwJtaOvVgpziAJEmYwq0AY/+n/FkYd+kViEAfO9ZSJMfzGubiJMOn/jWsMSFJw==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@node-rs/bcrypt-linux-arm-gnueabihf": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-linux-arm-gnueabihf/-/bcrypt-linux-arm-gnueabihf-1.10.0.tgz",
+ "integrity": "sha512-NuScKpkORnakT7IMidPcqQadgFQpHbcg6nMU4oyN6i1RGx66hbLheP/YD+2O2y/H98q9MGTn5DJ7czCE6h2QGA==",
+ "cpu": [
+ "arm"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@node-rs/bcrypt-linux-arm64-gnu": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-linux-arm64-gnu/-/bcrypt-linux-arm64-gnu-1.10.0.tgz",
+ "integrity": "sha512-U8lWREyHYU4jI58CYZVA+/NIVWRMPfgRz1OxvrZw5SnKW4LUvS9UxIkcw5TGoUlA5XXv46qU4MceO/PHd1XV0A==",
+ "cpu": [
+ "arm64"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@node-rs/bcrypt-linux-arm64-musl": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-linux-arm64-musl/-/bcrypt-linux-arm64-musl-1.10.0.tgz",
+ "integrity": "sha512-2Sc7NNlpuwHB/L2WvqhkQr8UOs1w4MT1xgXLoaumYhBj6GnnjryUlvHao1uuid5Yj/PteIyBXgpi8wmdU+68xA==",
+ "cpu": [
+ "arm64"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@node-rs/bcrypt-linux-x64-gnu": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-linux-x64-gnu/-/bcrypt-linux-x64-gnu-1.10.0.tgz",
+ "integrity": "sha512-dqzl/Sxiqc8cGNhIOiO12r0s7P0CVruoY1Dkz4OyTMujn4mOuu9r0+8sdX7kudZMHPzOruYFlFQw3o9+Tb3jzw==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@node-rs/bcrypt-linux-x64-musl": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-linux-x64-musl/-/bcrypt-linux-x64-musl-1.10.0.tgz",
+ "integrity": "sha512-3IXdIUKnuphbEouCMh0RuQ7vutxj2ti2vyEI+iaK7oVON8pKUf+veCzPSffaxU7uj4yKBElY4rv18PRK4cbgSQ==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@node-rs/bcrypt-wasm32-wasi": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-wasm32-wasi/-/bcrypt-wasm32-wasi-1.10.0.tgz",
+ "integrity": "sha512-zqpKu9eFdrVUSV+FZc0z+1p/i00/ovDwQY3c54sCdmV3U72LzsXUGXhnJoPYxq/Z6ea+wn+GIrCEKDlV0vy2dA==",
+ "cpu": [
+ "wasm32"
+ ],
+ "optional": true,
+ "dependencies": {
+ "@napi-rs/wasm-runtime": "^0.1.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@node-rs/bcrypt-win32-arm64-msvc": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-win32-arm64-msvc/-/bcrypt-win32-arm64-msvc-1.10.0.tgz",
+ "integrity": "sha512-DzTfWehvN1q4cRPMHHdbR7A2jDYR+P/uhNCkVsopNhdt+UojEQxLV6gp0Ane+m9bfya9jazWr1Vb4QL1KS25cA==",
+ "cpu": [
+ "arm64"
+ ],
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@node-rs/bcrypt-win32-ia32-msvc": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-win32-ia32-msvc/-/bcrypt-win32-ia32-msvc-1.10.0.tgz",
+ "integrity": "sha512-mlV090RTewQRodje7I9ezKjMVQCW5FU5U+wVFnGUNYDDC2Iwuqb5rvyYpQ/yUbK1+nMtYlNcK7b5aAR+nL7zzA==",
+ "cpu": [
+ "ia32"
+ ],
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@node-rs/bcrypt-win32-x64-msvc": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-win32-x64-msvc/-/bcrypt-win32-x64-msvc-1.10.0.tgz",
+ "integrity": "sha512-PxWRi8o+YLTGCANUlNJzUb7qDQz/uCffTcWPlwnJhyXpSC48cCQjCC7EHC9X248NTMz3hUBC9tHVKhrSg2IY9Q==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
"node_modules/@nodelib/fs.scandir": {
"version": "2.1.5",
"resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
@@ -7049,6 +7320,15 @@
"integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==",
"devOptional": true
},
+ "node_modules/@tybys/wasm-util": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.8.1.tgz",
+ "integrity": "sha512-GSsTwyBl4pIzsxAY5wroZdyQKyhXk0d8PCRZtrSZ2WEB1cBdrp2EgGBwHOGCZtIIPun/DL3+AykCv+J6fyRH4Q==",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
"node_modules/@types/acorn": {
"version": "4.0.6",
"resolved": "https://registry.npmjs.org/@types/acorn/-/acorn-4.0.6.tgz",
@@ -7057,15 +7337,6 @@
"@types/estree": "*"
}
},
- "node_modules/@types/bcrypt": {
- "version": "5.0.2",
- "resolved": "https://registry.npmjs.org/@types/bcrypt/-/bcrypt-5.0.2.tgz",
- "integrity": "sha512-6atioO8Y75fNcbmj0G7UjI9lXN2pQ/IGJ2FWT4a/btd0Lk9lQalHLKhkgKVZ3r+spnmWUKfbMi1GEe9wyHQfNQ==",
- "dev": true,
- "dependencies": {
- "@types/node": "*"
- }
- },
"node_modules/@types/d3-array": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz",
@@ -7531,7 +7802,8 @@
"node_modules/abbrev": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
- "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q=="
+ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
+ "optional": true
},
"node_modules/acorn": {
"version": "8.11.2",
@@ -7594,6 +7866,7 @@
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
"integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
+ "optional": true,
"dependencies": {
"debug": "4"
},
@@ -7686,12 +7959,14 @@
"node_modules/aproba": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz",
- "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ=="
+ "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==",
+ "optional": true
},
"node_modules/are-we-there-yet": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz",
"integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==",
+ "optional": true,
"dependencies": {
"delegates": "^1.0.0",
"readable-stream": "^3.6.0"
@@ -8060,19 +8335,6 @@
}
]
},
- "node_modules/bcrypt": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-5.1.1.tgz",
- "integrity": "sha512-AGBHOG5hPYZ5Xl9KXzU5iKq9516yEmvCKDg3ecP5kX2aB6UqTeXZxk2ELnDgDm6BQSMlLt9rDB4LoSMx0rYwww==",
- "hasInstallScript": true,
- "dependencies": {
- "@mapbox/node-pre-gyp": "^1.0.11",
- "node-addon-api": "^5.0.0"
- },
- "engines": {
- "node": ">= 10.0.0"
- }
- },
"node_modules/before-after-hook": {
"version": "2.2.3",
"resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz",
@@ -8494,6 +8756,7 @@
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
"integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
+ "optional": true,
"engines": {
"node": ">=10"
}
@@ -8944,6 +9207,7 @@
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz",
"integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==",
+ "optional": true,
"bin": {
"color-support": "bin.js"
}
@@ -9082,7 +9346,8 @@
"node_modules/console-control-strings": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
- "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ=="
+ "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==",
+ "optional": true
},
"node_modules/content-type": {
"version": "1.0.4",
@@ -9611,7 +9876,8 @@
"node_modules/delegates": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
- "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ=="
+ "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==",
+ "optional": true
},
"node_modules/depd": {
"version": "1.1.2",
@@ -9839,6 +10105,7 @@
"version": "16.3.1",
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz",
"integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==",
+ "dev": true,
"engines": {
"node": ">=12"
},
@@ -9850,6 +10117,7 @@
"version": "7.3.0",
"resolved": "https://registry.npmjs.org/dotenv-cli/-/dotenv-cli-7.3.0.tgz",
"integrity": "sha512-314CA4TyK34YEJ6ntBf80eUY+t1XaFLyem1k9P0sX1gn30qThZ5qZr/ZwE318gEnzyYP9yj9HJk6SqwE0upkfw==",
+ "dev": true,
"dependencies": {
"cross-spawn": "^7.0.3",
"dotenv": "^16.3.0",
@@ -9864,6 +10132,7 @@
"version": "10.0.0",
"resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-10.0.0.tgz",
"integrity": "sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==",
+ "dev": true,
"engines": {
"node": ">=12"
}
@@ -11584,6 +11853,7 @@
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
"integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
+ "optional": true,
"dependencies": {
"minipass": "^3.0.0"
},
@@ -11595,6 +11865,7 @@
"version": "3.3.6",
"resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
"integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+ "optional": true,
"dependencies": {
"yallist": "^4.0.0"
},
@@ -11698,6 +11969,7 @@
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz",
"integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==",
+ "optional": true,
"dependencies": {
"aproba": "^1.0.3 || ^2.0.0",
"color-support": "^1.1.2",
@@ -11716,12 +11988,14 @@
"node_modules/gauge/node_modules/emoji-regex": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
- "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "optional": true
},
"node_modules/gauge/node_modules/is-fullwidth-code-point": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "optional": true,
"engines": {
"node": ">=8"
}
@@ -11730,6 +12004,7 @@
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "optional": true,
"dependencies": {
"emoji-regex": "^8.0.0",
"is-fullwidth-code-point": "^3.0.0",
@@ -12087,7 +12362,8 @@
"node_modules/has-unicode": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
- "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ=="
+ "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==",
+ "optional": true
},
"node_modules/hash-wasm": {
"version": "4.11.0",
@@ -12386,6 +12662,7 @@
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
"integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
+ "optional": true,
"dependencies": {
"agent-base": "6",
"debug": "4"
@@ -13972,6 +14249,7 @@
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
"integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
+ "optional": true,
"dependencies": {
"semver": "^6.0.0"
},
@@ -13986,6 +14264,7 @@
"version": "6.3.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
"integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "optional": true,
"bin": {
"semver": "bin/semver.js"
}
@@ -15029,6 +15308,7 @@
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
"integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
+ "optional": true,
"dependencies": {
"minipass": "^3.0.0",
"yallist": "^4.0.0"
@@ -15041,6 +15321,7 @@
"version": "3.3.6",
"resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
"integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+ "optional": true,
"dependencies": {
"yallist": "^4.0.0"
},
@@ -15052,6 +15333,7 @@
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
"integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+ "optional": true,
"bin": {
"mkdirp": "bin/cmd.js"
},
@@ -15351,11 +15633,6 @@
"resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz",
"integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ=="
},
- "node_modules/node-addon-api": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz",
- "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA=="
- },
"node_modules/node-domexception": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz",
@@ -15456,6 +15733,7 @@
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz",
"integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==",
+ "optional": true,
"dependencies": {
"abbrev": "1"
},
@@ -15512,6 +15790,7 @@
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz",
"integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==",
+ "optional": true,
"dependencies": {
"are-we-there-yet": "^2.0.0",
"console-control-strings": "^1.1.0",
@@ -18392,7 +18671,8 @@
"node_modules/set-blocking": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
- "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw=="
+ "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==",
+ "optional": true
},
"node_modules/set-function-length": {
"version": "1.1.1",
@@ -19421,6 +19701,7 @@
"version": "6.2.0",
"resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz",
"integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==",
+ "optional": true,
"dependencies": {
"chownr": "^2.0.0",
"fs-minipass": "^2.0.0",
@@ -20832,6 +21113,7 @@
"version": "1.1.5",
"resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz",
"integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==",
+ "optional": true,
"dependencies": {
"string-width": "^1.0.2 || 2 || 3 || 4"
}
@@ -20839,12 +21121,14 @@
"node_modules/wide-align/node_modules/emoji-regex": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
- "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "optional": true
},
"node_modules/wide-align/node_modules/is-fullwidth-code-point": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "optional": true,
"engines": {
"node": ">=8"
}
@@ -20853,6 +21137,7 @@
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "optional": true,
"dependencies": {
"emoji-regex": "^8.0.0",
"is-fullwidth-code-point": "^3.0.0",
@@ -21524,12 +21809,12 @@
"@next-auth/prisma-adapter": "1.0.7",
"@noble/ciphers": "0.4.0",
"@noble/hashes": "1.3.2",
+ "@node-rs/bcrypt": "^1.10.0",
"@pdf-lib/fontkit": "^1.1.1",
"@scure/base": "^1.1.3",
"@sindresorhus/slugify": "^2.2.1",
"@upstash/redis": "^1.20.6",
"@vvo/tzdb": "^6.117.0",
- "bcrypt": "^5.1.0",
"luxon": "^3.4.0",
"nanoid": "^4.0.2",
"next": "14.0.3",
@@ -21543,7 +21828,6 @@
"zod": "^3.22.4"
},
"devDependencies": {
- "@types/bcrypt": "^5.0.0",
"@types/luxon": "^3.3.1"
}
},
@@ -21582,12 +21866,12 @@
"license": "MIT",
"dependencies": {
"@prisma/client": "5.4.2",
- "dotenv": "^16.3.1",
- "dotenv-cli": "^7.3.0",
"prisma": "5.4.2",
"ts-pattern": "^5.0.6"
},
"devDependencies": {
+ "dotenv": "^16.3.1",
+ "dotenv-cli": "^7.3.0",
"ts-node": "^10.9.1",
"typescript": "5.2.2"
}
diff --git a/package.json b/package.json
index 96dc3e9b4..c25aed514 100644
--- a/package.json
+++ b/package.json
@@ -13,8 +13,8 @@
"clean": "turbo run clean && rimraf node_modules",
"d": "npm run dx && npm run dev",
"dx": "npm i && npm run dx:up && npm run prisma:migrate-dev",
- "dx:up": "docker compose -f docker/compose-services.yml up -d",
- "dx:down": "docker compose -f docker/compose-services.yml down",
+ "dx:up": "docker compose -f docker/development/compose.yml up -d",
+ "dx:down": "docker compose -f docker/development/compose.yml down",
"ci": "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",
diff --git a/packages/lib/next-auth/auth-options.ts b/packages/lib/next-auth/auth-options.ts
index c9cb56381..a88797910 100644
--- a/packages/lib/next-auth/auth-options.ts
+++ b/packages/lib/next-auth/auth-options.ts
@@ -1,7 +1,7 @@
///
import { PrismaAdapter } from '@next-auth/prisma-adapter';
+import { compare } from '@node-rs/bcrypt';
import { verifyAuthenticationResponse } from '@simplewebauthn/server';
-import { compare } from 'bcrypt';
import { DateTime } from 'luxon';
import type { AuthOptions, Session, User } from 'next-auth';
import type { JWT } from 'next-auth/jwt';
diff --git a/packages/lib/package.json b/packages/lib/package.json
index 3fd14864e..7a32b3058 100644
--- a/packages/lib/package.json
+++ b/packages/lib/package.json
@@ -32,7 +32,7 @@
"@sindresorhus/slugify": "^2.2.1",
"@upstash/redis": "^1.20.6",
"@vvo/tzdb": "^6.117.0",
- "bcrypt": "^5.1.0",
+ "@node-rs/bcrypt": "^1.10.0",
"luxon": "^3.4.0",
"nanoid": "^4.0.2",
"next": "14.0.3",
@@ -46,7 +46,6 @@
"zod": "^3.22.4"
},
"devDependencies": {
- "@types/bcrypt": "^5.0.0",
"@types/luxon": "^3.3.1"
}
}
diff --git a/packages/lib/server-only/2fa/disable-2fa.ts b/packages/lib/server-only/2fa/disable-2fa.ts
index dd8a180c9..aba763d2d 100644
--- a/packages/lib/server-only/2fa/disable-2fa.ts
+++ b/packages/lib/server-only/2fa/disable-2fa.ts
@@ -1,4 +1,4 @@
-import { compare } from 'bcrypt';
+import { compare } from '@node-rs/bcrypt';
import { prisma } from '@documenso/prisma';
import type { User } from '@documenso/prisma/client';
diff --git a/packages/lib/server-only/2fa/setup-2fa.ts b/packages/lib/server-only/2fa/setup-2fa.ts
index bcaa8d498..e94676121 100644
--- a/packages/lib/server-only/2fa/setup-2fa.ts
+++ b/packages/lib/server-only/2fa/setup-2fa.ts
@@ -1,5 +1,5 @@
+import { compare } from '@node-rs/bcrypt';
import { base32 } from '@scure/base';
-import { compare } from 'bcrypt';
import crypto from 'crypto';
import { createTOTPKeyURI } from 'oslo/otp';
diff --git a/packages/lib/server-only/auth/hash.ts b/packages/lib/server-only/auth/hash.ts
index bb0b760fe..d38d344da 100644
--- a/packages/lib/server-only/auth/hash.ts
+++ b/packages/lib/server-only/auth/hash.ts
@@ -1,4 +1,4 @@
-import { compareSync as bcryptCompareSync, hashSync as bcryptHashSync } from 'bcrypt';
+import { compareSync as bcryptCompareSync, hashSync as bcryptHashSync } from '@node-rs/bcrypt';
import crypto from 'crypto';
import { SALT_ROUNDS } from '../../constants/auth';
diff --git a/packages/lib/server-only/user/create-user.ts b/packages/lib/server-only/user/create-user.ts
index dbcec9efb..263fa9392 100644
--- a/packages/lib/server-only/user/create-user.ts
+++ b/packages/lib/server-only/user/create-user.ts
@@ -1,4 +1,4 @@
-import { hash } from 'bcrypt';
+import { hash } from '@node-rs/bcrypt';
import { getStripeCustomerByUser } from '@documenso/ee/server-only/stripe/get-customer';
import { updateSubscriptionItemQuantity } from '@documenso/ee/server-only/stripe/update-subscription-item-quantity';
diff --git a/packages/lib/server-only/user/reset-password.ts b/packages/lib/server-only/user/reset-password.ts
index 39aac5d28..457d7e28c 100644
--- a/packages/lib/server-only/user/reset-password.ts
+++ b/packages/lib/server-only/user/reset-password.ts
@@ -1,4 +1,4 @@
-import { compare, hash } from 'bcrypt';
+import { compare, hash } from '@node-rs/bcrypt';
import { prisma } from '@documenso/prisma';
import { UserSecurityAuditLogType } from '@documenso/prisma/client';
diff --git a/packages/lib/server-only/user/update-password.ts b/packages/lib/server-only/user/update-password.ts
index 2621fe8e3..9c4882c5a 100644
--- a/packages/lib/server-only/user/update-password.ts
+++ b/packages/lib/server-only/user/update-password.ts
@@ -1,4 +1,4 @@
-import { compare, hash } from 'bcrypt';
+import { compare, hash } from '@node-rs/bcrypt';
import { SALT_ROUNDS } from '@documenso/lib/constants/auth';
import type { RequestMetadata } from '@documenso/lib/universal/extract-request-metadata';
diff --git a/packages/prisma/helper.ts b/packages/prisma/helper.ts
index 3acd113fc..512f7cd55 100644
--- a/packages/prisma/helper.ts
+++ b/packages/prisma/helper.ts
@@ -15,6 +15,10 @@ export const getDatabaseUrl = () => {
process.env.NEXT_PRIVATE_DIRECT_DATABASE_URL = process.env.DATABASE_URL;
}
+ if (process.env.DATABASE_URL_UNPOOLED) {
+ process.env.NEXT_PRIVATE_DIRECT_DATABASE_URL = process.env.DATABASE_URL_UNPOOLED;
+ }
+
if (process.env.POSTGRES_PRISMA_URL) {
process.env.NEXT_PRIVATE_DATABASE_URL = process.env.POSTGRES_PRISMA_URL;
}
@@ -40,18 +44,5 @@ export const getDatabaseUrl = () => {
process.env.NEXT_PRIVATE_DATABASE_URL = url.toString().replace('https://', 'postgres://');
}
- // Support for neon.tech (Neon Database)
- if (url.hostname.endsWith('neon.tech')) {
- const [projectId, ...rest] = url.hostname.split('.');
-
- if (!projectId.endsWith('-pooler')) {
- url.hostname = `${projectId}-pooler.${rest.join('.')}`;
- }
-
- url.searchParams.set('pgbouncer', 'true');
-
- process.env.NEXT_PRIVATE_DATABASE_URL = url.toString().replace('https://', 'postgres://');
- }
-
return process.env.NEXT_PRIVATE_DATABASE_URL;
};
diff --git a/packages/prisma/package.json b/packages/prisma/package.json
index 301b51dba..0cd3ed282 100644
--- a/packages/prisma/package.json
+++ b/packages/prisma/package.json
@@ -19,12 +19,12 @@
},
"dependencies": {
"@prisma/client": "5.4.2",
- "dotenv": "^16.3.1",
- "dotenv-cli": "^7.3.0",
"prisma": "5.4.2",
"ts-pattern": "^5.0.6"
},
"devDependencies": {
+ "dotenv": "^16.3.1",
+ "dotenv-cli": "^7.3.0",
"ts-node": "^10.9.1",
"typescript": "5.2.2"
}
diff --git a/packages/prisma/seed-database.ts b/packages/prisma/seed-database.ts
index e9db2a30c..c2bdde60e 100644
--- a/packages/prisma/seed-database.ts
+++ b/packages/prisma/seed-database.ts
@@ -13,7 +13,13 @@ const seedDatabase = async () => {
if ('seedDatabase' in mod && typeof mod.seedDatabase === 'function') {
console.log(`[SEEDING]: ${file}`);
- await mod.seedDatabase();
+
+ try {
+ await mod.seedDatabase();
+ } catch (e) {
+ console.log(`[SEEDING]: Seed failed for ${file}`);
+ console.error(e);
+ }
}
}
}
diff --git a/scripts/vercel.sh b/scripts/vercel.sh
index 30fe99476..4be594f4e 100755
--- a/scripts/vercel.sh
+++ b/scripts/vercel.sh
@@ -6,7 +6,6 @@ set -eo pipefail
# Get the directory of this script, regardless of where it is called from.
SCRIPT_DIR="$(readlink -f "$(dirname "$0")")"
-
function log() {
echo "[VercelBuild]: $1"
}
@@ -69,19 +68,17 @@ function remap_database_integration() {
export NEXT_PRIVATE_DIRECT_DATABASE_URL="$DATABASE_URL"
fi
+ if [[ ! -z "$DATABASE_URL_UNPOOLED" ]]; then
+ log "Remapping for Neon integration"
+
+ export NEXT_PRIVATE_DATABASE_URL="$DATABASE_URL&pgbouncer=true"
+ export NEXT_PRIVATE_DIRECT_DATABASE_URL="$DATABASE_URL_UNPOOLED"
+ fi
+
if [[ ! -z "$POSTGRES_URL_NON_POOLING" ]]; then
export NEXT_PRIVATE_DATABASE_URL="$POSTGRES_URL?pgbouncer=true"
export NEXT_PRIVATE_DIRECT_DATABASE_URL="$POSTGRES_URL_NON_POOLING"
fi
-
- if [[ "$NEXT_PRIVATE_DATABASE_URL" == *"neon.tech"* ]]; then
- log "Remapping for Neon integration"
-
- PROJECT_ID="$(echo "$PGHOST" | cut -d'.' -f1)"
- PGBOUNCER_HOST="$(echo "$PGHOST" | sed "s/${PROJECT_ID}/${PROJECT_ID}-pooler/")"
-
- export NEXT_PRIVATE_DATABASE_URL="postgres://${PGUSER}:${PGPASSWORD}@${PGBOUNCER_HOST}/${PGDATABASE}?pgbouncer=true"
- fi
}
# Navigate to the root of the project.
diff --git a/turbo.json b/turbo.json
index 995ed43e5..5e2c5526c 100644
--- a/turbo.json
+++ b/turbo.json
@@ -90,6 +90,7 @@
"FONT_CAVEAT_URI",
"POSTGRES_URL",
"DATABASE_URL",
+ "DATABASE_URL_UNPOOLED",
"POSTGRES_PRISMA_URL",
"POSTGRES_URL_NON_POOLING",
"E2E_TEST_AUTHENTICATE_USERNAME",