fix: build

This commit is contained in:
David Nguyen
2025-02-08 20:35:20 +11:00
parent 4aec21a37f
commit 82b5795636
34 changed files with 1175 additions and 147 deletions

28
apps/remix/.bin/build.sh Executable file
View File

@ -0,0 +1,28 @@
#!/usr/bin/env bash
# Exit on error.
set -eo pipefail
cd "$(dirname "$0")/.."
start_time=$(date +%s)
echo "[Build]: Extracting and compiling translations"
npm run translate --prefix ../../
echo "[Build]: Building app"
npm run build:app
echo "[Build]: Building server"
npm run build:server
# Copy over the entry point for the server.
cp server/main.js build/server/main.js
# Copy over all web.js translations
cp -r ../../packages/lib/translations build/server/hono/packages/lib/translations
# Time taken
end_time=$(date +%s)
echo "[Build]: Done in $((end_time - start_time)) seconds"

View File

@ -3,9 +3,11 @@
"private": true,
"type": "module",
"scripts": {
"build": "cross-env NODE_ENV=production react-router build",
"build": "sh .bin/build.sh",
"build:app": "cross-env NODE_ENV=production react-router build",
"build:server": "cross-env NODE_ENV=production rollup -c rollup.config.mjs",
"dev": "react-router dev",
"start": "cross-env NODE_ENV=production node dist/server/index.js",
"start": "cross-env NODE_ENV=production node build/server/main.js",
"clean": "rimraf .react-router && rimraf node_modules",
"typecheck": "react-router typegen && tsc",
"copy:pdfjs": "node ../../scripts/copy-pdfjs.cjs"
@ -55,7 +57,7 @@
"react-dropzone": "^14.2.3",
"react-hook-form": "^7.43.9",
"react-hotkeys-hook": "^4.4.1",
"react-icons": "^4.11.0",
"react-icons": "^5.4.0",
"react-rnd": "^10.4.1",
"react-router": "^7.1.5",
"recharts": "^2.7.2",
@ -69,9 +71,16 @@
"uqr": "^0.1.2"
},
"devDependencies": {
"@babel/core": "^7.26.7",
"@babel/preset-typescript": "^7.26.0",
"@lingui/babel-plugin-lingui-macro": "^5.2.0",
"@lingui/vite-plugin": "^5.2.0",
"@react-router/dev": "^7.1.1",
"@react-router/remix-routes-option-adapter": "^7.1.5",
"@rollup/plugin-babel": "^6.0.4",
"@rollup/plugin-commonjs": "^28.0.2",
"@rollup/plugin-node-resolve": "^16.0.0",
"@rollup/plugin-typescript": "^12.1.2",
"@simplewebauthn/types": "^9.0.1",
"@types/formidable": "^2.0.6",
"@types/luxon": "^3.3.1",
@ -80,8 +89,10 @@
"@types/react-dom": "^18",
"@types/ua-parser-js": "^0.7.39",
"cross-env": "^7.0.3",
"esbuild": "0.24.2",
"remix-flat-routes": "^0.8.4",
"tsx": "^4.11.0",
"rollup": "^4.34.5",
"tsx": "^4.19.2",
"typescript": "5.6.2",
"vite": "^6.1.0",
"vite-plugin-babel-macros": "^1.0.6",

View File

@ -2,6 +2,5 @@ import type { Config } from '@react-router/dev/config';
export default {
appDirectory: 'app',
// Server-side render by default, to enable SPA mode set this to `false`
ssr: true,
} satisfies Config;

View File

@ -0,0 +1,49 @@
import babel from '@rollup/plugin-babel';
import commonjs from '@rollup/plugin-commonjs';
import resolve from '@rollup/plugin-node-resolve';
import typescript from '@rollup/plugin-typescript';
import path from 'node:path';
/** @type {import('rollup').RollupOptions} */
const config = {
/**
* We specifically target the router.ts instead of the entry point so the rollup doesn't go through the
* already prebuilt RR7 server files.
*/
input: 'server/router.ts',
output: {
dir: 'build/server/hono',
format: 'esm',
sourcemap: true,
preserveModules: true,
preserveModulesRoot: '.',
},
external: [/node_modules/],
plugins: [
typescript({
// noEmitOnError: true,
moduleResolution: 'bundler',
include: ['server/**/*', '../../packages/**/*', '../../packages/lib/translations/**/*'],
}),
resolve({
rootDir: path.join(process.cwd(), '../..'),
preferBuiltins: true,
resolveOnly: [
'@documenso/api/*',
'@documenso/auth/*',
'@documenso/lib/*',
'@documenso/trpc/*',
],
extensions: ['.ts', '.tsx', '.js', '.jsx', '.json'],
}),
commonjs(),
babel({
babelHelpers: 'bundled',
extensions: ['.js', '.ts', '.tsx'],
presets: ['@babel/preset-typescript'],
plugins: ['@lingui/babel-plugin-lingui-macro'],
}),
],
};
export default config;

24
apps/remix/server/main.js Normal file
View File

@ -0,0 +1,24 @@
/**
* This is the main entry point for the server which will launch the RR7 application
* and spin up auth, api, etc.
*
* Note:
* This file will be copied to the build folder during build time.
* Running this file will not work without a build.
*/
import { serve } from '@hono/node-server';
import { serveStatic } from '@hono/node-server/serve-static';
import handle from 'hono-react-router-adapter/node';
import server from './hono/server/router.js';
import * as build from './index.js';
server.use(
serveStatic({
root: 'build/client',
}),
);
const handler = handle(build, server);
serve({ fetch: handler.fetch, port: 3000 });

View File

@ -1,17 +0,0 @@
// main.ts
import { serve } from '@hono/node-server';
import { serveStatic } from '@hono/node-server/serve-static';
import handle from 'hono-react-router-adapter/node';
import server from '.';
import * as build from '../build/server';
server.use(
serveStatic({
root: './build/client',
}),
);
const handler = handle(build, server);
serve({ fetch: handler.fetch, port: 3000 });

View File

@ -72,8 +72,12 @@ app
throw new AppError('INVALID_DOCUMENT_FILE');
}
// Todo: Test this.
if (!file.name.endsWith('.pdf')) {
file.name = `${file.name}.pdf`;
Object.defineProperty(file, 'name', {
writable: true,
value: `${file.name}.pdf`,
});
}
const { type, data } = await putFile(file);

View File

@ -1,7 +1,7 @@
import { getContext } from 'hono/context-storage';
import { redirect } from 'react-router';
import type { HonoEnv } from 'server';
import type { AppContext } from 'server/context';
import type { HonoEnv } from 'server/router';
import type { AppSession } from '@documenso/lib/client-only/providers/session';

View File

@ -10,7 +10,16 @@
"rootDirs": [".", "./.react-router/types"],
"baseUrl": ".",
"paths": {
"~/*": ["./app/*"]
"~/*": ["./app/*"],
"@documenso/api": ["../../packages/api"],
"@documenso/assets": ["../../packages/assets"],
"@documenso/auth": ["../../packages/auth"],
"@documenso/ee": ["../../packages/ee"],
"@documenso/lib": ["../../packages/lib"],
"@documenso/prisma": ["../../packages/prisma"],
"@documenso/trpc": ["../../packages/trpc"],
"@documenso/ui": ["../../packages/ui"],
"@documenso/tailwind-config": ["../../packages/tailwind-config"]
},
"esModuleInterop": true,
"verbatimModuleSyntax": true,

View File

@ -32,49 +32,38 @@ export default defineConfig({
lingui(),
tsconfigPaths(),
serverAdapter({
entry: 'server/index.ts',
entry: 'server/main.ts',
}),
],
ssr: {
noExternal: ['react-dropzone', 'plausible-tracker', 'pdfjs-dist'],
external: ['@node-rs/bcrypt'],
external: ['@node-rs/bcrypt', '@prisma/client'],
},
optimizeDeps: {
// include: ['react-icons'],
exclude: ['@node-rs/bcrypt'],
},
resolve: {
alias: {
https: 'node:https',
'.prisma/client/default': '../../node_modules/.prisma/client/default.js',
'.prisma/client/index-browser': '../../node_modules/.prisma/client/index-browser.js',
},
},
/**
* Throwing shit at a wall to see what sticks for building below onwards.
* Note: Re run rollup again to build the server afterwards.
*
* See rollup.config.mjs which is used for that.
*/
// resolve: {
// alias: {
// // https: 'node:https',
// // '.prisma/client/default': '../../node_modules/.prisma/client/default.js',
// },
// },
// optimizeDeps: {
// include: [],
// },
// ssr: {
// // noExternal: true,
// noExternal: [
// '@documenso/assets',
// '@documenso/ee',
// '@documenso/lib',
// '@documenso/prisma',
// '@documenso/tailwind-config',
// '@documenso/trpc',
// '@documenso/ui',
// ],
// },
// build: {
// rollupOptions: {
// external: [
// '@node-rs/bcrypt',
// '@documenso/pdf-sign',
// 'nodemailer',
// 'playwright',
// '@aws-sdk/cloudfront-signer',
// ],
// },
// },
build: {
rollupOptions: {
external: [
'@node-rs/bcrypt',
'@documenso/pdf-sign',
'@aws-sdk/cloudfront-signer',
'nodemailer',
'playwright',
],
},
},
});

976
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -1,5 +1,3 @@
'use server';
import type Stripe from 'stripe';
import { stripe } from '@documenso/lib/server-only/stripe';
@ -17,8 +15,6 @@ export const getCheckoutSession = async ({
returnUrl,
subscriptionMetadata,
}: GetCheckoutSessionOptions) => {
'use server';
const session = await stripe.checkout.sessions.create({
customer: customerId,
mode: 'subscription',

View File

@ -1,5 +1,3 @@
'use server';
import { stripe } from '@documenso/lib/server-only/stripe';
export type GetPortalSessionOptions = {
@ -8,8 +6,6 @@ export type GetPortalSessionOptions = {
};
export const getPortalSession = async ({ customerId, returnUrl }: GetPortalSessionOptions) => {
'use server';
const session = await stripe.billingPortal.sessions.create({
customer: customerId,
return_url: returnUrl,

View File

@ -1,17 +1,17 @@
export * from '@react-email/body';
export * from '@react-email/button';
export * from '@react-email/column';
export * from '@react-email/container';
export * from '@react-email/font';
export * from '@react-email/head';
export * from '@react-email/heading';
export * from '@react-email/hr';
export * from '@react-email/html';
export * from '@react-email/img';
export * from '@react-email/link';
export * from '@react-email/preview';
export * from '@react-email/render';
export * from '@react-email/row';
export * from '@react-email/section';
export * from '@react-email/tailwind';
export * from '@react-email/text';
export { Body } from '@react-email/body';
export { Button } from '@react-email/button';
export { Column } from '@react-email/column';
export { Container } from '@react-email/container';
export { Font } from '@react-email/font';
export { Head } from '@react-email/head';
export { Heading } from '@react-email/heading';
export { Hr } from '@react-email/hr';
export { Html } from '@react-email/html';
export { Img } from '@react-email/img';
export { Link } from '@react-email/link';
export { Preview } from '@react-email/preview';
export { render } from '@react-email/render';
export { Row } from '@react-email/row';
export { Section } from '@react-email/section';
export { Tailwind } from '@react-email/tailwind';
export { Text } from '@react-email/text';

View File

@ -16,9 +16,7 @@ export async function loadCatalog(lang: SupportedLanguages): Promise<{
}> {
const extension = env('NODE_ENV') === 'development' ? 'po' : 'js';
// Todo
const { messages } = await import(`../../translations/${lang}/web.po`);
// const { messages } = await import(`../../translations/${lang}/web.${extension}`);
const { messages } = await import(`../../translations/${lang}/web.${extension}`);
return {
[lang]: messages,

View File

@ -4,24 +4,24 @@ export const DOCUMENSO_ENCRYPTION_KEY = env('NEXT_PRIVATE_ENCRYPTION_KEY');
export const DOCUMENSO_ENCRYPTION_SECONDARY_KEY = env('NEXT_PRIVATE_ENCRYPTION_SECONDARY_KEY');
if (typeof window === 'undefined') {
if (!DOCUMENSO_ENCRYPTION_KEY || !DOCUMENSO_ENCRYPTION_SECONDARY_KEY) {
throw new Error('Missing DOCUMENSO_ENCRYPTION_KEY or DOCUMENSO_ENCRYPTION_SECONDARY_KEY keys');
}
// if (typeof window === 'undefined') {
// if (!DOCUMENSO_ENCRYPTION_KEY || !DOCUMENSO_ENCRYPTION_SECONDARY_KEY) {
// throw new Error('Missing DOCUMENSO_ENCRYPTION_KEY or DOCUMENSO_ENCRYPTION_SECONDARY_KEY keys');
// }
if (DOCUMENSO_ENCRYPTION_KEY === DOCUMENSO_ENCRYPTION_SECONDARY_KEY) {
throw new Error(
'DOCUMENSO_ENCRYPTION_KEY and DOCUMENSO_ENCRYPTION_SECONDARY_KEY cannot be equal',
);
}
}
// if (DOCUMENSO_ENCRYPTION_KEY === DOCUMENSO_ENCRYPTION_SECONDARY_KEY) {
// throw new Error(
// 'DOCUMENSO_ENCRYPTION_KEY and DOCUMENSO_ENCRYPTION_SECONDARY_KEY cannot be equal',
// );
// }
// }
if (DOCUMENSO_ENCRYPTION_KEY === 'CAFEBABE') {
console.warn('*********************************************************************');
console.warn('*');
console.warn('*');
console.warn('Please change the encryption key from the default value of "CAFEBABE"');
console.warn('*');
console.warn('*');
console.warn('*********************************************************************');
}
// if (DOCUMENSO_ENCRYPTION_KEY === 'CAFEBABE') {
// console.warn('*********************************************************************');
// console.warn('*');
// console.warn('*');
// console.warn('Please change the encryption key from the default value of "CAFEBABE"');
// console.warn('*');
// console.warn('*');
// console.warn('*********************************************************************');
// }

View File

@ -0,0 +1,3 @@
// Empty file for build reasons.
// Vite build seems to assume jobs/client.ts = jobs/client/index.ts and therefore will throw an error that the file is missing.
// Could refactor the files, but this is easier.

View File

@ -1,5 +1,3 @@
'use server';
import type { DocumentDistributionMethod, DocumentSigningOrder } from '@prisma/client';
import { DOCUMENT_AUDIT_LOG_TYPE } from '@documenso/lib/types/document-audit-logs';

View File

@ -1,5 +1,3 @@
'use server';
import { DocumentSource, WebhookTriggerEvents } from '@prisma/client';
import type { Team, TeamGlobalSettings } from '@prisma/client';
import { TeamMemberRole } from '@prisma/client';

View File

@ -1,5 +1,3 @@
'use server';
import { createElement } from 'react';
import { msg } from '@lingui/core/macro';

View File

@ -1,5 +1,3 @@
'use server';
import { createElement } from 'react';
import { msg } from '@lingui/core/macro';

View File

@ -1,5 +1,3 @@
'use server';
import { DOCUMENT_AUDIT_LOG_TYPE } from '@documenso/lib/types/document-audit-logs';
import type { RequestMetadata } from '@documenso/lib/universal/extract-request-metadata';
import { createDocumentAuditLogData } from '@documenso/lib/utils/document-audit-logs';

View File

@ -1,5 +1,3 @@
'use server';
import { DocumentStatus, SigningStatus } from '@prisma/client';
import { DOCUMENT_AUDIT_LOG_TYPE } from '@documenso/lib/types/document-audit-logs';

View File

@ -1,5 +1,3 @@
'use server';
import { DocumentStatus, FieldType, SigningStatus } from '@prisma/client';
import { DateTime } from 'luxon';
import { match } from 'ts-pattern';

View File

@ -5,9 +5,6 @@ import type { PDFDocument } from 'pdf-lib';
import { RotationTypes, degrees, radiansToDegrees } from 'pdf-lib';
import { P, match } from 'ts-pattern';
// Todo: Check if this is okay to do compared to the old approach.
import fontCaveat from '@documenso/assets/fonts/caveat.ttf?inline';
import fontNoto from '@documenso/assets/fonts/noto-sans.ttf?inline';
import {
DEFAULT_HANDWRITING_FONT_SIZE,
DEFAULT_STANDARD_FONT_SIZE,
@ -29,6 +26,13 @@ import {
ZTextFieldMeta,
} from '../../types/field-meta';
// Todo: Check if this is okay to do compared to the old approach.
// import fontCaveat from '@documenso/assets/fonts/caveat.ttf?inline';
// import fontNoto from '@documenso/assets/fonts/noto-sans.ttf?inline';
const fontCaveat = '';
const fontNoto = '';
export const insertFieldInPDF = async (pdf: PDFDocument, field: FieldWithSignature) => {
const isSignatureField = isSignatureFieldType(field.type);

View File

@ -1,5 +1,3 @@
'use server';
import { SubscriptionStatus } from '@prisma/client';
import { prisma } from '@documenso/prisma';

View File

@ -1,5 +1,3 @@
'use server';
import { prisma } from '@documenso/prisma';
export type GetSubscriptionsByUserIdOptions = {

View File

@ -1,5 +1,3 @@
'use server';
import type { Recipient } from '@prisma/client';
import { nanoid } from 'nanoid';

View File

@ -1,5 +1,3 @@
'use server';
import { generateAvaliableRecipientPlaceholder } from '@documenso/lib/utils/templates';
import { prisma } from '@documenso/prisma';

View File

@ -1,5 +1,3 @@
'use server';
import { prisma } from '@documenso/prisma';
export type DeleteTemplateOptions = {

View File

@ -1,5 +1,3 @@
'use server';
import { prisma } from '@documenso/prisma';
import { AppError, AppErrorCode } from '../../errors/app-error';

View File

@ -1,5 +1,3 @@
'use server';
import type { DocumentVisibility, Template, TemplateMeta } from '@prisma/client';
import { isUserEnterprise } from '@documenso/ee/server-only/util/is-document-enterprise';

View File

@ -10,8 +10,7 @@ export async function dynamicActivate(locale: string) {
// Todo: Use extension (currently breaks).
// const { messages } = await import(`../translations/${locale}/web.${extension}`);
const { messages } = await import(`../translations/${locale}/web.po`);
const { messages } = await import(`../translations/${locale}/web.${extension}`);
i18n.loadAndActivate({ locale, messages });
}

View File

@ -32,7 +32,7 @@
"dotenv-cli": "^7.3.0",
"prisma-json-types-generator": "^3.2.2",
"prisma-kysely": "^1.8.0",
"tsx": "^4.11.0",
"tsx": "^4.19.2",
"typescript": "5.6.2",
"zod-prisma-types": "3.1.9"
}