From 9e2d11d8dbddf99e222113bf502d9edb157b197c Mon Sep 17 00:00:00 2001 From: Aaron Klinker Date: Sat, 16 Dec 2023 12:37:13 -0600 Subject: [PATCH] List imports by hand --- demo/src/entrypoints/background.ts | 1 + src/browser.ts | 72 +++++++++++++++++++--- src/client/utils/reload-content-scripts.ts | 10 ++- src/core/utils/building/rebuild.ts | 4 +- src/core/utils/content-scripts.ts | 6 +- src/core/utils/manifest.ts | 24 ++++---- src/core/utils/testing/fake-objects.ts | 9 +-- src/storage.ts | 4 +- src/types/external.ts | 41 ++++-------- src/types/internal.ts | 6 +- 10 files changed, 108 insertions(+), 69 deletions(-) diff --git a/demo/src/entrypoints/background.ts b/demo/src/entrypoints/background.ts index f395ae23..21ec352c 100644 --- a/demo/src/entrypoints/background.ts +++ b/demo/src/entrypoints/background.ts @@ -1,4 +1,5 @@ import messages from 'public/_locales/en/messages.json'; +import {} from 'wxt/browser'; export default defineBackground(() => { console.log(browser.runtime.id); diff --git a/src/browser.ts b/src/browser.ts index 1a632c0e..6f148fee 100644 --- a/src/browser.ts +++ b/src/browser.ts @@ -1,22 +1,80 @@ /** * @module wxt/browser */ -import originalBrowser from 'webextension-polyfill'; -import * as WebextensionPolyfill from 'webextension-polyfill'; +import originalBrowser, { Browser, Runtime, I18n } from 'webextension-polyfill'; -export type { WebextensionPolyfill }; - -export interface AugmentedBrowser extends WebextensionPolyfill.Browser { +export interface AugmentedBrowser extends Browser { runtime: WxtRuntime; i18n: WxtI18n; } -export interface WxtRuntime extends WebextensionPolyfill.Runtime.Static { +export interface WxtRuntime extends Runtime.Static { // Overriden per-project } -export interface WxtI18n extends WebextensionPolyfill.I18n.Static { +export interface WxtI18n extends I18n.Static { // Overriden per-project } export const browser: AugmentedBrowser = originalBrowser; + +// re-export all the types from webextension-polyfill +// Because webextension-polyfill uses a weird namespace with "import export", there isn't a good way +// to get these types without re-listing them. +export { + ActivityLog, + Alarms, + Bookmarks, + Action, + BrowserAction, + BrowserSettings, + BrowsingData, + CaptivePortal, + Clipboard, + Commands, + ContentScripts, + ContextualIdentities, + Cookies, + DeclarativeNetRequest, + Devtools, + Dns, + Downloads, + Events, + Experiments, + Extension, + ExtensionTypes, + Find, + GeckoProfiler, + History, + I18n, + Identity, + Idle, + Management, + Manifest, + ContextMenus, + Menus, + NetworkStatus, + NormandyAddonStudy, + Notifications, + Omnibox, + PageAction, + Permissions, + Pkcs11, + Privacy, + Proxy, + Runtime, + Scripting, + Search, + Sessions, + SidebarAction, + Storage, + Tabs, + Theme, + TopSites, + Types, + Urlbar, + UserScripts, + WebNavigation, + WebRequest, + Windows, +} from 'webextension-polyfill'; diff --git a/src/client/utils/reload-content-scripts.ts b/src/client/utils/reload-content-scripts.ts index 827fbe24..c69a1150 100644 --- a/src/client/utils/reload-content-scripts.ts +++ b/src/client/utils/reload-content-scripts.ts @@ -1,10 +1,8 @@ -import { browser, WebextensionPolyfill } from '~/browser'; +import { browser, Manifest } from '~/browser'; import { logger } from './logger'; import { MatchPattern } from '~/sandbox'; -export function reloadContentScript( - contentScript: WebextensionPolyfill.Manifest.ContentScript, -) { +export function reloadContentScript(contentScript: Manifest.ContentScript) { const manifest = browser.runtime.getManifest(); if (manifest.manifest_version == 2) { void reloadContentScriptMv2(contentScript); @@ -14,7 +12,7 @@ export function reloadContentScript( } export async function reloadContentScriptMv3( - contentScript: WebextensionPolyfill.Manifest.ContentScript, + contentScript: Manifest.ContentScript, ) { const id = `wxt:${contentScript.js![0]}`; logger.log('Reloading content script:', contentScript); @@ -44,7 +42,7 @@ export async function reloadContentScriptMv3( } export async function reloadContentScriptMv2( - contentScript: WebextensionPolyfill.Manifest.ContentScript, + contentScript: Manifest.ContentScript, ) { throw Error('TODO: reloadContentScriptMv2'); } diff --git a/src/core/utils/building/rebuild.ts b/src/core/utils/building/rebuild.ts index 41946d36..5ca721d8 100644 --- a/src/core/utils/building/rebuild.ts +++ b/src/core/utils/building/rebuild.ts @@ -1,4 +1,4 @@ -import type { WebextensionPolyfill } from '~/browser'; +import type { Manifest } from '~/browser'; import { BuildOutput, EntrypointGroup, InternalConfig } from '~/types'; import { findEntrypoints } from './find-entrypoints'; import { generateTypesDir } from './generate-wxt-dir'; @@ -24,7 +24,7 @@ export async function rebuild( }, ): Promise<{ output: BuildOutput; - manifest: WebextensionPolyfill.Manifest.WebExtensionManifest; + manifest: Manifest.WebExtensionManifest; }> { const { default: ora } = await import('ora'); const spinner = ora(`Preparing...`).start(); diff --git a/src/core/utils/content-scripts.ts b/src/core/utils/content-scripts.ts index 74d9336d..a4f016ca 100644 --- a/src/core/utils/content-scripts.ts +++ b/src/core/utils/content-scripts.ts @@ -1,4 +1,4 @@ -import type { WebextensionPolyfill } from '~/browser'; +import type { Manifest } from '~/browser'; import { ContentScriptEntrypoint, InternalConfig } from '~/types'; import { resolvePerBrowserOption } from './entrypoints'; @@ -19,7 +19,7 @@ export function hashContentScriptOptions( if (simplifiedOptions[key] == null) delete simplifiedOptions[key]; }); - const withDefaults: WebextensionPolyfill.Manifest.ContentScript = { + const withDefaults: Manifest.ContentScript = { exclude_globs: [], exclude_matches: [], include_globs: [], @@ -46,7 +46,7 @@ export function hashContentScriptOptions( export function mapWxtOptionsToContentScript( options: ContentScriptEntrypoint['options'], config: InternalConfig, -): Omit { +): Omit { return { matches: resolvePerBrowserOption(options.matches, config.browser), all_frames: resolvePerBrowserOption(options.allFrames, config.browser), diff --git a/src/core/utils/manifest.ts b/src/core/utils/manifest.ts index 1bfc683a..f43b0890 100644 --- a/src/core/utils/manifest.ts +++ b/src/core/utils/manifest.ts @@ -1,4 +1,4 @@ -import type { WebextensionPolyfill } from '~/browser'; +import type { Manifest } from '~/browser'; import { Entrypoint, BackgroundEntrypoint, @@ -29,7 +29,7 @@ import defu from 'defu'; * Writes the manifest to the output directory and the build output. */ export async function writeManifest( - manifest: WebextensionPolyfill.Manifest.WebExtensionManifest, + manifest: Manifest.WebExtensionManifest, output: BuildOutput, config: InternalConfig, ): Promise { @@ -54,13 +54,13 @@ export async function generateMainfest( entrypoints: Entrypoint[], buildOutput: Omit, config: InternalConfig, -): Promise { +): Promise { const pkg = await getPackageJson(config); const versionName = config.manifest.version_name ?? pkg?.version; const version = config.manifest.version ?? simplifyVersion(pkg?.version); - const baseManifest: WebextensionPolyfill.Manifest.WebExtensionManifest = { + const baseManifest: Manifest.WebExtensionManifest = { manifest_version: config.manifestVersion, name: pkg?.name, description: pkg?.description, @@ -78,7 +78,7 @@ export async function generateMainfest( const manifest = defu( userManifest, baseManifest, - ) as WebextensionPolyfill.Manifest.WebExtensionManifest; + ) as Manifest.WebExtensionManifest; addEntrypoints(manifest, entrypoints, buildOutput, config); @@ -119,7 +119,7 @@ function simplifyVersion(versionName: string): string { } function addEntrypoints( - manifest: WebextensionPolyfill.Manifest.WebExtensionManifest, + manifest: Manifest.WebExtensionManifest, entrypoints: Entrypoint[], buildOutput: Omit, config: InternalConfig, @@ -216,7 +216,7 @@ function addEntrypoints( config.outDir, '.html', ); - const options: WebextensionPolyfill.Manifest.ActionManifest = {}; + const options: Manifest.ActionManifest = {}; if (popup.options.defaultIcon) options.default_icon = popup.options.defaultIcon; if (popup.options.defaultTitle) @@ -357,7 +357,7 @@ function addEntrypoints( function discoverIcons( buildOutput: Omit, -): WebextensionPolyfill.Manifest.WebExtensionManifest['icons'] { +): Manifest.WebExtensionManifest['icons'] { const icons: [string, string][] = []; // prettier-ignore // #region snippet @@ -390,7 +390,7 @@ function discoverIcons( } function addDevModeCsp( - manifest: WebextensionPolyfill.Manifest.WebExtensionManifest, + manifest: Manifest.WebExtensionManifest, config: InternalConfig, ): void { const permission = `http://${config.server?.hostname ?? ''}/*`; @@ -423,7 +423,7 @@ function addDevModeCsp( } function addDevModePermissions( - manifest: WebextensionPolyfill.Manifest.WebExtensionManifest, + manifest: Manifest.WebExtensionManifest, config: InternalConfig, ) { // For reloading the page @@ -511,7 +511,7 @@ export function getContentScriptsCssMap( } function addPermission( - manifest: WebextensionPolyfill.Manifest.WebExtensionManifest, + manifest: Manifest.WebExtensionManifest, permission: string, ): void { manifest.permissions ??= []; @@ -520,7 +520,7 @@ function addPermission( } function addHostPermission( - manifest: WebextensionPolyfill.Manifest.WebExtensionManifest, + manifest: Manifest.WebExtensionManifest, hostPermission: string, ): void { manifest.host_permissions ??= []; diff --git a/src/core/utils/testing/fake-objects.ts b/src/core/utils/testing/fake-objects.ts index e7a1d6e6..f846bd8b 100644 --- a/src/core/utils/testing/fake-objects.ts +++ b/src/core/utils/testing/fake-objects.ts @@ -4,7 +4,7 @@ import { resolve } from 'path'; import { faker } from '@faker-js/faker'; import merge from 'lodash.merge'; -import type { WebextensionPolyfill } from '~/browser'; +import type { Manifest } from '~/browser'; import { FsCache, InternalConfig, @@ -157,12 +157,13 @@ export function fakeOutputFile(): OutputFile { return faker.helpers.arrayElement([fakeOutputAsset(), fakeOutputChunk()]); } -export const fakeManifest = - fakeObjectCreator(() => ({ +export const fakeManifest = fakeObjectCreator( + () => ({ manifest_version: faker.helpers.arrayElement([2, 3]), name: faker.string.alphanumeric(), version: `${faker.number.int()}.${faker.number.int()}.${faker.number.int()}`, - })); + }), +); export function fakeArray(createItem: () => T, count = 3): T[] { const array: T[] = []; diff --git a/src/storage.ts b/src/storage.ts index 054bae5d..42861467 100644 --- a/src/storage.ts +++ b/src/storage.ts @@ -8,7 +8,7 @@ import { defineDriver, Storage, } from 'unstorage'; -import { browser, WebextensionPolyfill } from '~/browser'; +import { browser, Storage as BrowserStorage } from '~/browser'; export interface WebExtensionDriverOptions { storageArea: 'sync' | 'local' | 'managed' | 'session'; @@ -24,7 +24,7 @@ export const webExtensionDriver: (opts: WebExtensionDriverOptions) => Driver = }; const _storageListener: ( - changes: WebextensionPolyfill.Storage.StorageAreaSyncOnChangedChangesType, + changes: BrowserStorage.StorageAreaSyncOnChangedChangesType, ) => void = (changes) => { Object.entries(changes).forEach(([key, { newValue }]) => { _listeners.forEach((callback) => { diff --git a/src/types/external.ts b/src/types/external.ts index 264909a8..e535ae7f 100644 --- a/src/types/external.ts +++ b/src/types/external.ts @@ -1,5 +1,5 @@ import type * as vite from 'vite'; -import type { WebextensionPolyfill } from '~/browser'; +import type { Manifest, Scripting } from '~/browser'; import { UnimportOptions } from 'unimport'; import { LogLevel } from 'consola'; import { ContentScriptContext } from '../client/content-scripts/content-script-context'; @@ -167,9 +167,7 @@ export interface InlineConfig { * } * }) */ - transformManifest?: ( - manifest: WebextensionPolyfill.Manifest.WebExtensionManifest, - ) => void; + transformManifest?: (manifest: Manifest.WebExtensionManifest) => void; analysis?: { /** * Explicitly include bundle analysis when running `wxt build`. This can be overridden by the @@ -249,7 +247,7 @@ export type WxtViteConfig = Omit< >; export interface BuildOutput { - manifest: WebextensionPolyfill.Manifest.WebExtensionManifest; + manifest: Manifest.WebExtensionManifest; publicAssets: OutputAsset[]; steps: BuildStepOutput[]; } @@ -326,10 +324,7 @@ export interface WxtDevServer * @param contentScript The manifest definition for a content script */ reloadContentScript: ( - contentScript: Omit< - WebextensionPolyfill.Scripting.RegisteredContentScript, - 'id' - >, + contentScript: Omit, ) => void; } @@ -474,51 +469,39 @@ export interface ContentScriptMainWorldDefinition } export interface ContentScriptBaseDefinition extends ExcludableEntrypoint { - matches: PerBrowserOption< - WebextensionPolyfill.Manifest.ContentScript['matches'] - >; + matches: PerBrowserOption; /** * See https://developer.chrome.com/docs/extensions/mv3/content_scripts/ * @default "documentIdle" */ - runAt?: PerBrowserOption< - WebextensionPolyfill.Manifest.ContentScript['run_at'] - >; + runAt?: PerBrowserOption; /** * See https://developer.chrome.com/docs/extensions/mv3/content_scripts/ * @default false */ matchAboutBlank?: PerBrowserOption< - WebextensionPolyfill.Manifest.ContentScript['match_about_blank'] + Manifest.ContentScript['match_about_blank'] >; /** * See https://developer.chrome.com/docs/extensions/mv3/content_scripts/ * @default [] */ - excludeMatches?: PerBrowserOption< - WebextensionPolyfill.Manifest.ContentScript['exclude_matches'] - >; + excludeMatches?: PerBrowserOption; /** * See https://developer.chrome.com/docs/extensions/mv3/content_scripts/ * @default [] */ - includeGlobs?: PerBrowserOption< - WebextensionPolyfill.Manifest.ContentScript['include_globs'] - >; + includeGlobs?: PerBrowserOption; /** * See https://developer.chrome.com/docs/extensions/mv3/content_scripts/ * @default [] */ - excludeGlobs?: PerBrowserOption< - WebextensionPolyfill.Manifest.ContentScript['exclude_globs'] - >; + excludeGlobs?: PerBrowserOption; /** * See https://developer.chrome.com/docs/extensions/mv3/content_scripts/ * @default false */ - allFrames?: PerBrowserOption< - WebextensionPolyfill.Manifest.ContentScript['all_frames'] - >; + allFrames?: PerBrowserOption; /** * See https://developer.chrome.com/docs/extensions/mv3/content_scripts/ * @default false @@ -578,7 +561,7 @@ export interface ExcludableEntrypoint { */ export type UserManifest = Partial< Omit< - WebextensionPolyfill.Manifest.WebExtensionManifest, + Manifest.WebExtensionManifest, | 'background' | 'chrome_url_overrides' | 'devtools_page' diff --git a/src/types/internal.ts b/src/types/internal.ts index d1fce4e2..fc8a631c 100644 --- a/src/types/internal.ts +++ b/src/types/internal.ts @@ -11,7 +11,7 @@ import { } from './external'; import { UnimportOptions } from 'unimport'; import { ResolvedConfig } from 'c12'; -import type { WebextensionPolyfill } from '~/browser'; +import type { Manifest } from '~/browser'; import type { PluginVisualizerOptions } from 'rollup-plugin-visualizer'; export interface InternalConfig { @@ -42,9 +42,7 @@ export interface InternalConfig { ignoredSources: string[]; sourcesRoot: string; }; - transformManifest: ( - manifest: WebextensionPolyfill.Manifest.WebExtensionManifest, - ) => void; + transformManifest: (manifest: Manifest.WebExtensionManifest) => void; analysis: { enabled: boolean; template: NonNullable;