Compare commits

...

19 Commits

Author SHA1 Message Date
github-actions[bot] 3dd9bc7772 chore(release): @wxt-dev/i18n v0.2.4
📼 VHS / Create VHS (push) Waiting to run
2025-05-04 12:27:20 +00:00
Aaron c7335add19 chore: Change browser workspace dependency to ^ 2025-05-04 07:21:55 -05:00
Aaron c133498208 chore(deps): Update all dependencies (#1648) 2025-05-02 08:53:38 -05:00
Aaron 6a52bb22a3 fix: Use @wxt-dev/browser instead of @types/chrome (#1645) 2025-05-02 08:41:02 -05:00
Aaron 6f970efda5 chore: Upgrade @aklinker1/check to v2 (#1647) 2025-05-02 08:36:46 -05:00
Aaron c69350a0eb fix: Fix bad links to developer.chrome.com 2025-05-02 07:10:25 -05:00
Aaron 4add8820eb chore: Stop using PNPM catalog (#1644) 2025-05-02 06:26:12 -05:00
Aaron 033dd4811e chore(deps): Upgrade dev dependencies (#1642) 2025-05-02 05:52:06 -05:00
Aaron da5cd32502 fix: Improve CSS reset inside shadow roots 2025-05-02 05:14:42 -05:00
aklinker1 edf33fdec9 fix: Upgrade @wxt-dev/browser to latest @types/chrome version 2025-05-02 01:53:07 +00:00
seaders 448cbf16c9 feat: Add @font-face to be processed by splitShadowRootCss (#1635) 2025-05-01 12:49:54 -05:00
Aaron e45b77b528 chore(deps): Upgrade vite and related dependencies 2025-05-01 12:25:56 -05:00
github-actions[bot] b61fd1716e chore(release): wxt v0.20.6
📼 VHS / Create VHS (push) Waiting to run
2025-04-30 16:22:57 +00:00
Aaron d584b5cc7e chore(deps): Upgrade web-ext-run to v0.2.3 (#1634) 2025-04-30 11:18:30 -05:00
Bang·_· faf9cedfbd docs: Added "[DesignPicker]" to the homepage (#1624) 2025-04-27 07:24:00 -05:00
Aaron 3a38ac9339 Fix changelog contributors 2025-04-26 18:07:17 -05:00
github-actions[bot] 7ea36a3cfc chore(release): wxt v0.20.5
📼 VHS / Create VHS (push) Waiting to run
2025-04-26 13:53:46 +00:00
Aaron 3577c0b47a fix: Don't use crypto.randUUID for shadow root UIs 2025-04-26 08:48:42 -05:00
Aaron d0bef42186 fix: Standardize locale codes and warn about unsupported ones (#1617) 2025-04-26 08:03:22 -05:00
45 changed files with 1415 additions and 1895 deletions
@@ -73,6 +73,7 @@ const chromeExtensionIds = [
'gdjampjdgjmbifnhldgcnccdjkcoicmg', // radiofrance - news & broadcasts (French), music (international)
'jlnhphlghikichhgbnkepenehbmloenb', // Blens - Time Tracker and AI Insight
'njnammmpdodmfkodnfpammnpdcbhnlcm', // Always Light Mode - Setting website always in light mode
'lblmfclcfniabobmamfkdogcgdagbhhb', // DesignPicker - Color Picker & Font Detector
];
const { data, err, isLoading } = useListExtensionDetails(chromeExtensionIds);
+28 -28
View File
@@ -4,7 +4,7 @@
"engines": {
"node": ">=18.20.3"
},
"packageManager": "pnpm@10.8.0",
"packageManager": "pnpm@10.10.0",
"scripts": {
"check": "check && pnpm -r --sequential run check",
"test": "pnpm -r --sequential run test run",
@@ -17,33 +17,33 @@
"docs:preview": "pnpm -s docs:gen && vitepress preview docs"
},
"devDependencies": {
"@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:",
"feed": "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:",
"vitepress-plugin-group-icons": "catalog:",
"vitest-mock-extended": "catalog:",
"vue": "catalog:",
"@aklinker1/buildc": "^1.1.4",
"@aklinker1/check": "2.0.0",
"@commitlint/config-conventional": "^19.8.0",
"@commitlint/types": "^19.8.0",
"@types/fs-extra": "^11.0.4",
"@vitest/coverage-v8": "^3.1.2",
"changelogen": "^0.6.1",
"consola": "^3.4.2",
"fast-glob": "^3.3.3",
"feed": "^4.2.2",
"fs-extra": "^11.3.0",
"lint-staged": "^15.5.1",
"markdown-it-footnote": "^4.0.0",
"nano-spawn": "^0.2.0",
"prettier": "^3.5.3",
"simple-git-hooks": "^2.13.0",
"tsx": "4.19.4",
"typedoc": "^0.25.4",
"typedoc-plugin-frontmatter": "^1.3.0",
"typedoc-plugin-markdown": "4.0.0-next.23",
"typedoc-vitepress-theme": "1.0.0-next.3",
"typescript": "^5.8.3",
"vitepress": "^1.6.3",
"vitepress-knowledge": "^0.4.1",
"vitepress-plugin-group-icons": "^1.5.2",
"vitest-mock-extended": "^3.1.0",
"vue": "^3.5.13",
"wxt": "workspace:*"
},
"simple-git-hooks": {
@@ -9,11 +9,12 @@ import type {
AnalyticsEventMetadata,
AnalyticsProvider,
} from './types';
import { browser } from '@wxt-dev/browser';
const ANALYTICS_PORT = '@wxt-dev/analytics';
export function createAnalytics(config?: AnalyticsConfig): Analytics {
if (typeof chrome === 'undefined' || !chrome?.runtime?.id)
if (!browser?.runtime?.id)
throw Error(
'Cannot use WXT analytics in contexts without access to the browser.runtime APIs',
);
@@ -51,13 +52,13 @@ function createBackgroundAnalytics(
defineStorageItem<boolean>('local:wxt-analytics:enabled', false);
// Cached values
const platformInfo = chrome.runtime.getPlatformInfo();
const platformInfo = browser.runtime.getPlatformInfo();
const userAgent = UAParser();
let userId = Promise.resolve(userIdStorage.getValue()).then(
(id) => id ?? globalThis.crypto.randomUUID(),
);
let userProperties = userPropertiesStorage.getValue();
const manifest = chrome.runtime.getManifest();
const manifest = browser.runtime.getManifest();
const getBackgroundMeta = () => ({
timestamp: Date.now(),
@@ -178,7 +179,7 @@ function createBackgroundAnalytics(
config?.providers?.map((provider) => provider(analytics, config)) ?? [];
// Listen for messages from the rest of the extension
chrome.runtime.onConnect.addListener((port) => {
browser.runtime.onConnect.addListener((port) => {
if (port.name === ANALYTICS_PORT) {
port.onMessage.addListener(({ fn, args }) => {
// @ts-expect-error: Untyped fn key
@@ -194,7 +195,7 @@ function createBackgroundAnalytics(
* Creates an analytics client for non-background contexts.
*/
function createFrontendAnalytics(): Analytics {
const port = chrome.runtime.connect({ name: ANALYTICS_PORT });
const port = browser.runtime.connect({ name: ANALYTICS_PORT });
const sessionId = Date.now();
const getFrontendMetadata = (): AnalyticsEventMetadata => ({
sessionId,
@@ -252,8 +253,8 @@ function defineStorageItem<T>(
): AnalyticsStorageItem<T> {
return {
getValue: async () =>
(await chrome.storage.local.get(key))[key] ?? defaultValue,
setValue: (newValue) => chrome.storage.local.set({ [key]: newValue }),
(await browser.storage.local.get(key))[key] ?? defaultValue,
setValue: (newValue) => browser.storage.local.set({ [key]: newValue }),
};
}
+7 -7
View File
@@ -51,15 +51,15 @@
"wxt": ">=0.20.0"
},
"devDependencies": {
"@aklinker1/check": "catalog:",
"@types/chrome": "catalog:",
"@types/ua-parser-js": "catalog:",
"publint": "catalog:",
"typescript": "catalog:",
"unbuild": "catalog:",
"@aklinker1/check": "2.0.0",
"@types/ua-parser-js": "^0.7.39",
"publint": "^0.3.12",
"typescript": "^5.8.3",
"unbuild": "^3.5.0",
"wxt": "workspace:*"
},
"dependencies": {
"ua-parser-js": "catalog:"
"@wxt-dev/browser": "workspace:^",
"ua-parser-js": "^1.0.40"
}
}
+1 -2
View File
@@ -3,8 +3,7 @@
"compilerOptions": {
"paths": {
"#analytics": ["./.wxt/analytics/index.ts"]
},
"types": ["chrome"]
}
},
"exclude": ["node_modules", "dist"]
}
+8 -8
View File
@@ -45,16 +45,16 @@
"wxt": ">=0.19.0"
},
"dependencies": {
"defu": "catalog:",
"fs-extra": "catalog:",
"sharp": "catalog:"
"defu": "^6.1.4",
"fs-extra": "^11.3.0",
"sharp": "^0.34.1"
},
"devDependencies": {
"@aklinker1/check": "catalog:",
"oxlint": "catalog:",
"publint": "catalog:",
"typescript": "catalog:",
"unbuild": "catalog:",
"@aklinker1/check": "2.0.0",
"oxlint": "^0.16.8",
"publint": "^0.3.12",
"typescript": "^5.8.3",
"unbuild": "^3.5.0",
"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.0.317",
"version": "0.0.318",
"type": "module",
"main": "src/index.mjs",
"types": "src/index.d.ts",
@@ -23,12 +23,12 @@
"src"
],
"devDependencies": {
"@types/chrome": "0.0.317",
"fs-extra": "catalog:",
"nano-spawn": "catalog:",
"tsx": "catalog:",
"typescript": "catalog:",
"vitest": "catalog:"
"@types/chrome": "0.0.318",
"fs-extra": "^11.3.0",
"nano-spawn": "^0.2.0",
"tsx": "4.19.4",
"typescript": "^5.8.3",
"vitest": "^3.1.2"
},
"dependencies": {
"@types/filesystem": "*",
+2
View File
@@ -76,5 +76,7 @@ function transformFile(file: string, content: string): string {
.replaceAll('declare namespace chrome', 'export namespace Browser')
// Update references to `chrome` namespace to `Browser`
.replaceAll('chrome.', 'Browser.')
// Fix links to developer.chrome.com
.replaceAll('developer.Browser.com', 'developer.chrome.com')
);
}
+62 -82
View File
@@ -7480,7 +7480,7 @@ export namespace Browser {
*/
export namespace permissions {
export interface Permissions {
/** The list of host permissions, including those specified in the `optional_permissions` or `permissions` keys in the manifest, and those associated with [Content Scripts](https://developer.Browser.com/docs/extensions/develop/concepts/content-scripts). */
/** The list of host permissions, including those specified in the `optional_permissions` or `permissions` keys in the manifest, and those associated with [Content Scripts](https://developer.chrome.com/docs/extensions/develop/concepts/content-scripts). */
origins?: string[];
/** List of named permissions (does not include hosts or origins). */
permissions?: Browser.runtime.ManifestPermissions[];
@@ -8498,7 +8498,7 @@ export namespace Browser {
}
export interface ConnectionOptions {
/** Optional. Flag indicating whether or not the connection should be left open when the application is suspended (see Manage App Lifecycle: https://developer.Browser.com/apps/app_lifecycle).
/** Optional. Flag indicating whether or not the connection should be left open when the application is suspended (see Manage App Lifecycle: https://developer.chrome.com/apps/app_lifecycle).
* The default value is "false." When the application is loaded, any serial connections previously opened with persistent=true can be fetched with getConnections. */
persistent?: boolean | undefined;
/** Optional. An application-defined string to associate with the connection. */
@@ -8716,13 +8716,13 @@ export namespace Browser {
/** The ID of the extension/app. */
export var id: string;
/** https://developer.Browser.com/docs/extensions/reference/api/runtime#type-PlatformOs */
/** https://developer.chrome.com/docs/extensions/reference/api/runtime#type-PlatformOs */
export type PlatformOs = "mac" | "win" | "android" | "cros" | "linux" | "openbsd" | "fuchsia";
/** https://developer.Browser.com/docs/extensions/reference/api/runtime#type-PlatformArch */
/** https://developer.chrome.com/docs/extensions/reference/api/runtime#type-PlatformArch */
export type PlatformArch = "arm" | "arm64" | "x86-32" | "x86-64" | "mips" | "mips64";
/** https://developer.Browser.com/docs/extensions/reference/api/runtime#type-PlatformNaclArch */
/** https://developer.chrome.com/docs/extensions/reference/api/runtime#type-PlatformNaclArch */
export type PlatformNaclArch = "arm" | "x86-32" | "x86-64" | "mips" | "mips64";
/** https://developer.Browser.com/docs/extensions/reference/api/runtime#type-ContextType */
/** https://developer.chrome.com/docs/extensions/reference/api/runtime#type-ContextType */
export enum ContextType {
TAB = "TAB",
POPUP = "POPUP",
@@ -8731,7 +8731,7 @@ export namespace Browser {
SIDE_PANEL = "SIDE_PANEL",
DEVELOPER_TOOLS = "DEVELOPER_TOOLS",
}
/** https://developer.Browser.com/docs/extensions/reference/api/runtime#type-OnInstalledReason */
/** https://developer.chrome.com/docs/extensions/reference/api/runtime#type-OnInstalledReason */
export enum OnInstalledReason {
INSTALL = "install",
UPDATE = "update",
@@ -8958,7 +8958,7 @@ export namespace Browser {
default_popup?: string | undefined;
}
/** Source: https://developer.Browser.com/docs/extensions/reference/permissions-list */
/** Source: https://developer.chrome.com/docs/extensions/reference/permissions-list */
export type ManifestPermissions =
| "accessibilityFeatures.modify"
| "accessibilityFeatures.read"
@@ -9042,7 +9042,7 @@ export namespace Browser {
| "webRequestBlocking"
| "webRequestAuthProvider";
/** Source : https://developer.Browser.com/docs/extensions/reference/api/permissions */
/** Source : https://developer.chrome.com/docs/extensions/reference/api/permissions */
export type ManifestOptionalPermissions = Exclude<
ManifestPermissions,
| "debugger"
@@ -12228,131 +12228,111 @@ export namespace Browser {
*/
export namespace tabGroups {
/** An ID that represents the absence of a group. */
export var TAB_GROUP_ID_NONE: -1;
export const TAB_GROUP_ID_NONE: -1;
export type ColorEnum = "grey" | "blue" | "red" | "yellow" | "green" | "pink" | "purple" | "cyan" | "orange";
/** The group's color. */
export enum Color {
BLUE = "blue",
CYAN = "cyan",
GREEN = "green",
GREY = "grey",
ORANGE = "orange",
PINK = "pink",
PURPLE = "purple",
RED = "red",
YELLOW = "yellow",
}
export interface TabGroup {
/** Whether the group is collapsed. A collapsed group is one whose tabs are hidden. */
collapsed: boolean;
/** The group's color. */
color: ColorEnum;
color: `${Color}`;
/** The ID of the group. Group IDs are unique within a browser session. */
id: number;
/** Optional. The title of the group. */
title?: string | undefined;
/** The title of the group. */
title?: string;
/** The ID of the window that contains the group. */
windowId: number;
}
export interface MoveProperties {
/** The position to move the group to. Use -1 to place the group at the end of the window. */
/** The position to move the group to. Use `-1` to place the group at the end of the window. */
index: number;
/** Optional. The window to move the group to. Defaults to the window the group is currently in. Note that groups can only be moved to and from windows with Browser.windows.WindowType type "normal". */
windowId?: number | undefined;
/** The window to move the group to. Defaults to the window the group is currently in. Note that groups can only be moved to and from windows with {@link windows.windowTypeEnum windows.windowType} type `"normal"`. */
windowId?: number;
}
export interface QueryInfo {
/** Optional. Whether the groups are collapsed. */
collapsed?: boolean | undefined;
/** Optional. The color of the groups. */
color?: ColorEnum | undefined;
/** Optional. Match group titles against a pattern. */
title?: string | undefined;
/** Optional. The ID of the window that contains the group. */
windowId?: number | undefined;
/** Whether the groups are collapsed. */
collapsed?: boolean;
/** The color of the groups. */
color?: `${Color}`;
/** Match group titles against a pattern. */
title?: string;
/** The ID of the parent window, or {@link windows.WINDOW_ID_CURRENT} for the current window. */
windowId?: number;
}
export interface UpdateProperties {
/** Optional. Whether the group should be collapsed. */
collapsed?: boolean | undefined;
/** Optional. The color of the group. */
color?: ColorEnum | undefined;
/** Optional. The title of the group. */
title?: string | undefined;
/** Whether the group should be collapsed. */
collapsed?: boolean;
/** The color of the group. */
color?: `${Color}`;
/** The title of the group. */
title?: string;
}
/**
* Retrieves details about the specified group.
* @param groupId The ID of the tab group.
* @param callback Called with the retrieved tab group.
*
* Can return its result via Promise since Chrome 90.
*/
export function get(groupId: number): Promise<TabGroup>;
export function get(groupId: number, callback: (group: TabGroup) => void): void;
/**
* Retrieves details about the specified group.
* @param groupId The ID of the tab group.
* @return The `get` method provides its result via callback or returned as a `Promise` (MV3 only).
*/
export function get(groupId: number): Promise<TabGroup>;
/**
* Moves the group and all its tabs within its window, or to a new window.
* @param groupId The ID of the group to move.
* @param moveProperties Information on how to move the group.
* @return The `move` method provides its result via callback or returned as a `Promise` (MV3 only).
*/
export function move(groupId: number, moveProperties: MoveProperties): Promise<TabGroup>;
/**
* Moves the group and all its tabs within its window, or to a new window.
* @param groupId The ID of the group to move.
* @param moveProperties Information on how to move the group.
* @param callback Optional.
*
* Can return its result via Promise since Chrome 90.
*/
export function move(groupId: number, moveProperties: MoveProperties): Promise<TabGroup | undefined>;
export function move(
groupId: number,
moveProperties: MoveProperties,
callback: (group: TabGroup) => void,
callback: (group?: TabGroup) => void,
): void;
/**
* Gets all groups that have the specified properties, or all groups if no properties are specified.
* @param queryInfo Object with search parameters.
* @param callback Called with retrieved tab groups.
*
* Can return its result via Promise since Chrome 90.
*/
export function query(queryInfo: QueryInfo): Promise<TabGroup[]>;
export function query(queryInfo: QueryInfo, callback: (result: TabGroup[]) => void): void;
/**
* Gets all groups that have the specified properties, or all groups if no properties are specified.
* @param queryInfo Object with search parameters.
* @return The `query` method provides its result via callback or returned as a `Promise` (MV3 only).
*/
export function query(queryInfo: QueryInfo): Promise<TabGroup[]>;
/**
* Modifies the properties of a group. Properties that are not specified in updateProperties are not modified.
* Modifies the properties of a group. Properties that are not specified in `updateProperties` are not modified.
* @param groupId The ID of the group to modify.
* @param updateProperties Information on how to update the group.
* @return The `update` method provides its result via callback or returned as a `Promise` (MV3 only).
*/
export function update(groupId: number, updateProperties: UpdateProperties): Promise<TabGroup>;
/**
* Modifies the properties of a group. Properties that are not specified in updateProperties are not modified.
* @param groupId The ID of the group to modify.
* @param updateProperties Information on how to update the group.
* @param callback Optional.
*
* Can return its result via Promise since Chrome 90.
*/
export function update(groupId: number, updateProperties: UpdateProperties): Promise<TabGroup | undefined>;
export function update(
groupId: number,
updateProperties: UpdateProperties,
callback: (group: TabGroup) => void,
callback: (group?: TabGroup) => void,
): void;
export interface TabGroupCreatedEvent extends Browser.events.Event<(group: TabGroup) => void> {}
export interface TabGroupMovedEvent extends Browser.events.Event<(group: TabGroup) => void> {}
export interface TabGroupRemovedEvent extends Browser.events.Event<(group: TabGroup) => void> {}
export interface TabGroupUpdated extends Browser.events.Event<(group: TabGroup) => void> {}
/** Fired when a group is created. */
export var onCreated: TabGroupCreatedEvent;
export const onCreated: events.Event<(group: TabGroup) => void>;
/** Fired when a group is moved within a window. Move events are still fired for the individual tabs within the group, as well as for the group itself. This event is not fired when a group is moved between windows; instead, it will be removed from one window and created in another. */
export var onMoved: TabGroupMovedEvent;
/** Fired when a group is closed, either directly by the user or automatically because it contained zero. */
export var onRemoved: TabGroupRemovedEvent;
export const onMoved: events.Event<(group: TabGroup) => void>;
/** Fired when a group is closed, either directly by the user or automatically because it contained zero tabs. */
export const onRemoved: events.Event<(group: TabGroup) => void>;
/** Fired when a group is updated. */
export var onUpdated: TabGroupUpdated;
export const onUpdated: events.Event<(group: TabGroup) => void>;
}
////////////////////
+5 -5
View File
@@ -24,10 +24,10 @@
],
"devDependencies": {
"@types/chrome": "{{chromeTypesVersion}}",
"fs-extra": "catalog:",
"nano-spawn": "catalog:",
"tsx": "catalog:",
"typescript": "catalog:",
"vitest": "catalog:"
"fs-extra": "^11.3.0",
"nano-spawn": "^0.2.0",
"tsx": "4.19.4",
"typescript": "^5.8.3",
"vitest": "^3.1.2"
}
}
+31
View File
@@ -1,5 +1,36 @@
# Changelog
## v0.2.4
[compare changes](https://github.com/wxt-dev/wxt/compare/i18n-v0.2.3...i18n-v0.2.4)
### 🩹 Fixes
- Standardize locale codes and warn about unsupported ones ([#1617](https://github.com/wxt-dev/wxt/pull/1617))
- Use `@wxt-dev/browser` instead of `@types/chrome` ([#1645](https://github.com/wxt-dev/wxt/pull/1645))
### 📖 Documentation
- Add react language ID to README ([#1347](https://github.com/wxt-dev/wxt/pull/1347))
- Fix public path reference ([bcb20874](https://github.com/wxt-dev/wxt/commit/bcb20874))
### 🏡 Chore
- **deps:** Upgrade all non-major dependencies ([#1164](https://github.com/wxt-dev/wxt/pull/1164))
- **deps:** Bump dev and non-breaking major dependencies ([#1167](https://github.com/wxt-dev/wxt/pull/1167))
- 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))
- Change browser workspace dependency to `^` ([c7335add](https://github.com/wxt-dev/wxt/commit/c7335add))
### ❤️ Contributors
- Aaron ([@aklinker1](https://github.com/aklinker1))
- Okinea Dev ([@okineadev](https://github.com/okineadev))
- Redwoodlid ([@redwoodlid](https://github.com/redwoodlid))
## v0.2.3
[compare changes](https://github.com/wxt-dev/wxt/compare/i18n-v0.2.2...i18n-v0.2.3)
+13 -13
View File
@@ -1,7 +1,7 @@
{
"name": "@wxt-dev/i18n",
"description": "Type-safe wrapper around browser.i18n.getMessage with additional features",
"version": "0.2.3",
"version": "0.2.4",
"type": "module",
"repository": {
"type": "git",
@@ -26,9 +26,10 @@
"test": "buildc --deps-only -- vitest"
},
"dependencies": {
"chokidar": "catalog:",
"confbox": "catalog:",
"fast-glob": "catalog:"
"@wxt-dev/browser": "workspace:^",
"chokidar": "^4.0.3",
"confbox": "^0.1.8 || ^0.2.2",
"fast-glob": "^3.3.3"
},
"peerDependencies": {
"wxt": ">=0.19.7"
@@ -39,15 +40,14 @@
}
},
"devDependencies": {
"@aklinker1/check": "catalog:",
"@types/chrome": "catalog:",
"@types/node": "catalog:",
"oxlint": "catalog:",
"publint": "catalog:",
"typescript": "catalog:",
"unbuild": "catalog:",
"vitest": "catalog:",
"vitest-plugin-random-seed": "catalog:",
"@aklinker1/check": "2.0.0",
"@types/node": "^20.17.6",
"oxlint": "^0.16.8",
"publint": "^0.3.12",
"typescript": "^5.8.3",
"unbuild": "^3.5.0",
"vitest": "^3.1.2",
"vitest-plugin-random-seed": "^1.1.1",
"wxt": "workspace:*"
},
"main": "./dist/index.cjs",
+11 -6
View File
@@ -1,13 +1,18 @@
import { describe, it, expect, vi, beforeEach } from 'vitest';
import { createI18n } from '../index';
import { browser } from '@wxt-dev/browser';
const getMessageMock = vi.fn();
vi.stubGlobal('chrome', {
i18n: {
getMessage: getMessageMock,
},
vi.mock('@wxt-dev/browser', async () => {
const { vi } = await import('vitest');
return {
browser: {
i18n: {
getMessage: vi.fn(),
},
},
};
});
const getMessageMock = vi.mocked(browser.i18n.getMessage);
describe('createI18n', () => {
beforeEach(() => {
+11 -6
View File
@@ -1,13 +1,18 @@
import { beforeEach, describe, it, vi } from 'vitest';
import { createI18n } from '..';
import { browser } from '@wxt-dev/browser';
const getMessageMock = vi.fn();
vi.stubGlobal('chrome', {
i18n: {
getMessage: getMessageMock,
},
vi.mock('@wxt-dev/browser', async () => {
const { vi } = await import('vitest');
return {
browser: {
i18n: {
getMessage: vi.fn(),
},
},
};
});
const getMessageMock = vi.mocked(browser.i18n.getMessage);
const n: number = 1;
+32 -2
View File
@@ -1,10 +1,14 @@
import { describe, it, expect } from 'vitest';
import { ChromeMessage } from '../build';
import { applyChromeMessagePlaceholders, getSubstitutionCount } from '../utils';
import {
applyChromeMessagePlaceholders,
getSubstitutionCount,
standardizeLocale,
} from '../utils';
describe('Utils', () => {
describe('applyChromeMessagePlaceholders', () => {
it('should return the combined stirng', () => {
it('should return the combined string', () => {
const input = {
message: 'Hello $username$, welcome to $appName$',
placeholders: {
@@ -60,4 +64,30 @@ describe('Utils', () => {
expect(getSubstitutionCount('Hello $10')).toBe(1);
});
});
describe('standardizeLocale', () => {
it('should convert two-letter locale codes to lowercase', () => {
expect(standardizeLocale('en')).toEqual('en');
expect(standardizeLocale('EN')).toEqual('en');
});
it('should convert locale code extensions to uppercase', () => {
expect(standardizeLocale('en_US')).toEqual('en_US');
expect(standardizeLocale('en_us')).toEqual('en_US');
expect(standardizeLocale('es_419')).toEqual('es_419');
});
it('should convert dashes to underscores', () => {
expect(standardizeLocale('en_US')).toEqual('en_US');
expect(standardizeLocale('en-US')).toEqual('en_US');
});
it('should return the input string as-is for unknown formats', () => {
expect(standardizeLocale('en_USSS')).toEqual('en_USSS');
expect(standardizeLocale('en-')).toEqual('en-');
expect(standardizeLocale('------')).toEqual('------');
expect(standardizeLocale('test')).toEqual('test');
expect(standardizeLocale('hello-world')).toEqual('hello-world');
});
});
});
+2
View File
@@ -10,6 +10,8 @@ import { parseYAML, parseJSON5, parseTOML } from 'confbox';
import { dirname, extname } from 'node:path';
import { applyChromeMessagePlaceholders, getSubstitutionCount } from './utils';
export { SUPPORTED_LOCALES } from './supported-locales';
//
// TYPES
//
+3 -2
View File
@@ -7,6 +7,7 @@ import {
I18n,
Substitution,
} from './types';
import { browser } from '@wxt-dev/browser';
export function createI18n<
T extends I18nStructure = DefaultI18nStructure,
@@ -39,9 +40,9 @@ export function createI18n<
if (sub?.length) {
// Convert all substitutions to strings
const stringSubs = sub?.map((sub) => String(sub));
message = chrome.i18n.getMessage(key.replaceAll('.', '_'), stringSubs);
message = browser.i18n.getMessage(key.replaceAll('.', '_'), stringSubs);
} else {
message = chrome.i18n.getMessage(key.replaceAll('.', '_'));
message = browser.i18n.getMessage(key.replaceAll('.', '_'));
}
if (!message) {
console.warn(`[i18n] Message not found: "${key}"`);
+18 -4
View File
@@ -16,12 +16,14 @@ import {
generateChromeMessagesText,
parseMessagesFile,
generateTypeText,
SUPPORTED_LOCALES,
} from './build';
import glob from 'fast-glob';
import { basename, extname, join, resolve } from 'node:path';
import { watch } from 'chokidar';
import { GeneratedPublicFile, WxtDirFileEntry } from 'wxt';
import { writeFile } from 'node:fs/promises';
import { standardizeLocale } from './utils';
export default defineWxtModule<I18nOptions>({
name: '@wxt-dev/i18n',
@@ -46,10 +48,22 @@ export default defineWxtModule<I18nOptions>({
cwd: localesDir,
absolute: true,
});
return files.map((file) => ({
file,
locale: basename(file).replace(extname(file), ''),
}));
const unsupportedLocales: string[] = [];
const res = files.map((file) => {
const rawLocale = basename(file).replace(extname(file), '');
const locale = standardizeLocale(rawLocale);
if (!SUPPORTED_LOCALES.has(locale)) unsupportedLocales.push(locale);
return { file, locale };
});
if (unsupportedLocales.length > 0)
wxt.logger.warn(
`Unsupported locales: [${unsupportedLocales.join(', ')}].\n\nWeb extensions only support a limited set of locales as described here: https://developer.chrome.com/docs/extensions/reference/api/i18n#locales`,
);
return res;
};
const generateOutputJsonFiles = async (): Promise<
+58
View File
@@ -0,0 +1,58 @@
/** From https://developer.chrome.com/docs/extensions/reference/api/i18n#locales */
export const SUPPORTED_LOCALES = new Set([
'ar',
'am',
'bg',
'bn',
'ca',
'cs',
'da',
'de',
'el',
'en',
'en_AU',
'en_GB',
'en_US',
'es',
'es_419',
'et',
'fa',
'fi',
'fil',
'fr',
'gu',
'he',
'hi',
'hr',
'hu',
'id',
'it',
'ja',
'kn',
'ko',
'lt',
'lv',
'ml',
'mr',
'ms',
'nl',
'no',
'pl',
'pt_BR',
'pt_PT',
'ro',
'ru',
'sk',
'sl',
'sr',
'sv',
'sw',
'ta',
'te',
'th',
'tr',
'uk',
'vi',
'zh_CN',
'zh_TW',
]);
+13
View File
@@ -21,3 +21,16 @@ export function getSubstitutionCount(message: string): number {
}
const MAX_SUBSTITUTIONS = 9;
/** Given a string, standardize it to the format `xx_YY`. */
export function standardizeLocale(locale: string): string {
if (locale.length === 2) return locale.toLowerCase();
const [is_match, prefix, suffix] =
locale.match(/^([a-z]{2})[-_]([a-z]{2,3})$/i) ?? [];
if (is_match) {
return `${prefix.toLowerCase()}_${suffix.toUpperCase()}`;
}
return locale;
}
+1 -1
View File
@@ -1,7 +1,7 @@
{
"extends": "../../tsconfig.base.json",
"compilerOptions": {
"types": ["chrome", "node"]
"types": ["node"]
},
"exclude": ["node_modules/**", "dist/**"]
}
+9 -9
View File
@@ -48,17 +48,17 @@
"wxt": ">=0.19.16"
},
"dependencies": {
"@vitejs/plugin-react": "catalog:"
"@vitejs/plugin-react": "^4.4.1"
},
"devDependencies": {
"@aklinker1/check": "catalog:",
"@types/react": "catalog:",
"@types/react-dom": "catalog:",
"publint": "catalog:",
"react": "catalog:",
"react-dom": "catalog:",
"typescript": "catalog:",
"unbuild": "catalog:",
"@aklinker1/check": "2.0.0",
"@types/react": "^19.1.2",
"@types/react-dom": "^19.1.3",
"publint": "^0.3.12",
"react": "^19.1.0",
"react-dom": "^19.1.0",
"typescript": "^5.8.3",
"unbuild": "^3.5.0",
"wxt": "workspace:*"
}
}
+6 -6
View File
@@ -48,14 +48,14 @@
"wxt": ">=0.19.16"
},
"dependencies": {
"vite-plugin-solid": "catalog:"
"vite-plugin-solid": "^2.11.6"
},
"devDependencies": {
"@aklinker1/check": "catalog:",
"publint": "catalog:",
"solid-js": "catalog:",
"typescript": "catalog:",
"unbuild": "catalog:",
"@aklinker1/check": "2.0.0",
"publint": "^0.3.12",
"solid-js": "^1.9.6",
"typescript": "^5.8.3",
"unbuild": "^3.5.0",
"wxt": "workspace:*"
}
}
+5 -5
View File
@@ -47,13 +47,13 @@
"svelte": ">=5"
},
"dependencies": {
"@sveltejs/vite-plugin-svelte": "catalog:"
"@sveltejs/vite-plugin-svelte": "^4.0.0 || ^5.0.0"
},
"devDependencies": {
"@aklinker1/check": "catalog:",
"publint": "catalog:",
"typescript": "catalog:",
"unbuild": "catalog:",
"@aklinker1/check": "2.0.0",
"publint": "^0.3.12",
"typescript": "^5.8.3",
"unbuild": "^3.5.0",
"wxt": "workspace:*"
}
}
+5 -5
View File
@@ -46,13 +46,13 @@
"wxt": ">=0.19.16"
},
"dependencies": {
"@vitejs/plugin-vue": "catalog:"
"@vitejs/plugin-vue": "^5.2.3"
},
"devDependencies": {
"@aklinker1/check": "catalog:",
"publint": "catalog:",
"typescript": "catalog:",
"unbuild": "catalog:",
"@aklinker1/check": "2.0.0",
"publint": "^0.3.12",
"typescript": "^5.8.3",
"unbuild": "^3.5.0",
"wxt": "workspace:*"
}
}
+10 -10
View File
@@ -30,18 +30,18 @@
"test": "buildc --deps-only -- vitest"
},
"dependencies": {
"async-mutex": "catalog:",
"dequal": "catalog:"
"@wxt-dev/browser": "workspace:^",
"async-mutex": "^0.5.0",
"dequal": "^2.0.3"
},
"devDependencies": {
"@aklinker1/check": "catalog:",
"@types/chrome": "catalog:",
"@webext-core/fake-browser": "catalog:",
"oxlint": "catalog:",
"publint": "catalog:",
"typescript": "catalog:",
"unbuild": "catalog:",
"vitest": "catalog:"
"@aklinker1/check": "2.0.0",
"@webext-core/fake-browser": "^1.3.2",
"oxlint": "^0.16.8",
"publint": "^0.3.12",
"typescript": "^5.8.3",
"unbuild": "^3.5.0",
"vitest": "^3.1.2"
},
"module": "./dist/index.mjs",
"types": "./dist/index.d.ts",
+4 -3
View File
@@ -1,6 +1,7 @@
import { fakeBrowser } from '@webext-core/fake-browser';
import { describe, it, expect, beforeEach, vi, expectTypeOf } from 'vitest';
import { MigrationError, type WxtStorageItem, storage } from '../index';
import { browser } from '@wxt-dev/browser';
/**
* This works because fakeBrowser is synchronous, and is will finish any number of chained
@@ -222,7 +223,7 @@ describe('Storage Utils', () => {
describe('setMeta', () => {
it('should set metadata at key+$', async () => {
const existing = { v: 1 };
await chrome.storage[storageArea].set({ count$: existing });
await browser.storage[storageArea].set({ count$: existing });
const newValues = {
date: Date.now(),
};
@@ -238,7 +239,7 @@ describe('Storage Utils', () => {
'should remove any properties set to %s',
async (version) => {
const existing = { v: 1 };
await chrome.storage[storageArea].set({ count$: existing });
await browser.storage[storageArea].set({ count$: existing });
const expected = {};
await storage.setMeta(`${storageArea}:count`, { v: version });
@@ -1265,7 +1266,7 @@ describe('Storage Utils', () => {
await item.removeValue();
// Make sure it's actually blank before running the test
expect(await chrome.storage.local.get()).toEqual({});
expect(await browser.storage.local.get()).toEqual({});
init.mockClear();
const [value1, value2] = await Promise.all([
+2 -9
View File
@@ -1,4 +1,3 @@
/// <reference types="chrome" />
/**
* Simplified storage APIs with support for versioned fields, snapshots, metadata, and item definitions.
*
@@ -7,13 +6,7 @@
*/
import { dequal } from 'dequal/lite';
import { Mutex } from 'async-mutex';
const browser: typeof chrome =
// @ts-expect-error
globalThis.browser?.runtime?.id == null
? globalThis.chrome
: // @ts-expect-error
globalThis.browser;
import { browser, type Browser } from '@wxt-dev/browser';
export const storage = createStorage();
@@ -897,7 +890,7 @@ export interface WxtStorageItemOptions<T> {
}
export type StorageAreaChanges = {
[key: string]: chrome.storage.StorageChange;
[key: string]: Browser.storage.StorageChange;
};
/**
+1 -2
View File
@@ -1,8 +1,7 @@
{
"extends": "../../tsconfig.base.json",
"compilerOptions": {
"verbatimModuleSyntax": true,
"types": ["chrome"]
"verbatimModuleSyntax": true
},
"exclude": ["node_modules/**", "dist/**"]
}
+8 -8
View File
@@ -40,16 +40,16 @@
"wxt": ">=0.19.0"
},
"devDependencies": {
"@aklinker1/check": "catalog:",
"oxlint": "catalog:",
"publint": "catalog:",
"typescript": "catalog:",
"unbuild": "catalog:",
"unocss": "catalog:",
"@aklinker1/check": "2.0.0",
"oxlint": "^0.16.8",
"publint": "^0.3.12",
"typescript": "^5.8.3",
"unbuild": "^3.5.0",
"unocss": "^0.64.0 || ^0.65.0 || ^65.0.0 || ^66.0.0",
"wxt": "workspace:*"
},
"dependencies": {
"defu": "catalog:",
"fast-glob": "catalog:"
"defu": "^6.1.4",
"fast-glob": "^3.3.3"
}
}
+6 -6
View File
@@ -45,12 +45,12 @@
"wxt": ">=0.20.0"
},
"devDependencies": {
"@aklinker1/check": "catalog:",
"@types/webextension-polyfill": "catalog:",
"publint": "catalog:",
"typescript": "catalog:",
"unbuild": "catalog:",
"webextension-polyfill": "catalog:",
"@aklinker1/check": "2.0.0",
"@types/webextension-polyfill": "^0.12.3",
"publint": "^0.3.12",
"typescript": "^5.8.3",
"unbuild": "^3.5.0",
"webextension-polyfill": "^0.12.0",
"wxt": "workspace:*"
}
}
+9 -9
View File
@@ -18,19 +18,19 @@
},
"dependencies": {
"@wxt-dev/i18n": "workspace:*",
"react": "catalog:",
"react-dom": "catalog:"
"react": "^19.1.0",
"react-dom": "^19.1.0"
},
"devDependencies": {
"@types/react": "catalog:",
"@types/react-dom": "catalog:",
"@types/react": "^19.1.2",
"@types/react-dom": "^19.1.3",
"@wxt-dev/auto-icons": "workspace:*",
"@wxt-dev/unocss": "workspace:*",
"sass": "catalog:",
"typescript": "catalog:",
"unocss": "catalog:",
"vitest": "catalog:",
"vitest-plugin-random-seed": "catalog:",
"sass": "^1.87.0",
"typescript": "^5.8.3",
"unocss": "^0.64.0 || ^0.65.0 || ^65.0.0 || ^66.0.0",
"vitest": "^3.1.2",
"vitest-plugin-random-seed": "^1.1.1",
"wxt": "workspace:*"
},
"buildc": {
+18 -2
View File
@@ -1,5 +1,21 @@
# Changelog
## v0.20.6
[compare changes](https://github.com/wxt-dev/wxt/compare/wxt-v0.20.5...wxt-v0.20.6)
## v0.20.5
[compare changes](https://github.com/wxt-dev/wxt/compare/wxt-v0.20.4...wxt-v0.20.5)
### 🩹 Fixes
- Don't use crypto.randUUID for shadow root UIs ([3577c0b](https://github.com/wxt-dev/wxt/commit/3577c0b))
### ❤️ Contributors
- Aaron ([@aklinker1](https://github.com/aklinker1))
## v0.20.4
[compare changes](https://github.com/wxt-dev/wxt/compare/wxt-v0.20.3...wxt-v0.20.4)
@@ -21,8 +37,8 @@
### ❤️ Contributors
- Yunsup Sim <pedogunu@gmail.com>
- ТΞNSΛI <tensai@gmx.net>
- Yunsup Sim ([@SimYunSup](https://github.com/SimYunSup))
- ТΞNSΛI ([@Tensai75](https://github.com/Tensai75))
- Nishu ([@nishu-murmu](https://github.com/nishu-murmu))
- Aaron ([@aklinker1](https://github.com/aklinker1))
+61 -61
View File
@@ -1,7 +1,7 @@
{
"name": "wxt",
"type": "module",
"version": "0.20.4",
"version": "0.20.6",
"description": "⚡ Next-gen Web Extension Framework",
"license": "MIT",
"scripts": {
@@ -16,69 +16,69 @@
"prepack": "pnpm build"
},
"dependencies": {
"@1natsu/wait-element": "catalog:",
"@aklinker1/rollup-plugin-visualizer": "catalog:",
"@webext-core/fake-browser": "catalog:",
"@webext-core/isolated-element": "catalog:",
"@webext-core/match-patterns": "catalog:",
"@wxt-dev/browser": "workspace:*",
"@1natsu/wait-element": "^4.1.2",
"@aklinker1/rollup-plugin-visualizer": "5.12.0",
"@webext-core/fake-browser": "^1.3.2",
"@webext-core/isolated-element": "^1.1.2",
"@webext-core/match-patterns": "^1.0.3",
"@wxt-dev/browser": "workspace:^",
"@wxt-dev/storage": "workspace:^1.0.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:",
"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:"
"async-mutex": "^0.5.0",
"c12": "^3.0.3",
"cac": "^6.7.14",
"chokidar": "^4.0.3",
"ci-info": "^4.2.0",
"consola": "^3.4.2",
"defu": "^6.1.4",
"dotenv": "^16.5.0",
"dotenv-expand": "^12.0.2",
"esbuild": "^0.25.0",
"fast-glob": "^3.3.3",
"filesize": "^10.1.6",
"fs-extra": "^11.3.0",
"get-port-please": "^3.1.2",
"giget": "^1.2.3 || ^2.0.0",
"hookable": "^5.5.3",
"import-meta-resolve": "^4.1.0",
"is-wsl": "^3.1.0",
"json5": "^2.2.3",
"jszip": "^3.10.1",
"linkedom": "^0.18.10",
"magicast": "^0.3.5",
"minimatch": "^10.0.1",
"nano-spawn": "^0.2.0",
"normalize-path": "^3.0.0",
"nypm": "^0.6.0",
"ohash": "^2.0.11",
"open": "^10.1.2",
"ora": "^8.2.0",
"perfect-debounce": "^1.0.0",
"picocolors": "^1.1.1",
"prompts": "^2.4.2",
"publish-browser-extension": "^2.3.0 || ^3.0.0",
"scule": "^1.3.0",
"unimport": "^3.13.1 || ^4.0.0 || ^5.0.0",
"vite": "^5.4.19 || ^6.3.4",
"vite-node": "^2.1.4 || ^3.1.2",
"web-ext-run": "^0.2.3"
},
"devDependencies": {
"@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:"
"@aklinker1/check": "2.0.0",
"@faker-js/faker": "^9.7.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": "^17.4.6",
"lodash.merge": "^4.6.2",
"oxlint": "^0.16.8",
"publint": "^0.3.12",
"typescript": "^5.8.3",
"unbuild": "^3.5.0",
"vitest": "^3.1.2",
"vitest-plugin-random-seed": "^1.1.1"
},
"peerDependenciesMeta": {},
"repository": {
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -18,11 +18,11 @@ export async function createShadowRootUi<TMounted>(
ctx: ContentScriptContext,
options: ShadowRootContentScriptUiOptions<TMounted>,
): Promise<ShadowRootContentScriptUi<TMounted>> {
const instanceId = crypto.randomUUID();
const instanceId = Math.random().toString(36).substring(2, 15);
const css: string[] = [];
if (!options.inheritStyles) {
css.push(`/* WXT Shadow Root Reset */ body{all:initial;}`);
css.push(`/* WXT Shadow Root Reset */ :host{all:initial !important;}`);
}
if (options.css) {
css.push(options.css);
@@ -11,7 +11,7 @@ export function splitShadowRootCss(css: string): {
let shadowCss = css;
let documentCss = '';
const rulesRegex = /(\s*@property[\s\S]*?{[\s\S]*?})/gm;
const rulesRegex = /(\s*@(property|font-face)[\s\S]*?{[\s\S]*?})/gm;
let match;
while ((match = rulesRegex.exec(css)) !== null) {
documentCss += match[1];
+917 -1463
View File
File diff suppressed because it is too large Load Diff
-99
View File
@@ -8,102 +8,3 @@ onlyBuiltDependencies:
- sharp
- simple-git-hooks
- spawn-sync
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.8.0
'@commitlint/types': ^19.8.0
'@faker-js/faker': ^9.6.0
'@sveltejs/vite-plugin-svelte': ^4.0.0 || ^5.0.0
'@types/chrome': ^0.0.313
'@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.1.0
'@types/react-dom': ^19.1.2
'@types/ua-parser-js': ^0.7.39
'@types/webextension-polyfill': ^0.12.3
'@vitejs/plugin-react': ^4.3.4
'@vitejs/plugin-vue': ^5.2.3
'@vitest/coverage-v8': ^3.1.1
'@webext-core/fake-browser': ^1.3.2
'@webext-core/isolated-element': ^1.1.2
'@webext-core/match-patterns': ^1.0.3
async-mutex: ^0.5.0
c12: ^3.0.3
cac: ^6.7.14
changelogen: ^0.6.1
chokidar: ^4.0.3
ci-info: ^4.2.0
confbox: ^0.1.8 || ^0.2.2
consola: ^3.4.2
defu: ^6.1.4
dequal: ^2.0.3
dotenv: ^16.4.7
dotenv-expand: ^12.0.1
esbuild: ^0.25.0
extract-zip: ^2.0.1
fast-glob: ^3.3.3
feed: ^4.2.2
filesize: ^10.1.6
fs-extra: ^11.3.0
get-port-please: ^3.1.2
giget: ^1.2.3 || ^2.0.0
happy-dom: ^17.4.4
hookable: ^5.5.3
import-meta-resolve: ^4.1.0
is-wsl: ^3.1.0
json5: ^2.2.3
jszip: ^3.10.1
linkedom: ^0.18.9
lint-staged: ^15.5.0
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.6.0
ohash: ^2.0.11
open: ^10.1.0
ora: ^8.2.0
oxlint: ^0.16.5
perfect-debounce: ^1.0.0
picocolors: ^1.1.1
prettier: ^3.5.3
prompts: ^2.4.2
publint: ^0.3.10
publish-browser-extension: ^2.3.0 || ^3.0.0
react: ^19.1.0
react-dom: ^19.1.0
sass: ^1.86.3
scule: ^1.3.0
sharp: ^0.34.1
simple-git-hooks: ^2.12.1
solid-js: ^1.9.5
tsx: 4.19.3
typedoc: ^0.25.4
typedoc-plugin-frontmatter: ^1.3.0
typedoc-plugin-markdown: 4.0.0-next.23
typedoc-vitepress-theme: 1.0.0-next.3
typescript: ^5.8.3
ua-parser-js: ^1.0.40
unbuild: ^3.5.0
unimport: ^3.13.1 || ^4.0.0 || ^5.0.0
unocss: ^0.64.0 || ^0.65.0 || ^65.0.0 || ^66.0.0
vite: ^5.4.17 || ^6.2.5
vite-node: ^2.1.4 || ^3.0.0
vite-plugin-solid: ^2.11.6
vitepress: ^1.6.3
vitepress-knowledge: ^0.4.1
vitepress-plugin-group-icons: ^1.4.1
vitest: ^3.1.1
vitest-mock-extended: ^3.1.0
vitest-plugin-random-seed: ^1.1.1
vue: ^3.5.13
web-ext-run: ^0.2.2
webextension-polyfill: ^0.12.0
+3 -3
View File
@@ -19,10 +19,10 @@
"react-dom": "^19.1.0"
},
"devDependencies": {
"@types/react": "^19.1.0",
"@types/react-dom": "^19.1.2",
"@types/react": "^19.1.2",
"@types/react-dom": "^19.1.3",
"@wxt-dev/module-react": "^1.1.3",
"typescript": "^5.8.3",
"wxt": "^0.20.0"
"wxt": "^0.20.6"
}
}
+2 -2
View File
@@ -15,11 +15,11 @@
"postinstall": "wxt prepare"
},
"dependencies": {
"solid-js": "^1.9.5"
"solid-js": "^1.9.6"
},
"devDependencies": {
"@wxt-dev/module-solid": "^1.1.3",
"typescript": "^5.8.3",
"wxt": "^0.20.0"
"wxt": "^0.20.6"
}
}
+3 -3
View File
@@ -17,10 +17,10 @@
"devDependencies": {
"@tsconfig/svelte": "^5.0.4",
"@wxt-dev/module-svelte": "^2.0.3",
"svelte": "^5.25.9",
"svelte-check": "^4.1.5",
"svelte": "^5.28.2",
"svelte-check": "^4.1.6",
"tslib": "^2.8.1",
"typescript": "^5.8.3",
"wxt": "^0.20.0"
"wxt": "^0.20.6"
}
}
+1 -1
View File
@@ -16,6 +16,6 @@
},
"devDependencies": {
"typescript": "^5.8.3",
"wxt": "^0.20.0"
"wxt": "^0.20.6"
}
}
+2 -2
View File
@@ -20,7 +20,7 @@
"devDependencies": {
"@wxt-dev/module-vue": "^1.0.2",
"typescript": "5.6.3",
"vue-tsc": "^2.2.8",
"wxt": "^0.20.0"
"vue-tsc": "^2.2.10",
"wxt": "^0.20.6"
}
}