Skip to content

Commit 907df80

Browse files
Bill LeoutsakosBill Leoutsakos
authored andcommitted
fix(files): align PDF export with repository audits
1 parent e9d3777 commit 907df80

4 files changed

Lines changed: 19 additions & 42 deletions

File tree

‎apps/sim/app/api/files/export/[id]/markdown-pdf.tsx‎

Lines changed: 13 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -68,47 +68,26 @@ function resolveBrandFont(filename: string): string {
6868
return font
6969
}
7070

71-
function resolveDependencyFont(packageName: string, filename: string): string {
72-
const relativePath = join(packageName, 'files', filename)
73-
const candidates = [
74-
join(process.cwd(), 'node_modules', relativePath),
75-
join(process.cwd(), '..', '..', 'node_modules', relativePath),
76-
join(process.cwd(), 'apps', 'sim', 'node_modules', relativePath),
77-
]
78-
const font = candidates.find(existsSync)
79-
if (!font) throw new Error(`PDF dependency font not found: ${filename}`)
80-
return font
81-
}
82-
8371
const GEIST_REGULAR = resolveBrandFont('Geist-Regular.ttf')
8472
const GEIST_MEDIUM = resolveBrandFont('Geist-Medium.ttf')
85-
const UNIFONT_REGULAR = resolveDependencyFont(
86-
'@fontsource/unifont',
87-
'unifont-latin-400-normal.woff'
88-
)
89-
const NOTO_ARABIC = resolveDependencyFont(
90-
'@fontsource/noto-sans-arabic',
91-
'noto-sans-arabic-arabic-400-normal.woff'
73+
const UNIFONT_REGULAR = require.resolve('@fontsource/unifont/files/unifont-latin-400-normal.woff')
74+
const NOTO_ARABIC = require.resolve(
75+
'@fontsource/noto-sans-arabic/files/noto-sans-arabic-arabic-400-normal.woff'
9276
)
93-
const NOTO_ARABIC_BOLD = resolveDependencyFont(
94-
'@fontsource/noto-sans-arabic',
95-
'noto-sans-arabic-arabic-700-normal.woff'
77+
const NOTO_ARABIC_BOLD = require.resolve(
78+
'@fontsource/noto-sans-arabic/files/noto-sans-arabic-arabic-700-normal.woff'
9679
)
97-
const NOTO_DEVANAGARI = resolveDependencyFont(
98-
'@fontsource/noto-sans-devanagari',
99-
'noto-sans-devanagari-devanagari-400-normal.woff'
80+
const NOTO_DEVANAGARI = require.resolve(
81+
'@fontsource/noto-sans-devanagari/files/noto-sans-devanagari-devanagari-400-normal.woff'
10082
)
101-
const NOTO_DEVANAGARI_BOLD = resolveDependencyFont(
102-
'@fontsource/noto-sans-devanagari',
103-
'noto-sans-devanagari-devanagari-700-normal.woff'
83+
const NOTO_DEVANAGARI_BOLD = require.resolve(
84+
'@fontsource/noto-sans-devanagari/files/noto-sans-devanagari-devanagari-700-normal.woff'
10485
)
105-
const NOTO_HEBREW = resolveDependencyFont(
106-
'@fontsource/noto-sans-hebrew',
107-
'noto-sans-hebrew-hebrew-400-normal.woff'
86+
const NOTO_HEBREW = require.resolve(
87+
'@fontsource/noto-sans-hebrew/files/noto-sans-hebrew-hebrew-400-normal.woff'
10888
)
109-
const NOTO_HEBREW_BOLD = resolveDependencyFont(
110-
'@fontsource/noto-sans-hebrew',
111-
'noto-sans-hebrew-hebrew-700-normal.woff'
89+
const NOTO_HEBREW_BOLD = require.resolve(
90+
'@fontsource/noto-sans-hebrew/files/noto-sans-hebrew-hebrew-700-normal.woff'
11291
)
11392

11493
/**

‎apps/sim/app/api/files/export/[id]/route.test.ts‎

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import {
77
} from '@sim/testing/mocks/files-authorization.mock'
88
import { hybridAuthMockFns } from '@sim/testing/mocks/hybrid-auth.mock'
99
import { posthogServerMock, posthogServerMockFns } from '@sim/testing/mocks/posthog-server.mock'
10+
import { rateLimiterMock, rateLimiterMockFns } from '@sim/testing/mocks/rate-limiter.mock'
1011
import { storageServiceMock, storageServiceMockFns } from '@sim/testing/mocks/storage-service.mock'
1112
import {
1213
uploadsMetadataMock,
@@ -20,13 +21,11 @@ import { getServeStoragePrefix } from '@/lib/uploads/config'
2021
const {
2122
mockExtractEmbeddedFileRefs,
2223
mockResolveWorkspaceInlineImage,
23-
mockEnforceUserRateLimit,
2424
mockRenderMarkdownPdf,
2525
MockMarkdownPdfLimitError,
2626
} = vi.hoisted(() => ({
2727
mockExtractEmbeddedFileRefs: vi.fn(),
2828
mockResolveWorkspaceInlineImage: vi.fn(),
29-
mockEnforceUserRateLimit: vi.fn(),
3029
mockRenderMarkdownPdf: vi.fn(),
3130
MockMarkdownPdfLimitError: class extends Error {},
3231
}))
@@ -45,9 +44,7 @@ vi.mock('@/lib/uploads/server/embedded-image-refs', () => ({
4544
vi.mock('@/lib/uploads/server/inline-image', () => ({
4645
resolveWorkspaceInlineImage: mockResolveWorkspaceInlineImage,
4746
}))
48-
vi.mock('@/lib/core/rate-limiter/route-helpers', () => ({
49-
enforceUserRateLimit: mockEnforceUserRateLimit,
50-
}))
47+
vi.mock('@/lib/core/rate-limiter/route-helpers', () => rateLimiterMock)
5148
vi.mock('@/app/api/files/export/[id]/markdown-pdf', () => ({
5249
MarkdownPdfLimitError: MockMarkdownPdfLimitError,
5350
markdownPdfImageKey: (ref: { key?: string; fileId?: string }) =>
@@ -65,6 +62,7 @@ const mockVerifyFileAccess = filesAuthorizationMockFns.mockVerifyFileAccess
6562
const mockCheckAuth = hybridAuthMockFns.mockCheckSessionOrInternalAuth
6663
const mockRecordAudit = auditMockFns.mockRecordAudit
6764
const mockCaptureServerEvent = posthogServerMockFns.mockCaptureServerEvent
65+
const mockEnforceUserRateLimit = rateLimiterMockFns.mockEnforceUserRateLimit
6866

6967
const MB = 1024 * 1024
7068
const DOC_ID = 'doc-1'

‎apps/sim/lib/api/contracts/storage-transfer.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ export const fileExportParamsSchema = z.object({
200200
id: workspaceFileIdSchema,
201201
})
202202

203-
export const fileExportQuerySchema = z.object({
203+
const fileExportQuerySchema = z.object({
204204
format: z.literal('pdf').optional(),
205205
})
206206

‎apps/sim/lib/uploads/client/download.ts‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { PASTE_LIMITS, utf8ByteLength } from '@sim/utils/paste'
22
import { requestRaw } from '@/lib/api/client/request'
3-
import { fileExportContract } from '@/lib/api/contracts/storage-transfer'
3+
import { fileExportContract, type FileExportQuery } from '@/lib/api/contracts/storage-transfer'
44
import { downloadWorkspaceFileItemsContract } from '@/lib/api/contracts/workspace-file-folders'
55
import { exportWorkspaceFileSnapshotContract } from '@/lib/api/contracts/workspace-files'
66
import type { WorkspaceFileRecord } from '@/lib/uploads/contexts/workspace'
@@ -43,7 +43,7 @@ function fileNameFromDisposition(response: Response, fallback: string): string {
4343
export async function triggerFileDownload(
4444
record: WorkspaceFileRecord,
4545
source?: FileDownloadSource | null,
46-
options?: { format?: 'pdf' }
46+
options?: FileExportQuery
4747
): Promise<void> {
4848
const isMarkdown =
4949
record.type === 'text/markdown' ||

0 commit comments

Comments
 (0)