דלג לתוכן הראשי

פיתוח


מדריך פיתוח

ערכו באנגלית בלבד; התרגומים יתעדכנו אוטומטית

עדכנו תיעוד רק תחת website/docs (אנגלית). התרגומים תחת website/i18n/<locale>/… נוצרים ואינם אמורים להיערך ידנית. השתמשו במשימות התרגום (למשל, make translate_web_docs_batch) כדי לרענן תוכן מקומי.

דרישות מקדימות

  • Node.js 22+ ו-npm (נבדק עם Node 22)
  • Thunderbird 128 ESR או חדש יותר (לבדיקות ידניות)

פריסת הפרויקט (ברמה גבוהה)

  • שורש: סקריפט אריזה distribution_zip_packer.sh, תיעוד, צילומי מסך
  • sources/: קוד ההרחבה הראשי (רקע, ממשק אפשרויות/חלון קופץ, מניפסטים, אייקונים)
  • tests/: חבילת בדיקות Vitest
  • website/: תיעוד Docusaurus (עם i18n תחת website/i18n/de/...)

התקנה וכלים

  • התקנת תלויות בשורש: npm ci
  • דוקס (אופציונלי): cd website && npm ci
  • גילוי יעדים: make help

פיתוח חי (web‑ext run)

  • לולאה מהירה ב‑Firefox Desktop (בדיקות עשן של UI בלבד):
  • npx web-ext run --source-dir sources --target=firefox-desktop
  • הרצה ב‑Thunderbird (מועדף עבור MailExtensions):
  • npx web-ext run --source-dir sources --start-url about:addons --firefox-binary "$(command -v thunderbird || echo /path/to/thunderbird)"
  • טיפים:
  • השאירו את יומן השגיאות של Thunderbird פתוח (כלים → כלי פיתוח → מסוף שגיאות).
  • דפי אירועים של MV3 מושעים כשהם במצב סרק; טענו מחדש את ההרחבה אחרי שינויי קוד, או אפשרו ל‑web‑ext לטעון אוטומטית.
  • חלק מההתנהגויות הייחודיות ל‑Firefox שונות; תמיד אשרו ב‑Thunderbird לשוויון API.
  • נתיבי בינארי של Thunderbird (דוגמאות):
  • Linux: thunderbird (למשל, /usr/bin/thunderbird)
  • macOS: /Applications/Thunderbird.app/Contents/MacOS/thunderbird
  • Windows: "C:\\Program Files\\Mozilla Thunderbird\\thunderbird.exe"
  • בידוד פרופיל: השתמשו בפרופיל Thunderbird נפרד לפיתוח כדי לא להשפיע על סביבת העבודה היומית.

מטרות Make (בסדר אלפביתי)

ה‑Makefile מאחיד תזרימי פיתוח נפוצים. הריצו make help בכל עת לקבלת סיכום בשורה אחת לכל מטרה.

טיפ: הרצת make ללא מטרה תפתח תפריט Whiptail פשוט לבחירת מטרה.

יעדתיאור בשורה אחת
cleanהסרת ארטיפקטים מקומיים של בנייה/תצוגה מקדימה (tmp/, web-local-preview/, website/build/).
commitעיצוב קוד, הרצת בדיקות (כולל i18n), עדכון יומן שינויים, ביצוע commit ו‑push.
eslintהרצת ESLint באמצעות flat config (npm run -s lint:eslint).
helpרשימת כל המטרות עם תיאור בשורה אחת (ממוינות).
lintweb‑ext lint על sources/ (מניפסט זמני; מתעלם מקבצי ZIP; לא קטלני).
menuתפריט אינטראקטיבי לבחירת מטרה וארגומנטים אופציונליים.
packבניית ZIPs ל‑ATN ולוקאליים (מריץ linter; קורא לסקריפט האריזה).
prettierעיצוב המאגר במקום (כותב שינויים).
prettier_checkPrettier במצב בדיקה (ללא כתיבה); נכשל אם נדרש עיצוב מחדש.
prettier_writeכינוי עבור prettier.
testPrettier (כתיבה), ESLint, ואז Vitest (כיסוי אם מוגדר).
test_i18nבדיקות i18n בלבד: מצייני מקום/שוויון בהרחבה + שוויון באתר.
translate_appכינוי עבור translation_app.
translation_appתרגום מחרוזות UI של האפליקציה מ‑sources/_locales/en/messages.json.
translate_web_docs_batchתרגום דפי אתר דרך OpenAI Batch API (מועדף).
translate_web_docs_syncתרגום דפי אתר באופן סינכרוני (מורשת, לא באצ'ינג).
translate_web_indexכינוי עבור translation_web_index.
translation_web_indexתרגום מחרוזות UI של דף הבית/סרגל הניווט/כותרת תחתונה (website/i18n/en/code.json → .../<lang>/code.json).
web_buildבניית הדוקס אל website/build (תומך ב‑--locales / BUILD_LOCALES).
web_build_linkcheckבדיקת קישורים בטוחה לאופליין (מדלגת על HTTP[S] מרוחקים).
web_build_local_previewתצוגה מקדימה מקומית של gh‑pages; שרת אוטומטי על 8080–8090; בדיקות/בדיקת קישורים אופציונליות.
web_push_githubדחיפת website/build לענף gh-pages.

תחביר אפשרויות

  • השתמשו ב‑make <command> OPTS="…" להעברת אפשרויות (מומלץ מרכאות). לכל מטרה בהמשך יש דוגמת שימוש.

--

טיפים לבניית לוקאלים

  • בניית תת‑קבוצה של לוקאלים: הגדירו BUILD_LOCALES="en de" או העבירו OPTS="--locales en,de" ליעדי web.
  • תצוגה מקדימה של לוקאל מסוים: http://localhost:<port>/Thunderbird-Reply-with-Attachments/de/.

בנייה ואריזה

  • בניית ZIPs: make pack
  • מפיק ZIPs ל‑ATN ולוקאליים בשורש המאגר (אל תערכו ארטיפקטים ידנית)
  • טיפ: עדכנו גרסה הן ב‑sources/manifest_ATN.json והן ב‑sources/manifest_LOCAL.json לפני אריזה
  • התקנה ידנית (פיתוח): Thunderbird → Tools → Add‑ons and Themes → גלגל שיניים → Install Add‑on From File… → בחרו ב‑ZIP שנבנה

בדיקות

  • חבילה מלאה: make test (Vitest)
  • כיסוי (אופציונלי):
  • npm i -D @vitest/coverage-v8
  • הריצו make test; פתחו את coverage/index.html לדוח HTML
  • i18n בלבד: make test_i18n (מפתחות UI/מצייני מקום/כותרות + שוויון באתר לכל לוקאל ולכל מסמך עם בדיקות id/title/sidebar_label)

ניפוי שגיאות ולוגים

  • מסוף שגיאות: Tools → Developer Tools → Error Console
  • החלפת לוגים מפורטים בזמן ריצה:
  • הפעלה: messenger.storage.local.set({ debug: true })
  • כיבוי: messenger.storage.local.set({ debug: false })
  • לוגים מופיעים בזמן ניסוח/שליחת תגובות

דוקס (אתר)

  • שרת פיתוח: cd website && npm run start
  • בניית אתר סטטי: cd website && npm run build
  • מקבילות ב‑Make (אלפביתי): make web_build, make web_build_linkcheck, make web_build_local_preview, make web_push_github
  • דוגמאות שימוש:
  • EN בלבד, דילוג על בדיקות/בדיקת קישורים, ללא push: make web_build_local_preview OPTS="--locales en --no-test --no-link-check --dry-run"
  • כל הלוקאלים, עם בדיקות/בדיקת קישורים, ואז push: make web_build_local_preview && make web_push_github
  • לפני פרסום, הריצו את בדיקת הקישורים הבטוחה לאופליין: make web_build_linkcheck.
  • i18n: האנגלית חיה ב‑website/docs/*.md; תרגום לגרמנית ב‑website/i18n/de/docusaurus-plugin-content-docs/current/*.md
  • חיפוש: אם משתני סביבה של Algolia DocSearch מוגדרים ב‑CI (DOCSEARCH_APP_ID, DOCSEARCH_API_KEY, DOCSEARCH_INDEX_NAME), האתר ישתמש בחיפוש של Algolia; אחרת הוא ייפול לחיפוש מקומי. בדף הבית, לחצו / או Ctrl+K כדי לפתוח את תיבת החיפוש.

  • website/src/pages/donate.js
  • נתיב: /donate (וכן /<locale>/donate)
  • התנהגות:
  • אם לנתיב הנוכחי יש לוקאל (למשל, /de/donate), השתמשו בו
  • אחרת, בחרו את ההתאמה הטובה ביותר מ‑navigator.languages מול הלוקאלים המוגדרים; חזרה ללוקאל ברירת המחדל במקרה הצורך
  • מפנה אל:
  • en/docs/donation
  • אחרים → /<locale>/docs/donation
  • משתמש ב‑useBaseUrl לטיפול נכון ב‑baseUrl
  • כולל meta refresh + קישור noscript כגיבוי


טיפים לתצוגה מקדימה

  • עצירת תצוגת Node בצורה נקייה: פתחו http://localhost:<port>/__stop (מודפס אחרי Local server started).
  • אם תמונות לא נטענות ב‑MDX/JSX, השתמשו ב‑useBaseUrl('/img/...') כדי לכבד את baseUrl של האתר.
  • התצוגה המקדימה מתחילה תחילה; בדיקת הקישורים רצה לאחר מכן ואינה חוסמת (קישורים חיצוניים שבורים לא יעצרו את התצוגה).
  • דוגמת URL לתצוגה: http://localhost:<port>/Thunderbird-Reply-with-Attachments/ (מודפס לאחר “Local server started”).
  • קישורים חיצוניים בבדיקת קישורים: אתרים מסוימים (למשל, addons.thunderbird.net) חוסמים סורקים אוטומטיים ועלולים להציג 403 בבדיקות. התצוגה המקדימה עדיין תתחיל; ניתן להתעלם מכך.

תרגום האתר

מה ניתן לתרגם

  • ממשק האתר בלבד: דף הבית, סרגל הניווט, כותרת תחתונה ומחרוזות UI נוספות. תוכן הדוקס נשאר באנגלית בלבד לעת עתה.

היכן לערוך

  • ערכו את website/i18n/<locale>/code.json (השתמשו ב‑en כהפניה). השאירו מצייני מקום כמו {year}, {slash}, {ctrl}, {k}, {code1} ללא שינוי.

יצירה או רענון של קבצים

  • יצירת שבלונות חסרות לכל הלוקאלים: npm --prefix website run i18n:stubs
  • דריסה מחדש של שבלונות מהאנגלית (לאחר הוספת מחרוזות חדשות): npm --prefix website run i18n:stubs:force
  • חלופה ללוקאל יחיד: npx --prefix website docusaurus write-translations --locale <locale>

תרגום מחרוזות UI של דף הבית/סרגל ניווט/כותרת תחתונה (OpenAI)

  • הגדרת אישורים פעם אחת (Shell או .env):
  • export OPENAI_API_KEY=sk-...
  • אופציונלי: export OPENAI_MODEL=gpt-4o-mini
  • בפעימה אחת (כל הלוקאלים, מלבד en): make translate_web_index
  • הגבלה ללוקאלים מסוימים: make translate_web_index OPTS="--locales de,fr"
  • דריסת ערכים קיימים: make translate_web_index OPTS="--force"

אימות וניסיונות חוזרים

  • סקריפט התרגום מאמת את מבנה ה‑JSON, שומר על מצייני מקום בסוגריים מסולסלים, ומוודא ש‑URLים אינם משתנים.
  • בכשל אימות, מתבצע ניסיון חוזר עם משוב עד פעמיים לפני שמירת הערכים הקיימים.

תצוגה מקדימה של הלוקאל שלך

  • שרת פיתוח: npm --prefix website run start
  • בקרו ב‑http://localhost:3000/<locale>/Thunderbird-Reply-with-Attachments/

הגשה

  • פתחו PR עם קובצי code.json הערוכים. שמרו על שינויים ממוקדים והוסיפו צילום מסך קצר כשאפשר.

טיפים לאבטחה ולהגדרות

  • אל תבצעו commit ל‑sources/manifest.json (נוצר זמנית על ידי הבנייה)
  • שמרו על browser_specific_settings.gecko.id יציב כדי לשמר את ערוץ העדכונים

התמדה של הגדרות

  • אחסון: כל הגדרות המשתמש נמצאות ב‑storage.local ושורדות עדכוני הרחבה.
  • התקנה: ברירות מחדל מוחלות רק כאשר מפתח חסר לחלוטין (undefined).
  • עדכון: תהליך מיגרציה ממלא רק מפתחות חסרים; ערכים קיימים לעולם לא יידרסו.
  • סימון סכימה: settingsVersion (נוכחית 1).
  • מפתחות וברירות מחדל:
  • blacklistPatterns: string[]['*intern*', '*secret*', '*passwor*']
  • confirmBeforeAdd: booleanfalse
  • confirmDefaultChoice: 'yes'|'no''yes'
  • warnOnBlacklistExcluded: booleantrue
  • קוד: ראו sources/background.jsinitializeOrMigrateSettings() וגם SCHEMA_VERSION.

תזרים פיתוח (הוספת הגדרה חדשה)

  • העלו את SCHEMA_VERSION בתוך sources/background.js.
  • הוסיפו את המפתח החדש + ברירת המחדל לאובייקט DEFAULTS שב‑initializeOrMigrateSettings().
  • השתמשו בכלל “only-if-undefined” בעת זרע ברירות מחדל; אל תדרסו ערכים קיימים.
  • אם ההגדרה נראית למשתמש, חברו אותה ב‑sources/options.js והוסיפו מחרוזות מתורגמות.
  • הוסיפו/עדכנו בדיקות (ראו tests/background.settings.migration.test.js).

טיפים לבדיקות ידניות

  • סימולציה של התקנה חדשה: נקו את ספריית הנתונים של ההרחבה או התחילו עם פרופיל חדש.
  • סימולציה של עדכון: הגדירו settingsVersion ל‑0 בתוך storage.local וטעינו מחדש; אשרו שערכים קיימים נשמרים ללא שינוי ורק מפתחות חסרים מתווספים.

פתרון תקלות

  • ודאו ש‑Thunderbird הוא 128 ESR או חדש יותר
  • השתמשו ב‑Error Console לבעיות זמן ריצה
  • אם נראה שהגדרות שנשמרו אינן מוחלות כראוי, אתחלו את Thunderbird ונסו שוב. (Thunderbird עשוי לאחסן מצב בין סשנים; אתחול מבטיח שהגדרות ייטענו מחדש.)

CI וכיסוי

  • GitHub Actions (CI — Tests) מריץ vitest עם ספי כיסוי (85% שורות/פונקציות/ענפים/הצהרות). אם הספים לא מתקיימים, המשימה נכשלת.
  • ה‑workflow מעלה ארטיפקט coverage-html עם דוח HTML; הורידו אותו מעמוד הריצה (Actions → הריצה האחרונה → Artifacts).

תרומות

  • ראו CONTRIBUTING.md להנחיות סניפים/קומיטים/PR
  • טיפ: צרו פרופיל פיתוח נפרד של Thunderbird לבדיקות כדי להימנע מהשפעה על הפרופיל היומי.

תרגומים

  • הרצת עבודות תרגום גדולות “all → all” עשויה להיות איטית ויקרה. התחילו בתת‑קבוצה (למשל, כמה דוקס ו‑1–2 לוקאלים), בחנו את התוצאה, ואז הרחיבו.

  • מדיניות ניסיונות חוזרים: עבודות התרגום מבצעות עד 3 ניסיונות עם backoff מעריכי בשגיאות API; ראו scripts/translate_web_docs_batch.js ו‑scripts/translate_web_docs_sync.js.

צילומי מסך לדוקס

  • אחסנו תמונות תחת website/static/img/.

  • הפנו אליהן ב‑MD/MDX דרך useBaseUrl('/img/<filename>') כך שהנתיבים יעבדו עם baseUrl של האתר.

  • לאחר הוספה או שינוי שם של תמונות תחת website/static/img/, אשרו שכל ההפניות עדיין משתמשות ב‑useBaseUrl('/img/…') ומוצגות בתצוגה מקדימה מקומית. סמלי Favicon

  • הקובץ הרב‑גדלי favicon.ico נוצר אוטומטית בכל מסלולי הבנייה (Make + סקריפטים) דרך website/scripts/build-favicon.mjs.

  • אין צורך בצעד ידני; עדכון icon-*.png מספיק. טיפ לבדיקה

  • שמרו על id ללא שינוי בדוקס המתורגמים; תרגמו רק את title ו‑sidebar_label כשקיימים.

clean

  • מטרה: הסרת ארטיפקטים מקומיים של בנייה/תצוגה מקדימה.
  • שימוש: make clean
  • מסיר (אם קיימים):
  • tmp/
  • web-local-preview/
  • website/build/

commit

  • מטרה: עיצוב, בדיקות, עדכון יומן שינויים, commit ו‑push.
  • שימוש: make commit
  • פרטים: מריץ Prettier (כתיבה), make test, make test_i18n; מוסיף ליומן השינויים כאשר יש שינויים במצב staged; דוחף ל‑origin/<branch>.

eslint

  • מטרה: הרצת ESLint דרך flat config.
  • שימוש: make eslint

help

  • מטרה: רשימת כל המטרות עם תיאור בשורה אחת.
  • שימוש: make help

lint

  • מטרה: lint ל‑MailExtension בעזרת web-ext.
  • שימוש: make lint
  • הערות: מעתיק זמנית sources/manifest_LOCAL.jsonsources/manifest.json; מתעלם מ‑ZIPs שנבנו; אזהרות אינן מפילות את הצינור.

menu

  • מטרה: תפריט אינטראקטיבי לבחירת יעד Make וארגומנטים אופציונליים.
  • שימוש: הריצו make ללא ארגומנטים.
  • הערות: אם whiptail לא זמין, התפריט נופל ל‑make help.

pack

  • מטרה: בניית ZIPs ל‑ATN ולוקאליים (תלוי ב‑lint).
  • שימוש: make pack
  • טיפ: העלו גרסאות בשני sources/manifest_*.json לפני האריזה.

prettier

  • מטרה: עיצוב המאגר במקום.
  • שימוש: make prettier

prettier_check

  • מטרה: אימות עיצוב (ללא כתיבה).
  • שימוש: make prettier_check

prettier_write

  • מטרה: כינוי עבור prettier.
  • שימוש: make prettier_write

test

  • מטרה: הרצת Prettier (כתיבה), ESLint ואז Vitest (כיסוי אם מותקן).
  • שימוש: make test

test_i18n

  • מטרה: בדיקות ממוקדות i18n למחרוזות ההרחבה ולדפי האתר.
  • שימוש: make test_i18n
  • מריץ: npm run test:i18n ו‑npm run -s test:website-i18n.

translate_app / translation_app

  • מטרה: תרגום מחרוזות UI של ההרחבה מ‑EN ללוקאלים אחרים.
  • שימוש: make translation_app OPTS="--locales all|de,fr"
  • הערות: שומר על מבנה המפתחות ומצייני המקום; כותב לוג אל translation_app.log. צורת סקריפט: node scripts/translate_app.js --locales ….

translate_web_docs_batch / translate_web_docs_sync

  • מטרה: תרגום דפי האתר מ‑website/docs/*.md אל website/i18n/<locale>/....
  • מועדף: translate_web_docs_batch (OpenAI Batch API)
    • שימוש (דגלים): make translate_web_docs_batch OPTS="--files <doc1,doc2|all> --locales <lang1,lang2|all>"
    • מיקום ישן עדיין מתקבל: OPTS="<doc|all> <lang|all>"
  • התנהגות: בונה JSONL, מעלה, מבצע polling כל 30 שניות, מוריד תוצאות, כותב קבצים.
  • הערה: משימת batch עשויה להימשך עד 24 שעות להשלמה (לפי חלון ה‑batch של OpenAI). הקונסולה מציגה זמן שחלף בכל polling.
  • סביבה: OPENAI_API_KEY (נדרש), אופציונלי OPENAI_MODEL, OPENAI_TEMPERATURE, OPENAI_BATCH_WINDOW (ברירת מחדל 24h), BATCH_POLL_INTERVAL_MS.
  • מורשת: translate_web_docs_sync
    • שימוש (דגלים): make translate_web_docs_sync OPTS="--files <doc1,doc2|all> --locales <lang1,lang2|all>"
    • מיקום ישן עדיין מתקבל: OPTS="<doc|all> <lang|all>"
  • התנהגות: בקשות סינכרוניות לכל זוג (ללא אגרגציה של batch).
  • הערות: בקשות אינטראקטיביות כאשר OPTS מושמט. שני המצבים שומרים על בלוקי קוד/קוד בשורה ושומרים על id בפרונט‑מטר ללא שינוי; לוגים אל translation_web_batch.log (batch) או translation_web_sync.log (sync).

translate_web_index / translation_web_index

  • מטרה: תרגום מחרוזות UI של האתר (דף הבית, סרגל ניווט, כותרת תחתונה) מ‑website/i18n/en/code.json לכל הלוקאלים תחת website/i18n/<locale>/code.json (למעט en).
  • שימוש: make translate_web_index או make translate_web_index OPTS="--locales de,fr [--force]"
  • דרישות: לייצא OPENAI_API_KEY (אופציונלי: OPENAI_MODEL=gpt-4o-mini).
  • התנהגות: מאמת מבנה JSON, שומר מצייני מקום בסוגריים מסולסלים, משאיר URLים ללא שינוי, ומנסה מחדש עם משוב בשגיאות אימות.

web_build

  • מטרה: בניית אתר הדוקס אל website/build.
  • שימוש: make web_build OPTS="--locales en|de,en|all" (או הגדירו BUILD_LOCALES="en de")
  • פנימיים: node ./node_modules/@docusaurus/core/bin/docusaurus.mjs build [--locale …].
  • תלויות: מריץ npm ci בתוך website/ רק אם website/node_modules/@docusaurus חסר.

web_build_linkcheck

  • מטרה: בדיקת קישורים בטוחה לאופליין.
  • שימוש: make web_build_linkcheck OPTS="--locales en|all"
  • הערות: בונה אל tmp_linkcheck_web_pages; משכתב את baseUrl של GH Pages ל‑/; מדלג על קישורי HTTP(S) מרוחקים.

web_build_local_preview

  • מטרה: תצוגה מקדימה מקומית של gh‑pages עם בדיקות/בדיקת קישורים אופציונליות.
  • שימוש: make web_build_local_preview OPTS="--locales en|all [--no-test] [--no-link-check] [--dry-run] [--no-serve]"
  • התנהגות: מנסה קודם את שרת התצוגה של Node (scripts/preview-server.mjs, תומך ב‑/__stop), נופל ל‑python3 -m http.server; משרת על 8080–8090; PID ב‑web-local-preview/.server.pid.

web_push_github

  • מטרה: דחיפת website/build לענף gh-pages.
  • שימוש: make web_push_github

טיפ: הגדירו NPM=… כדי לעקוף את מנהל החבילות שבו משתמש ה‑Makefile (ברירת מחדל npm).