diff --git a/apps/remix/app/components/dialogs/document-duplicate-dialog.tsx b/apps/remix/app/components/dialogs/document-duplicate-dialog.tsx index cb8ccfbb1..a6c2d8f03 100644 --- a/apps/remix/app/components/dialogs/document-duplicate-dialog.tsx +++ b/apps/remix/app/components/dialogs/document-duplicate-dialog.tsx @@ -36,9 +36,14 @@ export const DocumentDuplicateDialog = ({ const team = useOptionalCurrentTeam(); - const { data: document, isLoading } = trpcReact.document.getDocumentById.useQuery({ - documentId: id, - }); + const { data: document, isLoading } = trpcReact.document.getDocumentById.useQuery( + { + documentId: id, + }, + { + enabled: open === true, + }, + ); const documentData = document?.documentData ? { diff --git a/apps/remix/app/routes/api+/stripe.webhook.ts b/apps/remix/app/routes/api+/stripe.webhook.ts index f3c78cd44..de42f7e6e 100644 --- a/apps/remix/app/routes/api+/stripe.webhook.ts +++ b/apps/remix/app/routes/api+/stripe.webhook.ts @@ -6,6 +6,6 @@ import { stripeWebhookHandler } from '@documenso/ee/server-only/stripe/webhook/h // }; import type { Route } from './+types/webhook.trigger'; -export async function loader({ request }: Route.LoaderArgs) { +export async function action({ request }: Route.ActionArgs) { return stripeWebhookHandler(request); } diff --git a/apps/remix/app/routes/api+/webhook.trigger.ts b/apps/remix/app/routes/api+/webhook.trigger.ts index ea95bd836..f5c3ceadd 100644 --- a/apps/remix/app/routes/api+/webhook.trigger.ts +++ b/apps/remix/app/routes/api+/webhook.trigger.ts @@ -12,6 +12,6 @@ import type { Route } from './+types/webhook.trigger'; // }, // }; -export async function loader({ request }: Route.LoaderArgs) { +export async function action({ request }: Route.ActionArgs) { return handlerTriggerWebhooks(request); } diff --git a/apps/remix/package.json b/apps/remix/package.json index bc99f8c40..788a97396 100644 --- a/apps/remix/package.json +++ b/apps/remix/package.json @@ -72,6 +72,7 @@ }, "devDependencies": { "@babel/core": "^7.26.7", + "@babel/preset-react": "^7.26.3", "@babel/preset-typescript": "^7.26.0", "@lingui/babel-plugin-lingui-macro": "^5.2.0", "@lingui/vite-plugin": "^5.2.0", diff --git a/apps/remix/rollup.config.mjs b/apps/remix/rollup.config.mjs index aa71dba19..0403c82db 100644 --- a/apps/remix/rollup.config.mjs +++ b/apps/remix/rollup.config.mjs @@ -25,6 +25,7 @@ const config = { noEmitOnError: true, moduleResolution: 'bundler', include: ['server/**/*', '../../packages/**/*', '../../packages/lib/translations/**/*'], + jsx: 'preserve', }), resolve({ rootDir: path.join(process.cwd(), '../..'), @@ -41,8 +42,8 @@ const config = { commonjs(), babel({ babelHelpers: 'bundled', - extensions: ['.js', '.ts', '.tsx'], - presets: ['@babel/preset-typescript'], + extensions: ['.ts', '.tsx'], + presets: ['@babel/preset-typescript', ['@babel/preset-react', { runtime: 'automatic' }]], plugins: [linguiMacro], }), ], diff --git a/apps/remix/server/context.ts b/apps/remix/server/context.ts index afcc64c65..f5bd8f9a2 100644 --- a/apps/remix/server/context.ts +++ b/apps/remix/server/context.ts @@ -27,7 +27,7 @@ export const appContext = async (c: Context, next: Next) => { const noSessionCookie = extractSessionCookieFromHeaders(request.headers) === null; if (!isPageRequest(request) || noSessionCookie || blacklistedPathsRegex.test(url.pathname)) { - logger.log('Pathname ignored', url.pathname); + // logger.log('Pathname ignored', url.pathname); setAppContext(c, { requestMetadata: extractRequestMetadata(request), diff --git a/apps/remix/tsconfig.json b/apps/remix/tsconfig.json index e5bb783ef..ec392a6d4 100644 --- a/apps/remix/tsconfig.json +++ b/apps/remix/tsconfig.json @@ -26,6 +26,7 @@ "noEmit": true, "moduleDetection": "force", "resolveJsonModule": true, + "isolatedModules": true, "skipLibCheck": true, "strict": true, "useUnknownInCatchVariables": false diff --git a/package-lock.json b/package-lock.json index d3c173cf5..937186d21 100644 --- a/package-lock.json +++ b/package-lock.json @@ -154,6 +154,7 @@ }, "devDependencies": { "@babel/core": "^7.26.7", + "@babel/preset-react": "^7.26.3", "@babel/preset-typescript": "^7.26.0", "@lingui/babel-plugin-lingui-macro": "^5.2.0", "@lingui/vite-plugin": "^5.2.0", @@ -2391,6 +2392,75 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.25.9.tgz", + "integrity": "sha512-KJfMlYIUxQB1CJfO3e0+h0ZHWOTLCPP115Awhaz8U0Zpq36Gl/cXlpoyMRnUWlhNUBAzldnCiAZNvCDj7CrKxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.9.tgz", + "integrity": "sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/plugin-syntax-jsx": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.25.9.tgz", + "integrity": "sha512-9mj6rm7XVYs4mdLIpbZnHOYdpW42uoiBCTVowg7sP1thUOiANgMb4UtpRivR0pp5iL+ocvUv7X4mZgFRpJEzGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.25.9.tgz", + "integrity": "sha512-KQ/Takk3T8Qzj5TppkS1be588lkbTp5uj7w6a0LeQaTMSckU/wK0oJ/pih+T690tkgI5jfmg2TqDJvd41Sj1Cg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-transform-typescript": { "version": "7.26.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.26.7.tgz", @@ -2411,6 +2481,27 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/preset-react": { + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.26.3.tgz", + "integrity": "sha512-Nl03d6T9ky516DGK2YMxrTqvnpUW63TnJMOMonj+Zae0JiPC5BC9xPMSL6L8fiSpA5vP88qfygavVQvnLp+6Cw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-validator-option": "^7.25.9", + "@babel/plugin-transform-react-display-name": "^7.25.9", + "@babel/plugin-transform-react-jsx": "^7.25.9", + "@babel/plugin-transform-react-jsx-development": "^7.25.9", + "@babel/plugin-transform-react-pure-annotations": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/preset-typescript": { "version": "7.26.0", "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.26.0.tgz", diff --git a/packages/app-tests/e2e/fixtures/authentication.ts b/packages/app-tests/e2e/fixtures/authentication.ts index a6f358a98..f52357895 100644 --- a/packages/app-tests/e2e/fixtures/authentication.ts +++ b/packages/app-tests/e2e/fixtures/authentication.ts @@ -21,12 +21,13 @@ export const apiSignin = async ({ }: LoginOptions) => { const { request } = page.context(); - // const csrfToken = await getCsrfToken(page); + const csrfToken = await getCsrfToken(page); await request.post(`${NEXT_PUBLIC_WEBAPP_URL()}/api/auth/email-password/authorize`, { data: { email, password, + csrfToken, }, }); @@ -50,6 +51,7 @@ const getCsrfToken = async (page: Page) => { }); const { csrfToken } = await response.json(); + if (!csrfToken) { throw new Error('Invalid session'); } diff --git a/packages/app-tests/e2e/teams/team-documents.spec.ts b/packages/app-tests/e2e/teams/team-documents.spec.ts index cc74478b8..c269eb9a9 100644 --- a/packages/app-tests/e2e/teams/team-documents.spec.ts +++ b/packages/app-tests/e2e/teams/team-documents.spec.ts @@ -422,10 +422,13 @@ test('[TEAMS]: check document visibility based on team member role', async ({ pa }, ]); + const teamUrlRedirect = `/t/${team.url}/documents?status=COMPLETED`; + // Test cases for each role const testCases = [ { user: adminUser, + path: teamUrlRedirect, expectedDocuments: [ 'Document Visible to Everyone', 'Document Visible to Manager and Above', @@ -435,14 +438,17 @@ test('[TEAMS]: check document visibility based on team member role', async ({ pa }, { user: managerUser, + path: teamUrlRedirect, expectedDocuments: ['Document Visible to Everyone', 'Document Visible to Manager and Above'], }, { user: memberUser, + path: teamUrlRedirect, expectedDocuments: ['Document Visible to Everyone'], }, { user: outsideUser, + path: '/documents', expectedDocuments: ['Document Visible to Admin with Recipient'], }, ]; @@ -451,7 +457,7 @@ test('[TEAMS]: check document visibility based on team member role', async ({ pa await apiSignin({ page, email: testCase.user.email, - redirectPath: `/t/${team.url}/documents?status=COMPLETED`, + redirectPath: testCase.path, }); // Check that the user sees the expected documents diff --git a/packages/app-tests/package.json b/packages/app-tests/package.json index a02c23177..1807dac8f 100644 --- a/packages/app-tests/package.json +++ b/packages/app-tests/package.json @@ -7,7 +7,7 @@ "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 start-server-and-test \"npm run start -w @documenso/web\" http://localhost:3000 \"playwright test $E2E_TEST_PATH\"" + "test:e2e": "NODE_OPTIONS=--experimental-require-module start-server-and-test \"npm run start -w @documenso/remix\" http://localhost:3000 \"playwright test $E2E_TEST_PATH\"" }, "keywords": [], "author": "", diff --git a/packages/auth/client/index.ts b/packages/auth/client/index.ts index 236aed72e..de14b654e 100644 --- a/packages/auth/client/index.ts +++ b/packages/auth/client/index.ts @@ -53,8 +53,12 @@ export class AuthClient { } public emailPassword = { - signIn: async (data: Omit) => { - const { csrfToken } = await this.client.csrf.$get().then(async (res) => res.json()); + signIn: async (data: Omit & { csrfToken?: string }) => { + let csrfToken = data.csrfToken; + + if (!csrfToken) { + csrfToken = (await this.client.csrf.$get().then(async (res) => res.json())).csrfToken; + } const response = await this.client['email-password'].authorize.$post({ json: {