Ontwikkeling
Ontwikkelingshandleiding
Werk documentatie alleen bij onder website/docs (Engels). Vertalingen onder website/i18n/<locale>/… worden gegenereerd en mogen niet handmatig worden bewerkt. Gebruik de vertaaltaken (bijv. make translate_web_docs_batch) om gelokaliseerde inhoud te verversen.
Vereisten
- Node.js 22+ en npm (getest met Node 22)
- Thunderbird 128 ESR of nieuwer (voor handmatig testen)
Projectindeling (op hoog niveau)
- Root: verpakkingsscript
distribution_zip_packer.sh, documentatie, schermafbeeldingen sources/: hoofdcode van de add‑on (achtergrond, opties/popup‑UI, manifests, iconen)tests/: Vitest‑suitewebsite/: Docusaurus‑documentatie (met i18n onderwebsite/i18n/de/...)
Installatie & tooling
- Installeer root‑afhankelijkheden:
npm ci - Documentatie (optioneel):
cd website && npm ci - Ontdek targets:
make help
Live ontwikkeling (web‑ext run)
- Snelle loop in Firefox Desktop (alleen UI‑smoketests):
npx web-ext run --source-dir sources --target=firefox-desktop- Uitvoeren in Thunderbird (voorkeur voor MailExtensions):
npx web-ext run --source-dir sources --start-url about:addons --firefox-binary "$(command -v thunderbird || echo /path/to/thunderbird)"- Tips:
- Houd de foutconsole van Thunderbird geopend (Hulpmiddelen → Ontwikkelaarshulpmiddelen → Foutconsole).
- MV3‑eventpagina’s worden onderbroken bij inactiviteit; laad de add‑on opnieuw na codewijzigingen of laat web‑ext automatisch herladen.
- Sommige enkel‑Firefox‑gedragingen verschillen; verifieer altijd in Thunderbird voor API‑pariteit.
- Thunderbird‑uitvoerbare paden (voorbeelden):
- Linux:
thunderbird(bijv./usr/bin/thunderbird) - macOS:
/Applications/Thunderbird.app/Contents/MacOS/thunderbird - Windows:
"C:\\Program Files\\Mozilla Thunderbird\\thunderbird.exe" - Profielsisolatie: gebruik een apart Thunderbird‑profiel voor ontwikkeling om je dagelijkse omgeving niet te beïnvloeden.
Make‑targets (alfabetisch)
Het Makefilebestand standaardiseert veelvoorkomende dev‑flows. Voer make help op elk moment uit voor een beknopte samenvatting (één regel) van elk target.
Tip: make zonder target opent een eenvoudig Whiptail‑menu om een target te kiezen.
| Doel | Beschrijving in één regel |
|---|---|
clean | Verwijder lokale build-/preview‑artefacten (tmp/, web-local-preview/, website/build/). |
commit | Formatteren, tests uitvoeren (incl. i18n), changelog bijwerken, committen & pushen. |
eslint | ESLint uitvoeren via flat config (npm run -s lint:eslint). |
help | Alle targets met beknopte docs (gesorteerd) weergeven. |
lint | web‑ext lint op sources/ (tijdelijk manifest; negeert ZIP’s; niet‑fataal). |
menu | Interactief menu om een target en optionele argumenten te kiezen. |
pack | ATN‑ en LOCAL‑ZIP’s bouwen (draait linter; roept packerscript aan). |
prettier | Repository ter plekke formatteren (schrijft wijzigingen). |
prettier_check | Prettier in controlemodus (geen writes); faalt als herformattering nodig is. |
prettier_write | Alias voor prettier. |
test | Prettier (write), daarna ESLint en Vitest (coverage indien geconfigureerd). |
test_i18n | Alleen i18n‑tests: add‑on‑plaatsaanduidingen/pariteit + websitepariteit. |
translate_app | Alias voor translation_app. |
translation_app | Vertaal app‑UI‑strings vanuit sources/_locales/en/messages.json. |
translate_web_docs_batch | Website‑documentatie vertalen via de OpenAI Batch API (voorkeur). |
translate_web_docs_sync | Website‑documentatie synchroon vertalen (legacy, zonder batch). |
translate_web_index | Alias voor translation_web_index. |
translation_web_index | Vertaal UI van homepage/navbar/footer (website/i18n/en/code.json → .../<lang>/code.json). |
web_build | Bouw docs naar website/build (ondersteunt --locales / BUILD_LOCALES). |
web_build_linkcheck | Offline‑veilige linkcontrole (slaat externe HTTP[S] over). |
web_build_local_preview | Lokale gh‑pages‑preview; automatisch serveren op 8080–8090; optionele tests/linkcontrole. |
web_push_github | Push website/build naar de gh-pages‑branch. |
Syntax voor opties
- Gebruik
make <command> OPTS="…"om opties door te geven (aanbevolen: aanhalingstekens). Elk target hieronder toont voorbeeldgebruik.
--
Tips voor locale build
- Bouw een subset van locales: stel
BUILD_LOCALES="en de"in of geefOPTS="--locales en,de"door aan webtargets. - Voorvertoning van een specifieke locale:
http://localhost:<port>/Thunderbird-Reply-with-Attachments/de/.
Bouwen & verpakken
- ZIP’s bouwen:
make pack - Maakt ATN‑ en LOCAL‑ZIP’s in de repo‑root (bewerk artefacten niet met de hand)
- Tip: werk de versie bij in zowel
sources/manifest_ATN.jsonalssources/manifest_LOCAL.jsonvóór het verpakken - Handmatige installatie (dev): Thunderbird → Hulpmiddelen → Add‑ons en thema’s → tandwiel → Add‑on uit bestand installeren… → selecteer het gebouwde ZIP
Testen
- Volledige suite:
make test(Vitest) - Coverage (optioneel):
npm i -D @vitest/coverage-v8- Voer
make testuit; opencoverage/index.htmlvoor het HTML‑rapport - Alleen i18n:
make test_i18n(UI‑sleutels/plaatsaanduidingen/titels + website‑per‑locale per‑documentpariteit met id/title/sidebar_label‑controles)
Foutopsporing & logs
- Foutconsole: Hulpmiddelen → Ontwikkelaarshulpmiddelen → Foutconsole
- Schakel uitgebreide logs runtime in/uit:
- Inschakelen:
messenger.storage.local.set({ debug: true }) - Uitschakelen:
messenger.storage.local.set({ debug: false }) - Logs verschijnen tijdens het opstellen/verzenden van antwoorden
Documentatie (website)
- Dev‑server:
cd website && npm run start - Statische site bouwen:
cd website && npm run build - Make‑equivalenten (alfabetisch):
make web_build,make web_build_linkcheck,make web_build_local_preview,make web_push_github - Voorbeelden van gebruik:
- Alleen EN, sla tests/linkcontrole over, geen push:
make web_build_local_preview OPTS="--locales en --no-test --no-link-check --dry-run" - Alle locales, met tests/linkcontrole, daarna push:
make web_build_local_preview && make web_push_github - Voordat je publiceert, voer de offline‑veilige linkcontrole uit:
make web_build_linkcheck. - i18n: Engels staat in
website/docs/*.md; Duitse vertalingen inwebsite/i18n/de/docusaurus-plugin-content-docs/current/*.md - Zoeken: Als Algolia DocSearch‑omgevingsvariabelen zijn ingesteld in CI (
DOCSEARCH_APP_ID,DOCSEARCH_API_KEY,DOCSEARCH_INDEX_NAME), gebruikt de site Algolia‑zoekfunctie; anders valt deze terug op lokale zoekfunctie. Op de homepage, druk op/ofCtrl+Kom het zoekvak te openen.
Donatie-redirectroute
website/src/pages/donate.js- Route:
/donate(en/<locale>/donate) - Gedrag:
- Als de huidige route een locale heeft (bijv.
/de/donate), gebruik die - Anders: kies de beste match uit
navigator.languagest.o.v. geconfigureerde locales; val terug op de standaardlocale - Leidt om naar:
en→/docs/donation- overige →
/<locale>/docs/donation - Gebruikt
useBaseUrlvoor correcte baseUrl‑afhandeling - Bevat meta refresh +
noscript‑link als fallback
Previewtips
- Stop de Node‑preview netjes: open
http://localhost:<port>/__stop(afgedrukt naLocal server started). - Als afbeeldingen niet laden in MDX/JSX, gebruik
useBaseUrl('/img/...')om de sitebaseUrlte respecteren. - De preview start eerst; de linkcontrole draait daarna en is niet‑blokkerend (gebroken externe links stoppen de preview niet).
- Voorbeeld‑preview‑URL:
http://localhost:<port>/Thunderbird-Reply-with-Attachments/(afgedrukt na “Local server started”). - Externe links in linkcontrole: sommige externe sites (bijv. addons.thunderbird.net) blokkeren geautomatiseerde crawlers en kunnen 403 tonen in linkcontroles. De preview start alsnog; dit is veilig om te negeren.
Vertaal de website
Wat je kunt vertalen
- Alleen website‑UI: homepage, navigatiebalk, footer en andere UI‑strings. De inhoud van de documentatie blijft voorlopig alleen Engelstalig.
Waar te bewerken
- Bewerk
website/i18n/<locale>/code.json(gebruikenals referentie). Laat plaatsaanduidingen zoals{year},{slash},{ctrl},{k},{code1}ongewijzigd.
Bestanden genereren of verversen
- Maak ontbrekende stubs voor alle locales:
npm --prefix website run i18n:stubs - Overschrijf stubs vanuit Engels (na toevoegen van nieuwe strings):
npm --prefix website run i18n:stubs:force - Alternatief voor één locale:
npx --prefix website docusaurus write-translations --locale <locale>
Vertaal UI‑strings van homepage/navbar/footer (OpenAI)
- Stel eenmaal de inloggegevens in (shell of .env):
export OPENAI_API_KEY=sk-...- Optioneel:
export OPENAI_MODEL=gpt-4o-mini - One‑shot (alle locales, sla en over):
make translate_web_index - Beperk tot specifieke locales:
make translate_web_index OPTS="--locales de,fr" - Overschrijf bestaande waarden:
make translate_web_index OPTS="--force"
Validatie & herpogingen
- Het vertaalscript valideert de JSON‑vorm, behoudt accolades‑plaatsaanduidingen en zorgt dat URL’s ongewijzigd blijven.
- Bij validatiefouten probeert het script het met feedback tot 2 keer opnieuw, voordat bestaande waarden behouden blijven.
Bekijk je locale in preview
- Dev‑server:
npm --prefix website run start - Bezoek
http://localhost:3000/<locale>/Thunderbird-Reply-with-Attachments/
Indienen
- Open een PR met de bewerkte
code.json‑bestanden. Houd wijzigingen gefocust en voeg indien mogelijk een snelle screenshot toe.
Beveiligings- & configuratietips
- Commit
sources/manifest.jsonniet (tijdelijk aangemaakt door de build) - Houd
browser_specific_settings.gecko.idstabiel om het updatekanaal te behouden
Persistentie van instellingen
- Opslag: alle gebruikersinstellingen staan in
storage.localen blijven behouden bij add‑on‑updates. - Installatie: standaardwaarden worden alleen toegepast wanneer een sleutel strikt ontbreekt (undefined).
- Update: een migratie vult alleen ontbrekende sleutels; bestaande waarden worden nooit overschreven.
- Schemakenmerk:
settingsVersion(momenteel1). - Sleutels en standaardwaarden:
blacklistPatterns: string[]→['*intern*', '*secret*', '*passwor*']confirmBeforeAdd: boolean→falseconfirmDefaultChoice: 'yes'|'no'→'yes'warnOnBlacklistExcluded: boolean→true- Code: zie
sources/background.js→initializeOrMigrateSettings()enSCHEMA_VERSION.
Dev‑workflow (nieuwe instelling toevoegen)
- Verhoog
SCHEMA_VERSIONinsources/background.js. - Voeg de nieuwe sleutel + standaardwaarde toe aan het
DEFAULTS‑object ininitializeOrMigrateSettings(). - Gebruik de "only-if-undefined"‑regel bij het zaaien van standaardwaarden; overschrijf geen bestaande waarden.
- Als de instelling zichtbaar is voor de gebruiker, koppel deze in
sources/options.jsen voeg gelokaliseerde strings toe. - Voeg tests toe/pas ze aan (zie
tests/background.settings.migration.test.js).
Tips voor handmatig testen
- Simuleer een schone installatie: wis de datamap van de extensie of start met een nieuw profiel.
- Simuleer een update: stel
settingsVersionin op0instorage.localen laad opnieuw; bevestig dat bestaande waarden ongewijzigd blijven en alleen ontbrekende sleutels worden toegevoegd.
Probleemoplossing
- Zorg dat Thunderbird 128 ESR of nieuwer is
- Gebruik de Foutconsole voor runtime‑problemen
- Als opgeslagen instellingen niet goed lijken te worden toegepast, herstart Thunderbird en probeer opnieuw. (Thunderbird kan status tussen sessies cachen; een herstart zorgt dat instellingen vers worden geladen.)
CI & coverage
- GitHub Actions (
CI — Tests) draait vitest met dekkingsdrempels (85% regels/functies/takken/statements). Als drempels niet worden gehaald, faalt de taak. - De workflow uploadt een artefact
coverage-htmlmet het HTML‑rapport; download dit vanaf de run‑pagina (Actions → laatste run → Artifacts).
Bijdragen
- Zie CONTRIBUTING.md voor richtlijnen rond branches/commits/PR’s
- Tip: maak een apart Thunderbird‑ontwikkelprofiel voor testen om je dagelijkse profiel niet te beïnvloeden.
Vertalingen
- Grote “all → all”‑vertaaljobs kunnen traag en duur zijn. Begin met een subset (bijv. enkele docs en 1–2 locales), beoordeel het resultaat en breid dan uit.
- Retrybeleid: vertaaljobs doen tot 3 herpogingen met exponentiële backoff bij API‑fouten; zie
scripts/translate_web_docs_batch.jsenscripts/translate_web_docs_sync.js.
Schermafbeeldingen voor documentatie
-
Sla afbeeldingen op onder
website/static/img/. -
Verwijs ernaar in MD/MDX via
useBaseUrl('/img/<filename>')zodat paden werken met de sitebaseUrl. -
Nadat je afbeeldingen hebt toegevoegd of hernoemd onder
website/static/img/, bevestig dat alle verwijzingen nog steedsuseBaseUrl('/img/…')gebruiken en renderen in een lokale preview. Favicons -
De multi‑size
favicon.icowordt automatisch gegenereerd in alle buildpaden (Make + scripts) viawebsite/scripts/build-favicon.mjs. -
Geen handmatige stap vereist;
icon-*.pngbijwerken is voldoende. Reviewtip -
Laat de front‑matter
idongewijzigd in vertaalde docs; vertaal alleentitleensidebar_labelindien aanwezig.
clean
- Doel: lokale build-/preview‑artefacten verwijderen.
- Gebruik:
make clean - Verwijdert (indien aanwezig):
tmp/web-local-preview/website/build/
commit
- Doel: formatteren, testen, changelog bijwerken, committen en pushen.
- Gebruik:
make commit - Details: draait Prettier (write),
make test,make test_i18n; voegt changelog toe wanneer er staged diffs zijn; pusht naarorigin/<branch>.
eslint
- Doel: ESLint draaien via flat config.
- Gebruik:
make eslint
help
- Doel: alle targets met beknopte docs weergeven.
- Gebruik:
make help
lint
- Doel: de MailExtension linten met
web-ext. - Gebruik:
make lint - Opmerkingen: kopieert tijdelijk
sources/manifest_LOCAL.json→sources/manifest.json; negeert gebouwde ZIP’s; waarschuwingen laten de pipeline niet falen.
menu
- Doel: interactief menu om een Make‑target en optionele argumenten te kiezen.
- Gebruik: voer
makeuit zonder argumenten. - Opmerkingen: als
whiptailniet beschikbaar is, valt het menu terug opmake help.
pack
- Doel: ATN‑ en LOCAL‑ZIP’s bouwen (hangt af van
lint). - Gebruik:
make pack - Tip: verhoog versies in beide
sources/manifest_*.jsonvóór het verpakken.
prettier
- Doel: de repo ter plekke formatteren.
- Gebruik:
make prettier
prettier_check
- Doel: formattering verifiëren (geen writes).
- Gebruik:
make prettier_check
prettier_write
- Doel: alias voor
prettier. - Gebruik:
make prettier_write
test
- Doel: Prettier (write), daarna ESLint en vervolgens Vitest (coverage indien geïnstalleerd).
- Gebruik:
make test
test_i18n
- Doel: i18n‑gerichte tests voor add‑on‑strings en websitedocumentatie.
- Gebruik:
make test_i18n - Draait:
npm run test:i18nennpm run -s test:website-i18n.
translate_app / translation_app
- Doel: add‑on‑UI‑strings vertalen van EN naar andere locales.
- Gebruik:
make translation_app OPTS="--locales all|de,fr" - Opmerkingen: behoudt sleutelstructuur en plaatsaanduidingen; logt naar
translation_app.log. Scriptvorm:node scripts/translate_app.js --locales ….
translate_web_docs_batch / translate_web_docs_sync
- Doel: websitedocumentatie vertalen van
website/docs/*.mdnaarwebsite/i18n/<locale>/.... - Voorkeur:
translate_web_docs_batch(OpenAI Batch API)- Gebruik (flags):
make translate_web_docs_batch OPTS="--files <doc1,doc2|all> --locales <lang1,lang2|all>" - Legacy positioneel wordt nog steeds geaccepteerd:
OPTS="<doc|all> <lang|all>"
- Gebruik (flags):
- Gedrag: bouwt JSONL, uploadt, polt elke 30s, downloadt resultaten, schrijft bestanden.
- Opmerking: een batchtaak kan tot 24 uur duren (volgens OpenAI’s batchvenster). De console toont de verstreken tijd bij elke poll.
- Omgeving:
OPENAI_API_KEY(vereist), optioneelOPENAI_MODEL,OPENAI_TEMPERATURE,OPENAI_BATCH_WINDOW(standaard 24u),BATCH_POLL_INTERVAL_MS. - Legacy:
translate_web_docs_sync- Gebruik (flags):
make translate_web_docs_sync OPTS="--files <doc1,doc2|all> --locales <lang1,lang2|all>" - Legacy positioneel wordt nog steeds geaccepteerd:
OPTS="<doc|all> <lang|all>"
- Gebruik (flags):
- Gedrag: synchrone verzoeken per paar (geen batchaggregatie).
- Opmerkingen: interactieve prompts wanneer
OPTSis weggelaten. Beide modi behouden codeblokken/inline code en laten front‑matteridongewijzigd; logt naartranslation_web_batch.log(batch) oftranslation_web_sync.log(sync).
translate_web_index / translation_web_index
- Doel: website‑UI‑strings (homepage, navbar, footer) vertalen van
website/i18n/en/code.jsonnaar alle locales onderwebsite/i18n/<locale>/code.json(exclusiefen). - Gebruik:
make translate_web_indexofmake translate_web_index OPTS="--locales de,fr [--force]" - Vereisten: exporteer
OPENAI_API_KEY(optioneel:OPENAI_MODEL=gpt-4o-mini). - Gedrag: valideert JSON‑structuur, behoudt accolades‑plaatsaanduidingen, laat URL’s ongewijzigd en probeert met feedback opnieuw bij validatiefouten.
web_build
- Doel: de docs‑site bouwen naar
website/build. - Gebruik:
make web_build OPTS="--locales en|de,en|all"(of stelBUILD_LOCALES="en de"in) - Interne werking:
node ./node_modules/@docusaurus/core/bin/docusaurus.mjs build [--locale …]. - Afhankelijkheden: draait
npm ciinwebsite/alleen alswebsite/node_modules/@docusaurusontbreekt.
web_build_linkcheck
- Doel: offline‑veilige linkcontrole.
- Gebruik:
make web_build_linkcheck OPTS="--locales en|all" - Opmerkingen: bouwt naar
tmp_linkcheck_web_pages; herschrijft GH PagesbaseUrlnaar/; slaat externe HTTP(S)‑links over.
web_build_local_preview
- Doel: lokale gh‑pages‑preview met optionele tests/linkcontrole.
- Gebruik:
make web_build_local_preview OPTS="--locales en|all [--no-test] [--no-link-check] [--dry-run] [--no-serve]" - Gedrag: probeert eerst de Node‑previewserver (
scripts/preview-server.mjs, ondersteunt/__stop), valt terug oppython3 -m http.server; serveert op 8080–8090; PID bijweb-local-preview/.server.pid.
web_push_github
- Doel:
website/buildpushen naar degh-pages‑branch. - Gebruik:
make web_push_github
Tip: stel NPM=… in om de pakketmanager die door het Makefile wordt gebruikt te overschrijven (standaard npm).