A .docx editor is a megabyte of vendored library. Bundling it would charge that to everyone who wanted a browser, including the people who will never open a Word document in it. So it leaves the build: out of bundled-addons/, out of extraResources, absent from a fresh profile. It arrives the way anyone else's extension does — Settings › Extensions › Community, from the catalogue the gateway builds, and listed on theseus.x/extensions alongside everything else published there. That also means it is signed by the owner of a BNS name rather than by the operator key, which is the right trust story for something that isn't part of the browser. `npm run pack` produces the tarball the publish page takes; the signature needs the publisher name's wallet, so it isn't something the repo can do. The end-to-end test now installs the extension into a throwaway profile the way the community installer would, and asserts up front that a fresh profile doesn't already have it — the bundling is what was being removed, so it is worth a test that would notice it coming back.
60 lines
2.5 KiB
Markdown
60 lines
2.5 KiB
Markdown
# Word editor — a Theseus community extension
|
||
|
||
Opens, edits and saves Word documents (`.docx`) in a full Theseus tab.
|
||
|
||
This is **not** a bundled add-on. It isn't in `bundled-addons/`, it isn't in
|
||
the installer's `extraResources`, and a fresh Theseus profile doesn't have it.
|
||
Users get it the same way they'd get anyone else's extension: from
|
||
**Settings › Extensions › Community**, which lists whatever is in the
|
||
catalogue at theseus.x/extensions.
|
||
|
||
Living outside the browser build is the point. A .docx editor is a big
|
||
dependency — a megabyte of vendored library — and nobody should carry it
|
||
because they wanted a browser.
|
||
|
||
## Building
|
||
|
||
The vendored libraries (mammoth, ProseMirror, docx, JSZip) are bundled by a
|
||
build step that lives outside this folder, because mammoth needs local patches
|
||
before it can carry everything the editor edits:
|
||
|
||
cd ../../addon-build/docx-editor
|
||
npm install
|
||
npm run build # writes vendor/docx-vendor.js here
|
||
npm run pack # writes out/docx-editor-<version>.tar.gz
|
||
|
||
`vendor/docx-vendor.js` is committed, so the extension is installable straight
|
||
from a checkout; re-run `npm run build` after touching anything under
|
||
`addon-build/`.
|
||
|
||
## Publishing
|
||
|
||
`npm run pack` produces the tarball and its sha256. Uploading it is a separate
|
||
step, and this repo can't do it: a community extension is signed by the
|
||
**owner of a BNS name**, using that name's wallet.
|
||
|
||
The straightforward route is the publish page at
|
||
**theseus.x/extensions/publish** — it unlocks a wallet in the browser, checks
|
||
that the name is yours, then signs and `PUT`s the tarball to
|
||
`/api/ext/<publisher-name>/docx-editor/<version>`. The gateway verifies both
|
||
signatures against the name's current owner, stores the tarball on Sia and
|
||
updates `catalog.json`, which is what Settings and the site both read.
|
||
|
||
Version numbers must increase, and the id `docx-editor` belongs to whichever
|
||
name publishes it first.
|
||
|
||
## Testing
|
||
|
||
Three levels, all re-runnable, all from `../../addon-build/docx-editor`:
|
||
|
||
node test/roundtrip.mjs # the built-in fixture
|
||
node test/corpus.mjs <folder of .docx> # real documents
|
||
node ../../../scratchpad/verify-docx-editor/drive.mjs # a real Theseus, over CDP
|
||
|
||
The last one installs this folder into a throwaway profile the way the
|
||
community channel would, and is the only one that catches browser-only
|
||
breakage.
|
||
|
||
What survives a round trip, and what doesn't, is written up in
|
||
[ROUND-TRIP.md](ROUND-TRIP.md). Read that before promising anyone a Word
|
||
feature.
|