List imports by hand

This commit is contained in:
Aaron Klinker
2023-12-16 12:37:13 -06:00
parent f2523c778f
commit 9e2d11d8db
10 changed files with 108 additions and 69 deletions
+1
View File
@@ -1,4 +1,5 @@
import messages from 'public/_locales/en/messages.json';
import {} from 'wxt/browser';
export default defineBackground(() => {
console.log(browser.runtime.id);
+65 -7
View File
@@ -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';
+4 -6
View File
@@ -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');
}
+2 -2
View File
@@ -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();
+3 -3
View File
@@ -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<WebextensionPolyfill.Manifest.ContentScript, 'js' | 'css'> {
): Omit<Manifest.ContentScript, 'js' | 'css'> {
return {
matches: resolvePerBrowserOption(options.matches, config.browser),
all_frames: resolvePerBrowserOption(options.allFrames, config.browser),
+12 -12
View File
@@ -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<void> {
@@ -54,13 +54,13 @@ export async function generateMainfest(
entrypoints: Entrypoint[],
buildOutput: Omit<BuildOutput, 'manifest'>,
config: InternalConfig,
): Promise<WebextensionPolyfill.Manifest.WebExtensionManifest> {
): Promise<Manifest.WebExtensionManifest> {
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<BuildOutput, 'manifest'>,
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<BuildOutput, 'manifest'>,
): 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 ??= [];
+5 -4
View File
@@ -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<WebextensionPolyfill.Manifest.WebExtensionManifest>(() => ({
export const fakeManifest = fakeObjectCreator<Manifest.WebExtensionManifest>(
() => ({
manifest_version: faker.helpers.arrayElement([2, 3]),
name: faker.string.alphanumeric(),
version: `${faker.number.int()}.${faker.number.int()}.${faker.number.int()}`,
}));
}),
);
export function fakeArray<T>(createItem: () => T, count = 3): T[] {
const array: T[] = [];
+2 -2
View File
@@ -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) => {
+12 -29
View File
@@ -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<Scripting.RegisteredContentScript, 'id'>,
) => void;
}
@@ -474,51 +469,39 @@ export interface ContentScriptMainWorldDefinition
}
export interface ContentScriptBaseDefinition extends ExcludableEntrypoint {
matches: PerBrowserOption<
WebextensionPolyfill.Manifest.ContentScript['matches']
>;
matches: PerBrowserOption<Manifest.ContentScript['matches']>;
/**
* See https://developer.chrome.com/docs/extensions/mv3/content_scripts/
* @default "documentIdle"
*/
runAt?: PerBrowserOption<
WebextensionPolyfill.Manifest.ContentScript['run_at']
>;
runAt?: PerBrowserOption<Manifest.ContentScript['run_at']>;
/**
* 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<Manifest.ContentScript['exclude_matches']>;
/**
* See https://developer.chrome.com/docs/extensions/mv3/content_scripts/
* @default []
*/
includeGlobs?: PerBrowserOption<
WebextensionPolyfill.Manifest.ContentScript['include_globs']
>;
includeGlobs?: PerBrowserOption<Manifest.ContentScript['include_globs']>;
/**
* See https://developer.chrome.com/docs/extensions/mv3/content_scripts/
* @default []
*/
excludeGlobs?: PerBrowserOption<
WebextensionPolyfill.Manifest.ContentScript['exclude_globs']
>;
excludeGlobs?: PerBrowserOption<Manifest.ContentScript['exclude_globs']>;
/**
* See https://developer.chrome.com/docs/extensions/mv3/content_scripts/
* @default false
*/
allFrames?: PerBrowserOption<
WebextensionPolyfill.Manifest.ContentScript['all_frames']
>;
allFrames?: PerBrowserOption<Manifest.ContentScript['all_frames']>;
/**
* 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'
+2 -4
View File
@@ -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<PluginVisualizerOptions['template']>;