From 22061486a8d69d25413c35d126e37252190692ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomek=20W=C3=B3jcik?= Date: Wed, 19 Nov 2025 20:28:31 +0100 Subject: [PATCH] BTHLABS-66: Prepping for public release: Take two --- services/extension/README.md | 33 +++++++++++ services/extension/src/content/main.js | 13 ++++- services/extension/src/manifest/firefox.json | 4 +- services/extension/tasks.py | 56 ++++++++++++++----- .../tasks/__init__.py | 2 +- .../hotpocket_workspace_tools/tasks/utils.py | 12 ++-- 6 files changed, 96 insertions(+), 24 deletions(-) diff --git a/services/extension/README.md b/services/extension/README.md index 05b4b04..619de2c 100644 --- a/services/extension/README.md +++ b/services/extension/README.md @@ -1,3 +1,36 @@ # HotPocket by BTHLabs This repository contains the _HotPocket Extension_ project. + +## Development environment setup + +### Requirements + +* macOS (18 or newer) or modern Linux (including WSL2). +* nodejs v22.14 or later. +* yarnpkg v1.22.22 or newer. + +### Setup + +1. `yarn install` + +## Building browser-specific extensions + +To build a browser-specific extension, use the following command: + +``` +$ yarn build: +``` + +Where `` is the name of the browser. The currently supported targets +are: `safari`, `firefox`, `chrome`. The build result will be placed in +`dist/-production` for Firefox and Chrome extensions. Safari +extension will be built in the `apple` service tree. + +## Author + +_HotPocket_ is developed by [BTHLabs](https://www.bthlabs.pl/). + +## License + +_HotPocket_ is licensed under the Apache 2.0 License. diff --git a/services/extension/src/content/main.js b/services/extension/src/content/main.js index ae660e4..5479892 100644 --- a/services/extension/src/content/main.js +++ b/services/extension/src/content/main.js @@ -19,15 +19,22 @@ class Popup { this.timeout = null; } }; + replaceInnerHTML = (element, content) => { + for (let child of element.childNodes) { + element.removeChild(child); + } + + element.insertAdjacentHTML('beforeend', content); + }; setContent = (content) => { const shadow = this.container.shadowRoot; const body = shadow.querySelector('.hotpocket-extension-popup-body'); - body.innerHTML = content; + this.replaceInnerHTML(body, content); const i18nElements = shadow.querySelectorAll('[data-message]'); for (let i18nElement of i18nElements) { - i18nElement.innerHTML = HotPocketExtension.api.i18n.getMessage( + i18nElement.textContent = HotPocketExtension.api.i18n.getMessage( i18nElement.dataset.message, ); } @@ -48,7 +55,7 @@ class Popup { this.container.hotPocketExtensionPopup = this; const shadow = this.container.attachShadow({mode: 'open'}); - shadow.innerHTML = POPUP; + shadow.setHTMLUnsafe(POPUP); this.setContent(content); diff --git a/services/extension/src/manifest/firefox.json b/services/extension/src/manifest/firefox.json index 733b9fa..3ef1c17 100644 --- a/services/extension/src/manifest/firefox.json +++ b/services/extension/src/manifest/firefox.json @@ -14,7 +14,7 @@ }, "browser_specific_settings": { "gecko": { - "id": "@Extension.HotPocket.BTHLabs", + "id": "@Production.Extension.HotPocket.BTHLabs", "strict_min_version": "142.0", "data_collection_permissions": { "required": [ @@ -24,4 +24,4 @@ } } } -} +} \ No newline at end of file diff --git a/services/extension/tasks.py b/services/extension/tasks.py index 103d11e..6c3d901 100644 --- a/services/extension/tasks.py +++ b/services/extension/tasks.py @@ -14,7 +14,7 @@ import werkzeug import werkzeug.routing from hotpocket_workspace_tools import get_workspace_mode -from hotpocket_workspace_tools.tasks import * # noqa: F401,F403 +from hotpocket_workspace_tools.tasks import bump_version, get_version # noqa: F401 WORKSPACE_MODE = get_workspace_mode() @@ -198,26 +198,54 @@ def build_safari(ctx: Context): @task(pre=[clean]) def build_chrome(ctx: Context): ctx.run('yarn build:chrome') - ctx.run(' '.join([ - r'/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome', - '--pack-extension=dist/chrome-production/', - '--pack-extension-key=secrets/chrome.pem', - ])) + + with ctx.cd('dist/chrome-production'): + current_version = get_version(ctx) + + ctx.run(' '.join([ + 'zip', + '-r', + f'../chrome-production-{current_version}.zip', + '.', + ])) @task(pre=[clean]) def build_firefox(ctx: Context): ctx.run('yarn build:firefox') - firefox_secrets = None - with open('secrets/firefox.json', 'r', encoding='utf-8') as firefox_secrets_f: - firefox_secrets = json.load(firefox_secrets_f) - with ctx.cd('dist/firefox-production'): ctx.run(' '.join([ 'web-ext', - 'sign', - '--channel=unlisted', - f'--api-key={firefox_secrets["api_key"]}', - f'--api-secret={firefox_secrets["api_secret"]}', + 'lint', + ])) + + current_version = get_version(ctx) + + ctx.run(' '.join([ + 'zip', + '-r', + f'../firefox-production-{current_version}.zip', + '.', + ])) + + +@task +def build_firefox_source(ctx: Context): + # AMO requires source bundle to be uploaded alongside the built version. + ctx.run('rm -rf dist/firefox-source') + ctx.run('mkdir -p dist/firefox-source dist/firefox-source/assets dist/firefox-source/src') + + ctx.run('rsync -arv assets/ dist/firefox-source/assets/') + ctx.run('rsync -arv src/ dist/firefox-source/src/') + ctx.run('rsync -arv eslint.config.js package.json README.md rollup.config.js yarn.lock dist/firefox-source/') + + with ctx.cd('dist/firefox-source'): + current_version = get_version(ctx) + + ctx.run(' '.join([ + 'zip', + '-r', + f'../firefox-source-{current_version}.zip', + '.', ])) diff --git a/services/packages/workspace_tools/hotpocket_workspace_tools/tasks/__init__.py b/services/packages/workspace_tools/hotpocket_workspace_tools/tasks/__init__.py index 1449414..78fff0d 100644 --- a/services/packages/workspace_tools/hotpocket_workspace_tools/tasks/__init__.py +++ b/services/packages/workspace_tools/hotpocket_workspace_tools/tasks/__init__.py @@ -1 +1 @@ -from .utils import bump_version # noqa: F401 +from .utils import bump_version, get_version # noqa: F401 diff --git a/services/packages/workspace_tools/hotpocket_workspace_tools/tasks/utils.py b/services/packages/workspace_tools/hotpocket_workspace_tools/tasks/utils.py index ddfbbbd..8591c64 100644 --- a/services/packages/workspace_tools/hotpocket_workspace_tools/tasks/utils.py +++ b/services/packages/workspace_tools/hotpocket_workspace_tools/tasks/utils.py @@ -4,12 +4,16 @@ from __future__ import annotations from invoke import Context, task +def get_version(ctx: Context) -> str: + result = ctx.run('poetry version -s --no-ansi', hide='out') + assert result is not None, 'Hm?' + + return result.stdout.strip() + + @task def bump_version(ctx: Context, next_version: str, build: str | None = None): - current_version_result = ctx.run('poetry version -s --no-ansi', hide='out') - assert current_version_result is not None, 'Hm?' - - current_version = current_version_result.stdout.strip() + current_version = get_version(ctx) print(f'Bumping version: `{current_version}` -> `{next_version}`')