Compare commits

...

80 Commits

Author SHA1 Message Date
github-actions[bot] 0404637da8 chore(release): wxt v0.20.12
📼 VHS / Create VHS (push) Waiting to run
2025-12-16 20:57:58 +00:00
Aaron 98d95e4b7f chore(deps): Upgrade node-forge to address CVE-2025-12816, CVE-2025-66031 (#2003) 2025-12-16 14:50:50 -06:00
Aaron 2687a35781 chore(dev-deps): Upgrade happy-dom to address CVE-2025-61927 (#2002) 2025-12-16 14:41:09 -06:00
Aaron 886dae28fa chore: Upgrade dev and non-major prod dependencies (#2000) 2025-12-16 14:33:59 -06:00
Aaron 8c9bc8cdbc chore: Add support for vite-node v5 (#2001) 2025-12-16 11:46:06 -06:00
Jaguar Zhou 5414a0aa34 fix: wxt prepare fails with the error "__vite_ssr_exportName__ is not defined" when using Vite 7 (#1884)
Co-authored-by: Aaron <aaronklinker1@gmail.com>
2025-12-16 11:04:14 -06:00
K.Utsunomiya 223cf8613b docs: Add note about reviewing project structure in migration guide (#1990) 2025-12-16 08:36:02 -06:00
Alexander Harding 4f1776befc feat: Default to using use_dynamic_url: true for content script css files (#1993)
Co-authored-by: Aaron <aaronklinker1@gmail.com>
2025-12-15 19:04:07 -06:00
Aaron 38473b9f6c chore: Fix formatting 2025-12-15 18:42:23 -06:00
Manabu Nakazawa 41b428c75f docs: Add "Redirect Web" to homepage (#1995)
Co-authored-by: Aaron <aaronklinker1@gmail.com>
2025-12-15 18:32:41 -06:00
yiang231 d8d754658f docs: Add "defineConfig" config to startup examples (#1989) 2025-12-15 18:31:43 -06:00
Shawn e52ebf1d53 docs: Change manifest.title to manifest.name in build:manifestGenerated hook example (#1985) 2025-12-15 18:29:10 -06:00
Nguyen Canh Toan 535c7a5f92 docs: add Zen Virtual Piano & Crypto Pulse to example projects (#1977) 2025-12-15 18:27:21 -06:00
TomvdPeet 99b2bd784a Fix comments for includeSources and excludeSources (#1998)
Co-authored-by: Aaron <aaronklinker1@gmail.com>
2025-12-15 18:19:48 -06:00
Aaron 31ebf966fd chore: Fix other type error after chrome types update 2025-12-15 18:19:25 -06:00
Aaron 6036c6e8e0 chore: Fix type errors after chrome type upgrades 2025-12-15 18:14:29 -06:00
Aaron 597151b5dd ci: Fix browser auto-release workflow 2025-12-15 18:07:44 -06:00
aklinker1 29aeaed223 fix: Upgrade @wxt-dev/browser to latest @types/chrome version 2025-12-11 18:41:00 +00:00
Alex Khrisanfov edf87952c7 ci: Fix update-browser-package action (#1992)
Co-authored-by: Aaron <aaronklinker1@gmail.com>
2025-12-11 12:39:18 -06:00
Aaron 78f8434a06 chore: Use linkedom a test instead of happy-dom (#1957) 2025-10-27 18:11:56 -05:00
Aaron 7eaccad683 chore: Update lockfile 2025-10-27 17:49:24 -05:00
Aaron bfa9c1e1c8 chore: Move PNPM settings to pnpm-workspace.yaml folder 2025-10-27 17:39:59 -05:00
Aaron a2d6577579 docs: Fix syntax error 2025-10-27 17:20:59 -05:00
Ethan Lanting 0e8191488f docs: Added "BetterCampus (prev. BetterCanvas)" to the homepage (#1888)
Co-authored-by: Aaron <aaronklinker1@gmail.com>
2025-10-27 17:08:12 -05:00
Shahil Yadav a1510bb081 docs: Added "Leetcode Fonts" to the homepage (#1889)
Co-authored-by: Aaron <aaronklinker1@gmail.com>
2025-10-27 17:07:05 -05:00
Fantasy 1eaca30f97 docs: Added "sitedata" and "TranslateManga" to homepage (#1902)
Co-authored-by: Aaron <aaronklinker1@gmail.com>
2025-10-27 17:05:52 -05:00
yukidaruma bc79987ed5 docs: Added "Livestream Chat Reader" to the homepage (#1910)
Co-authored-by: Aaron <aaronklinker1@gmail.com>
2025-10-27 17:04:46 -05:00
Alexander Harding 36a501506e feat: Remove data-wxt-* attributes (#1913) 2025-10-27 17:03:01 -05:00
dependabot[bot] e1d47f5f63 chore(deps): bump codecov/codecov-action from 5.5.0 to 5.5.1 (#1920)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-10-27 16:55:26 -05:00
dependabot[bot] 7faa9b5a64 chore(deps): bump docker/login-action from 3.5.0 to 3.6.0 (#1921)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-10-27 16:55:00 -05:00
dependabot[bot] 295bee708c chore(deps): bump actions/github-script from 7.0.1 to 8.0.0 (#1922)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-10-27 16:54:32 -05:00
Burak Unver 9e917481c4 docs: Added "ChatGPT Token Counter" to the homepage (#1926)
Co-authored-by: Aaron <aaronklinker1@gmail.com>
2025-10-27 16:53:41 -05:00
anghunk c5a8b9fb3d docs: Add LinuxDo Scripts extension to the list (#1940) 2025-10-27 16:26:46 -05:00
Florian Kühne 3f4e32f8da fix: Optimize splitShadowRootCss (#1934)
Co-authored-by: Aaron <aaronklinker1@gmail.com>
2025-10-27 16:06:01 -05:00
Aaron f630098f1d chore: Upgrade @aklinker1/check to reduce dev dep size 2025-10-27 09:09:20 -05:00
Eli 608d6e2b54 ci: Don't run cron jobs on forks (#1951) 2025-10-26 20:53:35 -05:00
github-actions[bot] fad5ab6c44 chore(release): @wxt-dev/storage v1.2.6
📼 VHS / Create VHS (push) Waiting to run
2025-10-25 16:40:59 +00:00
Aaron d4cb7997fe ci: Publish packages using OIDC with correctly generated package.json
files
2025-10-25 11:34:59 -05:00
Carlos Ortiz 28364b8be1 ci: publish using pnpm instead of npm (#1943) 2025-10-24 21:11:43 -05:00
github-actions[bot] d28a5c7d5e chore(release): @wxt-dev/storage v1.2.5
📼 VHS / Create VHS (push) Waiting to run
2025-10-13 03:09:36 +00:00
Aaron df707aef4c ci: Use correct version of NPM that supports OIDC auth 2025-10-12 22:02:37 -05:00
Aaron 77af2e58ec ci: Log all NPM versions on runner 2025-10-12 21:59:34 -05:00
Aaron f738e56337 ci: Upgrade actions/setup-node to v5 2025-10-12 21:57:24 -05:00
Aaron f2fe2584e0 ci: try out ubuntu-24.04 runner 2025-10-12 21:53:28 -05:00
Aaron 02673ae017 ci: Debug installed NPM versions more 2025-10-12 21:51:37 -05:00
Aaron 8dd294a163 ci: Disable publishing while debugging NPM changes 2025-10-12 21:49:01 -05:00
Aaron 469e735d53 ci: List installed NPM version 2025-10-12 21:47:57 -05:00
github-actions[bot] b02001796e chore(release): @wxt-dev/storage v1.2.4
📼 VHS / Create VHS (push) Waiting to run
2025-10-13 02:46:42 +00:00
Aaron 0d4d2fdd7e ci: Print NPM version 2025-10-12 21:42:15 -05:00
github-actions[bot] b65e5446fa chore(release): @wxt-dev/storage v1.2.3
📼 VHS / Create VHS (push) Waiting to run
2025-10-13 02:00:40 +00:00
Aaron f75fe3ce5b ci: Separate NPM upgrade from publish step 2025-10-12 20:52:54 -05:00
github-actions[bot] 59ba2712cf chore(release): @wxt-dev/storage v1.2.2
📼 VHS / Create VHS (push) Waiting to run
2025-10-13 01:45:12 +00:00
github-actions[bot] fefe601541 chore(release): @wxt-dev/storage v1.2.1
📼 VHS / Create VHS (push) Waiting to run
2025-10-11 17:41:03 +00:00
Aaron 7291c60413 ci: Support NPM OIDC publishing flow and add provenance (#1932) 2025-10-11 12:36:05 -05:00
Jaguar Zhou bb679102b1 fix: wxt normal logs are drowned by dotenv@17.0.0 ads (#1883) 2025-09-09 08:04:18 -05:00
Alexey Karetnikov 16027c8971 chore(templates): Fix typo vite -> wxt (#1885) 2025-09-09 08:02:40 -05:00
github-actions[bot] 84405a33e3 chore(release): wxt v0.20.11
📼 VHS / Create VHS (push) Waiting to run
2025-09-05 13:11:49 +00:00
Aaron bdf795c3f2 chore(deps): Upgrade project subdependencies (#1882) 2025-09-05 08:06:38 -05:00
Qijia Liu ab73084bb5 fix: input_components is supported by mv3 (#1881) 2025-09-05 07:58:09 -05:00
marcellino ornelas e9fb4c5414 fix: Split wxt/testing into separate modules to fix issues with jsdom and happy-dom (#1844)
Co-authored-by: Aaron <aaronklinker1@gmail.com>
2025-09-04 13:56:43 -05:00
github-actions[bot] bc54f525e4 chore(release): @wxt-dev/module-react v1.1.5
📼 VHS / Create VHS (push) Waiting to run
2025-09-04 14:06:52 +00:00
Aaron 9170159bc1 chore(deps): Support @vitejs/plugin-react@5 2025-09-04 09:01:01 -05:00
github-actions[bot] fa657a0366 chore(release): wxt v0.20.10
📼 VHS / Create VHS (push) Waiting to run
2025-09-04 00:03:50 +00:00
Aaron 24920ddd52 chore(deps): publish-browser-extension upgrade (#1880) 2025-09-03 18:59:39 -05:00
Aaron eb0b372113 chore(deps): Upgrade web-ext-run to support CDP (#1879) 2025-09-03 18:51:26 -05:00
Aaron 8f5f4f674e chore(deps): Upgrade non-breaking production dependencies (#1877) 2025-09-03 18:12:54 -05:00
Aaron 38c1dae9c7 ci: Fix fetch depth for notification workflow 2025-09-03 18:08:35 -05:00
Aaron f92bcd1d14 ci: Remove embed from discord notification 2025-09-03 18:07:10 -05:00
Aaron df09b86d23 ci: Fix notification workflow round 4 2025-09-03 18:05:04 -05:00
Aaron bd5cfa10ad ci: Fix notification workflow round 3 2025-09-03 18:00:57 -05:00
github-actions[bot] 94914dd1ad chore(release): wxt v0.20.9
📼 VHS / Create VHS (push) Waiting to run
2025-09-03 22:55:34 +00:00
Aaron dfbb58a2f1 ci: Fix notification workflow round 2 2025-09-03 17:50:13 -05:00
github-actions[bot] 54a1c3576f chore(release): @wxt-dev/storage v1.2.0
📼 VHS / Create VHS (push) Waiting to run
2025-09-03 22:49:56 +00:00
Aaron 9ddf73b4fe ci: Fix notification workflow 2025-09-03 17:44:39 -05:00
github-actions[bot] 4ceec1a6ab chore(release): @wxt-dev/runner v0.1.2
📼 VHS / Create VHS (push) Waiting to run
2025-09-03 22:44:18 +00:00
Aaron ba314d7434 chore: Add manual dispatch to new notification workflow 2025-09-03 17:39:23 -05:00
github-actions[bot] 55fed67067 chore(release): @wxt-dev/module-vue v1.0.3
📼 VHS / Create VHS (push) Waiting to run
2025-09-03 22:39:02 +00:00
Aaron 852390092e ci: Send a weekly notification to discord summarizing the unreleased commits 2025-09-03 17:34:02 -05:00
github-actions[bot] 067be3fed3 chore(release): @wxt-dev/module-svelte v2.0.4
📼 VHS / Create VHS (push) Waiting to run
2025-09-03 22:32:01 +00:00
github-actions[bot] 1aecdbb71c chore(release): @wxt-dev/module-solid v1.1.4
📼 VHS / Create VHS (push) Waiting to run
2025-09-03 22:26:05 +00:00
66 changed files with 5858 additions and 6123 deletions
+1 -1
View File
@@ -18,7 +18,7 @@ runs:
uses: pnpm/action-setup@f2b2b233b538f500472c7274c7012f57857d8ce0 # v4.1.0
- name: 🛠️ Setup NodeJS
uses: actions/setup-node@b7234cc9fe124f0f4932554b4e5284543083ae7b # v4.4.0
uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0
with:
node-version: 20
cache: pnpm
@@ -0,0 +1,36 @@
name: 🔔 Notify Unreleased Commits
on:
workflow_dispatch:
schedule:
- cron: '0 20 * * 1' # Weekly at 8 PM UTC (3 PM CT)
jobs:
notify:
runs-on: ubuntu-22.04
if: github.repository_owner == 'wxt-dev'
steps:
- name: Checkout
uses: actions/checkout@ff7abcd0c3c05ccf6adc123a8cd1fd4fb30fb493 # v5.0.0
with:
fetch-depth: 0
- name: List Commits
id: list-commits
run: |
./scripts/list-unreleased-commits.sh > summary.txt
- name: Discord notification
run: |
PAYLOAD=$(jq -n --arg content "${{ env.MESSAGE }}" '{"content": $content}')
curl -X POST \
-F "payload_json=${PAYLOAD}" \
-F "file1=@summary.txt" \
$DISCORD_WEBHOOK
env:
DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK_UNRELEASED_COMMITS }}
MESSAGE: |
If a package needs released, please [run the workflow](<https://github.com/wxt-dev/wxt/actions/workflows/release.yml>).
Before running, consider:
- Are there any breaking changes? If so, prepare a list of breaking changes and update the changelog and release notes after the release.
- Are there any PRs open that we wait to release after they're merged?
+1 -1
View File
@@ -16,7 +16,7 @@ jobs:
steps:
- name: Post Thank You Comment
uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0
env:
comment: Thanks for helping make WXT better!
with:
+1 -1
View File
@@ -29,7 +29,7 @@ jobs:
uses: ./.github/actions/setup
- name: Login to Docker Registry
uses: docker/login-action@184bdaa0721073962dff0199f1fb9940f07167d1 # v3.5.0
uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3.6.0
with:
registry: https://${{ secrets.DOCKER_REGISTRY_HOSTNAME }}
username: ${{ secrets.DOCKER_REGISTRY_USERNAME }}
+6 -5
View File
@@ -31,9 +31,10 @@ jobs:
publish:
name: Publish
runs-on: ubuntu-22.04
runs-on: ubuntu-24.04
permissions:
contents: write
contents: write # Push version changes
id-token: write # OIDC for NPM publishing
needs:
- validate
steps:
@@ -61,9 +62,9 @@ jobs:
- name: Publish to NPM
working-directory: packages/${{ inputs.package }}
run: |
echo "//registry.npmjs.org/:_authToken=${{ secrets.NPM_AUTH_TOKEN }}" > ~/.npmrc
pnpm build
pnpm publish
pnpm pack
sudo npm i -g npm@latest
/usr/local/bin/npm publish *.tgz
- name: Create GitHub release
run: pnpm tsx scripts/create-github-release.ts ${{ inputs.package }}
+9 -4
View File
@@ -11,11 +11,15 @@ jobs:
sync:
name: 'Sync with @types/chrome'
runs-on: ubuntu-latest
if: github.repository_owner == 'wxt-dev'
permissions:
contents: write
contents: write # Push version changes
id-token: write # OIDC for NPM publishing
steps:
- name: Checkout
uses: actions/checkout@ff7abcd0c3c05ccf6adc123a8cd1fd4fb30fb493 # v5.0.0
with:
ssh-key: ${{ secrets.DEPLOY_KEY }}
- name: Setup
uses: ./.github/actions/setup
@@ -38,9 +42,10 @@ jobs:
with:
commit_message: 'fix: Upgrade `@wxt-dev/browser` to latest `@types/chrome` version'
- name: Publish Package
- name: Publish to NPM
if: steps.commit.outputs.changes_detected == 'true'
working-directory: packages/browser
run: |
echo "//registry.npmjs.org/:_authToken=${{ secrets.NPM_AUTH_TOKEN }}" > ~/.npmrc
pnpm publish
pnpm pack
sudo npm i -g npm@latest
/usr/local/bin/npm publish *.tgz
+1 -1
View File
@@ -86,7 +86,7 @@ jobs:
- name: Upload Coverage
if: matrix.coverage
uses: codecov/codecov-action@fdcc8476540edceab3de004e990f80d881c6cc00 # v5.5.0
uses: codecov/codecov-action@5a1091511ad55cbe89839c7260b706298ca349f7 # v5.5.1
env:
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
@@ -102,6 +102,16 @@ const chromeExtensionIds = [
'ehmoihnjgkdimihkhokkmfjdgomohjgm', // Filmbudd Pro - Simple, private and synced ratings and watch notes across all your devices
'alglchohmdikgdjhafiicilegegieafa', // MultiField CopyCat - Copy, Paste & Autofill Web Forms Instantly
'aamihahiiogceidpbnfgehacgiecephe', // ChatSight - Add Table of Contents to ChatGPT
'cndibmoanboadcifjkjbdpjgfedanolh', // BetterCampus (prev. BetterCanvas)
'hinfimgacobnellbncbcpdlpaapcofaa', // Leetcode Fonts - Change fonts in leetcode effortlessly
'kbkbfefhhabpkibojinapkkgciiacggg', // TranslateManga - Manga Translator & Manga Tracker
'emeakbgdecgmdjgegnejpppcnkcnoaen', // SiteData - Free Website Traffic Checker & Reverse AdSense Tool
'gpnckbhgpnjciklpoehkmligeaebigaa', // Livestream Chat Reader - Text-to-Speech for YouTube/Twitch chat
'fjlalaedpfcojcfpkgkglbjjbbkofgnl', // ChatGPT Token Counter - Count tokens in real time on chatgpt conversation
'fbgblmjbeebanackldpbmpacppflgmlj', // LinuxDo Scripts - 为 linux.do 用户提供了一些增强功能
'dfacnjidgbagicaekenjgclfnhdnjjdi', // Zen Virtual Piano - https://zen-piano.web.app/
'naeibcegmgpofimedkmfgjgphfhfhlab', // Crypto Pulse price tracker - https://get-crypto-pulse.web.app/
'ffglckbhfbfmdkefdmjbhpnffkcmlhdh', // Redirect Web - Automatically redirect pages or open them in another app
];
const { data, err, isLoading } = useListExtensionDetails(chromeExtensionIds);
@@ -41,6 +41,18 @@ export default defineWebExtConfig({
});
```
```ts [wxt.config.ts]
export default defineConfig({
webExt: {
binaries: {
chrome: '/path/to/chrome-beta', // Use Chrome Beta instead of regular Chrome
firefox: 'firefoxdeveloperedition', // Use Firefox Developer Edition instead of regular Firefox
edge: '/path/to/edge', // Open MS Edge when running "wxt -b edge"
},
},
});
```
By default, WXT will try to automatically discover where Chrome/Firefox are installed. However, if you have chrome installed in a non-standard location, you need to set it manually as shown above.
### Persist Data
+1 -1
View File
@@ -11,7 +11,7 @@ export default defineConfig({
hooks: {
'build:manifestGenerated': (wxt, manifest) => {
if (wxt.config.mode === 'development') {
manifest.title += ' (DEV)';
manifest.name += ' (DEV)';
}
},
},
+2 -2
View File
@@ -9,7 +9,7 @@ WXT provides first class support for Vitest for unit testing:
```ts
// vitest.config.ts
import { defineConfig } from 'vitest/config';
import { WxtVitest } from 'wxt/testing';
import { WxtVitest } from 'wxt/testing/vitest-plugin';
export default defineConfig({
plugins: [WxtVitest()],
@@ -36,7 +36,7 @@ This example demonstrates that you don't have to mock `browser.storage` (used by
```ts
import { describe, it, expect } from 'vitest';
import { fakeBrowser } from 'wxt/testing';
import { fakeBrowser } from 'wxt/testing/fake-browser';
const accountStorage = storage.defineItem<Account>('local:account');
+5
View File
@@ -15,6 +15,11 @@ cd path/to/your/project
pnpm dlx wxt@latest init example-wxt --template vanilla
```
:::tip
We recommend reviewing [project structure](/guide/essentials/project-structure.md) before you get started.
You can customize directory names in `wxt.config.ts` to match your project's needs.
:::
In general, you'll need to:
&ensp;<input type="checkbox" /> Install `wxt`<br />
+13 -23
View File
@@ -18,35 +18,36 @@
},
"devDependencies": {
"@aklinker1/buildc": "^1.1.5",
"@aklinker1/check": "^2.1.0",
"@aklinker1/check": "^2.2.0",
"@commitlint/config-conventional": "^19.8.1",
"@commitlint/types": "^19.8.1",
"@types/fs-extra": "^11.0.4",
"@types/semver": "^7.7.1",
"@vitest/coverage-v8": "^3.2.4",
"@vitest/coverage-v8": "^4.0.16",
"changelogen": "^0.6.2",
"consola": "^3.4.2",
"fast-glob": "^3.3.3",
"feed": "^5.1.0",
"fs-extra": "^11.3.1",
"lint-staged": "^16.1.6",
"fs-extra": "^11.3.2",
"lint-staged": "^16.2.7",
"markdown-it-footnote": "^4.0.0",
"markdownlint-cli": "^0.45.0",
"nano-spawn": "^1.0.2",
"prettier": "^3.6.2",
"semver": "^7.7.2",
"nano-spawn": "^1.0.3",
"p-map": "^7.0.4",
"prettier": "^3.7.4",
"semver": "^7.7.3",
"simple-git-hooks": "^2.13.1",
"tsx": "4.20.5",
"tsx": "4.21.0",
"typedoc": "^0.25.4",
"typedoc-plugin-frontmatter": "^1.3.0",
"typedoc-plugin-frontmatter": "^1.3.1",
"typedoc-plugin-markdown": "4.0.0-next.23",
"typedoc-vitepress-theme": "1.0.0-next.3",
"typescript": "^5.9.2",
"typescript": "^5.9.3",
"vitepress": "^1.6.4",
"vitepress-knowledge": "^0.4.1",
"vitepress-plugin-group-icons": "^1.6.3",
"vitepress-plugin-group-icons": "^1.6.5",
"vitest-mock-extended": "^3.1.0",
"vue": "^3.5.21",
"vue": "^3.5.25",
"wxt": "workspace:*"
},
"simple-git-hooks": {
@@ -54,16 +55,5 @@
},
"lint-staged": {
"*": "prettier --ignore-unknown --write"
},
"pnpm": {
"peerDependencyRules": {
"ignoreMissing": [
"@algolia/client-search",
"search-insights"
]
},
"patchedDependencies": {
"markdown-it-footnote": "patches/markdown-it-footnote.patch"
}
}
}
@@ -253,7 +253,8 @@ function defineStorageItem<T>(
): AnalyticsStorageItem<T> {
return {
getValue: async () =>
(await browser.storage.local.get(key))[key] ?? defaultValue,
(await browser.storage.local.get<Record<string, any>>(key))[key] ??
defaultValue,
setValue: (newValue) => browser.storage.local.set({ [key]: newValue }),
};
}
+3 -3
View File
@@ -51,10 +51,10 @@
"wxt": ">=0.20.0"
},
"devDependencies": {
"@aklinker1/check": "^2.1.0",
"@aklinker1/check": "^2.2.0",
"@types/ua-parser-js": "^0.7.39",
"publint": "^0.3.12",
"typescript": "^5.9.2",
"publint": "^0.3.16",
"typescript": "^5.9.3",
"unbuild": "^3.6.1",
"wxt": "workspace:*"
},
+6 -6
View File
@@ -46,14 +46,14 @@
},
"dependencies": {
"defu": "^6.1.4",
"fs-extra": "^11.3.1",
"sharp": "^0.34.1"
"fs-extra": "^11.3.2",
"sharp": "^0.34.5"
},
"devDependencies": {
"@aklinker1/check": "^2.1.0",
"oxlint": "^1.14.0",
"publint": "^0.3.12",
"typescript": "^5.9.2",
"@aklinker1/check": "^2.2.0",
"oxlint": "^1.33.0",
"publint": "^0.3.16",
"typescript": "^5.9.3",
"unbuild": "^3.6.1",
"wxt": "workspace:*"
}
+7 -7
View File
@@ -1,7 +1,7 @@
{
"name": "@wxt-dev/browser",
"description": "Provides a cross-browser API for using extension APIs and types based on @types/chrome",
"version": "0.1.4",
"version": "0.1.32",
"type": "module",
"main": "src/index.mjs",
"types": "src/index.d.ts",
@@ -23,12 +23,12 @@
"src"
],
"devDependencies": {
"@types/chrome": "0.1.6",
"fs-extra": "^11.3.1",
"nano-spawn": "^1.0.2",
"tsx": "4.20.5",
"typescript": "^5.9.2",
"vitest": "^3.2.4"
"@types/chrome": "0.1.32",
"fs-extra": "^11.3.2",
"nano-spawn": "^1.0.3",
"tsx": "4.21.0",
"typescript": "^5.9.3",
"vitest": "^4.0.16"
},
"dependencies": {
"@types/filesystem": "*",
+1 -3
View File
@@ -60,9 +60,7 @@ for (const { file, srcPath, destPath } of declarationFileMapping) {
// Done!
console.log(
'\x1b[32m✔\x1b[0m Done in ' + performance.now().toFixed(0) + ' ms',
);
console.log('\x1b[32m✔\x1b[0m Done in ' + performance.now().toFixed(0) + ' ms');
// Transformations
+2645 -2390
View File
File diff suppressed because it is too large Load Diff
+2 -2
View File
@@ -26,8 +26,8 @@
"@types/chrome": "{{chromeTypesVersion}}",
"fs-extra": "^11.3.1",
"nano-spawn": "^1.0.2",
"tsx": "4.19.4",
"tsx": "4.20.5",
"typescript": "^5.9.2",
"vitest": "^3.1.2"
"vitest": "^4.0.16"
}
}
+6 -6
View File
@@ -40,14 +40,14 @@
}
},
"devDependencies": {
"@aklinker1/check": "^2.1.0",
"@aklinker1/check": "^2.2.0",
"@types/node": "^20.17.6",
"oxlint": "^1.14.0",
"publint": "^0.3.12",
"typescript": "^5.9.2",
"oxlint": "^1.33.0",
"publint": "^0.3.16",
"typescript": "^5.9.3",
"unbuild": "^3.6.1",
"vitest": "^3.2.4",
"vitest-plugin-random-seed": "^1.1.1",
"vitest": "^4.0.16",
"vitest-plugin-random-seed": "^1.1.2",
"wxt": "workspace:*"
},
"main": "./dist/index.cjs",
+12
View File
@@ -1,5 +1,17 @@
# Changelog
## v1.1.5
[compare changes](https://github.com/wxt-dev/wxt/compare/module-react-v1.1.4...module-react-v1.1.5)
### 🏡 Chore
- **deps:** Support @vitejs/plugin-react@5 ([9170159b](https://github.com/wxt-dev/wxt/commit/9170159b))
### ❤️ Contributors
- Aaron ([@aklinker1](https://github.com/aklinker1))
## v1.1.4
[compare changes](https://github.com/wxt-dev/wxt/compare/module-react-v1.1.3...module-react-v1.1.4)
+9 -9
View File
@@ -18,7 +18,7 @@
},
"license": "MIT",
"funding": "https://github.com/sponsors/wxt-dev",
"version": "1.1.4",
"version": "1.1.5",
"type": "module",
"main": "./dist/index.cjs",
"module": "./dist/index.mjs",
@@ -48,16 +48,16 @@
"wxt": ">=0.19.16"
},
"dependencies": {
"@vitejs/plugin-react": "^4.4.1"
"@vitejs/plugin-react": "^4.4.1 || ^5.0.0"
},
"devDependencies": {
"@aklinker1/check": "^2.1.0",
"@types/react": "^19.1.12",
"@types/react-dom": "^19.1.9",
"publint": "^0.3.12",
"react": "^19.1.1",
"react-dom": "^19.1.1",
"typescript": "^5.9.2",
"@aklinker1/check": "^2.2.0",
"@types/react": "^19.2.7",
"@types/react-dom": "^19.2.3",
"publint": "^0.3.16",
"react": "^19.2.3",
"react-dom": "^19.2.3",
"typescript": "^5.9.3",
"unbuild": "^3.6.1",
"wxt": "workspace:*"
}
+28
View File
@@ -1,5 +1,33 @@
# Changelog
## v1.1.4
[compare changes](https://github.com/wxt-dev/wxt/compare/module-solid-v1.1.3...module-solid-v1.1.4)
### 🩹 Fixes
- Add support for WXT v0.20.0 ([c9dca022](https://github.com/wxt-dev/wxt/commit/c9dca022))
### 🏡 Chore
- **deps-dev:** Bump solid-js from 1.9.3 to 1.9.4 ([#1391](https://github.com/wxt-dev/wxt/pull/1391))
- Add funding links to `package.json` files ([#1446](https://github.com/wxt-dev/wxt/pull/1446))
- **deps:** Bump vite-plugin-solid from 2.10.2 to 2.11.6 ([#1491](https://github.com/wxt-dev/wxt/pull/1491))
- Use PNPM 10's new catelog feature ([#1493](https://github.com/wxt-dev/wxt/pull/1493))
- Move production dependencies to PNPM 10 catelog ([#1494](https://github.com/wxt-dev/wxt/pull/1494))
- **deps:** Upgrade to Vite 6 and related dependencies ([#1496](https://github.com/wxt-dev/wxt/pull/1496))
- Stop using PNPM catalog ([#1644](https://github.com/wxt-dev/wxt/pull/1644))
- Upgrade `@aklinker1/check` to v2 ([#1647](https://github.com/wxt-dev/wxt/pull/1647))
- **deps:** Update all dependencies ([#1648](https://github.com/wxt-dev/wxt/pull/1648))
- **deps:** Upgrade typescript from 5.8.3 to 5.9.2 ([a6eef643](https://github.com/wxt-dev/wxt/commit/a6eef643))
- Create script for managing dependency upgrades ([#1875](https://github.com/wxt-dev/wxt/pull/1875))
- **deps:** Upgrade all dev dependencies ([#1876](https://github.com/wxt-dev/wxt/pull/1876))
### ❤️ Contributors
- Aaron ([@aklinker1](https://github.com/aklinker1))
- Okinea Dev <hi@okinea.dev>
## v1.1.3
[compare changes](https://github.com/wxt-dev/wxt/compare/module-solid-v1.1.2...module-solid-v1.1.3)
+6 -6
View File
@@ -18,7 +18,7 @@
},
"license": "MIT",
"funding": "https://github.com/sponsors/wxt-dev",
"version": "1.1.3",
"version": "1.1.4",
"type": "module",
"main": "./dist/index.cjs",
"module": "./dist/index.mjs",
@@ -48,13 +48,13 @@
"wxt": ">=0.19.16"
},
"dependencies": {
"vite-plugin-solid": "^2.11.6"
"vite-plugin-solid": "^2.11.10"
},
"devDependencies": {
"@aklinker1/check": "^2.1.0",
"publint": "^0.3.12",
"solid-js": "^1.9.9",
"typescript": "^5.9.2",
"@aklinker1/check": "^2.2.0",
"publint": "^0.3.16",
"solid-js": "^1.9.10",
"typescript": "^5.9.3",
"unbuild": "^3.6.1",
"wxt": "workspace:*"
}
+24
View File
@@ -1,5 +1,29 @@
# Changelog
## v2.0.4
[compare changes](https://github.com/wxt-dev/wxt/compare/module-svelte-v2.0.3...module-svelte-v2.0.4)
### 🩹 Fixes
- Add support for @sveltejs/vite-plugin-svelte@6 ([459f73fd](https://github.com/wxt-dev/wxt/commit/459f73fd))
### 🏡 Chore
- Add funding links to `package.json` files ([#1446](https://github.com/wxt-dev/wxt/pull/1446))
- Use PNPM 10's new catelog feature ([#1493](https://github.com/wxt-dev/wxt/pull/1493))
- Move production dependencies to PNPM 10 catelog ([#1494](https://github.com/wxt-dev/wxt/pull/1494))
- Stop using PNPM catalog ([#1644](https://github.com/wxt-dev/wxt/pull/1644))
- Upgrade `@aklinker1/check` to v2 ([#1647](https://github.com/wxt-dev/wxt/pull/1647))
- **deps:** Upgrade typescript from 5.8.3 to 5.9.2 ([a6eef643](https://github.com/wxt-dev/wxt/commit/a6eef643))
- Create script for managing dependency upgrades ([#1875](https://github.com/wxt-dev/wxt/pull/1875))
- **deps:** Upgrade all dev dependencies ([#1876](https://github.com/wxt-dev/wxt/pull/1876))
### ❤️ Contributors
- Aaron ([@aklinker1](https://github.com/aklinker1))
- Okinea Dev <hi@okinea.dev>
## v2.0.3
[compare changes](https://github.com/wxt-dev/wxt/compare/module-svelte-v2.0.2...module-svelte-v2.0.3)
+4 -4
View File
@@ -18,7 +18,7 @@
},
"license": "MIT",
"funding": "https://github.com/sponsors/wxt-dev",
"version": "2.0.3",
"version": "2.0.4",
"type": "module",
"main": "./dist/index.cjs",
"module": "./dist/index.mjs",
@@ -50,9 +50,9 @@
"@sveltejs/vite-plugin-svelte": "^4.0.0 || ^5.0.0 || ^6.0.0"
},
"devDependencies": {
"@aklinker1/check": "^2.1.0",
"publint": "^0.3.12",
"typescript": "^5.9.2",
"@aklinker1/check": "^2.2.0",
"publint": "^0.3.16",
"typescript": "^5.9.3",
"unbuild": "^3.6.1",
"wxt": "workspace:*"
}
+22
View File
@@ -1,5 +1,27 @@
# Changelog
## v1.0.3
[compare changes](https://github.com/wxt-dev/wxt/compare/module-vue-v1.0.2...module-vue-v1.0.3)
### 🏡 Chore
- Add funding links to `package.json` files ([#1446](https://github.com/wxt-dev/wxt/pull/1446))
- Use PNPM 10's new catelog feature ([#1493](https://github.com/wxt-dev/wxt/pull/1493))
- Move production dependencies to PNPM 10 catelog ([#1494](https://github.com/wxt-dev/wxt/pull/1494))
- Stop using PNPM catalog ([#1644](https://github.com/wxt-dev/wxt/pull/1644))
- Upgrade `@aklinker1/check` to v2 ([#1647](https://github.com/wxt-dev/wxt/pull/1647))
- Wxt & @wxt-dev/module-vue support Vite 7 ([#1771](https://github.com/wxt-dev/wxt/pull/1771))
- **deps:** Upgrade typescript from 5.8.3 to 5.9.2 ([a6eef643](https://github.com/wxt-dev/wxt/commit/a6eef643))
- Create script for managing dependency upgrades ([#1875](https://github.com/wxt-dev/wxt/pull/1875))
- **deps:** Upgrade all dev dependencies ([#1876](https://github.com/wxt-dev/wxt/pull/1876))
### ❤️ Contributors
- Aaron ([@aklinker1](https://github.com/aklinker1))
- Ayu ([@ayu-exorcist](https://github.com/ayu-exorcist))
- Okinea Dev <hi@okinea.dev>
## v1.0.2
[compare changes](https://github.com/wxt-dev/wxt/compare/module-vue-v1.0.1...module-vue-v1.0.2)
+4 -4
View File
@@ -18,7 +18,7 @@
},
"license": "MIT",
"funding": "https://github.com/sponsors/wxt-dev",
"version": "1.0.2",
"version": "1.0.3",
"type": "module",
"main": "./dist/index.cjs",
"module": "./dist/index.mjs",
@@ -49,9 +49,9 @@
"@vitejs/plugin-vue": "^5.2.3 || ^6.0.0"
},
"devDependencies": {
"@aklinker1/check": "^2.1.0",
"publint": "^0.3.12",
"typescript": "^5.9.2",
"@aklinker1/check": "^2.2.0",
"publint": "^0.3.16",
"typescript": "^5.9.3",
"unbuild": "^3.6.1",
"wxt": "workspace:*"
}
+28
View File
@@ -1,5 +1,33 @@
# Changelog
## v0.1.2
[compare changes](https://github.com/wxt-dev/wxt/compare/runner-v0.1.1...runner-v0.1.2)
### 🚀 Enhancements
- **config:** Add browser path for Zen via Homebrew ([#1813](https://github.com/wxt-dev/wxt/pull/1813))
### 🩹 Fixes
- Improve Chrome path search ([#1823](https://github.com/wxt-dev/wxt/pull/1823))
- **paths:** Add browser paths for Arc & Dia on macos ([#1814](https://github.com/wxt-dev/wxt/pull/1814))
### 🏡 Chore
- Fix auto-fixable `markdownlint` errors ([#1710](https://github.com/wxt-dev/wxt/pull/1710))
- Manually fix markdownlint errors ([#1711](https://github.com/wxt-dev/wxt/pull/1711))
- **deps:** Upgrade oxlint from 0.16.8 to 1.14.0 ([a01928e0](https://github.com/wxt-dev/wxt/commit/a01928e0))
- **deps:** Upgrade typescript from 5.8.3 to 5.9.2 ([a6eef643](https://github.com/wxt-dev/wxt/commit/a6eef643))
- Create script for managing dependency upgrades ([#1875](https://github.com/wxt-dev/wxt/pull/1875))
- **deps:** Upgrade all dev dependencies ([#1876](https://github.com/wxt-dev/wxt/pull/1876))
### ❤️ Contributors
- Aaron ([@aklinker1](https://github.com/aklinker1))
- Sam Carlton ([@ThatGuySam](https://github.com/ThatGuySam))
- Alexander Kachkaev <alexander@kachkaev.ru>
## v0.1.1
[compare changes](https://github.com/wxt-dev/wxt/compare/runner-v0.1.0...runner-v0.1.1)
+7 -7
View File
@@ -1,7 +1,7 @@
{
"name": "@wxt-dev/runner",
"description": "Launch Chrome and Firefox with a web extension installed",
"version": "0.1.1",
"version": "0.1.2",
"type": "module",
"repository": {
"type": "git",
@@ -29,13 +29,13 @@
},
"dependencies": {},
"devDependencies": {
"@aklinker1/check": "^2.1.0",
"oxlint": "^1.14.0",
"publint": "^0.3.12",
"tsx": "4.20.5",
"typescript": "^5.9.2",
"@aklinker1/check": "^2.2.0",
"oxlint": "^1.33.0",
"publint": "^0.3.16",
"tsx": "4.21.0",
"typescript": "^5.9.3",
"unbuild": "^3.6.1",
"vitest": "^3.2.4"
"vitest": "^4.0.16"
},
"main": "dist/index.mjs",
"types": "dist/index.d.ts",
+56 -1
View File
@@ -1,5 +1,60 @@
# Changelog
## v1.2.6
[compare changes](https://github.com/wxt-dev/wxt/compare/storage-v1.2.5...storage-v1.2.6)
## v1.2.5
[compare changes](https://github.com/wxt-dev/wxt/compare/storage-v1.2.4...storage-v1.2.5)
## v1.2.4
[compare changes](https://github.com/wxt-dev/wxt/compare/storage-v1.2.3...storage-v1.2.4)
## v1.2.3
[compare changes](https://github.com/wxt-dev/wxt/compare/storage-v1.2.2...storage-v1.2.3)
## v1.2.2
[compare changes](https://github.com/wxt-dev/wxt/compare/storage-v1.2.1...storage-v1.2.2)
## v1.2.1
[compare changes](https://github.com/wxt-dev/wxt/compare/storage-v1.2.0...storage-v1.2.1)
## v1.2.0
[compare changes](https://github.com/wxt-dev/wxt/compare/storage-v1.1.1...storage-v1.2.0)
### 🚀 Enhancements
- **storage:** Add `onMigrationComplete` callback ([#1514](https://github.com/wxt-dev/wxt/pull/1514))
- **storage:** Add `debug` option to enable migration logs ([#1513](https://github.com/wxt-dev/wxt/pull/1513))
### 🩹 Fixes
- Fix typescript error on `defineItem` fallback ([#1601](https://github.com/wxt-dev/wxt/pull/1601))
- Use `@wxt-dev/browser` instead of `@types/chrome` ([#1645](https://github.com/wxt-dev/wxt/pull/1645))
### 🏡 Chore
- **deps:** Update all dependencies ([#1568](https://github.com/wxt-dev/wxt/pull/1568))
- Stop using PNPM catalog ([#1644](https://github.com/wxt-dev/wxt/pull/1644))
- Upgrade `@aklinker1/check` to v2 ([#1647](https://github.com/wxt-dev/wxt/pull/1647))
- Change browser workspace dependency to `^` ([c7335add](https://github.com/wxt-dev/wxt/commit/c7335add))
- **deps:** Upgrade oxlint from 0.16.8 to 1.14.0 ([a01928e0](https://github.com/wxt-dev/wxt/commit/a01928e0))
- **deps:** Upgrade typescript from 5.8.3 to 5.9.2 ([a6eef643](https://github.com/wxt-dev/wxt/commit/a6eef643))
- Create script for managing dependency upgrades ([#1875](https://github.com/wxt-dev/wxt/pull/1875))
- **deps:** Upgrade all dev dependencies ([#1876](https://github.com/wxt-dev/wxt/pull/1876))
### ❤️ Contributors
- Aaron ([@aklinker1](https://github.com/aklinker1))
- Anh71me ([@iyume](https://github.com/iyume))
- Ergou <ma2808203259@hotmail.com>
## v1.1.1
[compare changes](https://github.com/wxt-dev/wxt/compare/storage-v1.1.0...storage-v1.1.1)
@@ -69,4 +124,4 @@ It's still shipped inside WXT and accessible via `wxt/storage`, but now:
[Read the docs](https://wxt.dev/storage.html) for more details.
> This is apart of the v1.0 initiative for WXT.
> This is apart of the v1.0 initiative for WXT.
+6 -6
View File
@@ -1,7 +1,7 @@
{
"name": "@wxt-dev/storage",
"description": "Web extension storage API provided by WXT, supports all browsers.",
"version": "1.1.1",
"version": "1.2.6",
"type": "module",
"repository": {
"type": "git",
@@ -35,13 +35,13 @@
"dequal": "^2.0.3"
},
"devDependencies": {
"@aklinker1/check": "^2.1.0",
"@aklinker1/check": "^2.2.0",
"@webext-core/fake-browser": "^1.3.2",
"oxlint": "^1.14.0",
"publint": "^0.3.12",
"typescript": "^5.9.2",
"oxlint": "^1.33.0",
"publint": "^0.3.16",
"typescript": "^5.9.3",
"unbuild": "^3.6.1",
"vitest": "^3.2.4"
"vitest": "^4.0.16"
},
"module": "./dist/index.mjs",
"types": "./dist/index.d.ts",
+5 -2
View File
@@ -519,7 +519,7 @@ function createDriver(storageArea: StorageArea): WxtStorageDriver {
const watchListeners = new Set<(changes: StorageAreaChanges) => void>();
return {
getItem: async (key) => {
const res = await getStorageArea().get(key);
const res = await getStorageArea().get<Record<string, any>>(key);
return res[key];
},
getItems: async (keys) => {
@@ -560,7 +560,10 @@ function createDriver(storageArea: StorageArea): WxtStorageDriver {
},
watch(key, cb) {
const listener = (changes: StorageAreaChanges) => {
const change = changes[key];
const change = changes[key] as {
newValue?: any;
oldValue?: any | null;
} | null;
if (change == null) return;
if (dequal(change.newValue, change.oldValue)) return;
cb(change.newValue ?? null, change.oldValue ?? null);
+4 -4
View File
@@ -40,10 +40,10 @@
"wxt": ">=0.19.0"
},
"devDependencies": {
"@aklinker1/check": "^2.1.0",
"oxlint": "^1.14.0",
"publint": "^0.3.12",
"typescript": "^5.9.2",
"@aklinker1/check": "^2.2.0",
"oxlint": "^1.33.0",
"publint": "^0.3.16",
"typescript": "^5.9.3",
"unbuild": "^3.6.1",
"unocss": "^0.64.0 || ^0.65.0 || ^65.0.0 || ^66.0.0",
"wxt": "workspace:*"
+4 -4
View File
@@ -45,10 +45,10 @@
"wxt": ">=0.20.0"
},
"devDependencies": {
"@aklinker1/check": "^2.1.0",
"@types/webextension-polyfill": "^0.12.3",
"publint": "^0.3.12",
"typescript": "^5.9.2",
"@aklinker1/check": "^2.2.0",
"@types/webextension-polyfill": "^0.12.4",
"publint": "^0.3.16",
"typescript": "^5.9.3",
"unbuild": "^3.6.1",
"webextension-polyfill": "^0.12.0",
"wxt": "workspace:*"
+8 -8
View File
@@ -18,19 +18,19 @@
},
"dependencies": {
"@wxt-dev/i18n": "workspace:*",
"react": "^19.1.1",
"react-dom": "^19.1.1"
"react": "^19.2.3",
"react-dom": "^19.2.3"
},
"devDependencies": {
"@types/react": "^19.1.12",
"@types/react-dom": "^19.1.9",
"@types/react": "^19.2.7",
"@types/react-dom": "^19.2.3",
"@wxt-dev/auto-icons": "workspace:*",
"@wxt-dev/unocss": "workspace:*",
"sass": "^1.92.0",
"typescript": "^5.9.2",
"sass": "^1.97.0",
"typescript": "^5.9.3",
"unocss": "^0.64.0 || ^0.65.0 || ^65.0.0 || ^66.0.0",
"vitest": "^3.2.4",
"vitest-plugin-random-seed": "^1.1.1",
"vitest": "^4.0.16",
"vitest-plugin-random-seed": "^1.1.2",
"wxt": "workspace:*"
},
"buildc": {
+88
View File
@@ -1,5 +1,93 @@
# Changelog
## v0.20.12
[compare changes](https://github.com/wxt-dev/wxt/compare/wxt-v0.20.11...wxt-v0.20.12)
### 🚀 Enhancements
- Remove `data-wxt-*` attributes ([#1913](https://github.com/wxt-dev/wxt/pull/1913))
- Default to using `use_dynamic_url: true` for content script css files ([#1993](https://github.com/wxt-dev/wxt/pull/1993))
### 🩹 Fixes
- Wxt normal logs are drowned by `dotenv@17.0.0` ads ([#1883](https://github.com/wxt-dev/wxt/pull/1883))
- Optimize `splitShadowRootCss` ([#1934](https://github.com/wxt-dev/wxt/pull/1934))
- `wxt prepare` fails with the error "__vite_ssr_exportName__ is not defined" when using Vite 7 ([#1884](https://github.com/wxt-dev/wxt/pull/1884))
### 🏡 Chore
- Use `linkedom` a test instead of `happy-dom` ([#1957](https://github.com/wxt-dev/wxt/pull/1957))
- Add support for `vite-node` v5 ([#2001](https://github.com/wxt-dev/wxt/pull/2001))
- Upgrade dev and non-major prod dependencies ([#2000](https://github.com/wxt-dev/wxt/pull/2000))
- **dev-deps:** Upgrade `happy-dom` to address CVE-2025-61927 ([#2002](https://github.com/wxt-dev/wxt/pull/2002))
### ❤️ Contributors
- Aaron ([@aklinker1](https://github.com/aklinker1))
- Jaguar Zhou ([@aiktb](https://github.com/aiktb))
- Alexander Harding <noreply@harding.dev>
- Florian Kühne ([@ZerGo0](https://github.com/ZerGo0))
## v0.20.11
[compare changes](https://github.com/wxt-dev/wxt/compare/wxt-v0.20.10...wxt-v0.20.11)
### 🩹 Fixes
- Split `wxt/testing` into separate modules to fix issues with `jsdom` and `happy-dom` ([#1844](https://github.com/wxt-dev/wxt/pull/1844))
- `input_components` is supported by mv3 ([#1881](https://github.com/wxt-dev/wxt/pull/1881))
### 🏡 Chore
- **deps:** Upgrade project subdependencies ([#1882](https://github.com/wxt-dev/wxt/pull/1882))
### ❤️ Contributors
- Aaron ([@aklinker1](https://github.com/aklinker1))
- Qijia Liu <liumeo@pku.edu.cn>
- Marcellino Ornelas ([@marcellino-ornelas](https://github.com/marcellino-ornelas))
## v0.20.10
[compare changes](https://github.com/wxt-dev/wxt/compare/wxt-v0.20.9...wxt-v0.20.10)
### 🏡 Chore
- **deps:** Upgrade non-breaking production dependencies ([#1877](https://github.com/wxt-dev/wxt/pull/1877))
- **deps:** Upgrade web-ext-run to support CDP ([#1879](https://github.com/wxt-dev/wxt/pull/1879))
- **deps:** `publish-browser-extension` upgrade ([#1880](https://github.com/wxt-dev/wxt/pull/1880))
### ❤️ Contributors
- Aaron ([@aklinker1](https://github.com/aklinker1))
## v0.20.9
[compare changes](https://github.com/wxt-dev/wxt/compare/wxt-v0.20.8...wxt-v0.20.9)
### 🩹 Fixes
- **types:** Use TType for DocumentEventMap key in ctx.addEventListener ([#1863](https://github.com/wxt-dev/wxt/pull/1863))
- Prevent Unlisted CSS from being excluded in the build when using CSS preprocessor ([#1590](https://github.com/wxt-dev/wxt/pull/1590))
### 🏡 Chore
- **deps:** Upgrade oxlint from 0.16.8 to 1.14.0 ([a01928e0](https://github.com/wxt-dev/wxt/commit/a01928e0))
- **deps:** Upgrade typescript from 5.8.3 to 5.9.2 ([a6eef643](https://github.com/wxt-dev/wxt/commit/a6eef643))
- Upgrade nano-spawn to v1 ([5fefd8e0](https://github.com/wxt-dev/wxt/commit/5fefd8e0))
- Upgrade faker to v10 ([984568e0](https://github.com/wxt-dev/wxt/commit/984568e0))
- Upgrade dotenv to v17.2.2 ([380a9630](https://github.com/wxt-dev/wxt/commit/380a9630))
- Upgrade happy-dom to v18.0.1 ([c1c3d3b7](https://github.com/wxt-dev/wxt/commit/c1c3d3b7))
- Create script for managing dependency upgrades ([#1875](https://github.com/wxt-dev/wxt/pull/1875))
- **deps:** Upgrade all dev dependencies ([#1876](https://github.com/wxt-dev/wxt/pull/1876))
### ❤️ Contributors
- Aaron ([@aklinker1](https://github.com/aklinker1))
- Kim Gyeongjae ([@PortalCube](https://github.com/PortalCube))
- Atomie CHEN <atomic_cwh@163.com>
## v0.20.8
[compare changes](https://github.com/wxt-dev/wxt/compare/wxt-v0.20.7...wxt-v0.20.8)
@@ -345,7 +345,6 @@ describe('Output Directory Structure', () => {
.toMatchInlineSnapshot(`
".output/chrome-mv3/background.js
----------------------------------------
var _a, _b;
import { l as logHello, i as initPlugins } from "./chunks/_virtual_wxt-plugins-OjKtWpmY.js";
function defineBackground(arg) {
if (arg == null || typeof arg === "function") return { main: arg };
@@ -357,7 +356,7 @@ describe('Output Directory Structure', () => {
logHello("background");
}
});
((_b = (_a = globalThis.browser) == null ? void 0 : _a.runtime) == null ? void 0 : _b.id) ? globalThis.browser : globalThis.chrome;
globalThis.browser?.runtime?.id ? globalThis.browser : globalThis.chrome;
function print(method, ...args) {
return;
}
@@ -423,9 +422,8 @@ describe('Output Directory Structure', () => {
.toMatchInlineSnapshot(`
".output/chrome-mv3/background.js
----------------------------------------
var background = function() {
var background = (function() {
"use strict";
var _a, _b;
function defineBackground(arg) {
if (arg == null || typeof arg === "function") return { main: arg };
return arg;
@@ -440,7 +438,7 @@ describe('Output Directory Structure', () => {
});
function initPlugins() {
}
((_b = (_a = globalThis.browser) == null ? void 0 : _a.runtime) == null ? void 0 : _b.id) ? globalThis.browser : globalThis.chrome;
globalThis.browser?.runtime?.id ? globalThis.browser : globalThis.chrome;
function print(method, ...args) {
return;
}
@@ -465,7 +463,7 @@ describe('Output Directory Structure', () => {
}
const result$1 = result;
return result$1;
}();
})();
"
`);
});
+1 -1
View File
@@ -16,7 +16,7 @@ describe('Remote Code', () => {
const output = await project.serializeFile('.output/chrome-mv3/popup.js');
expect(output).toContain(
// Some text that will hopefully be in future versions of this script
'lodash.com',
'__lodash_placeholder__',
);
expect(output).not.toContain(url);
expect(
+35 -27
View File
@@ -1,7 +1,7 @@
{
"name": "wxt",
"type": "module",
"version": "0.20.8",
"version": "0.20.12",
"description": "⚡ Next-gen Web Extension Framework",
"license": "MIT",
"scripts": {
@@ -24,61 +24,61 @@
"@wxt-dev/browser": "workspace:^",
"@wxt-dev/storage": "workspace:^1.0.0",
"async-mutex": "^0.5.0",
"c12": "^3.0.3",
"c12": "^3.3.2",
"cac": "^6.7.14",
"chokidar": "^4.0.3",
"ci-info": "^4.2.0",
"ci-info": "^4.3.1",
"consola": "^3.4.2",
"defu": "^6.1.4",
"dotenv": "^17.2.2",
"dotenv-expand": "^12.0.2",
"esbuild": "^0.25.0",
"dotenv": "^17.2.3",
"dotenv-expand": "^12.0.3",
"esbuild": "^0.27.1",
"fast-glob": "^3.3.3",
"filesize": "^10.1.6",
"fs-extra": "^11.3.1",
"get-port-please": "^3.1.2",
"filesize": "^11.0.13",
"fs-extra": "^11.3.2",
"get-port-please": "^3.2.0",
"giget": "^1.2.3 || ^2.0.0",
"hookable": "^5.5.3",
"import-meta-resolve": "^4.1.0",
"import-meta-resolve": "^4.2.0",
"is-wsl": "^3.1.0",
"json5": "^2.2.3",
"jszip": "^3.10.1",
"linkedom": "^0.18.10",
"linkedom": "^0.18.12",
"magicast": "^0.3.5",
"minimatch": "^10.0.1",
"nano-spawn": "^1.0.2",
"minimatch": "^10.1.1",
"nano-spawn": "^1.0.3",
"normalize-path": "^3.0.0",
"nypm": "^0.6.0",
"nypm": "^0.6.2",
"ohash": "^2.0.11",
"open": "^10.1.2",
"open": "^10.2.0",
"ora": "^8.2.0",
"perfect-debounce": "^1.0.0",
"perfect-debounce": "^2.0.0",
"picocolors": "^1.1.1",
"prompts": "^2.4.2",
"publish-browser-extension": "^2.3.0 || ^3.0.0",
"publish-browser-extension": "^2.3.0 || ^3.0.2",
"scule": "^1.3.0",
"unimport": "^3.13.1 || ^4.0.0 || ^5.0.0",
"vite": "^5.4.19 || ^6.3.4 || ^7.0.0",
"vite-node": "^2.1.4 || ^3.1.2",
"web-ext-run": "^0.2.3"
"vite-node": "^3.2.4 || ^5.0.0",
"web-ext-run": "^0.2.4"
},
"devDependencies": {
"@aklinker1/check": "^2.1.0",
"@faker-js/faker": "^10.0.0",
"@aklinker1/check": "^2.2.0",
"@faker-js/faker": "^10.1.0",
"@types/fs-extra": "^11.0.4",
"@types/lodash.merge": "^4.6.9",
"@types/node": "^20.17.6",
"@types/normalize-path": "^3.0.2",
"@types/prompts": "^2.4.9",
"extract-zip": "^2.0.1",
"happy-dom": "^18.0.1",
"happy-dom": "^20.0.0",
"lodash.merge": "^4.6.2",
"oxlint": "^1.14.0",
"publint": "^0.3.12",
"typescript": "^5.9.2",
"oxlint": "^1.33.0",
"publint": "^0.3.16",
"typescript": "^5.9.3",
"unbuild": "^3.6.1",
"vitest": "^3.2.4",
"vitest-plugin-random-seed": "^1.1.1"
"vitest": "^4.0.16",
"vitest-plugin-random-seed": "^1.1.2"
},
"peerDependenciesMeta": {},
"repository": {
@@ -179,6 +179,14 @@
"types": "./dist/browser.d.ts",
"default": "./dist/browser.mjs"
},
"./testing/fake-browser": {
"types": "./dist/testing/fake-browser.d.ts",
"default": "./dist/testing/fake-browser.mjs"
},
"./testing/vitest-plugin": {
"types": "./dist/testing/wxt-vitest-plugin.d.ts",
"default": "./dist/testing/wxt-vitest-plugin.mjs"
},
"./testing": {
"types": "./dist/testing/index.d.ts",
"default": "./dist/testing/index.mjs"
@@ -1,5 +1,4 @@
import { describe, expect, it } from 'vitest';
import { Window } from 'happy-dom';
import { pointToDevServer } from '../devHtmlPrerender';
import {
fakeDevServer,
@@ -7,6 +6,7 @@ import {
} from '../../../../utils/testing/fake-objects';
import { normalizePath } from '../../../../utils/paths';
import { resolve } from 'node:path';
import { parseHTML } from 'linkedom';
describe('Dev HTML Prerender Plugin', () => {
describe('pointToDevServer', () => {
@@ -32,9 +32,7 @@ describe('Dev HTML Prerender Plugin', () => {
// URLs should not be changed
['https://example.com/style.css', 'https://example.com/style.css'],
])('should transform "%s" into "%s"', (input, expected) => {
const { document } = new Window({
url: 'http://localhost',
});
const { document } = parseHTML('<html></html>');
const root = '/some/root';
const config = fakeResolvedConfig({
root,
@@ -55,7 +53,7 @@ describe('Dev HTML Prerender Plugin', () => {
const id = root + '/entrypoints/popup/index.html';
document.head.innerHTML = `<link rel="stylesheet" href="${input}" />`;
pointToDevServer(config, server, id, document as any, 'link', 'href');
pointToDevServer(config, server, id, document, 'link', 'href');
const actual = document.querySelector('link')!;
expect(actual.getAttribute('href')).toBe(expected);
@@ -43,7 +43,7 @@ export function extensionApiMock(config: ResolvedConfig): vite.PluginOption {
const setupTemplate = `
import { vi } from 'vitest';
import { fakeBrowser } from 'wxt/testing';
import { fakeBrowser } from 'wxt/testing/fake-browser';
vi.stubGlobal("chrome", fakeBrowser);
vi.stubGlobal("browser", fakeBrowser);
-1
View File
@@ -56,7 +56,6 @@ export function createWebExtRunner(): ExtensionRunner {
),
args: [
'--unsafely-disable-devtools-self-xss-warnings',
'--disable-features=DisableLoadExtensionCommandLineSwitch',
...(wxtUserConfig?.chromiumArgs ?? []),
],
}),
@@ -747,6 +747,7 @@ describe('Manifest Utils', () => {
{
matches: ['*://google.com/*'],
resources: ['content-scripts/one.css'],
use_dynamic_url: true,
},
]);
});
@@ -830,6 +831,7 @@ describe('Manifest Utils', () => {
{
matches: ['*://play.google.com/*'],
resources: ['content-scripts/one.css'],
use_dynamic_url: true,
},
]);
});
@@ -993,6 +995,7 @@ describe('Manifest Utils', () => {
{
resources: ['content-scripts/one.css'],
matches: ['*://google.com/*'],
use_dynamic_url: true,
},
]);
});
@@ -1351,7 +1354,6 @@ describe('Manifest Utils', () => {
event_rules: {},
file_browser_handlers: {},
file_system_provider_capabilities: {},
input_components: {},
nacl_modules: {},
natively_connectable: {},
offline_enabled: {},
+1
View File
@@ -8,6 +8,7 @@ import type { TargetBrowser } from '../../types';
export function loadEnv(mode: string, browser: TargetBrowser) {
return expand(
config({
quiet: true,
// Files on top override files below
path: [
`.env.${mode}.${browser}.local`,
+1 -1
View File
@@ -553,6 +553,7 @@ export function getContentScriptCssWebAccessibleResources(
resources.push({
resources: [cssFile],
use_dynamic_url: true,
matches:
script.options.matches?.map((matchPattern) =>
stripPathFromMatchPattern(matchPattern),
@@ -716,7 +717,6 @@ const mv2OnlyKeys = [
'event_rules',
'file_browser_handlers',
'file_system_provider_capabilities',
'input_components',
'nacl_modules',
'natively_connectable',
'offline_enabled',
+10
View File
@@ -1 +1,11 @@
/**
* The fake browser is automatically used as a mock for the `wxt/browser` import
* when using `wxt/testing/vitest-plugin` with Vitest. It is also setup to
* reset all state before each test.
*
* This module is just a re-export of [@webext-core/fake-browser](https://webext-core.aklinker1.io/fake-browser/triggering-events).
*
* @module wxt/testing/fake-browser
*/
export { fakeBrowser, type FakeBrowser } from '@webext-core/fake-browser';
+4
View File
@@ -1,5 +1,9 @@
/**
* Utilities for unit testing WXT extensions.
*
* @deprecated Use `wxt/testing/*` instead to prevent issues with JSDOM or
* HappyDOM environments. Will be removed in the next major version of WXT.
*
* @module wxt/testing
*/
export * from './fake-browser';
@@ -1,3 +1,10 @@
/**
* Contains a Vitest plugin that configures your test environment to work with
* WXT projects.
*
* @module wxt/testing/vitest
*/
import type * as vite from 'vite';
import {
download,
@@ -16,7 +23,7 @@ import { registerWxt, wxt } from '../core/wxt';
* ```ts
* // vitest.config.ts
* import { defineConfig } from 'vitest/config';
* import { WxtVitest } from 'wxt/testing';
* import { WxtVitest } from 'wxt/testing/vitest-plugin';
*
* export default defineConfig({
* plugins: [WxtVitest()],
+11 -16
View File
@@ -200,7 +200,7 @@ export interface InlineConfig {
*
* @example
* [
* "coverage", // Ignore the coverage directory in the `sourcesRoot`
* "coverage", // Include the coverage directory in the `sourcesRoot`
* ]
*/
includeSources?: string[];
@@ -213,7 +213,7 @@ export interface InlineConfig {
*
* @example
* [
* "coverage", // Include the coverage directory in the `sourcesRoot`
* "coverage", // Ignore the coverage directory in the `sourcesRoot`
* ]
*/
excludeSources?: string[];
@@ -462,8 +462,7 @@ export interface BuildStepOutput {
}
export interface WxtDevServer
extends Omit<WxtBuilderServer, 'listen' | 'close'>,
ServerInfo {
extends Omit<WxtBuilderServer, 'listen' | 'close'>, ServerInfo {
/**
* Stores the current build output of the server.
*/
@@ -567,8 +566,7 @@ export interface BackgroundEntrypointOptions extends BaseEntrypointOptions {
type?: PerBrowserOption<'module'>;
}
export interface BaseContentScriptEntrypointOptions
extends BaseEntrypointOptions {
export interface BaseContentScriptEntrypointOptions extends BaseEntrypointOptions {
matches?: PerBrowserOption<NonNullable<ManifestContentScript['matches']>>;
/**
* See https://developer.chrome.com/docs/extensions/mv3/content_scripts/
@@ -635,16 +633,14 @@ export interface BaseContentScriptEntrypointOptions
registration?: PerBrowserOption<'manifest' | 'runtime'>;
}
export interface MainWorldContentScriptEntrypointOptions
extends BaseContentScriptEntrypointOptions {
export interface MainWorldContentScriptEntrypointOptions extends BaseContentScriptEntrypointOptions {
/**
* See https://developer.chrome.com/docs/extensions/develop/concepts/content-scripts#isolated_world
*/
world: 'MAIN';
}
export interface IsolatedWorldContentScriptEntrypointOptions
extends BaseContentScriptEntrypointOptions {
export interface IsolatedWorldContentScriptEntrypointOptions extends BaseContentScriptEntrypointOptions {
/**
* See https://developer.chrome.com/docs/extensions/develop/concepts/content-scripts#isolated_world
* @default "ISOLATED"
@@ -780,8 +776,7 @@ export type EntrypointGroup = Entrypoint | Entrypoint[];
export type OnContentScriptStopped = (cb: () => void) => void;
export interface IsolatedWorldContentScriptDefinition
extends IsolatedWorldContentScriptEntrypointOptions {
export interface IsolatedWorldContentScriptDefinition extends IsolatedWorldContentScriptEntrypointOptions {
/**
* Main function executed when the content script is loaded.
*
@@ -792,8 +787,7 @@ export interface IsolatedWorldContentScriptDefinition
main(ctx: ContentScriptContext): any | Promise<any>;
}
export interface MainWorldContentScriptDefinition
extends MainWorldContentScriptEntrypointOptions {
export interface MainWorldContentScriptDefinition extends MainWorldContentScriptEntrypointOptions {
/**
* Main function executed when the content script is loaded.
*
@@ -1544,8 +1538,9 @@ export interface WxtModule<TOptions extends WxtModuleOptions> {
setup?: WxtModuleSetup<TOptions>;
}
export interface WxtModuleWithMetadata<TOptions extends WxtModuleOptions>
extends WxtModule<TOptions> {
export interface WxtModuleWithMetadata<
TOptions extends WxtModuleOptions,
> extends WxtModule<TOptions> {
type: 'local' | 'node_module';
id: string;
}
@@ -63,9 +63,7 @@ describe('Content Script UIs', () => {
});
ui.mount();
expect(
document.querySelector('div[data-wxt-integrated]'),
).not.toBeNull();
expect(document.body.children).toContain(ui.wrapper);
expect(document.querySelector('app')).not.toBeNull();
});
@@ -77,9 +75,7 @@ describe('Content Script UIs', () => {
});
ui.mount();
expect(
document.querySelector('pre[data-wxt-integrated]'),
).not.toBeNull();
expect(document.querySelector('pre')).toBe(ui.wrapper);
expect(document.querySelector('app')).not.toBeNull();
});
});
@@ -92,7 +88,7 @@ describe('Content Script UIs', () => {
});
ui.mount();
expect(document.querySelector('div[data-wxt-iframe]')).toBeDefined();
expect(document.body.children).toContain(ui.wrapper);
expect(document.querySelector('iframe')).toBeDefined();
});
});
@@ -108,9 +104,7 @@ describe('Content Script UIs', () => {
});
ui.mount();
expect(
document.querySelector('test-component[data-wxt-shadow-root]'),
).not.toBeNull();
expect(document.querySelector('test-component')).toBe(ui.shadowHost);
expect(ui.shadow.querySelector('app')).not.toBeNull();
});
@@ -143,7 +137,7 @@ describe('Content Script UIs', () => {
});
expect(ui.wrapper.outerHTML).toMatchInlineSnapshot(
`"<div data-wxt-iframe=""><iframe src="chrome-extension://test-extension-id/page.html"></iframe></div>"`,
`"<div><iframe src="chrome-extension://test-extension-id/page.html"></iframe></div>"`,
);
});
});
@@ -157,7 +151,7 @@ describe('Content Script UIs', () => {
ui.mount();
expect(ui.wrapper.outerHTML).toMatchInlineSnapshot(
`"<div data-wxt-iframe="" style="overflow: visible; position: relative; width: 0px; height: 0px; display: block;"><iframe src="chrome-extension://test-extension-id/page.html" style="position: absolute; top: 0px; left: 0px;"></iframe></div>"`,
`"<div style="overflow: visible; position: relative; width: 0px; height: 0px; display: block;"><iframe src="chrome-extension://test-extension-id/page.html" style="position: absolute; top: 0px; left: 0px;"></iframe></div>"`,
);
});
@@ -170,7 +164,7 @@ describe('Content Script UIs', () => {
ui.mount();
expect(ui.wrapper.outerHTML).toMatchInlineSnapshot(
`"<div data-wxt-iframe="" style="overflow: visible; position: relative; width: 0px; height: 0px; display: block;"><iframe src="chrome-extension://test-extension-id/page.html" style="position: absolute; top: 0px; left: 0px;"></iframe></div>"`,
`"<div style="overflow: visible; position: relative; width: 0px; height: 0px; display: block;"><iframe src="chrome-extension://test-extension-id/page.html" style="position: absolute; top: 0px; left: 0px;"></iframe></div>"`,
);
});
@@ -183,7 +177,7 @@ describe('Content Script UIs', () => {
ui.mount();
expect(ui.wrapper.outerHTML).toMatchInlineSnapshot(
`"<div data-wxt-iframe="" style="overflow: visible; position: relative; width: 0px; height: 0px; display: block;"><iframe src="chrome-extension://test-extension-id/page.html" style="position: absolute; top: 0px; right: 0px;"></iframe></div>"`,
`"<div style="overflow: visible; position: relative; width: 0px; height: 0px; display: block;"><iframe src="chrome-extension://test-extension-id/page.html" style="position: absolute; top: 0px; right: 0px;"></iframe></div>"`,
);
});
@@ -196,7 +190,7 @@ describe('Content Script UIs', () => {
ui.mount();
expect(ui.wrapper.outerHTML).toMatchInlineSnapshot(
`"<div data-wxt-iframe="" style="overflow: visible; position: relative; width: 0px; height: 0px; display: block;"><iframe src="chrome-extension://test-extension-id/page.html" style="position: absolute; bottom: 0px; right: 0px;"></iframe></div>"`,
`"<div style="overflow: visible; position: relative; width: 0px; height: 0px; display: block;"><iframe src="chrome-extension://test-extension-id/page.html" style="position: absolute; bottom: 0px; right: 0px;"></iframe></div>"`,
);
});
@@ -209,7 +203,7 @@ describe('Content Script UIs', () => {
ui.mount();
expect(ui.wrapper.outerHTML).toMatchInlineSnapshot(
`"<div data-wxt-iframe="" style="overflow: visible; position: relative; width: 0px; height: 0px; display: block;"><iframe src="chrome-extension://test-extension-id/page.html" style="position: absolute; bottom: 0px; left: 0px;"></iframe></div>"`,
`"<div style="overflow: visible; position: relative; width: 0px; height: 0px; display: block;"><iframe src="chrome-extension://test-extension-id/page.html" style="position: absolute; bottom: 0px; left: 0px;"></iframe></div>"`,
);
});
@@ -235,7 +229,7 @@ describe('Content Script UIs', () => {
ui.mount();
expect(ui.wrapper.outerHTML).toMatchInlineSnapshot(
`"<div data-wxt-iframe="" style="overflow: visible; position: relative; width: 0px; height: 0px; display: block;"><iframe src="chrome-extension://test-extension-id/page.html" style="position: fixed; top: 0px; bottom: 0px; left: 0px; right: 0px;"></iframe></div>"`,
`"<div style="overflow: visible; position: relative; width: 0px; height: 0px; display: block;"><iframe src="chrome-extension://test-extension-id/page.html" style="position: fixed; top: 0px; bottom: 0px; left: 0px; right: 0px;"></iframe></div>"`,
);
});
@@ -262,9 +256,7 @@ describe('Content Script UIs', () => {
});
ui.mount();
expect(
document.querySelector('body > div[data-wxt-integrated]'),
).not.toBeNull();
expect(document.body.children).toContain(ui.wrapper);
});
});
@@ -277,9 +269,9 @@ describe('Content Script UIs', () => {
});
ui.mount();
expect(
document.querySelector('#parent > div[data-wxt-integrated]'),
).not.toBeNull();
expect(document.querySelector('#parent')!.children).toContain(
ui.wrapper,
);
});
it('should append the element using an XPath string', () => {
@@ -295,9 +287,7 @@ describe('Content Script UIs', () => {
});
ui.mount();
expect(
document.querySelector('#three > div[data-wxt-integrated]'),
).not.toBeNull();
expect(document.querySelector('#three')!.children[0]).toBe(ui.wrapper);
});
});
@@ -310,9 +300,9 @@ describe('Content Script UIs', () => {
});
ui.mount();
expect(
document.querySelector('#parent > div[data-wxt-integrated]'),
).not.toBeNull();
expect(document.querySelector('#parent')!.children).toContain(
ui.wrapper,
);
});
});
@@ -325,9 +315,9 @@ describe('Content Script UIs', () => {
});
ui.mount();
expect(
document.querySelector('#parent > div[data-wxt-integrated]'),
).not.toBeNull();
expect(document.querySelector('#parent')!.children).toContain(
ui.wrapper,
);
});
});
@@ -354,9 +344,7 @@ describe('Content Script UIs', () => {
ui.mount();
expect(
document.querySelector(
'#parent > div[data-wxt-integrated]:last-child',
),
document.querySelector('#parent')!.lastElementChild,
).not.toBeNull();
});
});
@@ -372,9 +360,7 @@ describe('Content Script UIs', () => {
ui.mount();
expect(
document.querySelector(
'#parent > div[data-wxt-integrated]:first-child',
),
document.querySelector('#parent')!.children[0].firstElementChild,
).not.toBeNull();
});
});
@@ -389,9 +375,7 @@ describe('Content Script UIs', () => {
});
ui.mount();
expect(
document.querySelector('body > div[data-wxt-integrated]'),
).not.toBeNull();
expect(document.body.children).toContain(ui.wrapper);
expect(document.querySelector('#parent')).toBeNull();
});
});
@@ -406,11 +390,9 @@ describe('Content Script UIs', () => {
});
ui.mount();
expect(
document.querySelector(
'#parent > div[data-wxt-integrated]:first-child',
),
).not.toBeNull();
expect(document.querySelector('#parent')!.firstElementChild).toBe(
ui.wrapper,
);
});
});
@@ -424,11 +406,9 @@ describe('Content Script UIs', () => {
});
ui.mount();
expect(
document.querySelector(
'#parent > div[data-wxt-integrated]:last-child',
),
).not.toBeNull();
expect(document.querySelector('#parent')!.lastElementChild).toBe(
ui.wrapper,
);
});
});
@@ -444,9 +424,8 @@ describe('Content Script UIs', () => {
});
ui.mount();
expect(
document.querySelector('body > div[data-wxt-integrated]'),
).not.toBeNull();
expect(document.body.children).toContain(ui.wrapper);
expect(document.querySelector('#parent')).toBeNull();
});
});
@@ -529,23 +508,29 @@ describe('Content Script UIs', () => {
{
name: 'integrated',
createUiFunction: createIntegratedUi,
uiSelector: 'div[data-wxt-integrated]',
uiSelector: '[data-wrapper-name="integrated"]',
},
{
name: 'iframe',
createUiFunction: createIframeUi,
uiSelector: 'div[data-wxt-iframe]',
uiSelector: `[data-wrapper-name="iframe"]`,
},
{
name: 'shadow-root',
createUiFunction: createShadowRootUi,
uiSelector: 'test-component[data-wxt-shadow-root]',
uiSelector: 'test-component',
},
] as const)(
'built-in UI type: $name',
({ name, createUiFunction, uiSelector }) => {
const onMount = vi.fn((wrapper: HTMLElement) => {
if (name === 'shadow-root') return;
wrapper.setAttribute('data-wrapper-name', name);
appendTestApp(wrapper);
});
it('should mount if an anchor already exists at the initialization', async () => {
const onMount = vi.fn(appendTestApp);
ui = await createUiFunction(ctx, {
position: 'inline',
onMount,
@@ -555,6 +540,7 @@ describe('Content Script UIs', () => {
});
appendTestElement({ id: DYNAMIC_CHILD_ID });
ui.autoMount();
await runMicrotasks();
@@ -564,7 +550,6 @@ describe('Content Script UIs', () => {
});
it('should mount when an anchor is dynamically added and unmount when an anchor is removed', async () => {
const onMount = vi.fn(appendTestApp);
const onRemove = vi.fn();
ui = await createUiFunction(ctx, {
position: 'inline',
@@ -599,7 +584,6 @@ describe('Content Script UIs', () => {
describe('options', () => {
it('should auto-mount only once mount and remove when the `once` option is true', async () => {
const onMount = vi.fn(appendTestApp);
const onRemove = vi.fn();
ui = await createUiFunction(ctx, {
position: 'inline',
@@ -644,7 +628,7 @@ describe('Content Script UIs', () => {
it('should throw when anchor is set as type Element', async () => {
ui = await createUiFunction(ctx, {
position: 'inline',
onMount: appendTestApp,
onMount,
anchor: document.documentElement,
page: name === 'iframe' ? '/page.html' : undefined,
name: 'test-component',
@@ -657,7 +641,7 @@ describe('Content Script UIs', () => {
it('should throw when anchor is set as type `() => Element`', async () => {
ui = await createUiFunction(ctx, {
position: 'inline',
onMount: appendTestApp,
onMount,
anchor: () => document.documentElement,
page: name === 'iframe' ? '/page.html' : undefined,
name: 'test-component',
@@ -670,7 +654,6 @@ describe('Content Script UIs', () => {
describe('StopAutoMount', () => {
it('should stop auto-mounting and remove ui when `ui.remove` is called', async () => {
const onMount = vi.fn(appendTestApp);
const onRemove = vi.fn();
ui = await createUiFunction(ctx, {
position: 'inline',
@@ -705,7 +688,6 @@ describe('Content Script UIs', () => {
});
it('should call internal StopAutoMount when `ui.remove` is called', async () => {
const onMount = vi.fn(appendTestApp);
const onRemove = vi.fn();
const onStop = vi.fn();
ui = await createUiFunction(ctx, {
@@ -723,7 +705,6 @@ describe('Content Script UIs', () => {
});
it('should allow calling automount again after internal StopAutoMount is called', async () => {
const onMount = vi.fn(appendTestApp);
ui = await createUiFunction(ctx, {
position: 'inline',
onMount,
@@ -14,7 +14,6 @@ export function createIframeUi<TMounted>(
options: IframeContentScriptUiOptions<TMounted>,
): IframeContentScriptUi<TMounted> {
const wrapper = document.createElement('div');
wrapper.setAttribute('data-wxt-iframe', '');
const iframe = document.createElement('iframe');
// @ts-expect-error: getURL is defined per-project, but not inside the package
iframe.src = browser.runtime.getURL(options.page);
@@ -46,8 +45,9 @@ export function createIframeUi<TMounted>(
};
}
export interface IframeContentScriptUi<TMounted>
extends ContentScriptUi<TMounted> {
export interface IframeContentScriptUi<
TMounted,
> extends ContentScriptUi<TMounted> {
/**
* The iframe added to the DOM.
*/
@@ -13,7 +13,6 @@ export function createIntegratedUi<TMounted>(
options: IntegratedContentScriptUiOptions<TMounted>,
): IntegratedContentScriptUi<TMounted> {
const wrapper = document.createElement(options.tag || 'div');
wrapper.setAttribute('data-wxt-integrated', '');
let mounted: TMounted | undefined = undefined;
const mount = () => {
@@ -51,8 +50,9 @@ export function createIntegratedUi<TMounted>(
* Shared types for the different `wxt/utils/content-script-ui/*` modules.
* @module wxt/utils/content-script-ui/types
*/
export interface IntegratedContentScriptUi<TMounted>
extends ContentScriptUi<TMounted> {
export interface IntegratedContentScriptUi<
TMounted,
> extends ContentScriptUi<TMounted> {
/**
* A wrapper div that assists in positioning.
*/
@@ -48,7 +48,6 @@ export async function createShadowRootUi<TMounted>(
mode: options.mode ?? 'open',
isolateEvents: options.isolateEvents,
});
shadowHost.setAttribute('data-wxt-shadow-root', '');
let mounted: TMounted | undefined;
@@ -135,8 +134,9 @@ async function loadCss(): Promise<string> {
}
}
export interface ShadowRootContentScriptUi<TMounted>
extends ContentScriptUi<TMounted> {
export interface ShadowRootContentScriptUi<
TMounted,
> extends ContentScriptUi<TMounted> {
/**
* The `HTMLElement` hosting the shadow root used to isolate the UI's styles. This is the element
* that get's added to the DOM. This element's style is not isolated from the webpage.
@@ -1,5 +1,7 @@
/** @module wxt/utils/split-shadow-root-css */
const AT_RULE_BLOCKS = /(\s*@(property|font-face)[\s\S]*?{[\s\S]*?})/gm;
/**
* Given a CSS string that will be loaded into a shadow root, split it into two parts:
* - `documentCss`: CSS that needs to be applied to the document (like `@property`)
@@ -10,18 +12,13 @@ export function splitShadowRootCss(css: string): {
documentCss: string;
shadowCss: string;
} {
let shadowCss = css;
let documentCss = '';
const rulesRegex = /(\s*@(property|font-face)[\s\S]*?{[\s\S]*?})/gm;
let match;
while ((match = rulesRegex.exec(css)) !== null) {
documentCss += match[1];
shadowCss = shadowCss.replace(match[1], '');
}
const documentCss = Array.from(css.matchAll(AT_RULE_BLOCKS), (m) => m[0])
.join('')
.trim();
const shadowCss = css.replace(AT_RULE_BLOCKS, '').trim();
return {
documentCss: documentCss.trim(),
shadowCss: shadowCss.trim(),
documentCss: documentCss,
shadowCss: shadowCss,
};
}
+2
View File
@@ -17,6 +17,8 @@
"src/utils/split-shadow-root-css.ts",
"src/utils/storage.ts",
"src/testing/index.ts",
"src/testing/fake-browser.ts",
"src/testing/wxt-vitest-plugin.ts",
"src/modules.ts"
]
}
+2588 -3437
View File
File diff suppressed because it is too large Load Diff
+8
View File
@@ -8,3 +8,11 @@ onlyBuiltDependencies:
- sharp
- simple-git-hooks
- spawn-sync
autoInstallPeers: false
patchedDependencies:
markdown-it-footnote: patches/markdown-it-footnote.patch
peerDependencyRules:
ignoreMissing:
- '@algolia/client-search'
- search-insights
- svelte
+9 -8
View File
@@ -4,6 +4,7 @@ import * as semver from 'semver';
import { dirname } from 'node:path';
import consola from 'consola';
import spawn from 'nano-spawn';
import pMap from 'p-map';
const HELP_MESSAGE = `
Upgrades dependencies throughout WXT using custom rules.
@@ -177,7 +178,7 @@ function validateNoMultipleVersions(
async function fetchPackageInfo(name: string): Promise<PackageInfo> {
// Use PNPM instead of API in case dependencies don't come from NPM
const res = await spawn('pnpm', ['view', name, '--json']);
return JSON.parse(res.output);
return JSON.parse(res.stdout);
}
type PackageInfo = {
@@ -203,12 +204,13 @@ type DependencyInfo = {
async function fetchAllPackageInfos(
deps: DependencyVersionMap,
): Promise<DependencyInfo[]> {
const infos = await Promise.all(
Object.entries(deps).map(async ([name, currentVersionRange]) => ({
name,
currentVersionRange,
info: await fetchPackageInfo(name),
})),
const infos: DependencyInfo[] = await pMap(
Object.entries(deps),
async ([name, currentVersionRange]) => {
const info = await fetchPackageInfo(name);
return { name, currentVersionRange, info };
},
{ concurrency: 20 },
);
return infos.toSorted((a, b) => a.name.localeCompare(b.name));
}
@@ -253,7 +255,6 @@ async function detectUpgrades(
const latestVersion = dep.info['dist-tags'].latest;
const latestVersionReleasedAt = new Date(dep.info.time[latestVersion]);
semver.RELEASE_TYPES;
const upgradeToVersion = isMajor
? // Always use the latest version for major upgrades
latestVersion
+6 -6
View File
@@ -15,14 +15,14 @@
"postinstall": "wxt prepare"
},
"dependencies": {
"react": "^19.1.1",
"react-dom": "^19.1.1"
"react": "^19.2.3",
"react-dom": "^19.2.3"
},
"devDependencies": {
"@types/react": "^19.1.12",
"@types/react-dom": "^19.1.9",
"@wxt-dev/module-react": "^1.1.3",
"typescript": "^5.9.2",
"@types/react": "^19.2.7",
"@types/react-dom": "^19.2.3",
"@wxt-dev/module-react": "^1.1.5",
"typescript": "^5.9.3",
"wxt": "^0.20.6"
}
}
+3 -3
View File
@@ -15,11 +15,11 @@
"postinstall": "wxt prepare"
},
"dependencies": {
"solid-js": "^1.9.9"
"solid-js": "^1.9.10"
},
"devDependencies": {
"@wxt-dev/module-solid": "^1.1.3",
"typescript": "^5.9.2",
"@wxt-dev/module-solid": "^1.1.4",
"typescript": "^5.9.3",
"wxt": "^0.20.6"
}
}
+5 -5
View File
@@ -15,12 +15,12 @@
"postinstall": "wxt prepare"
},
"devDependencies": {
"@tsconfig/svelte": "^5.0.5",
"@wxt-dev/module-svelte": "^2.0.3",
"svelte": "^5.38.6",
"svelte-check": "^4.3.1",
"@tsconfig/svelte": "^5.0.6",
"@wxt-dev/module-svelte": "^2.0.4",
"svelte": "^5.46.0",
"svelte-check": "^4.3.4",
"tslib": "^2.8.1",
"typescript": "^5.9.2",
"typescript": "^5.9.3",
"wxt": "^0.20.6"
}
}
+2 -2
View File
@@ -1,12 +1,12 @@
import './style.css';
import typescriptLogo from '@/assets/typescript.svg';
import viteLogo from '/wxt.svg';
import wxtLogo from '/wxt.svg';
import { setupCounter } from '@/components/counter';
document.querySelector<HTMLDivElement>('#app')!.innerHTML = `
<div>
<a href="https://wxt.dev" target="_blank">
<img src="${viteLogo}" class="logo" alt="WXT logo" />
<img src="${wxtLogo}" class="logo" alt="WXT logo" />
</a>
<a href="https://www.typescriptlang.org/" target="_blank">
<img src="${typescriptLogo}" class="logo vanilla" alt="TypeScript logo" />
+1 -1
View File
@@ -15,7 +15,7 @@
"postinstall": "wxt prepare"
},
"devDependencies": {
"typescript": "^5.9.2",
"typescript": "^5.9.3",
"wxt": "^0.20.6"
}
}
+4 -4
View File
@@ -15,12 +15,12 @@
"postinstall": "wxt prepare"
},
"dependencies": {
"vue": "^3.5.13"
"vue": "^3.5.25"
},
"devDependencies": {
"@wxt-dev/module-vue": "^1.0.2",
"typescript": "^5.9.2",
"vue-tsc": "^3.0.6",
"@wxt-dev/module-vue": "^1.0.3",
"typescript": "^5.9.3",
"vue-tsc": "^3.1.8",
"wxt": "^0.20.6"
}
}