From 114434d6ddcb21e03e3b62139baaac6a882c0c82 Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Wed, 29 Jul 2026 21:25:14 +0700 Subject: [PATCH 01/20] release: bump version to 1.3.3 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 74a6f5f8..6ed73408 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "gmail-alias-toolkit", "description": "Generate and manage Gmail aliases with plus addressing and presets", "private": true, - "version": "1.3.2", + "version": "1.3.3", "author": "dev@eplus.dev", "license": "MIT", "homepage_url": "https://eplus.dev", From 236c8887f49bb170c1c2503a6a77a4546142b4f7 Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Wed, 29 Jul 2026 21:26:41 +0700 Subject: [PATCH 02/20] chore: add one-shot v1.3.3 changelog script --- scripts/prepare-v1.3.3-changelog.py | 31 +++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 scripts/prepare-v1.3.3-changelog.py diff --git a/scripts/prepare-v1.3.3-changelog.py b/scripts/prepare-v1.3.3-changelog.py new file mode 100644 index 00000000..d52c8947 --- /dev/null +++ b/scripts/prepare-v1.3.3-changelog.py @@ -0,0 +1,31 @@ +from pathlib import Path + +CHANGELOG_PATH = Path("CHANGELOG.md") +VERSION_HEADING = "## [1.3.3] - 2026-07-29" +INSERT_AFTER = ( + "and this project adheres to " + "[Semantic Versioning](https://semver.org/spec/v2.0.0.html).\n" +) +RELEASE_SECTION = """ + +## [1.3.3] - 2026-07-29 + +### :bug: Bug Fixes + +- [`63c969f`](https://github.com/ePlus-DEV/gmail-alias-toolkit/commit/63c969f3cacc3c79e91ac7a76b4b8a46885601d5) - preserve Google Workspace domains when generating website aliases and prevent Gmail alias history or favorites from leaking into another active account *(commit by [@hoangsvit](https://github.com/hoangsvit))* +""" + + +def prepend_release_section() -> None: + """Insert the v1.3.3 release notes after the changelog introduction.""" + content = CHANGELOG_PATH.read_text(encoding="utf-8") + if VERSION_HEADING in content: + raise RuntimeError("CHANGELOG.md already contains version 1.3.3") + if content.count(INSERT_AFTER) != 1: + raise RuntimeError("Unable to locate the changelog introduction marker") + + updated = content.replace(INSERT_AFTER, INSERT_AFTER + RELEASE_SECTION, 1) + CHANGELOG_PATH.write_text(updated, encoding="utf-8") + + +prepend_release_section() From 4eceb5e10fd910451169fd04214e99c21182bbbe Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Wed, 29 Jul 2026 21:27:08 +0700 Subject: [PATCH 03/20] chore: add one-shot v1.3.3 changelog workflow --- .github/workflows/apply-v1.3.3-changelog.yml | 35 ++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 .github/workflows/apply-v1.3.3-changelog.yml diff --git a/.github/workflows/apply-v1.3.3-changelog.yml b/.github/workflows/apply-v1.3.3-changelog.yml new file mode 100644 index 00000000..2ba2cf13 --- /dev/null +++ b/.github/workflows/apply-v1.3.3-changelog.yml @@ -0,0 +1,35 @@ +name: Apply v1.3.3 changelog + +on: + pull_request: + types: [opened] + +permissions: + contents: write + +jobs: + patch: + if: github.event.pull_request.base.ref == 'dev' && github.head_ref == 'release/v1.3.3-workspace-alias-fix' + runs-on: ubuntu-latest + steps: + - name: Checkout release branch + uses: actions/checkout@v4 + with: + ref: ${{ github.head_ref }} + fetch-depth: 0 + + - name: Apply changelog section + run: python3 scripts/prepare-v1.3.3-changelog.py + + - name: Commit changelog and remove temporary files + shell: bash + run: | + set -euo pipefail + git rm \ + .github/workflows/apply-v1.3.3-changelog.yml \ + scripts/prepare-v1.3.3-changelog.py + git config user.name "github-actions[bot]" + git config user.email "41898282+github-actions[bot]@users.noreply.github.com" + git add CHANGELOG.md + git commit -m "docs: add v1.3.3 changelog" + git push origin HEAD:${{ github.head_ref }} From 162daa6ae0a13d2565eda58c948adfceba20f61b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 29 Jul 2026 14:27:44 +0000 Subject: [PATCH 04/20] docs: add v1.3.3 changelog --- .github/workflows/apply-v1.3.3-changelog.yml | 35 -------------------- CHANGELOG.md | 7 ++++ scripts/prepare-v1.3.3-changelog.py | 31 ----------------- 3 files changed, 7 insertions(+), 66 deletions(-) delete mode 100644 .github/workflows/apply-v1.3.3-changelog.yml delete mode 100644 scripts/prepare-v1.3.3-changelog.py diff --git a/.github/workflows/apply-v1.3.3-changelog.yml b/.github/workflows/apply-v1.3.3-changelog.yml deleted file mode 100644 index 2ba2cf13..00000000 --- a/.github/workflows/apply-v1.3.3-changelog.yml +++ /dev/null @@ -1,35 +0,0 @@ -name: Apply v1.3.3 changelog - -on: - pull_request: - types: [opened] - -permissions: - contents: write - -jobs: - patch: - if: github.event.pull_request.base.ref == 'dev' && github.head_ref == 'release/v1.3.3-workspace-alias-fix' - runs-on: ubuntu-latest - steps: - - name: Checkout release branch - uses: actions/checkout@v4 - with: - ref: ${{ github.head_ref }} - fetch-depth: 0 - - - name: Apply changelog section - run: python3 scripts/prepare-v1.3.3-changelog.py - - - name: Commit changelog and remove temporary files - shell: bash - run: | - set -euo pipefail - git rm \ - .github/workflows/apply-v1.3.3-changelog.yml \ - scripts/prepare-v1.3.3-changelog.py - git config user.name "github-actions[bot]" - git config user.email "41898282+github-actions[bot]@users.noreply.github.com" - git add CHANGELOG.md - git commit -m "docs: add v1.3.3 changelog" - git push origin HEAD:${{ github.head_ref }} diff --git a/CHANGELOG.md b/CHANGELOG.md index 26ffc0aa..0f136bae 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,13 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [1.3.3] - 2026-07-29 + +### :bug: Bug Fixes + +- [`63c969f`](https://github.com/ePlus-DEV/gmail-alias-toolkit/commit/63c969f3cacc3c79e91ac7a76b4b8a46885601d5) - preserve Google Workspace domains when generating website aliases and prevent Gmail alias history or favorites from leaking into another active account *(commit by [@hoangsvit](https://github.com/hoangsvit))* + ## [1.3.1] - 2026-07-20 ### :sparkles: New Features - [`7148619`](https://github.com/ePlus-DEV/gmail-alias-toolkit/commit/7148619a98c09eaaee68376d4cd021149bd70c8f) - **release**: add Edge and Opera zip scripts *(commit by [@hoangsvit](https://github.com/hoangsvit))* diff --git a/scripts/prepare-v1.3.3-changelog.py b/scripts/prepare-v1.3.3-changelog.py deleted file mode 100644 index d52c8947..00000000 --- a/scripts/prepare-v1.3.3-changelog.py +++ /dev/null @@ -1,31 +0,0 @@ -from pathlib import Path - -CHANGELOG_PATH = Path("CHANGELOG.md") -VERSION_HEADING = "## [1.3.3] - 2026-07-29" -INSERT_AFTER = ( - "and this project adheres to " - "[Semantic Versioning](https://semver.org/spec/v2.0.0.html).\n" -) -RELEASE_SECTION = """ - -## [1.3.3] - 2026-07-29 - -### :bug: Bug Fixes - -- [`63c969f`](https://github.com/ePlus-DEV/gmail-alias-toolkit/commit/63c969f3cacc3c79e91ac7a76b4b8a46885601d5) - preserve Google Workspace domains when generating website aliases and prevent Gmail alias history or favorites from leaking into another active account *(commit by [@hoangsvit](https://github.com/hoangsvit))* -""" - - -def prepend_release_section() -> None: - """Insert the v1.3.3 release notes after the changelog introduction.""" - content = CHANGELOG_PATH.read_text(encoding="utf-8") - if VERSION_HEADING in content: - raise RuntimeError("CHANGELOG.md already contains version 1.3.3") - if content.count(INSERT_AFTER) != 1: - raise RuntimeError("Unable to locate the changelog introduction marker") - - updated = content.replace(INSERT_AFTER, INSERT_AFTER + RELEASE_SECTION, 1) - CHANGELOG_PATH.write_text(updated, encoding="utf-8") - - -prepend_release_section() From 31f2a227d9c22c2d76c817ca1ca741a180e18f9a Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Wed, 29 Jul 2026 21:48:17 +0700 Subject: [PATCH 05/20] chore: add one-shot extension changelog patch --- scripts/patch-v1.3.3-extension-changelog.py | 35 +++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 scripts/patch-v1.3.3-extension-changelog.py diff --git a/scripts/patch-v1.3.3-extension-changelog.py b/scripts/patch-v1.3.3-extension-changelog.py new file mode 100644 index 00000000..0cbe520c --- /dev/null +++ b/scripts/patch-v1.3.3-extension-changelog.py @@ -0,0 +1,35 @@ +from pathlib import Path + +settings_path = Path("entrypoints/popup/components/Settings.tsx") +settings = settings_path.read_text(encoding="utf-8") + +if 'version: "1.3.3"' in settings: + raise RuntimeError("Settings changelog already contains version 1.3.3") + +marker = '''const CHANGELOG: ChangelogEntry[] = [ + { + version: "1.3.2", +''' +replacement = '''const CHANGELOG: ChangelogEntry[] = [ + { + version: "1.3.3", + date: "2026-07-29", + changes: [ + { + type: "Fixed", + items: [ + "Preserved the selected Google Workspace domain when generating website-aware aliases instead of forcing @gmail.com", + "Filtered previous aliases, recent history, and favorites by the active account to prevent Gmail data from appearing under a Workspace account", + "Rejected malformed base email addresses before generating inline alias suggestions", + ], + }, + ], + }, + { + version: "1.3.2", +''' + +if settings.count(marker) != 1: + raise RuntimeError("Expected Settings changelog marker was not found exactly once") + +settings_path.write_text(settings.replace(marker, replacement, 1), encoding="utf-8") From 608ca57cef4776717d62864e4e5a64b0c555e7af Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Wed, 29 Jul 2026 21:48:43 +0700 Subject: [PATCH 06/20] chore: add one-shot extension changelog workflow --- .../apply-v1.3.3-extension-changelog.yml | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 .github/workflows/apply-v1.3.3-extension-changelog.yml diff --git a/.github/workflows/apply-v1.3.3-extension-changelog.yml b/.github/workflows/apply-v1.3.3-extension-changelog.yml new file mode 100644 index 00000000..7ae96579 --- /dev/null +++ b/.github/workflows/apply-v1.3.3-extension-changelog.yml @@ -0,0 +1,59 @@ +name: Apply v1.3.3 extension changelog + +on: + pull_request: + types: [reopened] + +permissions: + contents: write + +jobs: + patch: + if: github.event.pull_request.number == 88 && github.head_ref == 'release/v1.3.3-workspace-alias-fix' + runs-on: ubuntu-latest + steps: + - name: Checkout release branch + uses: actions/checkout@v4 + with: + ref: ${{ github.head_ref }} + fetch-depth: 0 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: 24.x + + - name: Restore repository changelog + shell: bash + run: | + set -euo pipefail + git fetch origin dev + git checkout origin/dev -- CHANGELOG.md + + - name: Update extension changelog + run: python3 scripts/patch-v1.3.3-extension-changelog.py + + - name: Validate patched source + shell: bash + run: | + set -euo pipefail + corepack enable + yarn install --immutable --mode=skip-build + yarn exec wxt prepare + yarn compile --pretty false + yarn test + + - name: Commit patch and remove temporary files + shell: bash + run: | + set -euo pipefail + git rm \ + .github/workflows/apply-v1.3.3-extension-changelog.yml \ + scripts/patch-v1.3.3-extension-changelog.py + git config user.name "github-actions[bot]" + git config user.email "41898282+github-actions[bot]@users.noreply.github.com" + git add \ + CHANGELOG.md \ + entrypoints/popup/components/Settings.tsx + git commit -m "release: add v1.3.3 extension changelog" + git push origin HEAD:${{ github.head_ref }} From 1e4c3e48634baa94eb630e43a98cf03ee8ef9185 Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Wed, 29 Jul 2026 21:49:15 +0700 Subject: [PATCH 07/20] chore: retain v1.3.3 release version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6ed73408..19202bcd 100644 --- a/package.json +++ b/package.json @@ -61,4 +61,4 @@ "vitest": "^4.1.9", "wxt": "^0.20.27" } -} +} \ No newline at end of file From 9545d59ffefe6b5550ad4aa05fa5777eb73f320e Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Wed, 29 Jul 2026 21:49:51 +0700 Subject: [PATCH 08/20] chore: normalize package metadata formatting From 6a0b0f282cdbcccfa5968517a97419062772e72e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 29 Jul 2026 14:51:22 +0000 Subject: [PATCH 09/20] release: add v1.3.3 extension changelog --- .../apply-v1.3.3-extension-changelog.yml | 59 ------------------- CHANGELOG.md | 7 --- entrypoints/popup/components/Settings.tsx | 14 +++++ scripts/patch-v1.3.3-extension-changelog.py | 35 ----------- 4 files changed, 14 insertions(+), 101 deletions(-) delete mode 100644 .github/workflows/apply-v1.3.3-extension-changelog.yml delete mode 100644 scripts/patch-v1.3.3-extension-changelog.py diff --git a/.github/workflows/apply-v1.3.3-extension-changelog.yml b/.github/workflows/apply-v1.3.3-extension-changelog.yml deleted file mode 100644 index 7ae96579..00000000 --- a/.github/workflows/apply-v1.3.3-extension-changelog.yml +++ /dev/null @@ -1,59 +0,0 @@ -name: Apply v1.3.3 extension changelog - -on: - pull_request: - types: [reopened] - -permissions: - contents: write - -jobs: - patch: - if: github.event.pull_request.number == 88 && github.head_ref == 'release/v1.3.3-workspace-alias-fix' - runs-on: ubuntu-latest - steps: - - name: Checkout release branch - uses: actions/checkout@v4 - with: - ref: ${{ github.head_ref }} - fetch-depth: 0 - - - name: Setup Node.js - uses: actions/setup-node@v4 - with: - node-version: 24.x - - - name: Restore repository changelog - shell: bash - run: | - set -euo pipefail - git fetch origin dev - git checkout origin/dev -- CHANGELOG.md - - - name: Update extension changelog - run: python3 scripts/patch-v1.3.3-extension-changelog.py - - - name: Validate patched source - shell: bash - run: | - set -euo pipefail - corepack enable - yarn install --immutable --mode=skip-build - yarn exec wxt prepare - yarn compile --pretty false - yarn test - - - name: Commit patch and remove temporary files - shell: bash - run: | - set -euo pipefail - git rm \ - .github/workflows/apply-v1.3.3-extension-changelog.yml \ - scripts/patch-v1.3.3-extension-changelog.py - git config user.name "github-actions[bot]" - git config user.email "41898282+github-actions[bot]@users.noreply.github.com" - git add \ - CHANGELOG.md \ - entrypoints/popup/components/Settings.tsx - git commit -m "release: add v1.3.3 extension changelog" - git push origin HEAD:${{ github.head_ref }} diff --git a/CHANGELOG.md b/CHANGELOG.md index 0f136bae..26ffc0aa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,13 +5,6 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - -## [1.3.3] - 2026-07-29 - -### :bug: Bug Fixes - -- [`63c969f`](https://github.com/ePlus-DEV/gmail-alias-toolkit/commit/63c969f3cacc3c79e91ac7a76b4b8a46885601d5) - preserve Google Workspace domains when generating website aliases and prevent Gmail alias history or favorites from leaking into another active account *(commit by [@hoangsvit](https://github.com/hoangsvit))* - ## [1.3.1] - 2026-07-20 ### :sparkles: New Features - [`7148619`](https://github.com/ePlus-DEV/gmail-alias-toolkit/commit/7148619a98c09eaaee68376d4cd021149bd70c8f) - **release**: add Edge and Opera zip scripts *(commit by [@hoangsvit](https://github.com/hoangsvit))* diff --git a/entrypoints/popup/components/Settings.tsx b/entrypoints/popup/components/Settings.tsx index 57354bf6..91dc765f 100644 --- a/entrypoints/popup/components/Settings.tsx +++ b/entrypoints/popup/components/Settings.tsx @@ -84,6 +84,20 @@ const DEFAULT_SETTINGS: AppSettings = { const TOAST_DURATION = 2000; const CHANGELOG: ChangelogEntry[] = [ + { + version: "1.3.3", + date: "2026-07-29", + changes: [ + { + type: "Fixed", + items: [ + "Preserved the selected Google Workspace domain when generating website-aware aliases instead of forcing @gmail.com", + "Filtered previous aliases, recent history, and favorites by the active account to prevent Gmail data from appearing under a Workspace account", + "Rejected malformed base email addresses before generating inline alias suggestions", + ], + }, + ], + }, { version: "1.3.2", date: "2026-07-24", diff --git a/scripts/patch-v1.3.3-extension-changelog.py b/scripts/patch-v1.3.3-extension-changelog.py deleted file mode 100644 index 0cbe520c..00000000 --- a/scripts/patch-v1.3.3-extension-changelog.py +++ /dev/null @@ -1,35 +0,0 @@ -from pathlib import Path - -settings_path = Path("entrypoints/popup/components/Settings.tsx") -settings = settings_path.read_text(encoding="utf-8") - -if 'version: "1.3.3"' in settings: - raise RuntimeError("Settings changelog already contains version 1.3.3") - -marker = '''const CHANGELOG: ChangelogEntry[] = [ - { - version: "1.3.2", -''' -replacement = '''const CHANGELOG: ChangelogEntry[] = [ - { - version: "1.3.3", - date: "2026-07-29", - changes: [ - { - type: "Fixed", - items: [ - "Preserved the selected Google Workspace domain when generating website-aware aliases instead of forcing @gmail.com", - "Filtered previous aliases, recent history, and favorites by the active account to prevent Gmail data from appearing under a Workspace account", - "Rejected malformed base email addresses before generating inline alias suggestions", - ], - }, - ], - }, - { - version: "1.3.2", -''' - -if settings.count(marker) != 1: - raise RuntimeError("Expected Settings changelog marker was not found exactly once") - -settings_path.write_text(settings.replace(marker, replacement, 1), encoding="utf-8") From 06298a9db9738430a3302e0c263d150e430c54a4 Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Wed, 29 Jul 2026 21:57:26 +0700 Subject: [PATCH 10/20] chore: restore package trailing newline --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 19202bcd..6ed73408 100644 --- a/package.json +++ b/package.json @@ -61,4 +61,4 @@ "vitest": "^4.1.9", "wxt": "^0.20.27" } -} \ No newline at end of file +} From a8ef1af765368a64887f3b0343d2eb917993070d Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Wed, 29 Jul 2026 22:46:08 +0700 Subject: [PATCH 11/20] refactor: extract extension changelog data --- entrypoints/popup/data/changelog.ts | 175 ++++++++++++++++++++++++++++ 1 file changed, 175 insertions(+) create mode 100644 entrypoints/popup/data/changelog.ts diff --git a/entrypoints/popup/data/changelog.ts b/entrypoints/popup/data/changelog.ts new file mode 100644 index 00000000..2a8e6880 --- /dev/null +++ b/entrypoints/popup/data/changelog.ts @@ -0,0 +1,175 @@ +export type ChangelogChangeType = "Added" | "Changed" | "Fixed"; + +export interface ChangelogChange { + readonly type: ChangelogChangeType; + readonly items: readonly string[]; +} + +export interface ChangelogEntry { + readonly version: string; + readonly date: string; + readonly changes: readonly ChangelogChange[]; +} + +export const CHANGELOG: readonly ChangelogEntry[] = [ + { + version: "1.3.3", + date: "2026-07-29", + changes: [ + { + type: "Fixed", + items: [ + "Preserved the selected Google Workspace domain when generating website-aware aliases instead of forcing @gmail.com", + "Filtered previous aliases, recent history, and favorites by the active account to prevent Gmail data from appearing under a Workspace account", + "Rejected malformed base email addresses before generating inline alias suggestions", + ], + }, + ], + }, + { + version: "1.3.2", + date: "2026-07-24", + changes: [ + { + type: "Added", + items: [ + "Added generated-manifest scope verification with regression coverage for Chrome and Firefox-style permissions", + ], + }, + { + type: "Changed", + items: [ + "Aligned WXT development and production URL-scope handling", + "Restricted development builds to the configured site allowlist while preserving all-site production support", + ], + }, + { + type: "Fixed", + items: [ + "Restored inline popup availability in production builds", + "Prevented unrelated content scripts and broad development URL patterns from passing manifest validation", + ], + }, + ], + }, + { + version: "1.3.1", + date: "2026-07-20", + changes: [ + { + type: "Added", + items: [ + "Added Edge and Opera release packages with multi-browser installation guidance", + "Added an interactive product tour and richer landing-page previews", + ], + }, + { + type: "Changed", + items: [ + "Improved active email handling across the popup, inline helper, and context menus", + "Optimized inline popup behavior and displayed the active base email", + ], + }, + { + type: "Fixed", + items: [ + "Improved user feedback when disabling the inline helper or saving aliases", + "Fixed context-menu caching, history loading, injected icon cleanup, and development-site configuration", + ], + }, + ], + }, + { + version: "1.3.0", + date: "2026-07-13", + changes: [ + { + type: "Added", + items: [ + "Added website-aware alias suggestions based on the current hostname", + "Added an email input helper with inline icons, suggestion popups, live previews, and explicit Use actions", + "Added previous-alias navigation and an information panel explaining supported rules and local-only storage", + "Added expanded statistics metrics and Russian and Turkish translations", + "Added a product landing page with automated GitHub Pages deployment", + ], + }, + { + type: "Changed", + items: [ + "Enhanced the context menu with dynamic, website-specific alias suggestions", + "Updated the History tab to show aliases across websites and store history per email account", + "Improved popup navigation, layout, styling, and alias selection behavior", + "Reorganized the content script and colocated its email helper styles", + ], + }, + { + type: "Fixed", + items: [ + "Preserved email input width and flex layout when injecting the helper icon", + "Improved helper popup positioning and hover behavior to prevent accidental closing", + "Hid the Tags statistics tab when there is not enough data for a useful chart", + "Hardened content rendering against client-side cross-site scripting", + "Resolved code quality, localization, and build workflow issues", + ], + }, + ], + }, + { + version: "1.2.0", + date: "2026-07-03", + changes: [ + { + type: "Added", + items: [ + "Added Tailwind CSS v4, shadcn, and beUI motion components", + "Added Action Swap, Animated Badge, Bouncy Accordion, Theme Toggle, Tooltip, and Table integrations", + "Added dark mode toggle in the popup header", + "Added locale key coverage tests for all supported languages", + ], + }, + { + type: "Changed", + items: [ + "Redesigned popup, settings, generator tabs, Gmail tricks, history table, and changelog UI with a unified beUI style", + "Reworked Recent Aliases into a compact non-scrolling table with fixed action buttons", + "Improved dark mode contrast, spacing, hover states, tooltips, and responsive popup layout", + "Moved theme switching out of Settings and into the main popup header", + "Updated all supported locales with the new UI strings", + ], + }, + { + type: "Fixed", + items: [ + "\"Copy All\" no longer undercounts statistics for generated aliases", + "Settings/QR modals no longer render outside the popup bounds", + "Tab key now moves focus normally instead of being hijacked for @gmail.com autocomplete", + "Fixed missing imports and old component references after replacing legacy UI components", + "Fixed table overflow and hidden row action buttons in alias history", + "Fixed untranslated/fallback strings in the new UI", + ], + }, + ], + }, + { + version: "1.1.0", + date: "2025-12-30", + changes: [ + { + type: "Added", + items: [ + "Gmail alias generation with plus addressing", + "Preset management", + "Keyboard shortcuts", + "Statistics tracking", + ], + }, + { type: "Changed", items: ["Updated dependencies"] }, + { type: "Fixed", items: ["Bug fixes and improvements"] }, + ], + }, + { + version: "1.0.0", + date: "2025-12-30", + changes: [{ type: "Added", items: ["Initial release"] }], + }, +]; From 503b2d6f290e51d7eaabf2b95ddfb2fdea1aa3f6 Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Wed, 29 Jul 2026 22:46:59 +0700 Subject: [PATCH 12/20] test: validate extension changelog data --- tests/popup/changelogData.test.ts | 42 +++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 tests/popup/changelogData.test.ts diff --git a/tests/popup/changelogData.test.ts b/tests/popup/changelogData.test.ts new file mode 100644 index 00000000..79c249f8 --- /dev/null +++ b/tests/popup/changelogData.test.ts @@ -0,0 +1,42 @@ +import { describe, expect, it } from "vitest"; +import { CHANGELOG } from "../../entrypoints/popup/data/changelog"; +import { APP_VERSION } from "../../src/version"; + +/** Converts a semantic version into numeric parts for descending-order checks. */ +function parseVersion(version: string): number[] { + return version.split(".").map(Number); +} + +/** Compares two semantic versions from newest to oldest. */ +function compareVersionsDescending(first: string, second: string): number { + const firstParts = parseVersion(first); + const secondParts = parseVersion(second); + + for (let index = 0; index < 3; index += 1) { + const difference = (secondParts[index] ?? 0) - (firstParts[index] ?? 0); + if (difference !== 0) return difference; + } + + return 0; +} + +describe("extension changelog data", () => { + it("starts with the current package version", () => { + expect(CHANGELOG[0]?.version).toBe(APP_VERSION); + }); + + it("keeps versions unique and ordered from newest to oldest", () => { + const versions = CHANGELOG.map((entry) => entry.version); + + expect(new Set(versions).size).toBe(versions.length); + expect([...versions].sort(compareVersionsDescending)).toEqual(versions); + }); + + it("provides at least one non-empty change item for every release", () => { + for (const entry of CHANGELOG) { + expect(entry.date).toMatch(/^\d{4}-\d{2}-\d{2}$/); + expect(entry.changes.length).toBeGreaterThan(0); + expect(entry.changes.flatMap((change) => change.items)).not.toContain(""); + } + }); +}); From 862cedd65cbf9fc3cccf65bfcf3a95d566de6346 Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Wed, 29 Jul 2026 22:47:20 +0700 Subject: [PATCH 13/20] chore: add one-shot changelog extraction patch --- scripts/extract-extension-changelog.py | 36 ++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 scripts/extract-extension-changelog.py diff --git a/scripts/extract-extension-changelog.py b/scripts/extract-extension-changelog.py new file mode 100644 index 00000000..5bde115e --- /dev/null +++ b/scripts/extract-extension-changelog.py @@ -0,0 +1,36 @@ +from pathlib import Path + + +SETTINGS_PATH = Path("entrypoints/popup/components/Settings.tsx") + + +def replace_once(content: str, old: str, new: str) -> str: + """Replace one expected source fragment and fail when the branch has drifted.""" + count = content.count(old) + if count != 1: + raise RuntimeError(f"Expected exactly one source match, found {count}") + return content.replace(old, new, 1) + + +content = SETTINGS_PATH.read_text(encoding="utf-8") +content = replace_once( + content, + 'import { openUserGuide } from "src/utils/externalLinks";\n', + 'import { openUserGuide } from "src/utils/externalLinks";\n' + 'import { CHANGELOG } from "../data/changelog";\n', +) + +interfaces_start = content.index("interface ChangelogChange {") +interfaces_end = content.index("const DEFAULT_SETTINGS", interfaces_start) +content = content[:interfaces_start] + content[interfaces_end:] + +changelog_start = content.index("const CHANGELOG:") +changelog_end = content.index("interface SettingsPanelProps", changelog_start) +content = content[:changelog_start] + content[changelog_end:] + +if "interface ChangelogEntry" in content or "const CHANGELOG:" in content: + raise RuntimeError("Inline changelog declarations were not fully removed") +if 'import { CHANGELOG } from "../data/changelog";' not in content: + raise RuntimeError("Changelog data import was not added") + +SETTINGS_PATH.write_text(content, encoding="utf-8") From c45194f3e6ae91787bb55cf917641b64e538157c Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Wed, 29 Jul 2026 22:47:43 +0700 Subject: [PATCH 14/20] chore: add one-shot changelog extraction workflow --- .../workflows/extract-extension-changelog.yml | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 .github/workflows/extract-extension-changelog.yml diff --git a/.github/workflows/extract-extension-changelog.yml b/.github/workflows/extract-extension-changelog.yml new file mode 100644 index 00000000..9346a110 --- /dev/null +++ b/.github/workflows/extract-extension-changelog.yml @@ -0,0 +1,53 @@ +name: Extract extension changelog data + +on: + pull_request: + types: [reopened] + +permissions: + contents: write + +jobs: + patch: + if: github.event.pull_request.number == 88 && github.head_ref == 'release/v1.3.3-workspace-alias-fix' + runs-on: ubuntu-latest + steps: + - name: Checkout release branch + uses: actions/checkout@v4 + with: + ref: ${{ github.head_ref }} + fetch-depth: 0 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: 24.x + + - name: Extract changelog data from Settings + run: python3 scripts/extract-extension-changelog.py + + - name: Validate refactor + shell: bash + run: | + set -euo pipefail + corepack enable + yarn install --immutable --mode=skip-build + yarn exec wxt prepare + yarn compile --pretty false + yarn test + + - name: Commit refactor and remove temporary files + shell: bash + run: | + set -euo pipefail + git rm \ + .github/workflows/extract-extension-changelog.yml \ + scripts/extract-extension-changelog.py + git config user.name "github-actions[bot]" + git config user.email "41898282+github-actions[bot]@users.noreply.github.com" + git add \ + entrypoints/popup/components/Settings.tsx \ + entrypoints/popup/data/changelog.ts \ + tests/popup/changelogData.test.ts + git commit -m "refactor: separate extension changelog data" + git push origin HEAD:${{ github.head_ref }} From 11f8d6ecde70c0aff9d472c4952759617f20aa45 Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Wed, 29 Jul 2026 22:48:17 +0700 Subject: [PATCH 15/20] chore: keep release branch active --- package.json | 78 ++++++++++++++++++++++++++++++++-------------------- 1 file changed, 48 insertions(+), 30 deletions(-) diff --git a/package.json b/package.json index 6ed73408..4981f716 100644 --- a/package.json +++ b/package.json @@ -15,50 +15,68 @@ "node": ">=24.0.0" }, "scripts": { - "dev": "wxt", - "dev:firefox": "wxt -b firefox", "build": "wxt build", "build:firefox": "wxt build -b firefox", "zip": "wxt zip", "zip:firefox": "wxt zip -b firefox", - "zip:edge": "wxt zip -b edge", - "zip:opera": "wxt zip -b opera", + "zip:edge": "yarn build && node scripts/package-browser.mjs edge", + "zip:opera": "yarn build && node scripts/package-browser.mjs opera", + "release:all": "yarn zip && yarn zip:firefox && yarn zip:edge && yarn zip:opera", "compile": "tsc --noEmit", + "dev": "wxt", + "dev:firefox": "wxt -b firefox", + "postinstall": "wxt prepare", "test": "vitest run", "test:watch": "vitest", - "postinstall": "wxt prepare" + "test:coverage": "vitest run --coverage", + "test:coverage:open": "vitest run --coverage && node scripts/open-coverage.mjs" }, "dependencies": { - "@tanstack/react-virtual": "^3.14.5", - "@wxt-dev/auto-icons": "^1.1.0", - "@wxt-dev/module-react": "^1.1.5", + "@radix-ui/react-accordion": "^1.2.12", + "@radix-ui/react-dialog": "^1.1.15", + "@radix-ui/react-dropdown-menu": "^2.1.16", + "@radix-ui/react-label": "^2.1.8", + "@radix-ui/react-radio-group": "^1.3.8", + "@radix-ui/react-select": "^2.2.6", + "@radix-ui/react-slot": "^1.2.3", + "@radix-ui/react-switch": "^1.2.6", + "@radix-ui/react-tabs": "^1.1.13", + "@radix-ui/react-toast": "^1.2.15", + "@radix-ui/react-tooltip": "^1.2.8", + "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "lucide-react": "^0.468.0", - "motion": "^12.0.0", - "next-themes": "^0.4.6", - "qrcode": "^1.5.4", - "react": "^19.2.3", - "react-dom": "^19.2.3", - "tailwind-merge": "^2.6.0", - "tldts": "^7.4.8" + "motion": "^12.23.12", + "react": "^19.1.1", + "react-dom": "^19.1.1", + "tailwind-merge": "^3.3.1", + "tldts": "^7.0.15" }, "devDependencies": { - "@tailwindcss/postcss": "^4.3.2", - "@testing-library/dom": "^10.4.1", + "@eslint/js": "^9.39.1", + "@tailwindcss/postcss": "^4.1.14", "@testing-library/jest-dom": "^6.9.1", - "@testing-library/react": "^16.3.2", - "@testing-library/user-event": "^14.6.1", - "@types/qrcode": "^1.5.6", - "@types/react": "^19.2.7", - "@types/react-dom": "^19.2.3", - "@vitejs/plugin-react": "^6.0.3", - "autoprefixer": "^10.4.20", - "jsdom": "^29.1.1", - "postcss": "^8.5.10", - "tailwindcss": "^4", + "@testing-library/react": "^16.3.0", + "@types/node": "^24.10.1", + "@types/react": "^19.1.16", + "@types/react-dom": "^19.1.9", + "@vitest/coverage-v8": "^4.0.15", + "autoprefixer": "^10.4.22", + "eslint": "^9.39.1", + "eslint-plugin-react-hooks": "^7.0.1", + "eslint-plugin-react-refresh": "^0.4.24", + "fake-browser": "^0.1.1", + "jsdom": "^27.2.0", + "postcss": "^8.5.6", + "prettier": "^3.6.2", + "tailwindcss": "^4.1.14", "typescript": "^5.9.3", - "vite": "^8.1.1", - "vitest": "^4.1.9", - "wxt": "^0.20.27" + "typescript-eslint": "^8.48.0", + "vite": "^7.2.4", + "vitest": "^4.0.15", + "wxt": "^0.20.13" + }, + "resolutions": { + "tar": "^7.5.11" } } From e20fe7d99a3829ccc7e7e07eb116840042ac3053 Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Wed, 29 Jul 2026 22:48:59 +0700 Subject: [PATCH 16/20] fix: keep package metadata aligned with dev --- package.json | 78 ++++++++++++++++++++-------------------------------- 1 file changed, 30 insertions(+), 48 deletions(-) diff --git a/package.json b/package.json index 4981f716..6ed73408 100644 --- a/package.json +++ b/package.json @@ -15,68 +15,50 @@ "node": ">=24.0.0" }, "scripts": { + "dev": "wxt", + "dev:firefox": "wxt -b firefox", "build": "wxt build", "build:firefox": "wxt build -b firefox", "zip": "wxt zip", "zip:firefox": "wxt zip -b firefox", - "zip:edge": "yarn build && node scripts/package-browser.mjs edge", - "zip:opera": "yarn build && node scripts/package-browser.mjs opera", - "release:all": "yarn zip && yarn zip:firefox && yarn zip:edge && yarn zip:opera", + "zip:edge": "wxt zip -b edge", + "zip:opera": "wxt zip -b opera", "compile": "tsc --noEmit", - "dev": "wxt", - "dev:firefox": "wxt -b firefox", - "postinstall": "wxt prepare", "test": "vitest run", "test:watch": "vitest", - "test:coverage": "vitest run --coverage", - "test:coverage:open": "vitest run --coverage && node scripts/open-coverage.mjs" + "postinstall": "wxt prepare" }, "dependencies": { - "@radix-ui/react-accordion": "^1.2.12", - "@radix-ui/react-dialog": "^1.1.15", - "@radix-ui/react-dropdown-menu": "^2.1.16", - "@radix-ui/react-label": "^2.1.8", - "@radix-ui/react-radio-group": "^1.3.8", - "@radix-ui/react-select": "^2.2.6", - "@radix-ui/react-slot": "^1.2.3", - "@radix-ui/react-switch": "^1.2.6", - "@radix-ui/react-tabs": "^1.1.13", - "@radix-ui/react-toast": "^1.2.15", - "@radix-ui/react-tooltip": "^1.2.8", - "class-variance-authority": "^0.7.1", + "@tanstack/react-virtual": "^3.14.5", + "@wxt-dev/auto-icons": "^1.1.0", + "@wxt-dev/module-react": "^1.1.5", "clsx": "^2.1.1", "lucide-react": "^0.468.0", - "motion": "^12.23.12", - "react": "^19.1.1", - "react-dom": "^19.1.1", - "tailwind-merge": "^3.3.1", - "tldts": "^7.0.15" + "motion": "^12.0.0", + "next-themes": "^0.4.6", + "qrcode": "^1.5.4", + "react": "^19.2.3", + "react-dom": "^19.2.3", + "tailwind-merge": "^2.6.0", + "tldts": "^7.4.8" }, "devDependencies": { - "@eslint/js": "^9.39.1", - "@tailwindcss/postcss": "^4.1.14", + "@tailwindcss/postcss": "^4.3.2", + "@testing-library/dom": "^10.4.1", "@testing-library/jest-dom": "^6.9.1", - "@testing-library/react": "^16.3.0", - "@types/node": "^24.10.1", - "@types/react": "^19.1.16", - "@types/react-dom": "^19.1.9", - "@vitest/coverage-v8": "^4.0.15", - "autoprefixer": "^10.4.22", - "eslint": "^9.39.1", - "eslint-plugin-react-hooks": "^7.0.1", - "eslint-plugin-react-refresh": "^0.4.24", - "fake-browser": "^0.1.1", - "jsdom": "^27.2.0", - "postcss": "^8.5.6", - "prettier": "^3.6.2", - "tailwindcss": "^4.1.14", + "@testing-library/react": "^16.3.2", + "@testing-library/user-event": "^14.6.1", + "@types/qrcode": "^1.5.6", + "@types/react": "^19.2.7", + "@types/react-dom": "^19.2.3", + "@vitejs/plugin-react": "^6.0.3", + "autoprefixer": "^10.4.20", + "jsdom": "^29.1.1", + "postcss": "^8.5.10", + "tailwindcss": "^4", "typescript": "^5.9.3", - "typescript-eslint": "^8.48.0", - "vite": "^7.2.4", - "vitest": "^4.0.15", - "wxt": "^0.20.13" - }, - "resolutions": { - "tar": "^7.5.11" + "vite": "^8.1.1", + "vitest": "^4.1.9", + "wxt": "^0.20.27" } } From 59b2adb45fba9110304f2d503b46a4bfc094dc4b Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Wed, 29 Jul 2026 22:49:28 +0700 Subject: [PATCH 17/20] chore: normalize release package metadata From 875befa0c8ae699a6fd4872e81d7d5560087fd7e Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Wed, 29 Jul 2026 22:49:53 +0700 Subject: [PATCH 18/20] chore: preserve package formatting From b0d1e79d1dd5feb5584e0049608a1e075dae8b42 Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Wed, 29 Jul 2026 22:52:14 +0700 Subject: [PATCH 19/20] fix: import changelog types from data module --- scripts/extract-extension-changelog.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/scripts/extract-extension-changelog.py b/scripts/extract-extension-changelog.py index 5bde115e..9553f6b3 100644 --- a/scripts/extract-extension-changelog.py +++ b/scripts/extract-extension-changelog.py @@ -17,7 +17,11 @@ def replace_once(content: str, old: str, new: str) -> str: content, 'import { openUserGuide } from "src/utils/externalLinks";\n', 'import { openUserGuide } from "src/utils/externalLinks";\n' - 'import { CHANGELOG } from "../data/changelog";\n', + 'import {\n' + ' CHANGELOG,\n' + ' type ChangelogChange,\n' + ' type ChangelogEntry,\n' + '} from "../data/changelog";\n', ) interfaces_start = content.index("interface ChangelogChange {") @@ -30,7 +34,7 @@ def replace_once(content: str, old: str, new: str) -> str: if "interface ChangelogEntry" in content or "const CHANGELOG:" in content: raise RuntimeError("Inline changelog declarations were not fully removed") -if 'import { CHANGELOG } from "../data/changelog";' not in content: - raise RuntimeError("Changelog data import was not added") +if 'type ChangelogEntry,' not in content or 'type ChangelogChange,' not in content: + raise RuntimeError("Changelog data types were not imported") SETTINGS_PATH.write_text(content, encoding="utf-8") From 8b3271e71328b17d09157ad30dbbcc0430f7323e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 29 Jul 2026 15:53:27 +0000 Subject: [PATCH 20/20] refactor: separate extension changelog data --- .../workflows/extract-extension-changelog.yml | 53 ------ entrypoints/popup/components/Settings.tsx | 179 +----------------- scripts/extract-extension-changelog.py | 40 ---- 3 files changed, 5 insertions(+), 267 deletions(-) delete mode 100644 .github/workflows/extract-extension-changelog.yml delete mode 100644 scripts/extract-extension-changelog.py diff --git a/.github/workflows/extract-extension-changelog.yml b/.github/workflows/extract-extension-changelog.yml deleted file mode 100644 index 9346a110..00000000 --- a/.github/workflows/extract-extension-changelog.yml +++ /dev/null @@ -1,53 +0,0 @@ -name: Extract extension changelog data - -on: - pull_request: - types: [reopened] - -permissions: - contents: write - -jobs: - patch: - if: github.event.pull_request.number == 88 && github.head_ref == 'release/v1.3.3-workspace-alias-fix' - runs-on: ubuntu-latest - steps: - - name: Checkout release branch - uses: actions/checkout@v4 - with: - ref: ${{ github.head_ref }} - fetch-depth: 0 - - - name: Setup Node.js - uses: actions/setup-node@v4 - with: - node-version: 24.x - - - name: Extract changelog data from Settings - run: python3 scripts/extract-extension-changelog.py - - - name: Validate refactor - shell: bash - run: | - set -euo pipefail - corepack enable - yarn install --immutable --mode=skip-build - yarn exec wxt prepare - yarn compile --pretty false - yarn test - - - name: Commit refactor and remove temporary files - shell: bash - run: | - set -euo pipefail - git rm \ - .github/workflows/extract-extension-changelog.yml \ - scripts/extract-extension-changelog.py - git config user.name "github-actions[bot]" - git config user.email "41898282+github-actions[bot]@users.noreply.github.com" - git add \ - entrypoints/popup/components/Settings.tsx \ - entrypoints/popup/data/changelog.ts \ - tests/popup/changelogData.test.ts - git commit -m "refactor: separate extension changelog data" - git push origin HEAD:${{ github.head_ref }} diff --git a/entrypoints/popup/components/Settings.tsx b/entrypoints/popup/components/Settings.tsx index 91dc765f..3315d49d 100644 --- a/entrypoints/popup/components/Settings.tsx +++ b/entrypoints/popup/components/Settings.tsx @@ -24,6 +24,11 @@ import { parseDisabledInlineSites, } from "src/utils/inlineSiteSettings"; import { openUserGuide } from "src/utils/externalLinks"; +import { + CHANGELOG, + type ChangelogChange, + type ChangelogEntry, +} from "../data/changelog"; interface SettingsProps { isOpen: boolean; @@ -61,17 +66,6 @@ interface ConfirmationRequest { resolve: (confirmed: boolean) => void; } -interface ChangelogChange { - type: "Added" | "Changed" | "Fixed"; - items: string[]; -} - -interface ChangelogEntry { - version: string; - date: string; - changes: ChangelogChange[]; -} - const DEFAULT_SETTINGS: AppSettings = { customPresets: [], maxHistory: 20, @@ -83,169 +77,6 @@ const DEFAULT_SETTINGS: AppSettings = { const TOAST_DURATION = 2000; -const CHANGELOG: ChangelogEntry[] = [ - { - version: "1.3.3", - date: "2026-07-29", - changes: [ - { - type: "Fixed", - items: [ - "Preserved the selected Google Workspace domain when generating website-aware aliases instead of forcing @gmail.com", - "Filtered previous aliases, recent history, and favorites by the active account to prevent Gmail data from appearing under a Workspace account", - "Rejected malformed base email addresses before generating inline alias suggestions", - ], - }, - ], - }, - { - version: "1.3.2", - date: "2026-07-24", - changes: [ - { - type: "Added", - items: [ - "Added generated-manifest scope verification with regression coverage for Chrome and Firefox-style permissions", - ], - }, - { - type: "Changed", - items: [ - "Aligned WXT development and production URL-scope handling", - "Restricted development builds to the configured site allowlist while preserving all-site production support", - ], - }, - { - type: "Fixed", - items: [ - "Restored inline popup availability in production builds", - "Prevented unrelated content scripts and broad development URL patterns from passing manifest validation", - ], - }, - ], - }, - { - version: "1.3.1", - date: "2026-07-20", - changes: [ - { - type: "Added", - items: [ - "Added Edge and Opera release packages with multi-browser installation guidance", - "Added an interactive product tour and richer landing-page previews", - ], - }, - { - type: "Changed", - items: [ - "Improved active email handling across the popup, inline helper, and context menus", - "Optimized inline popup behavior and displayed the active base email", - ], - }, - { - type: "Fixed", - items: [ - "Improved user feedback when disabling the inline helper or saving aliases", - "Fixed context-menu caching, history loading, injected icon cleanup, and development-site configuration", - ], - }, - ], - }, - { - version: "1.3.0", - date: "2026-07-13", - changes: [ - { - type: "Added", - items: [ - "Added website-aware alias suggestions based on the current hostname", - "Added an email input helper with inline icons, suggestion popups, live previews, and explicit Use actions", - "Added previous-alias navigation and an information panel explaining supported rules and local-only storage", - "Added expanded statistics metrics and Russian and Turkish translations", - "Added a product landing page with automated GitHub Pages deployment", - ], - }, - { - type: "Changed", - items: [ - "Enhanced the context menu with dynamic, website-specific alias suggestions", - "Updated the History tab to show aliases across websites and store history per email account", - "Improved popup navigation, layout, styling, and alias selection behavior", - "Reorganized the content script and colocated its email helper styles", - ], - }, - { - type: "Fixed", - items: [ - "Preserved email input width and flex layout when injecting the helper icon", - "Improved helper popup positioning and hover behavior to prevent accidental closing", - "Hid the Tags statistics tab when there is not enough data for a useful chart", - "Hardened content rendering against client-side cross-site scripting", - "Resolved code quality, localization, and build workflow issues", - ], - }, - ], - }, - { - version: "1.2.0", - date: "2026-07-03", - changes: [ - { - type: "Added", - items: [ - "Added Tailwind CSS v4, shadcn, and beUI motion components", - "Added Action Swap, Animated Badge, Bouncy Accordion, Theme Toggle, Tooltip, and Table integrations", - "Added dark mode toggle in the popup header", - "Added locale key coverage tests for all supported languages", - ], - }, - { - type: "Changed", - items: [ - "Redesigned popup, settings, generator tabs, Gmail tricks, history table, and changelog UI with a unified beUI style", - "Reworked Recent Aliases into a compact non-scrolling table with fixed action buttons", - "Improved dark mode contrast, spacing, hover states, tooltips, and responsive popup layout", - "Moved theme switching out of Settings and into the main popup header", - "Updated all supported locales with the new UI strings", - ], - }, - { - type: "Fixed", - items: [ - '"Copy All" no longer undercounts statistics for generated aliases', - "Settings/QR modals no longer render outside the popup bounds", - "Tab key now moves focus normally instead of being hijacked for @gmail.com autocomplete", - "Fixed missing imports and old component references after replacing legacy UI components", - "Fixed table overflow and hidden row action buttons in alias history", - "Fixed untranslated/fallback strings in the new UI", - ], - }, - ], - }, - { - version: "1.1.0", - date: "2025-12-30", - changes: [ - { - type: "Added", - items: [ - "Gmail alias generation with plus addressing", - "Preset management", - "Keyboard shortcuts", - "Statistics tracking", - ], - }, - { type: "Changed", items: ["Updated dependencies"] }, - { type: "Fixed", items: ["Bug fixes and improvements"] }, - ], - }, - { - version: "1.0.0", - date: "2025-12-30", - changes: [{ type: "Added", items: ["Initial release"] }], - }, -]; - interface SettingsPanelProps { settings: AppSettings; saveSettings: (settings: AppSettings) => Promise; diff --git a/scripts/extract-extension-changelog.py b/scripts/extract-extension-changelog.py deleted file mode 100644 index 9553f6b3..00000000 --- a/scripts/extract-extension-changelog.py +++ /dev/null @@ -1,40 +0,0 @@ -from pathlib import Path - - -SETTINGS_PATH = Path("entrypoints/popup/components/Settings.tsx") - - -def replace_once(content: str, old: str, new: str) -> str: - """Replace one expected source fragment and fail when the branch has drifted.""" - count = content.count(old) - if count != 1: - raise RuntimeError(f"Expected exactly one source match, found {count}") - return content.replace(old, new, 1) - - -content = SETTINGS_PATH.read_text(encoding="utf-8") -content = replace_once( - content, - 'import { openUserGuide } from "src/utils/externalLinks";\n', - 'import { openUserGuide } from "src/utils/externalLinks";\n' - 'import {\n' - ' CHANGELOG,\n' - ' type ChangelogChange,\n' - ' type ChangelogEntry,\n' - '} from "../data/changelog";\n', -) - -interfaces_start = content.index("interface ChangelogChange {") -interfaces_end = content.index("const DEFAULT_SETTINGS", interfaces_start) -content = content[:interfaces_start] + content[interfaces_end:] - -changelog_start = content.index("const CHANGELOG:") -changelog_end = content.index("interface SettingsPanelProps", changelog_start) -content = content[:changelog_start] + content[changelog_end:] - -if "interface ChangelogEntry" in content or "const CHANGELOG:" in content: - raise RuntimeError("Inline changelog declarations were not fully removed") -if 'type ChangelogEntry,' not in content or 'type ChangelogChange,' not in content: - raise RuntimeError("Changelog data types were not imported") - -SETTINGS_PATH.write_text(content, encoding="utf-8")