f6dfd09d82
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>
31 lines
990 B
JSON
31 lines
990 B
JSON
{
|
|
"compilerOptions": {
|
|
"target": "ES2022",
|
|
"module": "ESNext",
|
|
"moduleResolution": "Bundler",
|
|
"lib": ["ES2022", "DOM", "DOM.Iterable", "WebWorker"],
|
|
"strict": true,
|
|
"noImplicitAny": true,
|
|
"esModuleInterop": true,
|
|
"skipLibCheck": true,
|
|
"forceConsistentCasingInFileNames": true,
|
|
"resolveJsonModule": true,
|
|
"isolatedModules": true,
|
|
"useDefineForClassFields": true,
|
|
"types": ["chrome"],
|
|
"outDir": "dist",
|
|
"baseUrl": ".",
|
|
"paths": {
|
|
"@/services/environment": ["./src/stubs/environment.ts"],
|
|
"@tauri-apps/plugin-http": ["./src/stubs/tauri-http.ts"],
|
|
"@/services/*": ["../../src/services/*"],
|
|
"@/utils/*": ["../../src/utils/*"],
|
|
"@/types/*": ["../../src/types/*"],
|
|
"@/libs/*": ["../../src/libs/*"],
|
|
"@/*": ["../../src/*"]
|
|
}
|
|
},
|
|
"include": ["src/**/*", "../../src/services/send/conversion/**/*", "../../src/utils/zip.ts"],
|
|
"exclude": ["node_modules", "dist", "src/**/*.test.ts"]
|
|
}
|