Files
readest/pnpm-workspace.yaml
T
Huang Xin f6dfd09d82 feat(send): browser extension that clips pages into Readest as EPUBs (#4266)
Replaces the URL-only placeholder extension with a full MV3 page-clipper
that builds a self-contained EPUB on the user's machine and uploads it
to the inbox.

- Captures the rendered DOM in a content script, then runs Readability,
  asset bundling, and EPUB build through the shared
  `convertToEpub({kind: 'page'})` pipeline inside a Chrome offscreen
  document (the SW lacks DOMParser).
- Uploads the resulting EPUB directly from the offscreen page to the
  new `POST /api/send/inbox/file` endpoint — keeps the bytes in one
  realm because `runtime.sendMessage` JSON-serialises ArrayBuffer to
  `{}` between extension contexts.
- Adds a long-lived Port + ping handshake between SW, offscreen, and
  the on-demand capture content script so neither idle-eviction nor
  load-order races can hang the popup.
- Localised popup, badge feedback, key-as-content i18n (`_('English source')`)
  with an extract script that seeds locale stubs from i18n-langs.json
  and writes a static-imports map for the runtime. All 33 locales
  fully translated.
- Server: `pages/api/send/inbox/file.ts` accepts a raw EPUB body
  (Content-Type: application/epub+zip), enforces the inbox pending cap,
  stores to the existing send-inbox R2 bucket as `kind='file'`.
  `assetBundler` now sets `credentials: 'include'` in the non-Tauri
  branch so the extension SW carries paywalled-CDN cookies.
- 47 vitest cases for the extension shell (upload, badge, auth, lazy,
  popup state machine, auth-bridge token sync) + 8 cases for the new
  server endpoint. CI's `test_web_app` invokes both via the extended
  `test:pr:web` plus a `build-browser-ext` step that catches webpack
  alias / Tauri-stub regressions.

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 14:45:29 +02:00

52 lines
1.2 KiB
YAML

packages:
- apps/*
- apps/readest-app/workers/send-email
- apps/readest-app/extensions/*
- packages/foliate-js
allowBuilds:
core-js: true
edgedriver: true
esbuild: true
geckodriver: true
protobufjs: true
sharp: true
workerd: true
onlyBuiltDependencies:
- sharp
patchedDependencies:
'@ai-sdk/provider-utils@3.0.25': patches/@ai-sdk__provider-utils@3.0.25.patch
'@ai-sdk/provider-utils@4.0.27': patches/@ai-sdk__provider-utils@4.0.27.patch
mdast-util-gfm-autolink-literal@2.0.1: patches/mdast-util-gfm-autolink-literal@2.0.1.patch
overrides:
glob: '>=11.1.0'
jws: '>=4.0.1'
vite: '>=7.3.2 <8'
srvx: '>=0.11.13'
rollup: '>=4.59.0'
undici: '>=7.24.0'
flatted: '>=3.4.2'
body-parser: '>=2.2.1'
dompurify: '>=3.4.0'
i18next-http-backend: '>=3.0.5'
picomatch: '>=4.0.4'
path-to-regexp: '>=8.4.0'
protobufjs: '>=7.5.5'
serialize-javascript: 7.0.5
fast-xml-parser: '>=5.7.0'
lodash: '>=4.18.0'
lodash-es: '>=4.18.0'
postcss: 8.5.14
basic-ftp: '>=5.3.0'
qs: '>=6.14.2'
'@babel/runtime': '>=7.26.10'
'@babel/helpers': '>=7.26.10'
mdast-util-gfm-autolink-literal: 2.0.1
uuid: '>=14.0.0'
ws: 8.20.1
'@emnapi/core': 1.8.1
'@emnapi/runtime': 1.8.1