@striae-org/striae 3.1.1 → 3.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/.env.example +2 -0
  2. package/README.md +3 -32
  3. package/app/components/actions/case-export/data-processing.ts +49 -9
  4. package/app/components/actions/case-export/download-handlers.ts +125 -40
  5. package/app/components/actions/case-export/metadata-helpers.ts +31 -13
  6. package/app/components/actions/generate-pdf.ts +4 -0
  7. package/app/components/form/base-form.tsx +1 -1
  8. package/app/components/sidebar/case-export/case-export.tsx +15 -15
  9. package/app/components/sidebar/cases/case-sidebar.tsx +23 -16
  10. package/app/components/sidebar/sidebar-container.tsx +1 -1
  11. package/app/config-example/inactivity.ts +1 -1
  12. package/app/entry.client.tsx +12 -12
  13. package/app/entry.server.tsx +4 -4
  14. package/app/hooks/useInactivityTimeout.ts +1 -1
  15. package/app/root.tsx +3 -3
  16. package/app/routes/auth/emailActionHandler.tsx +1 -1
  17. package/app/routes/auth/emailVerification.tsx +1 -1
  18. package/app/routes/auth/login.tsx +1 -1
  19. package/app/routes/auth/passwordReset.tsx +1 -1
  20. package/app/routes/auth/route.ts +1 -1
  21. package/app/services/firebase.ts +4 -0
  22. package/app/types/exceljs-bare.d.ts +7 -0
  23. package/app/utils/auth.ts +5 -1
  24. package/functions/[[path]].ts +2 -2
  25. package/package.json +33 -18
  26. package/public/_routes.json +1 -0
  27. package/public/icon-256.png +0 -0
  28. package/public/vendor/exceljs.LICENSE +22 -0
  29. package/public/vendor/exceljs.bare.min.js +45 -0
  30. package/scripts/deploy-all.sh +52 -0
  31. package/scripts/deploy-config.sh +508 -3
  32. package/scripts/deploy-worker-secrets.sh +6 -2
  33. package/tsconfig.json +18 -8
  34. package/vite.config.ts +6 -22
  35. package/workers/audit-worker/package.json +8 -4
  36. package/workers/audit-worker/wrangler.jsonc.example +1 -1
  37. package/workers/data-worker/package.json +8 -4
  38. package/workers/data-worker/wrangler.jsonc.example +1 -1
  39. package/workers/image-worker/package.json +8 -4
  40. package/workers/image-worker/wrangler.jsonc.example +1 -1
  41. package/workers/keys-worker/package.json +8 -4
  42. package/workers/keys-worker/src/keys.example.ts +1 -0
  43. package/workers/keys-worker/wrangler.jsonc.example +1 -1
  44. package/workers/pdf-worker/package.json +9 -4
  45. package/workers/pdf-worker/src/format-striae.ts +2 -1
  46. package/workers/pdf-worker/src/generated-assets.ts +117 -0
  47. package/workers/pdf-worker/src/pdf-worker.example.ts +12 -1
  48. package/workers/pdf-worker/wrangler.jsonc.example +1 -1
  49. package/workers/user-worker/package.json +8 -4
  50. package/workers/user-worker/wrangler.jsonc.example +1 -1
  51. package/wrangler.toml.example +1 -1
@@ -175,7 +175,7 @@ fi
175
175
 
176
176
  # Keys Worker
177
177
  if ! set_worker_secrets "Keys Worker" "workers/keys-worker" \
178
- "KEYS_AUTH" "USER_DB_AUTH" "R2_KEY_SECRET" "ACCOUNT_HASH" "IMAGES_API_TOKEN"; then
178
+ "KEYS_AUTH" "USER_DB_AUTH" "R2_KEY_SECRET" "ACCOUNT_HASH" "IMAGES_API_TOKEN" "PDF_WORKER_AUTH"; then
179
179
  echo -e "${YELLOW}⚠️ Skipping Keys Worker (not configured)${NC}"
180
180
  fi
181
181
 
@@ -198,7 +198,11 @@ if ! set_worker_secrets "Images Worker" "workers/image-worker" \
198
198
  fi
199
199
 
200
200
  # PDF Worker (no secrets needed)
201
- echo -e "\n${BLUE}📄 PDF Worker: No environment variables needed${NC}"
201
+ # PDF Worker
202
+ if ! set_worker_secrets "PDF Worker" "workers/pdf-worker" \
203
+ "PDF_WORKER_AUTH"; then
204
+ echo -e "${YELLOW}⚠️ Skipping PDF Worker (not configured)${NC}"
205
+ fi
202
206
 
203
207
  echo -e "\n${GREEN}🎉 Worker secrets deployment completed!${NC}"
204
208
 
package/tsconfig.json CHANGED
@@ -5,14 +5,19 @@
5
5
  "**/.server/**/*.ts",
6
6
  "**/.server/**/*.tsx",
7
7
  "**/.client/**/*.ts",
8
- "**/.client/**/*.tsx"
8
+ "**/.client/**/*.tsx",
9
+ ".react-router/types/**/*"
9
10
  ],
10
11
  "compilerOptions": {
11
- "lib": ["DOM", "DOM.Iterable", "ES2022"],
12
+ "lib": [
13
+ "DOM",
14
+ "DOM.Iterable",
15
+ "ES2022"
16
+ ],
12
17
  "types": [
13
- "@remix-run/cloudflare",
14
- "vite/client"
15
- ],
18
+ "@react-router/cloudflare",
19
+ "vite/client"
20
+ ],
16
21
  "isolatedModules": true,
17
22
  "esModuleInterop": true,
18
23
  "jsx": "react-jsx",
@@ -25,9 +30,14 @@
25
30
  "skipLibCheck": true,
26
31
  "forceConsistentCasingInFileNames": true,
27
32
  "paths": {
28
- "~/*": ["./app/*"]
33
+ "~/*": [
34
+ "./app/*"
35
+ ]
29
36
  },
30
-
37
+ "rootDirs": [
38
+ ".",
39
+ "./.react-router/types"
40
+ ],
31
41
  "noEmit": true
32
42
  }
33
- }
43
+ }
package/vite.config.ts CHANGED
@@ -1,35 +1,19 @@
1
- import {
2
- vitePlugin as remix,
3
- cloudflareDevProxyVitePlugin as remixCloudflareDevProxy,
4
- } from "@remix-run/dev";
1
+ import { reactRouter } from "@react-router/dev/vite";
2
+ import { cloudflareDevProxy } from "@react-router/dev/vite/cloudflare";
5
3
  import { defineConfig } from "vite";
6
4
  import tsconfigPaths from "vite-tsconfig-paths";
7
5
 
8
- declare module "@remix-run/cloudflare" {
9
- interface Future {
10
- v3_singleFetch: true;
11
- }
12
- }
13
-
14
6
  export default defineConfig({
15
7
  server: {
16
8
  port: 7777,
17
9
  },
18
- build: {
10
+ build: {
19
11
  chunkSizeWarningLimit: 500,
20
12
  minify: true,
21
13
  },
22
14
  plugins: [
23
- remixCloudflareDevProxy(),
24
- remix({
25
- future: {
26
- v3_fetcherPersist: true,
27
- v3_relativeSplatPath: true,
28
- v3_throwAbortReason: true,
29
- v3_singleFetch: true,
30
- v3_lazyRouteDiscovery: true,
31
- },
32
- }),
33
- tsconfigPaths()
15
+ cloudflareDevProxy(),
16
+ reactRouter(),
17
+ tsconfigPaths(),
34
18
  ],
35
19
  });
@@ -9,9 +9,13 @@
9
9
  "test": "vitest"
10
10
  },
11
11
  "devDependencies": {
12
- "@cloudflare/puppeteer": "^1.0.4",
13
- "@cloudflare/vitest-pool-workers": "^0.12.9",
14
- "vitest": "~3.2.0",
15
- "wrangler": "^4.69.0"
12
+ "@cloudflare/puppeteer": "^1.0.6",
13
+ "@cloudflare/vitest-pool-workers": "^0.13.0",
14
+ "vitest": "~4.1.0",
15
+ "wrangler": "^4.73.0"
16
+ },
17
+ "overrides": {
18
+ "undici": "7.24.1",
19
+ "yauzl": "3.2.1"
16
20
  }
17
21
  }
@@ -2,7 +2,7 @@
2
2
  "name": "AUDIT_WORKER_NAME",
3
3
  "account_id": "ACCOUNT_ID",
4
4
  "main": "src/audit-worker.ts",
5
- "compatibility_date": "2026-03-12",
5
+ "compatibility_date": "2026-03-14",
6
6
  "compatibility_flags": [
7
7
  "nodejs_compat"
8
8
  ],
@@ -9,9 +9,13 @@
9
9
  "test": "vitest"
10
10
  },
11
11
  "devDependencies": {
12
- "@cloudflare/puppeteer": "^1.0.4",
13
- "@cloudflare/vitest-pool-workers": "^0.12.9",
14
- "vitest": "~3.2.0",
15
- "wrangler": "^4.69.0"
12
+ "@cloudflare/puppeteer": "^1.0.6",
13
+ "@cloudflare/vitest-pool-workers": "^0.13.0",
14
+ "vitest": "~4.1.0",
15
+ "wrangler": "^4.73.0"
16
+ },
17
+ "overrides": {
18
+ "undici": "7.24.1",
19
+ "yauzl": "3.2.1"
16
20
  }
17
21
  }
@@ -3,7 +3,7 @@
3
3
  "name": "DATA_WORKER_NAME",
4
4
  "account_id": "ACCOUNT_ID",
5
5
  "main": "src/data-worker.ts",
6
- "compatibility_date": "2026-03-12",
6
+ "compatibility_date": "2026-03-14",
7
7
  "compatibility_flags": [
8
8
  "nodejs_compat"
9
9
  ],
@@ -9,9 +9,13 @@
9
9
  "test": "vitest"
10
10
  },
11
11
  "devDependencies": {
12
- "@cloudflare/puppeteer": "^1.0.4",
13
- "@cloudflare/vitest-pool-workers": "^0.12.9",
14
- "vitest": "~3.2.0",
15
- "wrangler": "^4.69.0"
12
+ "@cloudflare/puppeteer": "^1.0.6",
13
+ "@cloudflare/vitest-pool-workers": "^0.13.0",
14
+ "vitest": "~4.1.0",
15
+ "wrangler": "^4.73.0"
16
+ },
17
+ "overrides": {
18
+ "undici": "7.24.1",
19
+ "yauzl": "3.2.1"
16
20
  }
17
21
  }
@@ -2,7 +2,7 @@
2
2
  "name": "IMAGES_WORKER_NAME",
3
3
  "account_id": "ACCOUNT_ID",
4
4
  "main": "src/image-worker.ts",
5
- "compatibility_date": "2026-03-12",
5
+ "compatibility_date": "2026-03-14",
6
6
  "compatibility_flags": [
7
7
  "nodejs_compat"
8
8
  ],
@@ -9,9 +9,13 @@
9
9
  "test": "vitest"
10
10
  },
11
11
  "devDependencies": {
12
- "@cloudflare/puppeteer": "^1.0.4",
13
- "@cloudflare/vitest-pool-workers": "^0.12.9",
14
- "vitest": "~3.2.0",
15
- "wrangler": "^4.69.0"
12
+ "@cloudflare/puppeteer": "^1.0.6",
13
+ "@cloudflare/vitest-pool-workers": "^0.13.0",
14
+ "vitest": "~4.1.0",
15
+ "wrangler": "^4.73.0"
16
+ },
17
+ "overrides": {
18
+ "undici": "7.24.1",
19
+ "yauzl": "3.2.1"
16
20
  }
17
21
  }
@@ -3,6 +3,7 @@ interface Env {
3
3
  ACCOUNT_HASH: string;
4
4
  IMAGES_API_TOKEN: string;
5
5
  USER_DB_AUTH: string;
6
+ PDF_WORKER_AUTH: string;
6
7
  KEYS_AUTH: string;
7
8
  }
8
9
 
@@ -2,7 +2,7 @@
2
2
  "name": "KEYS_WORKER_NAME",
3
3
  "account_id": "ACCOUNT_ID",
4
4
  "main": "src/keys.ts",
5
- "compatibility_date": "2026-03-12",
5
+ "compatibility_date": "2026-03-14",
6
6
  "compatibility_flags": [
7
7
  "nodejs_compat"
8
8
  ],
@@ -3,15 +3,20 @@
3
3
  "version": "0.0.0",
4
4
  "private": true,
5
5
  "scripts": {
6
+ "generate:assets": "node scripts/generate-assets.js",
6
7
  "deploy": "wrangler deploy",
7
8
  "dev": "wrangler dev",
8
9
  "start": "wrangler dev",
9
10
  "test": "vitest"
10
11
  },
11
12
  "devDependencies": {
12
- "@cloudflare/puppeteer": "^1.0.4",
13
- "@cloudflare/vitest-pool-workers": "^0.12.9",
14
- "vitest": "~3.2.0",
15
- "wrangler": "^4.69.0"
13
+ "@cloudflare/puppeteer": "^1.0.6",
14
+ "@cloudflare/vitest-pool-workers": "^0.13.0",
15
+ "vitest": "~4.1.0",
16
+ "wrangler": "^4.73.0"
17
+ },
18
+ "overrides": {
19
+ "undici": "7.24.1",
20
+ "yauzl": "3.2.1"
16
21
  }
17
22
  }
@@ -1,4 +1,5 @@
1
1
  import type { PDFGenerationData, ReportRenderer } from './report-types';
2
+ import { ICON_256 } from './generated-assets';
2
3
 
3
4
  export const renderReport: ReportRenderer = (data: PDFGenerationData): string => {
4
5
  const { imageUrl, caseNumber, annotationData, activeAnnotations, currentDate, notesUpdatedFormatted, userCompany } = data;
@@ -519,7 +520,7 @@ export const renderReport: ReportRenderer = (data: PDFGenerationData): string =>
519
520
  <div class="footer">
520
521
  <div class="footer-left">
521
522
  <span>Notes formatted by Striae</span>
522
- <img class="footer-brand-icon" src="https://app.striae.org/icon-256.png" alt="Striae icon" />
523
+ <img class="footer-brand-icon" src="${ICON_256}" alt="Striae icon" />
523
524
  </div>
524
525
  <div class="footer-center">
525
526
  ${userCompany ? userCompany : ''}
@@ -0,0 +1,117 @@
1
+ // Auto-generated by scripts/generate-assets.js
2
+ // Do not edit manually — run `npm run generate:assets` to regenerate.
3
+
4
+ // Source: src/assets/icon-256.png
5
+ export const ICON_256 =
6
+ "data:image/png;base64," +
7
+ "iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAYAAABccqhmAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAYdEVY" +
8
+ "dFNvZnR3YXJlAFBhaW50Lk5FVCA1LjEuMvu8A7YAAAC2ZVhJZklJKgAIAAAABQAaAQUAAQAAAEoAAAAbAQUAAQAAAFIAAAAoAQMAAQAAAAIAAAAxAQIAEAAA" +
9
+ "AFoAAABphwQAAQAAAGoAAAAAAAAAYAAAAAEAAABgAAAAAQAAAFBhaW50Lk5FVCA1LjEuMgADAACQBwAEAAAAMDIzMAGgAwABAAAAAQAAAAWgBAABAAAAlAAA" +
10
+ "AAAAAAACAAEAAgAEAAAAUjk4AAIABwAEAAAAMDEwMAAAAADp1fY4ytpsegAAJW1JREFUeF7tnQecVdW1/9ftbXpv9KaYKFHMM3+RZzRoNAYFJY/yBGOMIu/p" +
11
+ "U3z2gJ/YRYLGmIiRYsooSIvGqMSnWGLJx5K8hygCQxkYhun99nv3f68zexQGpt/T9lnfz+d8zt7nUu49Z6/fLmevtYAgCIIgCIIgCIIgCIIgCIIgCEmxiTMx" +
12
+ "RB5//HHW0NAgaoSajBgxAq655hpquymAbuIQuP/++9n27dshFouJK4SW+P1+OP3002Hx4sXUjgcJ3bgBsGXLFvbhhx/C7t27xRXCSEyaNAmWLl1KbXoA0M3q" +
13
+ "Bw8//DD75JNPIJFIiCuEkfF6vTBlyhRYtGgRte8+oBvUA+Xl5Wzbtm3Q2NgorhBmZNiwYXD++efD9OnTqa0TBEEQBEEo0LDIhKx9/T1W29wKR/hR19IO9fxo" +
14
+ "C4UhHItBPJGARCIJ0XgCkowB48fR4AO32+38sIGDn/FwORzgdPCz0wFpfP5ckJUOZXnZUJiVAf916fnURiSGHq5BeWTDq+yLQ0dgz+FaCIajijEnkknlHOcG" +
15
+ "joaNdTVBkbDbbIpAuJ1OcHCRcHLBCHg9kJeZBhNKi+Dn/05zazNDD88ALNv4GjtY3wSHG5qhtrkNmjqCEIpExafGB0cLJTlZMKIwFx6+aia1KRNBD0sHVmx5" +
16
+ "nW3ffwg+raiE9lBEXJUHGx81jC8pgIkjSmD5T2ZRGzMw9HA04qoVa9kHOyuU4bsVGZafA1MmjoX7519Gbc5A0MNQkSV/eJG9u2M3VPHhPc7dCVDWEnLSA3BS" +
17
+ "WRGcPXEMXH3BFGqDOmKpm79u3TpVrbA1EoOKxnb4ZzWfz7eFIRiNi0+InsjxuWFcbjqcUZoD+QEPuB128Yk+OLlAXXHFFZaxC0v80JdffpmVl5dDJKLCfJvP" +
18
+ "d4N2DzR7MqHFlQZRu0t8QAwEbIiBeBCyIy2QEe8AZ1I/8czKyoI1a9ZYwjak/5F33303++KLL0QtdcTtTmhxp0OtJ4eMXgWyom1QGG4AbyIsrmjP1KlT4aab" +
19
+ "bpLaRqT+cfPmzWOhUEjUUkPY7oYGTxY08R4/AXy4ykcAhDo4WAIyo+1QEGkAT0Kf16IFBQWwcuVKaR+ylD9s1apV7JVXXhG11JDgt6rOm8MNP4t6fI3xJGN8" +
20
+ "atCsTA/cTPupgcvlgvXr10tpK9R99YPH17/EXvj7Z1DT0i6uEHpQmJkGl0+eCLfMpVeJqYJuZB+ctfhBhvvtCeMwsjAX3njwFmq7KYBuYg9c/+s/sjf/90vF" +
21
+ "uYYwHui49KMpk+HeKy+lNjwE6OadgHNuXcYONzaLGmFkJo0eBpvuvp7a8SChG3cUi35dzrZ+ukPUCLOAHotXnncWLJ37Q2rPA4RumOD/3fIwq2luFTXCjIwo" +
22
+ "yIU3H6K1gYFg+Zv14PpX2B+3fQiRGG3blYH8zHT4cMWdJAL9xNI36rY1G9mm9z4VNUIWcIFw59P3kQj0A8PfpCVLlqTcgSfK/8VtDUlowAIhLRMCNjg9065b" +
23
+ "I3e73dh+DW1jhv5yM2fOTLmFdji8UBUohpDDI64QMpMZa4eyjmpwMn1e52ZnZ8Pq1asNa2f6+l72wpw5c1Ju/G2uAFSmlZLxWwj00DzoL4KYzSGuaEtTUxNc" +
24
+ "d911hh1qGlIArrrqKpZq190Opx8OBEppH78FaXWnQ7W/EBI6iUBdXR16FRpSBAwnAAsWLGCtral9HdfOjX8/7/kTNsMOeAiVaXJnQJWvAPSywsrKSrj55psN" +
25
+ "JwKGmptg4I729tTuu99V3wZbPj+kROshrA029slluTD9pBJl85AezJ4921A2Z9jFiVQx5dZHWHVji6gRVgcjFt84/Tx+UMITROqb8J3FD7HaljZRI4hOsNHv" +
26
+ "Wf0gCQBH2knx9HufJOMnTghOxE+/4T7DrsxriZQCcPXjz7IdBw6LGkEcT0swBOff9QvLi4B0ArD0jy+yt7fvEjWC6Jn9NQ1KwhZRtSTSCUD5tr+LEkH0DSZu" +
27
+ "Wb31XcuKgFQCcMr199C8jhgwv3zpTVGyHtIIwL8/uoqFo/Sunxg4HeEIzF32jCU7DykE4Dcvb2Mf7NwragQxcP7+5T54dNNWy4mAZu9CMS/fjh2pD7fVFgd4" +
28
+ "rS4BMRr8E0PEwa3hB/l2SHPqu0Xgvvu0i2Wg2X+khmsvsj9QqqToIohUkB7rgNHtB0VNH7RMRKLJFEAN114k6PBy408TNYIYOugy3urSt03FYjHNXIhVF4Ab" +
29
+ "brgh5a69COblq/YX8JK+wzVCPqq9eUryVz1BF+IVK1aoLgKqCsDatWtZVVWVqKUWHPajmy9BpJqw02uItvW3v/1NlNRDVQF4+eWXRSm1MJsNGt2ZokYQqafG" +
30
+ "mwNJA8SPmD9/vqqjANOOn0++bimLximUN6EODrsd7vjRRXD1tLOlnmPqL3GDYMGKNWT8hKokkknY8O7HoiYvphSAj3cfECWCUI9dVTWiJC+mE4DFz7xAW34J" +
31
+ "zbj8gac0eR2nF6YTgNf/8bkoEYT6/HOvvpuC1MZ0AhCMREWJILThgfV/kXYUYCoB+PFjz0o9HCOMybuf7RYl+TDVK47xP72bJZKkAUeTm5EGJTmZkJ3mh3Sf" +
32
+ "F7ICfkjzecDt7HknG65wh/hIqjkYgsbWDmho64CKI3XKNeLEVEgaRNRUP2rMT+6yrPVjHPuA1wNZ3NALMtNhQmkh3Df/spQ/P3SJ3X24Fg7WNUJTewc/QhBP" +
33
+ "6JNXz0hM/5fT4LFr/006ERjyD1q9ejX7y1/+ImrqkORf80BaCbS6rOf1h0ktvfEwBOIhSI93gI+X7Vrkt+GCE7K7ocPpU+47no2wM04vnMk4jGmrBG/SOKOk" +
34
+ "zZs3D9l+h/wPzJo1iyVU7iFCDq+S2ssqef1sjEFWrB1yI03g54Zv0y2h1dcw/i2a3enQ5M5UPOasB4OSUB3khxtFXX/y8vLgt7/97ZBseEiS/sQTT6hu/Aj2" +
35
+ "PlYwfnyS6dzwJ7Tug+HBw7zXDxrC+BH8HtnRVhjZfkjpCbOibWBnSfGpFbBBm9NYwldfXy9Kg2dIAvDWW2+Jkrp0uOT3+vMkolAcrIFR3MA8OMzkowAjgtOP" +
36
+ "NC5MwzuqYCQ/fImw+ER+gk6vMhIyEldfffWQGsqgBeDRRx/VrIUGJc/nnxdphrFtByCfD/mN1bx6pnO00gHjWg9AAR8Wm+V7DwVMLx7ko1Ej0dzcDH/6058G" +
37
+ "bYuDFoAPPvhAlNQFF56YTnnd1YdBWagGSoNHlMU+M4JTg+JQrSJguEApO60GXP/gAiBKA2fQwo1BPkVRVapag7Dq470QTcg133Ta7XDJSSVwZmmOuGJ+8Blt" +
38
+ "/Owg7KiVNxtzSYYPrj59NPhcxuqUBpt23BQjtwnXLmGyvYuWdWMJ8pPHf8fe2v6lqMkFxgnY9cz90jw7w7/Yvfe5PzPcuSYTp40eJkpysvqmBTbcrCQjsrVF" +
39
+ "wwvAjsrDwAy6Ij4YHHYbbL77eml7/y4+WHGntL/xqb+8JU2DNLwAVNYaZ+NFKjh1lNy9/9FMHF4sSnKx67A8gUIMLwCN7UFRMj9Ohx023rVQ+t6/iz/fc4Mt" +
40
+ "M2Cs12ap4IBEnZLhBUCmxb+xxZjHwFp8/4xviJI8HKojASAGwSkjSkTJOjy4YIbN55ZrGze6T8sCCYCGjCrKEyVrcfGZ3xQleVjyh8HvvjMS/ZqP3nPPPWz7" +
41
+ "9u2iph1hhwe+zBglauZnWLAaciLybpLpCfQe3Jsm1+In+kOgU5RRufTSS2HBggV92ne/RgCfffaZKGmL0RwvhopNnreZAwK9Gr0JuaINoV+Akdm2bZso9U6f" +
42
+ "AlBeXs70eg+PKcBkIm6X1aehd+y8/WRHm0VNDhK8czJygJTW1lZR6p0+f0F/lUQNZBsBxGz6ZpzVE4wfINPTxBFA1ODP86GHHuqz5+5TABob9XvlIdsIIKZz" +
43
+ "ymk9cSdjfCQgkT8Hb5oxh1tUjMnHH/ed2qxXAVi2bJmus1YMjSUTUd5g9M47ryfFoXol2AlGEjLz4cA4jYmI+FXGBafuW7Zs6dWIeu1if/7zn7O4jkk4G6IM" +
44
+ "ttbL43yBajs50wZjA8adO6pNhD/OcIJB51M15wgPoyJ5HTbwmOAxlpSUwPXX9+x7YvgnIFso8FNHlsGWJYvM2fIJ6bBuV6QT/7f/EDz1yttyzW0I00ICoAPL" +
45
+ "N22VOt8cYR4MLwCYEUdG1vz1PfjPp54jESB0xfAC4HLKu3nm1Y8/g+8sfog9uP4VEgJCFwzfvX7rhntZa1D+aLOYzHPat06GJxbOoQVCQjMM39guXvpL9mWV" +
46
+ "PBFY+gKnPONLC+F7k06Gm2dMIzEgVMXwDWz+IyvZe7uM63WlJll+LxRmpkERP75RVgCL56Q+GzBhbY5rULfffjvbvXu3qOlPjTcXjvjQj57aPm5ACcQ6wJeI" +
47
+ "gJ8fHn64knFld5pRcggSxuXCCy+E66677hhDOm4RcM+ePaJkDLChozcZ0Zkmvc2VBrVcFPcHSpRYCV9kjIaKtGFQ7cuHZle6st1YNicqIjXs2LFDlL7mOAEw" +
48
+ "Wghu7OWod+uZhN2hJE9FUahMK4FdGSPh88wx/DwKDgSKlRFUizvd0j4IRCeHDh0Spa85RgDWrl1rOEtThrgkAP0Ce/4Ev1to7CGHB5rdmcr06aCvUBkl7E0r" +
49
+ "gypfATR6Mr9KuY5+7YR1OUYAvvzSeOmcsPd3chEgBgsXBS4IGF4Npw/13hw46C+GivQRsD+tFA4HiqDekwUhLghKgAtJN14RnaxZs+aY3vQYAaioqBAlY+GP" +
50
+ "h0SJSBXYCkIOLzTyUUKVvwh2cUH4LGs87EwfxQWiCJr49Yjd2P7uxMDp3skfIwAJg8bgT+MCQP2S+qAoRBxuPkXIgoOBYtidMUJZaDwQKIE6PnLAEUSMTxsI" +
51
+ "87J3715R6sQ0dnX+7cvY/nq54sqZjQyfB4qz0mF4biaMKciBW+fNIF02OaZ5gIufeYG9+OE/RY0wCrhr8cLTT4GbLvseiYEJMdVDky04iGxk+L1K8tNzvzke" +
52
+ "fjztbBIEE2CqhzT+pz9jsuVnlxGHww6Zfh9kp/nhrAmj4d4rLyUxMCimejBXLl/N3v/CmG8qiJ4JeD3KVOGMsSPgzh9dRGJgIEz3MGgaYH6G5+fAd0+dAEvn" +
53
+ "/pDEQGdM9wDOvOkB1ihRdlark8GnCt85aTT85j/mkRjogOlu+m0r/8g2ffS5qBGy4HTYIZuLwcSyfDh73HD4yaXfJ0HQAOUm33rrrcyouwC7g+m10OGFnFvk" +
54
+ "BX0/PIkopMU7IDPaDv540Hw9lcG54IILYOHChZ3ZDWtqzBNxx8XikM4bBiEv6PaMzkx1nhzYkz5c8Vtodmco14nU0GXzigC0t7crFbOQF25SvAQJa4Cei7gd" +
55
+ "eWfmGKjyFyriQAyN2tpa5XyML4BZ8CfCUBhuEDXCKmBy1XpPNuzlo4JKLgjom0CjgsFRXV2tnE0pAEh2pBm8fJ5IWI+4zQFNfEqA8Q0qA8UQ5CMEejc8OEwr" +
56
+ "ALhQVBiqEzXCqrRwIditxDYoU2IeEAPD/vzzz5tWPLNibZAWD4oaYWVa+XQAhQCnBkGHV1wl+sL20ksvsY8++khUzUdDjME7DUkIkYsAIcC03d9It8NInzlS" +
57
+ "eOvFfffdJ0f8p9Vb/8Ye2fgakKMQcTSnjSqDzT+jVOy9Ic3NWfrHF1n5tr+LGkF8zeypZ8IDCyh4yYmQ6qbMenAl+7TCmlmEiN4ZWZALbzx0C4lAN6S7IWct" +
58
+ "fojVtbSJGkF8DWaavnjyN2HFT39EQiCQ8kac8V/3s+Z2ejtAnJgpp4yD3y3+MYkAR9qbMJmLQBOJANEDZXnZ8PYjt1peBGzr1q2TchNVXUcYVn+8F9qi5DNA" +
59
+ "nJiA2wk/mFACpxVliSvWYvbs2TbbzJkzpd1FiTHu96YNU1JgEcSJwB2lZe3VkB1rFVesQ2lpqXm3AvcH9Ckf21YJnmRMXCGIY0FnooNpnf4EVgMTAUm/T8rF" +
60
+ "jX9c2wHIiJnL5ZnQDkyqio5Fba6AuGINksmk/AKAOJJxGN5+GHKirfKuehJDImFzdPoRWGgkwBizhgAgDj7YK+s4DHmRJmXeRxDdQTfjfYFSJe6AFbDb7dYR" +
61
+ "AAR7/5JgDZTyw8nIb4A4How1ia7FVog56XA4rCUAXeREmmF8617I5lMCgugOuhNX+QpETV4sKwAIxhQc1lENZaEa5W0BQRxNsytdSYkuMy6Xi9bEulj42Gr2" +
62
+ "xo69kGS0PkB04ve4YPtvfi61jZAAdOMH9zzBdh46ImqE1SnKzoD3lt8hrZ2QAPTABT97jFVUU8xBAuCWmRfAoh+cK6WtWHYNoC/+ev/Nthunnw9jS+RfDCJ6" +
63
+ "57m35A00QyOAfvD0q2+zLe//A/YeqaewYxblmgunwJ0/ulg6eyEBGCD/vWoDe+3THRCK0JsDK+F1uWDHSvkWBJUfJKtLsBrgS4K2aAy2H2mGL+raYF8T+RhY" +
64
+ "heFZfrh28hiwyRFLt9MduLy8nG3atElcIgYC7h8POr3Q6gxAszsdEnYXbTKWGgbjWw+ALxEWdXOzefNmm33evHk0DRgkDpaA9FgHlIZqYVxbpZKpyJukqYG8" +
65
+ "2KDRk6mcZYHeAqQIdzKmJCyd0LIXJrZUwLDgEUUcyPFILjAnYdzuEDXzQwKgAhiDAP0NRnVUwfiWfYoYYBozSmlufnDah2nIzE7XOgYJgIrYWBI8fEqAYjC8" +
66
+ "vQpGdhyCIj5N8MdD4ORiQHMvc4J+Aug6bGays7OVsyIA6BRAqAsauz8eVqYJGKFofOt+KBXTBCdLdL5eIExBh8tv+sAhhYWFylkRgKKiIqVCaIeLxSGXjwxG" +
67
+ "tx+Eic27YWLLHhjDhaEkVAsZ0TZlhEAYE4wjaHYBKC4uVs6KAHRVCH3A0YGLjwLS+NQgP9wIwzuqvxoljGo/BAWhesjkouDjIwhHko8WCN3pkEQAvpqGLlmy" +
68
+ "hMagBgYfTlucQQe3/+YYg8YYQCsfJESSDHgV4snOP0Nog98BcEmBA5wmXcjB1OB4NunXJ7rz21ffYZ/sOQCfV1ZDdVOLEvCRUI+A1wP/9+t7TG8/JAAS88sX" +
69
+ "/4eLQiWgMISjlBshlaDhLLrku7B4xjRT2xAJgMW497k/s0MNzXCEjxIO1TdBS0dIfEIMlDPHj4R1t19LAkCYlyf//Cb7sqoG9h2p46LQCsFIFKKxOK0n9IPM" +
70
+ "gA8+fWIJCQAhF49teZ19zKcNXxysphFCL+Buuj2rHpBHAOhNANFFkrcEbAxtCYCGSBLqY6AcLfjKgeiEMbgo3wHZbnNpQNcbAOSYby5zpmBiaCR5bxe1uZSs" +
71
+ "ORGnF8ION0TtbgjxwwpJNHoC92mYKe8k5gLYsGHDV3Z/jC+A2+0WJYI4Fjvv7dDVOT0ehLxwI5R1HOGN/6BiAIWhesW/wWbBV48Rk6WeHzdunCh1cowAdP+Q" +
72
+ "IHoDDd6fCENRuF7ZuTihdS8vNyhxEqxC1OFRtgabhQkTJohSJ8cIwPjx40WJIAaOB2MihOrgpNb9UMBHCVbwZ4jy6U/SdowZGZoFCxYco1bHfPMrr7zSPFJG" +
73
+ "GBYnF4LiUC2M4VOEzvyL8k4NInY3JEwkAN057pvjIoGuYKACMx/EV3gTERjecRjKgrXKirmM4KIoM4kAjBw5UpS+5rgWe9ddd7GdO3eKmnaE+Vyq3RUwf1/B" +
74
+ "Gzr692fEOiw1F+6LJk8mVPrl8zq18RY7jk95fFzsjM706dPhqquuOsbmjxMADBH+wgsviJp2VPvyodabK2rmBuMAFvNeLy/SJK4QSJWvEOq9nZFo5AEFoBL8" +
75
+ "CeNvmMIowKL4FceNXTBWuChqipnnUd3BVeFGT5apFoe0oDRUA+kmemfeP2zKHgmj09PU3jDf/NHntrCVb3wkanJQsfpB47cMjXnu1TfYko1viJoc3Hv5eTDv" +
76
+ "4u+Z8lkbpou6de4M6Yzl8T/9D+2s7Mbci863jSiQY6rXhVmNHzHUGDXN5xElOXj/iwpRIo7mW2OGixKhN4YSgDFF+aIkB59WVIoScTTjKOW6YTCUAAzLzxEl" +
77
+ "OcCwXHc+u5mmAd1YePG/0tqIQej1QWjtHvx5O4N/tsqVf9/NJfb7eXZIM2v0SBWojjDY1iDPc56aY4cyr3Gf79Huv93p9VvPnTuXhcPaZUJtc/phb7p880PM" +
78
+ "DITpwYhOWtwZsD9QImrmB3M7YIIXIzJ27FhYtmxZj3be6xTgrLPOEiVtQGcSGbeMNisJJa3rM9+dqMnTanXHyG7QvRk/0qsA3HjjjZqOa3ALrYfJ50GGG4Jq" +
79
+ "PdkSu8T0H9wkJZsY4nZgI9KVALQ3+lwEzMzEfOjagMk0MbCEjDR4cxRfB6vD7A4IObyiZn7Q+I06Apg8ebIo9UyfAnDeeeeJkvqgXqXxuZSmww6NwJ7viDdP" +
80
+ "8R+3MhGbE9pcflEzPzZu+0YdAdx55519mlKfAoAxAvozlEgVGHIKRwIyggkla3xy7XUYKLjQ2yn1cmDn01Z0/jIaWVlZotQ7fQoAMmnSJFFSH1cyBp5EVNTk" +
81
+ "o9GdCXUeufY79Je43QVNnv41TLPg5u0V4yUajWnTpolS7/RLAJYs0Tb5QcAErpVD4bC/AJq4EFiNal8eRBxyBZ7FQKlGi/uAI/Y5c+b0y2b7JQBIf4cUqQCn" +
82
+ "AQ5JpwFdHAoUQb1kvWFvtLrSoMmVIWrygFGP7AZrq2eeeaYo9c2AenatdgZi7ok36pPQaIEkFKem2+Eb6fLMiU9EKMHglbokRCTU9PNy7VDkMdbz623nX3cM" +
83
+ "2/JuWbWB/emDf4ia3Jw2qgw2/2yRtCow9bZlrKqhWdTkwuwxH/o9BdCaX1wzS1qD6M7/7jsE37nlIbb29fekG/KcedMD0hp/ht/8+xkMKwDIhLIiUZKf2uY2" +
84
+ "eHjDa/AfvymXQgSWb9rKTll4D2tsM+Ye+VQwXALvVUMLwCXfPlWUrEE8kYDXPtkBJ123hM1Z9owpheC3r77DvrP4IfbUK29DOBYTV+VEhg5qUMPsOXPmsEhE" +
85
+ "/TDIGCh0R9Z4S++hxweE3oQ50RYlDZfRnKVwh2PQ6YVWd4ayx0Gm4K69wp9Dacg4kZ9LSkrgySefHLA9D0oAnn/+ebZhwwZRU5eKtGG0h56Dr5rcLA6uZBx8" +
86
+ "8ZDy/hk3obgSMeWsBbjnLeFwKgkxcT9/mytN8exD5x6rRUB2JBMwtr1SeQ1oBE4U8rs/DOovIfPnz2ft7eqHeMb3x/vTyiw9CugJNHzMv+fmYuDlZXciquyi" +
87
+ "xK2puJ0aTbLLWQXv3wkfNr+Igwr+p3j5613tSqhrbtRo9GFu8LiBJ8bPUX4OOTydf97CBOJBGNtmjJBvo0ePhuXLlw/qgQz6Kb700kvs2WefFTX1wIb2ReYY" +
88
+ "JQUT0T/woeKIAXeooYs19lZ2HKx3mz5gLYm9N/8baPAJ3pvj/cYyprvC68SJwYzImBbdCAy290cGPW6bPn26LTdX/fDO2CfhHJjoP2jYOBeP8h47qAzVA9Di" +
89
+ "SlcCkxx9YGQedM7pcPqUIT3+eRRaFAIy/p5BcQ0YxG29Py6/vTHkpzxz5sxjuxUVwIa5N22YdPvICXOCW9VHtFcZwgdgKL0/MuSVm1GjRomSeuBcN0tJM00Q" +
90
+ "+oMxK4xg/BdeeKEoDZ6UjPO0GAXE+LC0ImOksgJNEHoyXskGrF2w3BPh8/mgvLx8yPabknc35557riiph4srbi5l2yV0Rnn9aoB4FakwfiQlAoDBQz0e9dN6" +
91
+ "4WIgrmgThF7khRoAl0j1pLS0VJSGTkoEAJk1a5YoqQfGCMiPNPKS6jMOgjgOfKWabYC1qF/96lcp6f2RlP1DWvLdO5azyjoUAoLQjp9+/xy4Y9ZFprSZnjDt" +
92
+ "jxl7zd0Mc+8RhBbkZaTB3x+7SyrjR1I2BdCauf/6bVEiCPW5aPI3REkuTK1oZ//3I+xIU4uoEYQ6FGVnwnvLb5eu90dU+1Fa7A3AyLqVgWJRIwh1yI00Q2nw" +
93
+ "iG69pcvlgvXr16vy36s2BbjgggtEST2yoy2QFg+KGkGkHkcyDkXhBl2HymoZP6KaACxcuNCGQQrUpowrsycpbyIRQk+YktbdqVG8hRNxxhlniJI6qC5ss2bN" +
94
+ "YomEupt30NMNpwJWC0pBqEtGrB1GtR8SNe3BXBxr1qxR1UZVt5i5c+eKknpkxtqgkA/TCCJVYKCV0mCNqGkPZvdR2/gR1QVgxowZtlNOOUXU1CMv0miIXVqE" +
95
+ "HJSG6jQLtXYipk+fLkrqosmYGTOV5OXliZo6YIJGVGx01iCIoZAXboRMHTuTCRMmwIIFCzRZd9TkP+mCTwdYOKyuGyVGwMHgIQm7Q1whiP7jSUSUWH+4718P" +
96
+ "CgoKYOXKlZrZpaYCgFx++eWqb+Ftd/pgX/pwCmtFDAiMuDy27YBuQ/9U+fgPBM2XzefPny9K6pEWDykhm7oHwSSInsAev4xPIfUyfrvdrrnxI5oLwKWXXmqb" +
97
+ "OnWqqKkHvsIZFqzmP5BEgOgD3lEUhep5m2kTF7Rn48aNugxXdRsjb9q0icU0SB31cVUjvLSzChJJEgLixEwdmQ8XjtNvS/ns2bN1s0Pd/mOtGXfN3SxJUwKi" +
98
+ "G+jl9+T1cy1jB93RfAqgF7tXPWALeNUPW0aYA9xoM2vKGZY2fsQyAoDceckUyJIgpzsxNND4L588ER7+8eWWNn7EMDdAq1yDmMjygL+YEo5aGHTw0TPbFAb1" +
99
+ "TGVcv6FgKAWcN28eC4XUT7mETkM13jyo9WRjdyCuErLTtb8/S8fV/sGm8VYLw7V+LbwHEVwOrPfmQK03F+I22jUoO/5EGIqCtUpaL73QwrtvoBiy+9Nit2AX" +
100
+ "HS4/HPYVKFuICTnJjLVDSahW14QemDfj+eefN5y9GVIAEC1FAFNiH/YXQD1OCQiJYNzw6yA/rG8IeT22+PYXwwoAotV0QMFmgyZXOtT48in/oAR442EoDdcp" +
101
+ "iTz1JBAIwB/+8AfD2pmhBQDRVAQ4YacXary50MzFgDAfuPU7nRt9cbAGPDr68yOZmZmwdu1aQ9uY4QUAmT17NotGtZu/4ZSg1psNR/howCS3iODgHL8oXK+k" +
102
+ "ktf7qeXk5MCqVasM33hM07q12idwNDG7U3lLUO/OUqYIhDFxJ2Lc8OsgG1/vGWC798iRI2HFihWmaDCmatW33HIL27dvn6hpR9jhgWpvHrS70iBJQmAY3Mko" +
103
+ "5ERaID/SBHamb8beLs466yy47bbbTNNITNealy9fzt5//31R0w40/HZnAOo82dDhCij7CAh9wA09udEWyIo0g1fneX4XuL14zpw5cMUVV5jKpkzZnb344ovs" +
104
+ "97//PR/t6WOGTZ5MZaEwYneLK4QWYMQezNKD23hdLC6u6o+RX/P1hSm/tJFY/MwLbOsnOyCsQWwDq3LaqDLY/LNF1FZVgG5qivjF5r+yt7Z/CZ9XVosrxFDI" +
105
+ "9Ptgyilj4YmFc6iNqgjd3BTz2LoX2btfHoA9NQ0QisaBgpD0HzufRxdnpcM5E0bAAz8lw9cCqW6yVt6E/SHscEObKw1aXenQ4fAAo7RlvYI79nB+j/v2bQZe" +
106
+ "YjXL+/3+Ip3K3nbbbWzPnj2ipj/YlBM2BwRdPmhzBrggpEGUthor0XcD8aDinReIhZRXekbnnHPOgZtvvlkqm5FymLVu3Tq2ceNGSCaN8W64CxSDODf+MD/a" +
107
+ "3WkQsnsUMYjbHYpIyAyu4KORp8dD4Oe9PQoAruRjRiejY+ZV/r6Q8kd1ccMNN7CqqipRMx7Y9MMOL0T4dCHEzyGnR3FESoADmB13tRt5MHw82JjwG9tYUjFs" +
108
+ "NHLMtOPjh1ccemXcGSyTJk2CpUuXSmsnUgsA8sILL7BNmzaBFiHIUwWOBnD3YYfTBx0OnyIQyigBQzgabCciGrQzwQ2dxRQD98fD/BzmPX7CZPJ1LBkZGfDs" +
109
+ "s89Kbx/S/8Au7rjjDrZr1y5RMw/KKIAbvZLmTJwTNrsiEhjJKGF3KmcUiDi/nuTlEBePJL/elRptsGaIBoxG7ebDdwc/XNzY8ezmQ3fcf985hOfTLN7bKz2/" +
110
+ "+Htm59xzz4Ubb7zRErZhGQHowkhvClJNjBs/xjvENw5o/Cgc+IiVMp9S4Bm3NDM+kkjgGd9McONFI+aTDjEfx087h/EOHMqj8fPr2NPj35SZ/Px8ePrppy1l" +
111
+ "E5YTAOTxxx9n77zzjqgRVsflcsGMGTN0zdCjF5YUgC4WLVrEjhw5ImqEFZk4cSLcf//9lrUDSwsAsn79erZlyxbQMuAIoT+ybegZLJa/AV387ne/Y6+99hpE" +
112
+ "IhFxhZCR7OxsZbh/ySWXUNvn0E3oxtq1a9nWrVtpRCAZGJP/sssug+nTp1ObPwq6GT2wefNmTeMQEuphxcU9giCIPiFlHCC4aKhXJCKid5xOp+lCcukN3axB" +
113
+ "gAuGb775JrS16ZdkkviawsJCmDZtGsycOZPa8wChGzZE7rrrLrZz505RI7TCbrfD5MmTcYs3teEhQDcvRTz33HPK7sLa2lpxhVCDMWPGwNSpU+GHP/whtd0U" +
114
+ "QDdRBZ5++mkldDlNEVIDDvExGMfcuXOpvaYYuqEq89RTT7EPP/yQxGCAFBQUwNlnnw1XXnkltVEVoZurIbh4+NFHH8Hhw4fFFaILTKwxbtw4+Pa3v02LeRpC" +
115
+ "N1pH0CsRFxCtum4wYsQIOPnkk+Haa6+ldqgTdOMNBG5D3r17N1RUVJgqglF/wDz548ePV3p52plnHOhBGJzy8nIlIer+/fuhsbFRXDUuOJQvLi6GUaNGKQcN" +
116
+ "540NPRwTg/EOGxoa4OhD7RTq6Eabl5ennHNzc5Xjsssuo3ZkUujBSQ46NXV0dCjejSc6sMd2u93K4fF4vip7vV5IT08nt1mCIAiCIAiCIAiCIAjTA/D/Abmz" +
117
+ "ZXM4My2jAAAAAElFTkSuQmCC";
@@ -3,6 +3,7 @@ import type { PDFGenerationData, PDFGenerationRequest, ReportModule } from './re
3
3
 
4
4
  interface Env {
5
5
  BROWSER: Fetcher;
6
+ PDF_WORKER_AUTH: string;
6
7
  }
7
8
 
8
9
  const DEFAULT_REPORT_FORMAT = 'striae';
@@ -15,9 +16,12 @@ const reportModuleLoaders: Record<string, () => Promise<ReportModule>> = {
15
16
  const corsHeaders: Record<string, string> = {
16
17
  'Access-Control-Allow-Origin': 'PAGES_CUSTOM_DOMAIN',
17
18
  'Access-Control-Allow-Methods': 'GET, POST, OPTIONS',
18
- 'Access-Control-Allow-Headers': 'Content-Type',
19
+ 'Access-Control-Allow-Headers': 'Content-Type, X-Custom-Auth-Key',
19
20
  };
20
21
 
22
+ const hasValidHeader = (request: Request, env: Env): boolean =>
23
+ request.headers.get('X-Custom-Auth-Key') === env.PDF_WORKER_AUTH;
24
+
21
25
  function normalizeReportFormat(format: unknown): string {
22
26
  if (typeof format !== 'string') {
23
27
  return DEFAULT_REPORT_FORMAT;
@@ -71,6 +75,13 @@ export default {
71
75
  return new Response(null, { headers: corsHeaders });
72
76
  }
73
77
 
78
+ if (!hasValidHeader(request, env)) {
79
+ return new Response(JSON.stringify({ error: 'Forbidden' }), {
80
+ status: 403,
81
+ headers: { ...corsHeaders, 'content-type': 'application/json' },
82
+ });
83
+ }
84
+
74
85
  if (request.method === 'POST') {
75
86
  let browser: Awaited<ReturnType<typeof launch>> | undefined;
76
87
 
@@ -2,7 +2,7 @@
2
2
  "name": "PDF_WORKER_NAME",
3
3
  "account_id": "ACCOUNT_ID",
4
4
  "main": "src/pdf-worker.ts",
5
- "compatibility_date": "2026-03-12",
5
+ "compatibility_date": "2026-03-14",
6
6
  "compatibility_flags": [
7
7
  "nodejs_compat"
8
8
  ],
@@ -9,9 +9,13 @@
9
9
  "test": "vitest"
10
10
  },
11
11
  "devDependencies": {
12
- "@cloudflare/puppeteer": "^1.0.4",
13
- "@cloudflare/vitest-pool-workers": "^0.12.9",
14
- "vitest": "~3.2.0",
15
- "wrangler": "^4.69.0"
12
+ "@cloudflare/puppeteer": "^1.0.6",
13
+ "@cloudflare/vitest-pool-workers": "^0.13.0",
14
+ "vitest": "~4.1.0",
15
+ "wrangler": "^4.73.0"
16
+ },
17
+ "overrides": {
18
+ "undici": "7.24.1",
19
+ "yauzl": "3.2.1"
16
20
  }
17
21
  }
@@ -2,7 +2,7 @@
2
2
  "name": "USER_WORKER_NAME",
3
3
  "account_id": "ACCOUNT_ID",
4
4
  "main": "src/user-worker.ts",
5
- "compatibility_date": "2026-03-12",
5
+ "compatibility_date": "2026-03-14",
6
6
  "compatibility_flags": [
7
7
  "nodejs_compat"
8
8
  ],
@@ -1,6 +1,6 @@
1
1
  #:schema node_modules/wrangler/config-schema.json
2
2
  name = "PAGES_PROJECT_NAME"
3
- compatibility_date = "2026-03-12"
3
+ compatibility_date = "2026-03-14"
4
4
  compatibility_flags = ["nodejs_compat"]
5
5
  pages_build_output_dir = "./build/client"
6
6