Compare commits

...

64 Commits

Author SHA1 Message Date
github-actions[bot] d8a8202e63 chore(release): wxt v0.19.28
📼 VHS / Create VHS (push) Waiting to run
2025-03-04 00:26:31 +00:00
Aaron c9eb3b0ca9 fix: Allow vite 6.0.9+ (#1497) 2025-03-03 18:21:18 -06:00
Aaron 665f5a52c4 chore: Fix typo 2025-03-03 17:57:45 -06:00
Aaron 798f3b8e47 chore(deps): Upgrade to Vite 6 and related dependencies (#1496) 2025-03-03 17:52:52 -06:00
Aaron a886ab28e1 chore(deps-dev): bump happy-dom from 15.11.4 to 17.1.8 (#1495) 2025-03-03 15:06:42 -06:00
Aaron 28cff9c90a chore: Move production dependencies to PNPM 10 catelog (#1494) 2025-03-03 14:57:28 -06:00
Aaron 8ce197b023 chore: Use PNPM 10's new catelog feature (#1493) 2025-03-03 14:50:05 -06:00
dependabot[bot] a5553457c6 chore(deps): bump vite-plugin-solid from 2.10.2 to 2.11.6 (#1491)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-03 14:26:55 -06:00
Saksham Kushwaha 7d9ed777fb docs: Added monochromate to the homepage (#1486)
Co-authored-by: Aaron <aaronklinker1@gmail.com>
2025-03-03 14:26:09 -06:00
Aaron 59362e7274 chore: Upgrade to PNPM 10 (#1492) 2025-03-03 14:23:11 -06:00
Aaron d32d17952c chore: Update workflow emoji 2025-03-03 14:14:03 -06:00
Aaron 6630bca73f chore: Update dependabot config 2025-03-03 14:02:14 -06:00
Okinea Dev befd442075 ci: fix pr-closed.yml workflow (#1470) 2025-03-02 10:50:04 -06:00
Aaron da885ff6c8 docs: Update browser-startup.md 2025-02-27 09:59:29 -06:00
Aaron 349b216439 docs: Update entrypoints.md 2025-02-27 09:58:19 -06:00
Aaron 47b78d66cf docs: Fix typo in auto-imports.md 2025-02-27 09:45:39 -06:00
Aaron fe2baef2b1 chore: Upgrade vitepress-knowledge 2025-02-26 22:01:15 -06:00
Aaron 357bbdaec9 docs: Add AI assistant to https://wxt.dev (#1453) 2025-02-20 23:52:04 -06:00
Stefan Maric a38e3c2733 fix: regression on variable expansion in dotenv files (#1449) 2025-02-18 21:47:47 -06:00
Okinea Dev f17e527d72 chore: improve .gitattributes (#1447) 2025-02-18 07:59:31 -06:00
Okinea Dev e20de4ca0d chore: Add funding links to package.json files (#1446) 2025-02-17 15:35:01 -06:00
Aaron 16ac53e0a1 docs: Fix link to knowledge file index 2025-02-17 11:46:03 -06:00
skube fee978bf25 docs: Uses correct grammar (#1445) 2025-02-16 16:39:21 -06:00
Aaron f80909d63e docs: Host pre-aggregated LLM knowledge files (#1355) 2025-02-16 14:03:18 -06:00
Aaron d5b2503155 ci: Update pkg.pr.new workflow names 2025-02-16 12:40:54 -06:00
Aaron 80ca5760e2 docs: Fix bad alias usage in assets examples (#1443) 2025-02-16 10:12:21 -06:00
Okinea Dev 44dab3726f ci: Add PR title checker workflow and thank-you comment on merge (#1385)
Co-authored-by: Aaron <aaronklinker1@gmail.com>
2025-02-15 18:38:43 -06:00
Aaron c4295a4f4b ci: Improve main check step name 2025-02-15 10:40:51 -06:00
1natsu a6a91250d1 fix: Properly detect and reload changed files when using Vite's ?suffix imports (#1432) 2025-02-13 22:45:52 -06:00
Okinea Dev 1db50ed7a9 ci: Enhance GitHub Actions workflows (#1370)
Co-authored-by: Aaron <aaronklinker1@gmail.com>
2025-02-13 16:06:46 -06:00
Alec Larson 342057b3f5 fix: resolve wxt modules from the root (#1417) 2025-02-12 22:12:48 -06:00
John Wu 151b1392c6 docs: Add comctx to community page (#1422) 2025-02-12 21:37:37 -06:00
John Wu 1d5d0663ac docs: Add comctx to messaging docs (#1421) 2025-02-12 21:36:37 -06:00
Aaron 30b8ba495d fix: Ignore manifest.manifest_version option and warn about incorrect usage (#1419) 2025-02-12 08:43:44 -06:00
Andy Cloke 5775c9ce0f docs: Add "Python Code Runner" to homepage (#1420) 2025-02-12 02:40:59 -06:00
GitHub Actions 4f82dd87fc chore(release): wxt v0.19.27
vhs / vhs (push) Waiting to run
2025-02-12 06:31:38 +00:00
Aaron fab9fa81d1 ci: Add missing permission to release workflow 2025-02-11 23:52:15 -06:00
Jaguar Zhou d6ee4560d8 fix: auto-import does not work when using @vitejs/plugin-vue alone (#1412) 2025-02-11 23:49:59 -06:00
Alec Larson 655ba863a0 fix: respect inlineConfig.mode when setting NODE_ENV (#1416) 2025-02-11 23:44:29 -06:00
Aaron ac92d4019f fix: Support publish-browser-extension v3.0.0 2025-02-11 23:36:49 -06:00
Andy Nguyen 0ff964a04b docs: fix typo you're -> your (#1414) 2025-02-09 15:35:31 -06:00
Malix 89459f0a4d docs: Add "maintenance" to the comparison (#1404) 2025-02-08 13:58:36 -06:00
Aaron 0d56100abb docs: Fix wording around ESM background scripts 2025-02-07 23:28:24 -06:00
Aaron dc770b5952 docs: Update ESM docs to clearify that it covers configuring ESM at runtime 2025-02-07 23:24:00 -06:00
Aaron 8cd2bff67a revert: #1382 - migrate feature request template to YAML form (#1410) 2025-02-07 21:56:28 -06:00
Okinea Dev 11e55e2499 chore: Migrate feature request template to YAML form (#1382) 2025-02-07 21:52:21 -06:00
Okinea Dev 4cab3a5593 chore: Add vscode configuration (#1399) 2025-02-07 21:33:50 -06:00
st3h3n daa0eed851 fix: Use path triple slash directive for types that are referenced via path (#1407)
Co-authored-by: Stefan Hensel <stefan.hensel@varia.media>
2025-02-07 12:00:08 -06:00
Aabid 868a347d40 docs: Fixed an external link in FAQs (#1402) 2025-02-07 02:40:14 -06:00
daichan132 48a87aa352 docs: Add "Youtube Live Chat Fullscreen" to homepage (#1398) 2025-02-04 19:54:54 +01:00
Aaron dfec8a3608 chore: Cleanup CODEOWNERS file, add myself to .github dir 2025-02-01 14:31:30 -06:00
dependabot[bot] 9a71231436 chore(deps-dev): bump solid-js from 1.9.3 to 1.9.4 (#1391)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-02-01 14:12:44 -06:00
Aaron db4592fbb3 docs: Add community page (#1381) 2025-02-01 14:11:35 -06:00
Solaiman Islam Naiem 8551d6071e docs: Add "Walmart WFS Profit Calculator" to homepage (#1380) 2025-01-30 08:15:09 -06:00
Florian Metz c40285f750 chore(repo): add CODEOWNERS (#1377) 2025-01-29 17:32:34 -06:00
Eli 9238f9fd85 fix: Allow vite-node@^3.0.0 (#1378) 2025-01-29 17:32:14 -06:00
GitHub Actions ba3d8838e3 chore(release): @wxt-dev/module-svelte v2.0.3
vhs / vhs (push) Waiting to run
2025-01-28 21:17:33 +00:00
Eli e9b6f5f97c fix: Upgrade vite-plugin-svelte to support Vite 6 (#1375)
Co-authored-by: Aaron <aaronklinker1@gmail.com>
2025-01-28 15:09:01 -06:00
Aaron 5b6c82d38f chore: Fix formatting 2025-01-28 14:43:38 -06:00
Aaron 5b41b70abe docs: Add SECURITY.md 2025-01-28 14:41:56 -06:00
Okinea Dev 93f624610f chore: add pull request template (#1372)
Co-authored-by: Aaron <aaronklinker1@gmail.com>
2025-01-28 08:03:26 -06:00
Okinea Dev 73bdd49471 chore: simplify FUNDING.yml (#1371) 2025-01-28 07:32:59 -06:00
GitHub Actions 635f3f0898 chore(release): wxt v0.19.26
vhs / vhs (push) Waiting to run
2025-01-28 06:46:49 +00:00
Deniz Uğur a53ee6d590 fix(context): Deduplicate wxt:content-script-started (#1364)
Co-authored-by: DenizUgur <DenizUgur@users.noreply.github.com>
Co-authored-by: Aaron <aaronklinker1@gmail.com>
2025-01-28 00:41:12 -06:00
72 changed files with 3595 additions and 2683 deletions
+10
View File
@@ -0,0 +1,10 @@
extends:
- '@commitlint/config-conventional'
rules:
subject-case:
- 0
- always
- - sentence-case
- start-case
- pascal-case
- upper-case
+8
View File
@@ -1,5 +1,13 @@
# See https://git-scm.com/docs/gitattributes#_pattern_format for more about `.gitattributes`.
# Normalize EOL for all files that Git considers text files
* text=auto eol=lf
# Mark lock files as generated to avoid diffing
pnpm-lock.yaml linguist-generated
package-lock.json linguist-generated
bun.lockb linguist-generated
yarn.lock linguist-generated
# Exclude templates from language statistics
templates/**/* linguist-vendored
+9
View File
@@ -0,0 +1,9 @@
# Set default
* @aklinker1 @Timeraa
# Secure Directories
/.github/ @aklinker1
# Creator of specific wxt modules
/packages/auto-icons/ @Timeraa
/packages/unocss/ @Timeraa
+2 -14
View File
@@ -1,15 +1,3 @@
# These are supported funding model platforms
# https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/displaying-a-sponsor-button-in-your-repository#about-funding-files
github: [wxt-dev] # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry
polar: # Replace with a single Polar username
buy_me_a_coffee: # Replace with a single Buy Me a Coffee username
thanks_dev: # Replace with a single thanks.dev username
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
github: wxt-dev
+11 -3
View File
@@ -1,23 +1,31 @@
name: Basic Setup
description: Install PNPM, Node, and dependencies
inputs:
install:
default: 'true'
type: boolean
description: Whether or not to run 'pnpm install'
installArgs:
default: ''
type: string
description: Additional args to append to "pnpm install"
runs:
using: composite
steps:
- name: Setup PNPM
- name: 🛠️ Setup PNPM
uses: pnpm/action-setup@v4
- name: Setup NodeJS
- name: 🛠️ Setup NodeJS
uses: actions/setup-node@v4
with:
node-version: 18
cache: pnpm
- name: Install Dependencies
- name: 📦 Install Dependencies
if: ${{ inputs.install == 'true' }}
shell: bash
run: pnpm install ${{ inputs.installArgs }}
+1 -3
View File
@@ -6,9 +6,7 @@
version: 2
updates:
- package-ecosystem: npm
directories:
- /
- packages/*
directory: /
schedule:
interval: 'monthly'
- package-ecosystem: 'github-actions'
+13
View File
@@ -0,0 +1,13 @@
### Overview
<!-- Describe your changes and why you made them -->
### Manual Testing
<!-- Describe how to test your changes to make sure the PR works as intended -->
### Related Issue
<!-- If this PR is related to an issue, please link it here -->
This PR closes #<issue_number>
+16 -5
View File
@@ -1,4 +1,4 @@
name: Continuous Publish
name: ✨ pkg.pr.new
on:
push:
branches:
@@ -7,11 +7,22 @@ on:
branches:
- main
permissions:
contents: read
jobs:
build:
name: Publish Test Packages
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v4
- uses: ./.github/actions/setup
- run: pnpm buildc all
- run: pnpx pkg-pr-new publish --compact './packages/*'
- name: Checkout
uses: actions/checkout@v4
- name: Setup
uses: ./.github/actions/setup
- name: Build All Packages
run: pnpm buildc all
- name: Publish
run: pnpx pkg-pr-new publish --compact --pnpm './packages/*'
+29
View File
@@ -0,0 +1,29 @@
name: 🎉 PR closed
on:
pull_request_target:
types:
- closed
permissions:
contents: read
pull-requests: write
jobs:
thank-you:
runs-on: ubuntu-latest
if: github.event.pull_request.merged == true
steps:
- name: Post Thank You Comment
uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1
env:
comment: Thanks for helping make WXT better!
with:
script: |
github.rest.issues.createComment({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: process.env.comment
})
+26
View File
@@ -0,0 +1,26 @@
name: 🛡️ Check PR Title
on:
pull_request:
types: [opened, edited]
jobs:
lint-pr-title:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
# Only fetch the config file from the repository
sparse-checkout-cone-mode: false
sparse-checkout: .commitlintrc.yml
- name: Install dependencies
run: npm install --global @commitlint/config-conventional commitlint
- name: Check PR title with commitlint
env:
PR_TITLE: ${{ github.event.pull_request.title }}
HELP_URL: https://github.com/wxt-dev/wxt/blob/main/CONTRIBUTING.md#conventional-pr-titles
run: echo "$PR_TITLE" | npx commitlint --help-url $HELP_URL
+26 -8
View File
@@ -1,4 +1,4 @@
name: Publish Docs
name: 📝 Publish Docs
on:
push:
branches:
@@ -10,20 +10,38 @@ on:
required: true
default: latest
permissions:
contents: read
jobs:
publish:
# Only run if it's the upstream repository, not forks
if: github.repository == 'wxt-dev/wxt'
name: Publish Docs
runs-on: ubuntu-22.04
permissions:
contents: write
steps:
- uses: actions/checkout@v4
- uses: ./.github/actions/setup
- uses: docker/login-action@v3
- name: Checkout
uses: actions/checkout@v4
- name: Setup
uses: ./.github/actions/setup
- name: Login to Docker Registry
uses: docker/login-action@v3
with:
registry: https://${{ secrets.DOCKER_REGISTRY_HOSTNAME }}
username: ${{ secrets.DOCKER_REGISTRY_USERNAME }}
password: ${{ secrets.DOCKER_REGISTRY_PASSWORD }}
- run: pnpm docs:build
- run: docker build docs/.vitepress -t ${{ secrets.DOCKER_REGISTRY_HOSTNAME }}/wxt/docs:${{ github.event.inputs.tag || 'latest' }}
- run: docker push ${{ secrets.DOCKER_REGISTRY_HOSTNAME }}/wxt/docs:${{ github.event.inputs.tag || 'latest' }}
- run: curl -X POST -i ${{ secrets.UPDATE_DOCS_WEBHOOK }}
- name: Build docs
run: |
pnpm docs:build
docker build docs/.vitepress -t ${{ secrets.DOCKER_REGISTRY_HOSTNAME }}/wxt/docs:${{ github.event.inputs.tag || 'latest' }}
- name: Push Image
run: docker push ${{ secrets.DOCKER_REGISTRY_HOSTNAME }}/wxt/docs:${{ github.event.inputs.tag || 'latest' }}
- name: Deploy
run: curl -X POST -i ${{ secrets.UPDATE_DOCS_WEBHOOK }}
+21 -8
View File
@@ -1,4 +1,4 @@
name: Release
name: 🚀 Release
on:
workflow_dispatch:
inputs:
@@ -17,38 +17,51 @@ on:
- unocss
- wxt
permissions:
contents: read
jobs:
validate:
name: Validate
uses: './.github/workflows/validate.yml'
secrets: inherit
publish:
name: Publish
runs-on: ubuntu-22.04
permissions:
contents: write
needs:
- validate
steps:
- uses: actions/checkout@v4
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: ./.github/actions/setup
- name: Setup
uses: ./.github/actions/setup
- name: Configure Git
run: |
git config user.name 'github-actions[bot]'
git config user.email 'github-actions[bot]@users.noreply.github.com'
git config --global push.followTags true
- name: Bump and Tag
run: |
git config user.email "github-actions@users.noreply.github.com"
git config user.name "GitHub Actions"
pnpm tsx scripts/bump-package-version.ts ${{ inputs.package }}
git push
git push --tags
- name: NPM
- name: Publish to NPM
working-directory: packages/${{ inputs.package }}
run: |
echo "//registry.npmjs.org/:_authToken=${{ secrets.NPM_AUTH_TOKEN }}" > ~/.npmrc
pnpm build
pnpm publish
working-directory: packages/${{ inputs.package }}
- name: GitHub Release
- name: Create GitHub release
run: pnpm tsx scripts/create-github-release.ts ${{ inputs.package }}
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+15 -4
View File
@@ -1,4 +1,4 @@
name: Sync Releases
name: 🔄 Sync Releases
on:
workflow_dispatch:
inputs:
@@ -16,14 +16,25 @@ on:
- storage
- wxt
permissions:
contents: read
jobs:
sync:
name: Sync Releases
runs-on: ubuntu-22.04
permissions:
contents: write
steps:
- uses: actions/checkout@v4
- uses: ./.github/actions/setup
- name: Checkout
uses: actions/checkout@v4
- name: Setup
uses: ./.github/actions/setup
with:
installArgs: --ignore-scripts
- run: pnpm tsx scripts/sync-releases.ts ${{ inputs.package }}
- name: Sync Releases
run: pnpm tsx scripts/sync-releases.ts ${{ inputs.package }}
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+86 -27
View File
@@ -1,4 +1,4 @@
name: Validate
name: 🛡️ Validate
on:
workflow_call:
pull_request:
@@ -6,46 +6,90 @@ on:
branches:
- main
permissions:
contents: read
jobs:
checks:
name: Checks
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v4
- uses: ./.github/actions/setup
- run: pnpm check
- name: Checkout
uses: actions/checkout@v4
- name: Setup
uses: ./.github/actions/setup
- name: Basic Checks
run: pnpm check
builds:
name: Builds
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v4
- uses: ./.github/actions/setup
- run: pnpm buildc all
- name: Checkout
uses: actions/checkout@v4
- name: Setup
uses: ./.github/actions/setup
- name: Build All Packages
run: pnpm buildc all
build-demo:
name: Build Demo
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v4
- uses: ./.github/actions/setup
- run: pnpm build:all
- name: Checkout
uses: actions/checkout@v4
- name: Setup
uses: ./.github/actions/setup
- name: Build
run: pnpm build:all
working-directory: packages/wxt-demo
- run: pnpm wxt zip
- name: ZIP
run: pnpm wxt zip
working-directory: packages/wxt-demo
tests:
name: Tests
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v4
- uses: ./.github/actions/setup
- uses: oven-sh/setup-bun@v2
- name: pnpm test:coverage
- name: Checkout
uses: actions/checkout@v4
- name: Setup
uses: ./.github/actions/setup
- name: Setup Bun
uses: oven-sh/setup-bun@v2
- name: Run Tests
run: pnpm test:coverage -- --reporter=default --reporter=hanging-process
- uses: codecov/codecov-action@v5
- name: Upload Coverage
uses: codecov/codecov-action@v5
env:
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
windows-tests:
name: Windows Tests
runs-on: windows-latest
steps:
- uses: actions/checkout@v4
- uses: ./.github/actions/setup
- run: pnpm test
- name: Checkout
uses: actions/checkout@v4
- name: Setup
uses: ./.github/actions/setup
- name: Run Tests
run: pnpm test
template:
name: Template
runs-on: ubuntu-22.04
strategy:
fail-fast: false
@@ -57,19 +101,34 @@ jobs:
- vanilla
- vue
steps:
- uses: actions/checkout@v4
- uses: ./.github/actions/setup
- run: pnpm pack
- name: Checkout
uses: actions/checkout@v4
- name: Setup
uses: ./.github/actions/setup
- name: Pack WXT package
run: pnpm pack
working-directory: packages/wxt
- run: npm i
- name: Install Dependencies
run: npm i
working-directory: templates/${{ matrix.template }}
- run: npm i -D ../../packages/wxt/wxt-*.tgz
- name: Install Packed WXT
run: npm i -D ../../packages/wxt/wxt-*.tgz
working-directory: templates/${{ matrix.template }}
- run: pnpm compile
- name: Type Check Template
run: pnpm compile
if: matrix.template != 'svelte'
working-directory: templates/${{ matrix.template }}
- run: pnpm check
- name: Type Check Template
run: pnpm check
if: matrix.template == 'svelte'
working-directory: templates/${{ matrix.template }}
- run: pnpm build
- name: Build Template
run: pnpm build
working-directory: templates/${{ matrix.template }}
+22 -7
View File
@@ -1,26 +1,41 @@
name: vhs
name: 📼 VHS
on:
push:
paths:
- 'docs/tapes/*.tape'
workflow_dispatch:
permissions:
contents: read
jobs:
vhs:
name: Create VHS
runs-on: ubuntu-22.04
permissions:
contents: write
steps:
- uses: actions/checkout@v4
- uses: ./.github/actions/setup
- name: Checkout
uses: actions/checkout@v4
- name: Setup
uses: ./.github/actions/setup
with:
install: 'false'
- name: Preinstall WXT
install: false
# This prevents pnpm dlx from downloading WXT in the video
- name: Pre-install WXT
run: |
pnpm store add wxt@latest
pnpm dlx wxt@latest --version
- uses: charmbracelet/vhs-action@v2.1.0
- name: Record VHS
uses: charmbracelet/vhs-action@v2.1.0
with:
path: 'docs/tapes/init-demo.tape'
- uses: stefanzweifel/git-auto-commit-action@v5
- name: Save recorded GIF
uses: stefanzweifel/git-auto-commit-action@v5
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
-1
View File
@@ -6,7 +6,6 @@
.webextrc
.wxt
*.log
/.vscode/
/docs/.vitepress/cache
coverage
dist
+7
View File
@@ -0,0 +1,7 @@
{
"recommendations": [
"davidanson.vscode-markdownlint",
"esbenp.prettier-vscode",
"github.vscode-github-actions"
]
}
+14
View File
@@ -0,0 +1,14 @@
{
// Set default formatter
"editor.defaultFormatter": "esbenp.prettier-vscode",
"[json]": { "editor.defaultFormatter": "esbenp.prettier-vscode" },
"[yaml]": { "editor.defaultFormatter": "esbenp.prettier-vscode" },
"[typescript]": { "editor.defaultFormatter": "esbenp.prettier-vscode" },
"[markdown]": { "editor.defaultFormatter": "esbenp.prettier-vscode" },
// Additional guidelines for Copilot
"github.copilot.chat.codeGeneration.instructions": [
{ "file": "CONTRIBUTING.md" }
]
}
+10 -2
View File
@@ -8,9 +8,17 @@ If you want to add a new feature, please create an issue or discussion first so
## Conventional Commits
This project uses [Conventional Commits](https://www.conventionalcommits.org/en) to automate versioning. If you're a new contributor, don't worry about this. When you open a PR, a maintainer will change the PR's title so it's in the style of conventional commits, but that's all.
This project uses [Conventional Commit format](https://www.conventionalcommits.org/en/v1.0.0/) to automatically generate a changelog and better understand the changes in the project
Maintainers, commits to the `main` branch (either directly or via PRs) must be valid conventional commits.
Here are some examples of conventional commit messages:
- `feat: add new functionality`
- `fix: correct typos in code`
- `ci: add GitHub Actions for automated testing`
## Conventional PR Titles
The title of your pull request should follow the [conventional commit format](#conventional-commits). When a pull request is merged to the main branch, all changes are going to be squashed into a single commit. The message of this commit will be the title of the pull request. And for every release, the commit messages are used to generate the changelog.
## Setup
+15
View File
@@ -0,0 +1,15 @@
# Security Policy
While WXT is in prerelease, only the latest version will receive security updates. The latest version is:
<img alt="npm version" src="https://img.shields.io/npm/v/wxt?labelColor=black&color=%234fa048">
<!--
## Reporting a Vulnerability
Use this section to tell people how to report a vulnerability.
Tell them where to go, how often they can expect to get an update on a
reported vulnerability, what to expect if the vulnerability is accepted or
declined, etc.
-->
@@ -64,6 +64,10 @@ const chromeExtensionIds = [
'ocllfkhcdopiafndigclebelbecaiocp', // ZenGram: Mindful Instagram, Your Way
'odffpjnpocjfcaclnenaaaddghkgijdb', // Blync: Preview Links, Selection Search, AI Assistant
'kofbbilhmnkcmibjbioafflgmpkbnmme', // HTML to Markdown - Convert webpages to markdown
'boecmgggeigllcdocgioijmleimjbfkg', // Walmart WFS Profit Calculator
'dlnjcbkmomenmieechnmgglgcljhoepd', // Youtube Live Chat Fullscreen
'keiealdacakpnbbljlmhfgcebmaadieg', // Python Code Runner
'hafcajcllbjnoolpfngclfmmgpikdhlm', // Monochromate
];
const { data, err, isLoading } = useListExtensionDetails(chromeExtensionIds);
+13
View File
@@ -14,6 +14,7 @@ import { version as i18nVersion } from '../../packages/i18n/package.json';
import { version as autoIconsVersion } from '../../packages/auto-icons/package.json';
import { version as unocssVersion } from '../../packages/unocss/package.json';
import { version as storageVersion } from '../../packages/storage/package.json';
import knowledge from 'vitepress-knowledge';
const title = 'Next-gen Web Extension Framework';
const titleSuffix = ' WXT';
@@ -25,6 +26,17 @@ const ogImage = 'https://wxt.dev/social-preview.png';
// https://vitepress.dev/reference/site-config
export default defineConfig({
extends: knowledge({
serverUrl: 'https://knowledge.wxt.dev',
paths: {
'/': 'docs',
'/api/': 'api-reference',
},
pageSelectors: {
'examples.md': '#VPContent > .VPPage',
},
}),
titleTemplate: `:title${titleSuffix}`,
title: 'WXT',
description,
@@ -152,6 +164,7 @@ export default defineConfig({
menuGroup('Resources', '/guide/resources/', [
menuItem('Compare', 'compare.md'),
menuItem('FAQ', 'faq.md'),
menuItem('Community', 'community.md'),
menuItem('Upgrading WXT', 'upgrading.md'),
menuItem('Migrate to WXT', 'migrate.md'),
menuItem('How WXT Works', 'how-wxt-works.md'),
+2 -2
View File
@@ -28,13 +28,13 @@ export function menuRoot(items: SidebarItem[]) {
export function menuGroup(
text: string,
items: SidebarItem[],
collapsable?: boolean,
collapsible?: boolean,
): SidebarItem;
export function menuGroup(
text: string,
base: string,
items: SidebarItem[],
collapsable?: boolean,
collapsible?: boolean,
): SidebarItem;
export function menuGroup(
text: string,
+29 -2
View File
@@ -16,7 +16,8 @@ img.src = imageUrl;
```
```html [HTML]
<img src="~/assets/image.png" />
<!-- In HTML tags, you must use the relative path --->
<img src="../assets/image.png" />
```
```css [CSS]
@@ -25,6 +26,22 @@ img.src = imageUrl;
}
```
```vue [Vue]
<script>
import image from '~/assets/image.png';
</script>
<template>
<img :src="image" />
</template>
```
```jsx [JSX]
import image from '~/assets/image.png';
<img src={image} />;
```
:::
## `/public` Directory
@@ -52,6 +69,16 @@ img.src = imageUrl;
}
```
```vue [Vue]
<template>
<img src="/image.png" />
</template>
```
```jsx [JSX]
<img src="/image.png" />
```
:::
## Inside Content Scripts
@@ -114,7 +141,7 @@ export default defineConfig({
manifest: {
web_accessible_resources: [
{
// We'll use this matches in the cotent script as well
// We'll use this matches in the content script as well
matches: ['*://*.github.com/*'],
// Use the same path as `relativeDest` from the WXT module
resources: ['/oxc_parser_wasm_bg.wasm'],
+1 -1
View File
@@ -11,7 +11,7 @@ export default defineConfig({
});
```
By default, WXT automatically setups up auto-imports for all of it's own APIs:
By default, WXT sets up auto-imports for all of it's own APIs:
- [`browser`](/api/reference/wxt/browser/variables/browser) from `wxt/browser`
- [`defineContentScript`](/api/reference/wxt/sandbox/functions/defineContentScript) from `wxt/sandbox`
@@ -6,7 +6,7 @@ outline: deep
> See the [API Reference](/api/reference/wxt/interfaces/ExtensionRunnerConfig) for a full list of config.
During development WXT uses [`web-ext` by Mozilla](https://www.npmjs.com/package/web-ext) to automatically open a browser window with your extension installed.
During development, WXT uses [`web-ext` by Mozilla](https://www.npmjs.com/package/web-ext) to automatically open a browser window with your extension installed.
## Config Files
@@ -74,7 +74,7 @@ export default defineRunnerConfig({
Now, next time you run the `dev` script, a persistent profile will be created in `.wxt/chrome-data/{profile-name}`. With a persistent profile, you can install devtools extensions to help with development, allow the browser to remember logins, etc, without worrying about the profile being reset the next time you run the `dev` script.
:::tip
You can use any directory you'd like for `--user-data-dir`, the examples above create a persistent profile for each WXT project. To create a profile for all WXT projects, you can put the `chrome-data` directory inside you're user's home directory.
You can use any directory you'd like for `--user-data-dir`, the examples above create a persistent profile for each WXT project. To create a profile for all WXT projects, you can put the `chrome-data` directory inside your user's home directory.
:::
### Disable Opening Browser
+1 -1
View File
@@ -14,7 +14,7 @@ At a minimum, you need to create a TSConfig in your root directory that looks li
Or if you're in a monorepo, you may not want to extend the config. If you don't extend it, you need to add `.wxt/wxt.d.ts` to the TypeScript project:
```ts
/// <reference types="./.wxt/wxt.d.ts" />
/// <reference path="./.wxt/wxt.d.ts" />
```
## Compiler Options
+1 -1
View File
@@ -8,7 +8,7 @@ outline: deep
## Context
The first argument to a content script's `main` function is it's "context".
The first argument to a content script's `main` function is its "context".
```ts
// entrypoints/example.content.ts
+1 -1
View File
@@ -553,4 +553,4 @@ const url = browser.runtime.getURL('/<name>.js');
console.log(url); // "chrome-extension://<id>/<name>.js"
```
You are responsible for loading/running these scripts where needed. If necessary, don't forget to add the script and/or any related stylesheets to [`web_accessible_resources`](https://developer.chrome.com/docs/extensions/reference/manifest/web-accessible-resources).
You are responsible for loading/running these scripts where needed. If necessary, don't forget to add the script and/or any related assets to [`web_accessible_resources`](https://developer.chrome.com/docs/extensions/reference/manifest/web-accessible-resources).
+7 -7
View File
@@ -1,12 +1,10 @@
# ES Modules
Currently, ESM entrypoints are opt-in, so you must configure each entrypoint with that in mind.
You source code should always be written as ESM. However, you have some control whether an entrypoint is bundled as ESM.
## HTML Pages <Badge type="warning" text="≥0.0.1" />
In general, you should always make HTML pages import ESM scripts, unless you need to support old browsers.
To make a script ESM, add `type="module"`:
Vite only supports bundling JS from HTML pages as ESM. Ensure you have added `type="module"` to your `<script>` tags:
<!-- prettier-ignore -->
```html
@@ -16,7 +14,7 @@ To make a script ESM, add `type="module"`:
## Background <Badge type="warning" text="≥0.16.0" />
In your background script, set `type: "module"`:
By default, your background will be bundled into a single file as IIFE. You can change this by setting `type: "module"` in your background entrypoint:
```ts
export default defineBackground({
@@ -27,12 +25,14 @@ export default defineBackground({
});
```
This will change the output format to ESM, enable code-spliting between your background script and HTML pages, and set `"type": "module"` in your manifest.
:::warning
Only MV3 supports ESM background scripts/service workers. When targeting MV2, the `type` option is ignored and the background is always bundled into a single file as IIFE.
:::
## Content Scripts
WXT does not yet include built-in support for ESM content scripts. The plan is to add support for chunking to reduce bundle size, but not support HMR for now. There are several technical issues that make implementing a generic solution for HMR impossible. See [Content Script ESM Support #357](https://github.com/wxt-dev/wxt/issues/357) for details.
WXT does not yet include built-in support for bundling content scripts as ESM. The plan is to add support for chunking to reduce bundle size, but not support HMR for now. There are several technical issues that make implementing a generic solution for HMR impossible. See [Content Script ESM Support #357](https://github.com/wxt-dev/wxt/issues/357) for details.
If you can't wait, and need ESM support right now, you can implement ESM support manually. See the [ESM Content Script UI](https://github.com/wxt-dev/examples/tree/main/examples/esm-content-script-ui) example to get started.
If you can't wait, and need ESM support right now, you can implement ESM support manually. See the [ESM Content Script UI](https://github.com/wxt-dev/examples/tree/main/examples/esm-content-script-ui) example to learn how.
+1
View File
@@ -14,3 +14,4 @@ Here are some popular messaging libraries that support all browsers and work wit
- [`webext-bridge`](https://www.npmjs.com/package/webext-bridge) - Messaging in WebExtensions made super easy. Out of the box.
- [`@webext-core/messaging`](https://www.npmjs.com/package/@webext-core/messaging) - Light weight, type-safe wrapper around the web extension messaging APIs
- [`@webext-core/proxy-service`](https://www.npmjs.com/package/@webext-core/proxy-service) - A type-safe wrapper around the web extension messaging APIs that lets you call a function from anywhere, but execute it in the background.
- [`Comctx`](https://github.com/molvqingtai/comctx) - Cross-context RPC solution with type safety and flexible adapters.
+1
View File
@@ -121,3 +121,4 @@ Once you've run the `dev` command, continue to [Next Steps](#next-steps)!
- Keep reading on about WXT's [Project Structure](/guide/essentials/project-structure) and other essential concepts to learn
- Configure [automatic browser startup](/guide/essentials/config/browser-startup) during dev mode
- Explore [WXT's example library](/examples) to see how to use specific APIs or perform common tasks
- Checkout the [community page](/guide/resources/community) for a list of resources made by the community!
+14
View File
@@ -0,0 +1,14 @@
# Community
This page is dedicated to all the awesome people how have made something for WXT or that works with WXT. Blog posts, YouTube videos, NPM packages, etc. If a section doesn't exist for the thing you made, add one!
[[toc]]
## Blog Posts
- [Building Modern Cross Browser Web Extensions](https://aabidk.dev/tags/wxt/) by Aabid ([@aabidk20](https://github.com/aabidk20))
## NPM Packages
- [`@webext-core/*`](https://webext-core.aklinker1.io/): Easy-to-use utilities for writing and testing web extensions that work on all browsers.
- [`Comctx`](https://github.com/molvqingtai/comctx): Cross-context RPC solution with type safety and flexible adapters.
+5
View File
@@ -10,6 +10,7 @@ Lets compare the features of WXT vs [Plasmo](https://docs.plasmo.com/framework)
| Features | WXT | Plasmo | CRXJS |
| ------------------------------------------------------- | :-----: | :-----: | :-----: |
| Maintained | ✅ | 🟡 [^n] | 🟡 [^m] |
| Supports all browsers | ✅ | ✅ | 🟡 [^j] |
| MV2 Support | ✅ | ✅ | 🟡 [^a] |
| MV3 Support | ✅ | ✅ | 🟡 [^a] |
@@ -64,3 +65,7 @@ Lets compare the features of WXT vs [Plasmo](https://docs.plasmo.com/framework)
[^k]: There is no built-in wrapper around this API. However, you can still access the standard APIs via `chrome`/`browser` globals or use any 3rd party NPM package.
[^l]: WIP, moving very slowly. Follow [wxt-dev/wxt#357](https://github.com/wxt-dev/wxt/issues/357) for updates.
[^m]: See [crxjs/chrome-extension-tools#974](https://github.com/crxjs/chrome-extension-tools/discussions/974)
[^n]: Appears to be in maintenance mode with little to no maintainers nor feature development happening and _(see [wxt-dev/wxt#1404 (comment)](https://github.com/wxt-dev/wxt/pull/1404#issuecomment-2643089518))_
+10
View File
@@ -157,8 +157,18 @@ This is usually caused by one of two things (or both) when using `createShadowRo
:::
If you use ShadCN, [see this blog post](https://aabidk.dev/blog/building-modern-cross-browser-web-extensions-content-scripts-and-ui/#using-radixui-portals-to-move-the-dialog-to-shadow-dom).
::::::
Both issues have the same cause: the library puts something outside the `ShadowRoot`, and the `ShadowRoot`'s isolation prevents CSS from being applied to your UI.
Both issues have the same fix: tell the library to put elements inside the `ShadowRoot`, not outside it. See the details above for more information and example fixes for each problem.
## Is there an LLM trained on WXT's docs that I chat with?
Not yet, but we're working on it. For now, https://wxt.dev hosts pre-aggregated and pre-formatted knowledge files containing all the docs from this website:
- Index listing available knowledge files: https://wxt.dev/knowledge/index.json
You don't need to crawl the entire website, these files already contain all the relevant docs for training a LLM on WXT. But feel free to crawl it and generate your own files if you want!
+26 -23
View File
@@ -4,7 +4,7 @@
"engines": {
"node": ">=18.20.3"
},
"packageManager": "pnpm@9.13.0",
"packageManager": "pnpm@10.5.2",
"scripts": {
"check": "check && pnpm -r --sequential run check",
"test": "pnpm -r --sequential run test run",
@@ -17,28 +17,31 @@
"docs:preview": "pnpm -s docs:gen && vitepress preview docs"
},
"devDependencies": {
"@aklinker1/buildc": "^1.1.4",
"@aklinker1/check": "^1.4.5",
"@types/fs-extra": "^11.0.4",
"@vitest/coverage-v8": "^2.1.4",
"changelogen": "^0.5.7",
"consola": "^3.2.3",
"fast-glob": "^3.3.2",
"fs-extra": "^11.2.0",
"lint-staged": "^15.2.10",
"markdown-it-footnote": "^4.0.0",
"nano-spawn": "^0.2.0",
"prettier": "^3.3.3",
"simple-git-hooks": "^2.11.1",
"tsx": "4.15.7",
"typedoc": "^0.25.4",
"typedoc-plugin-frontmatter": "^1.1.0",
"typedoc-plugin-markdown": "4.0.0-next.23",
"typedoc-vitepress-theme": "1.0.0-next.3",
"typescript": "^5.6.3",
"vitepress": "^1.5.0",
"vitest-mock-extended": "^2.0.2",
"vue": "^3.5.12",
"@aklinker1/buildc": "catalog:",
"@aklinker1/check": "catalog:",
"@commitlint/config-conventional": "catalog:",
"@commitlint/types": "catalog:",
"@types/fs-extra": "catalog:",
"@vitest/coverage-v8": "catalog:",
"changelogen": "catalog:",
"consola": "catalog:",
"fast-glob": "catalog:",
"fs-extra": "catalog:",
"lint-staged": "catalog:",
"markdown-it-footnote": "catalog:",
"nano-spawn": "catalog:",
"prettier": "catalog:",
"simple-git-hooks": "catalog:",
"tsx": "catalog:",
"typedoc": "catalog:",
"typedoc-plugin-frontmatter": "catalog:",
"typedoc-plugin-markdown": "catalog:",
"typedoc-vitepress-theme": "catalog:",
"typescript": "catalog:",
"vitepress": "catalog:",
"vitepress-knowledge": "catalog:",
"vitest-mock-extended": "catalog:",
"vue": "catalog:",
"wxt": "workspace:*"
},
"simple-git-hooks": {
+11 -11
View File
@@ -44,17 +44,17 @@
"peerDependencies": {
"wxt": ">=0.19.0"
},
"devDependencies": {
"@aklinker1/check": "^1.4.5",
"oxlint": "^0.11.1",
"publint": "^0.2.12",
"typescript": "^5.6.3",
"unbuild": "^2.0.0",
"wxt": "workspace:*"
},
"dependencies": {
"defu": "^6.1.4",
"fs-extra": "^11.2.0",
"sharp": "^0.33.5"
"defu": "catalog:",
"fs-extra": "catalog:",
"sharp": "catalog:"
},
"devDependencies": {
"@aklinker1/check": "catalog:",
"oxlint": "catalog:",
"publint": "catalog:",
"typescript": "catalog:",
"unbuild": "catalog:",
"wxt": "workspace:*"
}
}
+13 -12
View File
@@ -19,15 +19,16 @@
"email": "aaronklinker1+wxt@gmail.com"
},
"license": "MIT",
"funding": "https://github.com/sponsors/wxt-dev",
"scripts": {
"build": "buildc -- unbuild",
"check": "buildc --deps-only -- check",
"test": "buildc --deps-only -- vitest"
},
"dependencies": {
"chokidar": "^3.6.0",
"confbox": "^0.1.8",
"fast-glob": "^3.3.2"
"chokidar": "catalog:",
"confbox": "catalog:",
"fast-glob": "catalog:"
},
"peerDependencies": {
"wxt": ">=0.19.7"
@@ -38,15 +39,15 @@
}
},
"devDependencies": {
"@aklinker1/check": "^1.4.5",
"@types/chrome": "^0.0.280",
"@types/node": "^20.17.6",
"oxlint": "^0.11.1",
"publint": "^0.2.12",
"typescript": "^5.6.3",
"unbuild": "^2.0.0",
"vitest": "^2.1.4",
"vitest-plugin-random-seed": "^1.1.0",
"@aklinker1/check": "catalog:",
"@types/chrome": "catalog:",
"@types/node": "catalog:",
"oxlint": "catalog:",
"publint": "catalog:",
"typescript": "catalog:",
"unbuild": "catalog:",
"vitest": "catalog:",
"vitest-plugin-random-seed": "catalog:",
"wxt": "workspace:*"
},
"main": "./dist/index.cjs",
+1 -1
View File
@@ -2,7 +2,7 @@ import { defineBuildConfig } from 'unbuild';
import { resolve } from 'node:path';
export default defineBuildConfig({
rootDir: 'modules',
rootDir: resolve(__dirname, 'modules'),
outDir: resolve(__dirname, 'dist'),
entries: [{ input: 'react.ts', name: 'index' }],
rollup: {
+10 -9
View File
@@ -17,6 +17,7 @@
"email": "aaronklinker1+wxt@gmail.com"
},
"license": "MIT",
"funding": "https://github.com/sponsors/wxt-dev",
"version": "1.1.3",
"type": "module",
"main": "./dist/index.cjs",
@@ -47,17 +48,17 @@
"wxt": ">=0.19.16"
},
"dependencies": {
"@vitejs/plugin-react": "^4.3.4"
"@vitejs/plugin-react": "catalog:"
},
"devDependencies": {
"@aklinker1/check": "^1.4.5",
"@types/react": "^19.0.1",
"@types/react-dom": "^19.0.2",
"publint": "^0.2.12",
"react": "^19.0.0",
"react-dom": "^19.0.0",
"typescript": "^5.6.3",
"unbuild": "^2.0.0",
"@aklinker1/check": "catalog:",
"@types/react": "catalog:",
"@types/react-dom": "catalog:",
"publint": "catalog:",
"react": "catalog:",
"react-dom": "catalog:",
"typescript": "catalog:",
"unbuild": "catalog:",
"wxt": "workspace:*"
}
}
+1 -1
View File
@@ -2,7 +2,7 @@ import { defineBuildConfig } from 'unbuild';
import { resolve } from 'node:path';
export default defineBuildConfig({
rootDir: 'modules',
rootDir: resolve(__dirname, 'modules'),
outDir: resolve(__dirname, 'dist'),
entries: [{ input: 'solid.ts', name: 'index' }],
rollup: {
+7 -6
View File
@@ -17,6 +17,7 @@
"email": "aaronklinker1+wxt@gmail.com"
},
"license": "MIT",
"funding": "https://github.com/sponsors/wxt-dev",
"version": "1.1.3",
"type": "module",
"main": "./dist/index.cjs",
@@ -47,14 +48,14 @@
"wxt": ">=0.19.16"
},
"dependencies": {
"vite-plugin-solid": "^2.10.2"
"vite-plugin-solid": "catalog:"
},
"devDependencies": {
"@aklinker1/check": "^1.4.5",
"publint": "^0.2.12",
"solid-js": "^1.9.3",
"typescript": "^5.6.3",
"unbuild": "^2.0.0",
"@aklinker1/check": "catalog:",
"publint": "catalog:",
"solid-js": "catalog:",
"typescript": "catalog:",
"unbuild": "catalog:",
"wxt": "workspace:*"
}
}
+12
View File
@@ -1,5 +1,17 @@
# Changelog
## v2.0.3
[compare changes](https://github.com/wxt-dev/wxt/compare/module-svelte-v2.0.2...module-svelte-v2.0.3)
### 🩹 Fixes
- Upgrade `vite-plugin-svelte` to support Vite 6 ([#1375](https://github.com/wxt-dev/wxt/pull/1375))
### ❤️ Contributors
- Eli ([@lishaduck](http://github.com/lishaduck))
## v2.0.2
[compare changes](https://github.com/wxt-dev/wxt/compare/module-svelte-v2.0.1...module-svelte-v2.0.2)
+7 -6
View File
@@ -17,7 +17,8 @@
"email": "aaronklinker1+wxt@gmail.com"
},
"license": "MIT",
"version": "2.0.2",
"funding": "https://github.com/sponsors/wxt-dev",
"version": "2.0.3",
"type": "module",
"main": "./dist/index.cjs",
"module": "./dist/index.mjs",
@@ -46,13 +47,13 @@
"svelte": ">=5"
},
"dependencies": {
"@sveltejs/vite-plugin-svelte": "^4.0.0"
"@sveltejs/vite-plugin-svelte": "catalog:"
},
"devDependencies": {
"@aklinker1/check": "^1.4.5",
"publint": "^0.2.12",
"typescript": "^5.6.3",
"unbuild": "^2.0.0",
"@aklinker1/check": "catalog:",
"publint": "catalog:",
"typescript": "catalog:",
"unbuild": "catalog:",
"wxt": "workspace:*"
}
}
+6 -5
View File
@@ -17,6 +17,7 @@
"email": "aaronklinker1+wxt@gmail.com"
},
"license": "MIT",
"funding": "https://github.com/sponsors/wxt-dev",
"version": "1.0.2",
"type": "module",
"main": "./dist/index.cjs",
@@ -45,13 +46,13 @@
"wxt": ">=0.19.16"
},
"dependencies": {
"@vitejs/plugin-vue": "^5.2.0"
"@vitejs/plugin-vue": "catalog:"
},
"devDependencies": {
"@aklinker1/check": "^1.4.5",
"publint": "^0.2.12",
"typescript": "^5.6.3",
"unbuild": "^2.0.0",
"@aklinker1/check": "catalog:",
"publint": "catalog:",
"typescript": "catalog:",
"unbuild": "catalog:",
"wxt": "workspace:*"
}
}
+11 -10
View File
@@ -23,24 +23,25 @@
"email": "aaronklinker1+wxt@gmail.com"
},
"license": "MIT",
"funding": "https://github.com/sponsors/wxt-dev",
"scripts": {
"build": "buildc -- unbuild",
"check": "buildc --deps-only -- check",
"test": "buildc --deps-only -- vitest"
},
"dependencies": {
"async-mutex": "^0.5.0",
"dequal": "^2.0.3"
"async-mutex": "catalog:",
"dequal": "catalog:"
},
"devDependencies": {
"@aklinker1/check": "^1.4.5",
"@types/chrome": "^0.0.268",
"@webext-core/fake-browser": "^1.3.1",
"oxlint": "^0.9.9",
"publint": "^0.2.11",
"typescript": "^5.6.2",
"unbuild": "^2.0.0",
"vitest": "^2.0.0"
"@aklinker1/check": "catalog:",
"@types/chrome": "catalog:",
"@webext-core/fake-browser": "catalog:",
"oxlint": "catalog:",
"publint": "catalog:",
"typescript": "catalog:",
"unbuild": "catalog:",
"vitest": "catalog:"
},
"module": "./dist/index.mjs",
"types": "./dist/index.d.ts",
+1 -1
View File
@@ -394,7 +394,7 @@ function createStorage(): WxtStorage {
(await migrations?.[migrateToVersion]?.(migratedValue)) ??
migratedValue;
} catch (err) {
throw Error(`v${migrateToVersion} migration failed for "${key}"`, {
throw new MigrationError(key, migrateToVersion, {
cause: err,
});
}
+8 -8
View File
@@ -40,16 +40,16 @@
"wxt": ">=0.19.0"
},
"devDependencies": {
"@aklinker1/check": "^1.4.5",
"oxlint": "^0.11.1",
"publint": "^0.2.12",
"typescript": "^5.6.3",
"unbuild": "^2.0.0",
"unocss": "^0.64.0",
"@aklinker1/check": "catalog:",
"oxlint": "catalog:",
"publint": "catalog:",
"typescript": "catalog:",
"unbuild": "catalog:",
"unocss": "catalog:",
"wxt": "workspace:*"
},
"dependencies": {
"defu": "^6.1.4",
"fast-glob": "^3.3.2"
"defu": "catalog:",
"fast-glob": "catalog:"
}
}
+10 -10
View File
@@ -18,20 +18,20 @@
},
"dependencies": {
"@wxt-dev/i18n": "workspace:*",
"react": "^19.0.0",
"react-dom": "^19.0.0"
"react": "catalog:",
"react-dom": "catalog:"
},
"devDependencies": {
"@types/chrome": "^0.0.280",
"@types/react": "^19.0.1",
"@types/react-dom": "^19.0.2",
"@types/chrome": "catalog:",
"@types/react": "catalog:",
"@types/react-dom": "catalog:",
"@wxt-dev/auto-icons": "workspace:*",
"@wxt-dev/unocss": "workspace:*",
"sass": "^1.80.7",
"typescript": "^5.6.3",
"unocss": "^0.64.0",
"vitest": "^2.1.4",
"vitest-plugin-random-seed": "^1.1.0",
"sass": "catalog:",
"typescript": "catalog:",
"unocss": "catalog:",
"vitest": "catalog:",
"vitest-plugin-random-seed": "catalog:",
"wxt": "workspace:*"
},
"buildc": {
@@ -1,11 +1,16 @@
import 'uno.css';
import './style.css';
import manualStyle from './manual-style.css?inline';
export default defineContentScript({
matches: ['https://*.duckduckgo.com/*'],
cssInjectionMode: 'ui',
async main(ctx) {
const style = document.createElement('style');
style.textContent = manualStyle;
document.head.append(style);
const ui = await createShadowRootUi(ctx, {
name: 'demo-ui',
position: 'inline',
@@ -0,0 +1,4 @@
body {
padding: 2rem;
background-color: blanchedalmond;
}
+63
View File
@@ -1,5 +1,68 @@
# Changelog
## v0.19.28
[compare changes](https://github.com/wxt-dev/wxt/compare/wxt-v0.19.27...wxt-v0.19.28)
### 🩹 Fixes
- Ignore `manifest.manifest_version` option and warn about incorrect usage ([#1419](https://github.com/wxt-dev/wxt/pull/1419))
- Resolve wxt modules from the root ([#1417](https://github.com/wxt-dev/wxt/pull/1417))
- Properly detect and reload changed files when using Vite's `?suffix` imports ([#1432](https://github.com/wxt-dev/wxt/pull/1432))
- Regression on variable expansion in dotenv files ([#1449](https://github.com/wxt-dev/wxt/pull/1449))
- Allow vite 6.0.9+ ([#1497](https://github.com/wxt-dev/wxt/pull/1497))
### 📖 Documentation
- Host pre-aggregated LLM knowledge files ([#1355](https://github.com/wxt-dev/wxt/pull/1355))
### 🏡 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))
- **deps:** Upgrade to Vite 6 and related dependencies ([#1496](https://github.com/wxt-dev/wxt/pull/1496))
### ❤️ Contributors
- Aaron ([@aklinker1](http://github.com/aklinker1))
- Stefan Maric <me@stefanmaric.com>
- Okinea Dev ([@okineadev](http://github.com/okineadev))
- 1natsu ([@1natsu172](http://github.com/1natsu172))
- Alec Larson ([@aleclarson](http://github.com/aleclarson))
## v0.19.27
[compare changes](https://github.com/wxt-dev/wxt/compare/wxt-v0.19.26...wxt-v0.19.27)
### 🩹 Fixes
- Allow `vite-node@^3.0.0` ([#1378](https://github.com/wxt-dev/wxt/pull/1378))
- Use path triple slash directive for types that are referenced via path ([#1407](https://github.com/wxt-dev/wxt/pull/1407))
- Support `publish-browser-extension` v3.0.0 ([ac92d40](https://github.com/wxt-dev/wxt/commit/ac92d40))
- Respect `inlineConfig.mode` when setting NODE_ENV ([#1416](https://github.com/wxt-dev/wxt/pull/1416))
- Auto-import does not work when using `@vitejs/plugin-vue` alone ([#1412](https://github.com/wxt-dev/wxt/pull/1412))
### ❤️ Contributors
- Jaguar Zhou ([@aiktb](http://github.com/aiktb))
- Alec Larson ([@aleclarson](http://github.com/aleclarson))
- Aaron ([@aklinker1](http://github.com/aklinker1))
- St3h3n <st3h3n@gmail.com>
- Eli ([@lishaduck](http://github.com/lishaduck))
## v0.19.26
[compare changes](https://github.com/wxt-dev/wxt/compare/wxt-v0.19.25...wxt-v0.19.26)
### 🩹 Fixes
- **context:** Deduplicate `wxt:content-script-started` ([#1364](https://github.com/wxt-dev/wxt/pull/1364))
### ❤️ Contributors
- Deniz Uğur ([@DenizUgur](http://github.com/DenizUgur))
## v0.19.25
[compare changes](https://github.com/wxt-dev/wxt/compare/wxt-v0.19.24...wxt-v0.19.25)
+7 -7
View File
@@ -52,10 +52,10 @@ describe('Auto Imports', () => {
----------------------------------------
// Generated by wxt
/// <reference types="wxt/vite-builder-env" />
/// <reference types="./types/paths.d.ts" />
/// <reference types="./types/i18n.d.ts" />
/// <reference types="./types/globals.d.ts" />
/// <reference types="./types/imports.d.ts" />
/// <reference path="./types/paths.d.ts" />
/// <reference path="./types/i18n.d.ts" />
/// <reference path="./types/globals.d.ts" />
/// <reference path="./types/imports.d.ts" />
"
`);
});
@@ -91,9 +91,9 @@ describe('Auto Imports', () => {
----------------------------------------
// Generated by wxt
/// <reference types="wxt/vite-builder-env" />
/// <reference types="./types/paths.d.ts" />
/// <reference types="./types/i18n.d.ts" />
/// <reference types="./types/globals.d.ts" />
/// <reference path="./types/paths.d.ts" />
/// <reference path="./types/i18n.d.ts" />
/// <reference path="./types/globals.d.ts" />
"
`,
);
@@ -236,10 +236,10 @@ describe('TypeScript Project', () => {
----------------------------------------
// Generated by wxt
/// <reference types="wxt/vite-builder-env" />
/// <reference types="./types/paths.d.ts" />
/// <reference types="./types/i18n.d.ts" />
/// <reference types="./types/globals.d.ts" />
/// <reference types="./types/imports.d.ts" />
/// <reference path="./types/paths.d.ts" />
/// <reference path="./types/i18n.d.ts" />
/// <reference path="./types/globals.d.ts" />
/// <reference path="./types/imports.d.ts" />
"
`);
});
+66 -64
View File
@@ -1,8 +1,8 @@
{
"name": "wxt",
"type": "module",
"version": "0.19.25",
"description": "Next gen framework for developing web extensions",
"version": "0.19.28",
"description": "Next-gen Web Extension Framework",
"repository": {
"type": "git",
"url": "git+https://github.com/wxt-dev/wxt.git"
@@ -22,6 +22,7 @@
"email": "aaronklinker1+wxt@gmail.com"
},
"license": "MIT",
"funding": "https://github.com/sponsors/wxt-dev",
"files": [
"bin",
"dist"
@@ -81,71 +82,72 @@
"prepack": "pnpm build"
},
"dependencies": {
"@1natsu/wait-element": "^4.1.2",
"@aklinker1/rollup-plugin-visualizer": "5.12.0",
"@types/chrome": "^0.0.280",
"@types/webextension-polyfill": "^0.12.1",
"@webext-core/fake-browser": "^1.3.1",
"@webext-core/isolated-element": "^1.1.2",
"@webext-core/match-patterns": "^1.0.3",
"@1natsu/wait-element": "catalog:",
"@aklinker1/rollup-plugin-visualizer": "catalog:",
"@types/chrome": "catalog:",
"@types/webextension-polyfill": "catalog:",
"@webext-core/fake-browser": "catalog:",
"@webext-core/isolated-element": "catalog:",
"@webext-core/match-patterns": "catalog:",
"@wxt-dev/storage": "workspace:^1.0.0",
"async-mutex": "^0.5.0",
"c12": "^1.11.2",
"cac": "^6.7.14",
"chokidar": "^3.6.0",
"ci-info": "^4.1.0",
"consola": "^3.2.3",
"defu": "^6.1.4",
"dotenv": "^16.4.5",
"esbuild": "^0.21.5",
"fast-glob": "^3.3.2",
"filesize": "^10.1.6",
"fs-extra": "^11.2.0",
"get-port-please": "^3.1.2",
"giget": "^1.2.3",
"hookable": "^5.5.3",
"is-wsl": "^3.1.0",
"jiti": "^1.21.6",
"json5": "^2.2.3",
"jszip": "^3.10.1",
"linkedom": "^0.18.5",
"magicast": "^0.3.5",
"minimatch": "^10.0.1",
"nano-spawn": "^0.2.0",
"normalize-path": "^3.0.0",
"nypm": "^0.3.12",
"ohash": "^1.1.4",
"open": "^10.1.0",
"ora": "^8.1.1",
"perfect-debounce": "^1.0.0",
"picocolors": "^1.1.1",
"prompts": "^2.4.2",
"publish-browser-extension": "^2.2.2",
"scule": "^1.3.0",
"unimport": "^3.13.1",
"vite": "^5.0.0 || <=6.0.8",
"vite-node": "^2.1.4",
"web-ext-run": "^0.2.1",
"webextension-polyfill": "^0.12.0"
"async-mutex": "catalog:",
"c12": "catalog:",
"cac": "catalog:",
"chokidar": "catalog:",
"ci-info": "catalog:",
"consola": "catalog:",
"defu": "catalog:",
"dotenv": "catalog:",
"dotenv-expand": "catalog:",
"esbuild": "catalog:",
"fast-glob": "catalog:",
"filesize": "catalog:",
"fs-extra": "catalog:",
"get-port-please": "catalog:",
"giget": "catalog:",
"hookable": "catalog:",
"import-meta-resolve": "catalog:",
"is-wsl": "catalog:",
"jiti": "catalog:",
"json5": "catalog:",
"jszip": "catalog:",
"linkedom": "catalog:",
"magicast": "catalog:",
"minimatch": "catalog:",
"nano-spawn": "catalog:",
"normalize-path": "catalog:",
"nypm": "catalog:",
"ohash": "catalog:",
"open": "catalog:",
"ora": "catalog:",
"perfect-debounce": "catalog:",
"picocolors": "catalog:",
"prompts": "catalog:",
"publish-browser-extension": "catalog:",
"scule": "catalog:",
"unimport": "catalog:",
"vite": "catalog:",
"vite-node": "catalog:",
"web-ext-run": "catalog:",
"webextension-polyfill": "catalog:"
},
"devDependencies": {
"@aklinker1/check": "^1.4.5",
"@faker-js/faker": "^9.2.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": "^15.11.4",
"lodash.merge": "^4.6.2",
"oxlint": "^0.11.1",
"publint": "^0.2.12",
"tsx": "4.15.7",
"typescript": "^5.6.3",
"unbuild": "^2.0.0",
"vitest": "^2.1.4",
"vitest-plugin-random-seed": "^1.1.0"
"@aklinker1/check": "catalog:",
"@faker-js/faker": "catalog:",
"@types/fs-extra": "catalog:",
"@types/lodash.merge": "catalog:",
"@types/node": "catalog:",
"@types/normalize-path": "catalog:",
"@types/prompts": "catalog:",
"extract-zip": "catalog:",
"happy-dom": "catalog:",
"lodash.merge": "catalog:",
"oxlint": "catalog:",
"publint": "catalog:",
"typescript": "catalog:",
"unbuild": "catalog:",
"vitest": "catalog:",
"vitest-plugin-random-seed": "catalog:"
},
"peerDependenciesMeta": {
"@types/chrome": {
+2 -30
View File
@@ -6,8 +6,7 @@ import type {
WxtResolvedUnimportOptions,
} from '../types';
import { type Unimport, createUnimport } from 'unimport';
import { Plugin } from 'vite';
import { extname } from 'node:path';
import UnimportPlugin from 'unimport/unplugin';
export default defineWxtModule({
name: 'wxt:built-in:unimport',
@@ -53,38 +52,11 @@ export default defineWxtModule({
// Add vite plugin
addViteConfig(wxt, () => ({
plugins: [vitePlugin(unimport)],
plugins: [UnimportPlugin.vite(options)],
}));
},
});
export function vitePlugin(unimport: Unimport): Plugin {
const ENABLED_EXTENSIONS = new Set([
'.js',
'.jsx',
'.ts',
'.tsx',
'.vue',
'.svelte',
]);
return {
name: 'wxt:unimport',
async transform(code, id) {
// Don't transform dependencies
if (id.includes('node_modules')) return;
// Don't transform non-js files
if (!ENABLED_EXTENSIONS.has(extname(id))) return;
const injected = await unimport.injectImports(code, id);
return {
code: injected.code,
map: injected.s.generateMap({ hires: 'boundary', source: id }),
};
},
};
}
async function getImportsDeclarationEntry(
unimport: Unimport,
): Promise<WxtDirFileEntry> {
@@ -42,6 +42,7 @@ export class ContentScriptContext implements AbortController {
private isTopFrame = window.self === window.top;
private abortController: AbortController;
private locationWatcher = createLocationWatcher(this);
private receivedMessageIds = new Set<string>();
constructor(
private readonly contentScriptName: string,
@@ -233,19 +234,28 @@ export class ContentScriptContext implements AbortController {
{
type: ContentScriptContext.SCRIPT_STARTED_MESSAGE_TYPE,
contentScriptName: this.contentScriptName,
messageId: Math.random().toString(36).slice(2),
},
'*',
);
}
verifyScriptStartedEvent(event: MessageEvent) {
const isScriptStartedEvent =
event.data?.type === ContentScriptContext.SCRIPT_STARTED_MESSAGE_TYPE;
const isSameContentScript =
event.data?.contentScriptName === this.contentScriptName;
const isNotDuplicate = !this.receivedMessageIds.has(event.data?.messageId);
return isScriptStartedEvent && isSameContentScript && isNotDuplicate;
}
listenForNewerScripts(options?: { ignoreFirstEvent?: boolean }) {
let isFirst = true;
const cb = (event: MessageEvent) => {
if (
event.data?.type === ContentScriptContext.SCRIPT_STARTED_MESSAGE_TYPE &&
event.data?.contentScriptName === this.contentScriptName
) {
if (this.verifyScriptStartedEvent(event)) {
this.receivedMessageIds.add(event.data.messageId);
const wasFirst = isFirst;
isFirst = false;
if (wasFirst && options?.ignoreFirstEvent) return;
@@ -67,6 +67,11 @@ export async function createViteBuilder(
ignored: [`${wxtConfig.outBaseDir}/**`, `${wxtConfig.wxtDir}/**`],
};
// TODO: Remove once https://github.com/wxt-dev/wxt/pull/1411 is merged
config.legacy ??= {};
// @ts-ignore: Untyped option:
config.legacy.skipWebSocketTokenCheck = true;
const server = getWxtDevServer?.();
config.plugins ??= [];
+1 -1
View File
@@ -217,7 +217,7 @@ function getMainDeclarationEntry(references: WxtDirEntry[]): WxtDirFileEntry {
} else if (ref.tsReference) {
const absolutePath = resolve(wxt.config.wxtDir, ref.path);
const relativePath = relative(wxt.config.wxtDir, absolutePath);
lines.push(`/// <reference types="./${normalizePath(relativePath)}" />`);
lines.push(`/// <reference path="./${normalizePath(relativePath)}" />`);
}
});
return {
+24 -17
View File
@@ -1,4 +1,5 @@
import { loadConfig } from 'c12';
import { resolve as esmResolve } from 'import-meta-resolve';
import {
InlineConfig,
ResolvedConfig,
@@ -28,6 +29,7 @@ import { getEslintVersion } from './utils/eslint';
import { safeStringToNumber } from './utils/number';
import { loadEnv } from './utils/env';
import { getPort } from 'get-port-please';
import { fileURLToPath, pathToFileURL } from 'node:url';
/**
* Given an inline config, discover the config file if necessary, merge the results, resolve any
@@ -50,9 +52,6 @@ export async function resolveConfig(
name: 'wxt',
cwd: inlineConfig.root ?? process.cwd(),
rcFile: false,
jitiOptions: {
esmResolve: true,
},
});
if (inlineConfig.configFile && metadata.layers?.length === 0) {
throw Error(`Config file "${inlineConfig.configFile}" not found`);
@@ -84,7 +83,7 @@ export async function resolveConfig(
inlineConfig.root ?? userConfig.root ?? process.cwd(),
);
const wxtDir = path.resolve(root, '.wxt');
const wxtModuleDir = await resolveWxtModuleDir();
const wxtModuleDir = resolveWxtModuleDir();
const srcDir = path.resolve(root, mergedConfig.srcDir ?? root);
const entrypointsDir = path.resolve(
srcDir,
@@ -156,6 +155,7 @@ export async function resolveConfig(
}
const userModules = await resolveWxtUserModules(
root,
modulesDir,
mergedConfig.modules,
);
@@ -420,21 +420,22 @@ async function getUnimportEslintOptions(
/**
* Returns the path to `node_modules/wxt`.
*/
async function resolveWxtModuleDir() {
// TODO: Use this once we're fully running in ESM, see https://github.com/wxt-dev/wxt/issues/277
// const url = import.meta.resolve('wxt', import.meta.url);
// resolve() returns the "wxt/dist/index.mjs" file, not the package's root
// directory, which we want to return from this function.
// return path.resolve(fileURLToPath(url), '../..');
function resolveWxtModuleDir() {
// TODO: Drop the __filename expression once we're fully running in ESM
// (see https://github.com/wxt-dev/wxt/issues/277)
const importer =
typeof __filename === 'string'
? pathToFileURL(__filename).href
: import.meta.url;
const requireResolve =
globalThis.require?.resolve ??
(await import('node:module')).default.createRequire(import.meta.url)
.resolve;
// TODO: Switch to import.meta.resolve() once the parent argument is unflagged
// (e.g. --experimental-import-meta-resolve) and all Node.js versions we support
// have it.
const url = esmResolve('wxt', importer);
// resolve() returns the "wxt/dist/index.mjs" file, not the package's root
// esmResolve() returns the "wxt/dist/index.mjs" file, not the package's root
// directory, which we want to return from this function.
return path.resolve(requireResolve('wxt'), '../..');
return path.resolve(fileURLToPath(url), '../..');
}
async function isDirMissing(dir: string) {
@@ -479,14 +480,20 @@ export async function mergeBuilderConfig(
}
export async function resolveWxtUserModules(
root: string,
modulesDir: string,
modules: string[] = [],
): Promise<WxtModuleWithMetadata<any>[]> {
const importer = pathToFileURL(path.join(root, 'index.js')).href;
// Resolve node_modules modules
const npmModules = await Promise.all<WxtModuleWithMetadata<any>>(
modules.map(async (moduleId) => {
// Resolve before importing to allow for a local WXT clone to be
// symlinked into a project.
const resolvedModulePath = esmResolve(moduleId, importer);
const mod: { default: WxtModule<any> } = await import(
/* @vite-ignore */ moduleId
/* @vite-ignore */ resolvedModulePath
);
if (mod.default == null) {
throw Error('Module missing default export: ' + moduleId);
@@ -11,8 +11,8 @@ describe('Content Script Utils', () => {
it('should return a string containing all the options with defaults applied', () => {
const hash = hashContentScriptOptions({ matches: [] });
expect(hash).toMatchInlineSnapshot(
`"[["all_frames",false],["exclude_globs",[]],["exclude_matches",[]],["include_globs",[]],["match_about_blank",false],["match_origin_as_fallback",false],["matches",[]],["run_at","document_idle"],["world","ISOLATED"]]"`,
expect(hash).toEqual(
'[["all_frames",false],["exclude_globs",[]],["exclude_matches",[]],["include_globs",[]],["match_about_blank",false],["match_origin_as_fallback",false],["matches",[]],["run_at","document_idle"],["world","ISOLATED"]]',
);
});
@@ -21,6 +21,7 @@ import {
OutputAsset,
} from '../../../types';
import { wxt } from '../../wxt';
import { mock } from 'vitest-mock-extended';
const outDir = '/output';
const contentScriptOutDir = '/output/content-scripts';
@@ -1646,6 +1647,33 @@ describe('Manifest Utils', () => {
expect(manifest.sidebar_action).toBeUndefined();
expect(manifest.content_scripts).toBeUndefined();
});
describe('manifest_version', () => {
it('should ignore and log a warning when someone sets `manifest_version` inside the manifest', async () => {
const buildOutput = fakeBuildOutput();
const expectedVersion = 2;
setFakeWxt({
logger: mock(),
config: {
command: 'build',
manifestVersion: expectedVersion,
manifest: {
manifest_version: 3,
},
},
});
const { manifest } = await generateManifest([], buildOutput);
expect(manifest.manifest_version).toBe(expectedVersion);
expect(wxt.logger.warn).toBeCalledTimes(1);
expect(wxt.logger.warn).toBeCalledWith(
expect.stringContaining(
'`manifest.manifest_version` config was set, but ignored',
),
);
});
});
});
describe('stripPathFromMatchPattern', () => {
@@ -359,5 +359,63 @@ describe('Detect Dev Changes', () => {
expect(actual).toEqual(expected);
});
it('should detect changes to import files with `?suffix`', () => {
const importedPath = '/root/utils/shared.css?inline';
const changedPath = '/root/utils/shared.css';
const script1 = fakeContentScriptEntrypoint({
inputPath: '/root/overlay1.content/index.ts',
});
const script2 = fakeContentScriptEntrypoint({
inputPath: '/root/overlay2.ts',
});
const script3 = fakeContentScriptEntrypoint({
inputPath: '/root/overlay3.content/index.ts',
});
const step1: BuildStepOutput = {
entrypoints: script1,
chunks: [
fakeOutputChunk({
moduleIds: [fakeFile(), importedPath],
}),
],
};
const step2: BuildStepOutput = {
entrypoints: script2,
chunks: [
fakeOutputChunk({
moduleIds: [fakeFile(), fakeFile(), fakeFile()],
}),
],
};
const step3: BuildStepOutput = {
entrypoints: script3,
chunks: [
fakeOutputChunk({
moduleIds: [importedPath, fakeFile(), fakeFile()],
}),
],
};
const currentOutput: BuildOutput = {
manifest: fakeManifest(),
publicAssets: [],
steps: [step1, step2, step3],
};
const expected: DevModeChange = {
type: 'content-script-reload',
cachedOutput: {
...currentOutput,
steps: [step2],
},
changedSteps: [step1, step3],
rebuildGroups: [script1, script3],
};
const actual = detectDevChanges([changedPath], currentOutput);
expect(actual).toEqual(expected);
});
});
});
@@ -135,14 +135,26 @@ function findEffectedSteps(
const changes: BuildStepOutput[] = [];
const changedPath = normalizePath(changedFile);
const isChunkEffected = (chunk: OutputFile): boolean =>
// If it's an HTML file with the same path, is is effected because HTML files need to be re-rendered
// - fileName is normalized, relative bundle path, "<entrypoint-name>.html"
(chunk.type === 'asset' &&
changedPath.replace('/index.html', '.html').endsWith(chunk.fileName)) ||
// If it's a chunk that depends on the changed file, it is effected
// - moduleIds are absolute, normalized paths
(chunk.type === 'chunk' && chunk.moduleIds.includes(changedPath));
const isChunkEffected = (chunk: OutputFile): boolean => {
switch (chunk.type) {
// If it's an HTML file with the same path, is is effected because HTML files need to be re-rendered
// - fileName is normalized, relative bundle path, "<entrypoint-name>.html"
case 'asset': {
return changedPath
.replace('/index.html', '.html')
.endsWith(chunk.fileName);
}
// If it's a chunk that depends on the changed file, it is effected
// - moduleIds are absolute, normalized paths
case 'chunk': {
const modulePaths = chunk.moduleIds.map((path) => path.split('?')[0]);
return modulePaths.includes(changedPath);
}
default: {
return false;
}
}
};
for (const step of currentOutput.steps) {
const effectedChunk = step.chunks.find((chunk) => isChunkEffected(chunk));
@@ -49,7 +49,6 @@ export async function importEntrypointFile<T>(path: string): Promise<T> {
{
cache: false,
debug: wxt.config.debug,
esmResolve: true,
alias: {
'webextension-polyfill': resolve(
wxt.config.wxtModuleDir,
@@ -65,7 +64,7 @@ export async function importEntrypointFile<T>(path: string): Promise<T> {
},
// Continue using node to load TS files even if `bun run --bun` is detected. Jiti does not
// respect the custom transform function when using it's native bun option.
experimentalBun: false,
tryNative: false,
// List of extensions to transform with esbuild
extensions: [
'.ts',
+16 -13
View File
@@ -1,21 +1,24 @@
import { config } from 'dotenv';
import { expand } from 'dotenv-expand';
import type { TargetBrowser } from '../../types';
/**
* Load environment files based on the current mode and browser.
*/
export function loadEnv(mode: string, browser: TargetBrowser) {
return config({
// Files on top override files below
path: [
`.env.${mode}.${browser}.local`,
`.env.${mode}.${browser}`,
`.env.${browser}.local`,
`.env.${browser}`,
`.env.${mode}.local`,
`.env.${mode}`,
`.env.local`,
`.env`,
],
});
return expand(
config({
// Files on top override files below
path: [
`.env.${mode}.${browser}.local`,
`.env.${mode}.${browser}`,
`.env.${browser}.local`,
`.env.${browser}`,
`.env.${mode}.local`,
`.env.${mode}`,
`.env.local`,
`.env`,
],
}),
);
}
+6
View File
@@ -76,6 +76,12 @@ export async function generateManifest(
icons: discoverIcons(buildOutput),
};
const userManifest = wxt.config.manifest;
if (userManifest.manifest_version) {
delete userManifest.manifest_version;
wxt.logger.warn(
'`manifest.manifest_version` config was set, but ignored. To change the target manifest version, use the `manifestVersion` option or the `--mv2`/`--mv3` CLI flags.\nSee https://wxt.dev/guide/essentials/target-different-browsers.html#target-a-manifest-version',
);
}
let manifest = defu(
userManifest,
+2 -1
View File
@@ -21,7 +21,8 @@ export async function registerWxt(
): Promise<void> {
// Default NODE_ENV environment variable before other packages, like vite, do it
// See https://github.com/wxt-dev/wxt/issues/873#issuecomment-2254555523
process.env.NODE_ENV ??= command === 'serve' ? 'development' : 'production';
process.env.NODE_ENV ??=
inlineConfig.mode ?? (command === 'serve' ? 'development' : 'production');
const hooks = createHooks<WxtHooks>();
const config = await resolveConfig(inlineConfig, command);
@@ -7,8 +7,7 @@ import {
resolveAppConfig,
} from '../core/builders/vite/plugins';
import { InlineConfig } from '../types';
import { vitePlugin as unimportPlugin } from '../builtin-modules/unimport';
import { createUnimport } from 'unimport';
import UnimportPlugin from 'unimport/unplugin';
import { registerWxt, wxt } from '../core/wxt';
/**
@@ -39,9 +38,7 @@ export async function WxtVitest(
extensionApiMock(wxt.config),
];
if (wxt.config.imports !== false) {
const unimport = createUnimport(wxt.config.imports);
await unimport.init();
plugins.push(unimportPlugin(unimport));
plugins.push(UnimportPlugin.vite(wxt.config.imports));
}
return plugins;
+1 -2
View File
@@ -4,7 +4,6 @@ import { UnimportOptions, Import } from 'unimport';
import { LogLevel } from 'consola';
import type { ContentScriptContext } from './client/content-scripts/content-script-context';
import type { PluginVisualizerOptions } from '@aklinker1/rollup-plugin-visualizer';
import type { FSWatcher } from 'chokidar';
import { ResolvedConfig as C12ResolvedConfig } from 'c12';
import { Hookable, NestedHooks } from 'hookable';
import type * as Nypm from 'nypm';
@@ -1097,7 +1096,7 @@ export interface WxtBuilderServer {
/**
* Chokidar file watcher instance.
*/
watcher: FSWatcher;
watcher: vite.ViteDevServer['watcher'];
on?(event: string, callback: () => void): void;
}
+2609 -2321
View File
File diff suppressed because it is too large Load Diff
+98
View File
@@ -1,3 +1,101 @@
packages:
- docs
- packages/*
onlyBuiltDependencies:
- esbuild
catalog:
'@1natsu/wait-element': ^4.1.2
'@aklinker1/buildc': ^1.1.4
'@aklinker1/check': ^1.4.5
'@aklinker1/rollup-plugin-visualizer': 5.12.0
'@commitlint/config-conventional': ^19.7.1
'@commitlint/types': ^19.5.0
'@faker-js/faker': ^9.2.0
'@sveltejs/vite-plugin-svelte': ^4.0.0 || ^5.0.0
'@types/chrome': ^0.0.280
'@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
'@types/react': ^19.0.1
'@types/react-dom': ^19.0.2
'@types/webextension-polyfill': ^0.12.1
'@vitejs/plugin-react': ^4.3.4
'@vitejs/plugin-vue': ^5.2.1
'@vitest/coverage-v8': ^3.0.7
'@webext-core/fake-browser': ^1.3.1
'@webext-core/isolated-element': ^1.1.2
'@webext-core/match-patterns': ^1.0.3
async-mutex: ^0.5.0
c12: ^3.0.2
cac: ^6.7.14
changelogen: ^0.5.7
chokidar: ^4.0.3
ci-info: ^4.1.0
confbox: ^0.1.8
consola: ^3.2.3
defu: ^6.1.4
dequal: ^2.0.3
dotenv: ^16.4.5
dotenv-expand: ^12.0.1
esbuild: ^0.25.0
extract-zip: ^2.0.1
fast-glob: ^3.3.2
filesize: ^10.1.6
fs-extra: ^11.2.0
get-port-please: ^3.1.2
giget: ^1.2.3
happy-dom: ^17.1.8
hookable: ^5.5.3
import-meta-resolve: ^4.1.0
is-wsl: ^3.1.0
jiti: ^2.4.2
json5: ^2.2.3
jszip: ^3.10.1
linkedom: ^0.18.5
lint-staged: ^15.2.10
lodash.merge: ^4.6.2
magicast: ^0.3.5
markdown-it-footnote: ^4.0.0
minimatch: ^10.0.1
nano-spawn: ^0.2.0
normalize-path: ^3.0.0
nypm: ^0.3.12
ohash: ^1.1.4
open: ^10.1.0
ora: ^8.1.1
oxlint: ^0.11.1
perfect-debounce: ^1.0.0
picocolors: ^1.1.1
prettier: ^3.3.3
prompts: ^2.4.2
publint: ^0.2.12
publish-browser-extension: ^2.3.0 || ^3.0.0
react: ^19.0.0
react-dom: ^19.0.0
sass: ^1.80.7
scule: ^1.3.0
sharp: ^0.33.5
simple-git-hooks: ^2.11.1
solid-js: ^1.9.4
tsx: 4.19.3
typedoc: ^0.25.4
typedoc-plugin-frontmatter: ^1.1.0
typedoc-plugin-markdown: 4.0.0-next.23
typedoc-vitepress-theme: 1.0.0-next.3
typescript: ^5.6.3
unbuild: ^3.5.0
unimport: ^3.13.1
unocss: ^0.64.0 || ^0.65.0 || ^65.0.0 ||^66.0.0
vite: ^5.0.0 || ^6.0.0
vite-node: ^2.1.4 || ^3.0.0
vite-plugin-solid: ^2.11.6
vitepress: ^1.6.3
vitepress-knowledge: ^0.4.0
vitest: ^3.0.7
vitest-mock-extended: ^3.0.1
vitest-plugin-random-seed: ^1.1.1
vue: ^3.5.12
web-ext-run: ^0.2.1
webextension-polyfill: ^0.12.0