wxt 0.19.23 → 0.20.0-beta1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser.d.ts +28 -0
- package/dist/builtin-modules/unimport.d.ts +1 -1
- package/dist/builtin-modules/unimport.mjs +36 -12
- package/dist/cli/index.mjs +0 -1
- package/dist/core/builders/vite/index.mjs +17 -37
- package/dist/core/builders/vite/plugins/extensionApiMock.d.ts +1 -6
- package/dist/core/builders/vite/plugins/extensionApiMock.mjs +2 -4
- package/dist/core/builders/vite/plugins/index.d.ts +0 -1
- package/dist/core/builders/vite/plugins/index.mjs +0 -1
- package/dist/core/builders/vite/plugins/noopBackground.mjs +1 -1
- package/dist/core/define-web-ext-config.d.ts +9 -0
- package/dist/core/define-web-ext-config.mjs +10 -0
- package/dist/core/generate-wxt-dir.mjs +4 -6
- package/dist/core/index.d.ts +1 -1
- package/dist/core/index.mjs +1 -1
- package/dist/core/initialize.mjs +2 -5
- package/dist/core/resolve-config.mjs +152 -55
- package/dist/core/runners/web-ext.mjs +1 -1
- package/dist/core/utils/building/index.d.ts +0 -1
- package/dist/core/utils/building/index.mjs +0 -1
- package/dist/core/utils/building/rebuild.d.ts +1 -2
- package/dist/core/utils/content-scripts.d.ts +3 -3
- package/dist/core/utils/content-scripts.mjs +2 -0
- package/dist/core/utils/eslint.mjs +3 -5
- package/dist/core/utils/manifest.d.ts +3 -8
- package/dist/core/utils/manifest.mjs +4 -7
- package/dist/core/utils/strings.d.ts +0 -4
- package/dist/core/utils/strings.mjs +0 -6
- package/dist/core/utils/testing/fake-objects.d.ts +3355 -993
- package/dist/core/utils/testing/fake-objects.mjs +19 -22
- package/dist/core/utils/transform.d.ts +1 -1
- package/dist/core/utils/types.d.ts +2 -0
- package/dist/index.d.ts +5 -0
- package/dist/modules.d.ts +1 -1
- package/dist/testing/index.d.ts +1 -0
- package/dist/testing/wxt-vitest-plugin.mjs +3 -5
- package/dist/types.d.ts +35 -70
- package/dist/utils/app-config.d.ts +2 -0
- package/dist/{client/content-scripts → utils}/content-script-context.d.ts +4 -3
- package/dist/{client/content-scripts → utils}/content-script-context.mjs +5 -3
- package/dist/utils/content-script-ui/iframe.d.ts +32 -0
- package/dist/utils/content-script-ui/iframe.mjs +30 -0
- package/dist/utils/content-script-ui/integrated.d.ts +34 -0
- package/dist/utils/content-script-ui/integrated.mjs +32 -0
- package/dist/utils/content-script-ui/shadow-root.d.ts +76 -0
- package/dist/utils/content-script-ui/shadow-root.mjs +73 -0
- package/dist/utils/content-script-ui/shared.d.ts +5 -0
- package/dist/{client/content-scripts/ui/index.mjs → utils/content-script-ui/shared.mjs} +5 -138
- package/dist/{client/content-scripts/ui → utils/content-script-ui}/types.d.ts +0 -96
- package/dist/{sandbox → utils}/define-app-config.d.ts +3 -2
- package/dist/{sandbox → utils}/define-background.d.ts +1 -0
- package/dist/{sandbox → utils}/define-content-script.d.ts +1 -0
- package/dist/{sandbox → utils}/define-unlisted-script.d.ts +1 -0
- package/dist/{sandbox → utils}/define-wxt-plugin.d.ts +1 -0
- package/dist/{sandbox → utils/internal}/dev-server-websocket.mjs +1 -1
- package/dist/{client/content-scripts → utils/internal}/location-watcher.d.ts +1 -1
- package/dist/utils/match-patterns.d.ts +5 -0
- package/dist/utils/match-patterns.mjs +1 -0
- package/dist/utils/storage.d.ts +5 -0
- package/dist/version.mjs +1 -1
- package/dist/virtual/background-entrypoint.mjs +1 -1
- package/dist/virtual/content-script-isolated-world-entrypoint.mjs +1 -1
- package/package.json +108 -71
- package/dist/browser/chrome.d.ts +0 -13
- package/dist/browser/index.d.ts +0 -26
- package/dist/browser/index.mjs +0 -2
- package/dist/client/app-config.d.ts +0 -2
- package/dist/client/content-scripts/index.d.ts +0 -2
- package/dist/client/content-scripts/index.mjs +0 -2
- package/dist/client/content-scripts/ui/index.d.ts +0 -23
- package/dist/client/index.d.ts +0 -8
- package/dist/client/index.mjs +0 -3
- package/dist/core/builders/vite/plugins/resolveExtensionApi.d.ts +0 -10
- package/dist/core/builders/vite/plugins/resolveExtensionApi.mjs +0 -15
- package/dist/core/define-runner-config.d.ts +0 -2
- package/dist/core/define-runner-config.mjs +0 -3
- package/dist/core/utils/building/import-entrypoint.d.ts +0 -16
- package/dist/core/utils/building/import-entrypoint.mjs +0 -100
- package/dist/sandbox/index.d.ts +0 -11
- package/dist/sandbox/index.mjs +0 -6
- package/dist/storage.d.ts +0 -4
- /package/dist/{browser/chrome.mjs → browser.mjs} +0 -0
- /package/dist/{client → utils}/app-config.mjs +0 -0
- /package/dist/{client/content-scripts/ui → utils/content-script-ui}/types.mjs +0 -0
- /package/dist/{sandbox → utils}/define-app-config.mjs +0 -0
- /package/dist/{sandbox → utils}/define-background.mjs +0 -0
- /package/dist/{sandbox → utils}/define-content-script.mjs +0 -0
- /package/dist/{sandbox → utils}/define-unlisted-script.mjs +0 -0
- /package/dist/{sandbox → utils}/define-wxt-plugin.mjs +0 -0
- /package/dist/{client → utils}/inject-script.d.ts +0 -0
- /package/dist/{client → utils}/inject-script.mjs +0 -0
- /package/dist/{client/content-scripts → utils/internal}/custom-events.d.ts +0 -0
- /package/dist/{client/content-scripts → utils/internal}/custom-events.mjs +0 -0
- /package/dist/{sandbox → utils/internal}/dev-server-websocket.d.ts +0 -0
- /package/dist/{client/content-scripts → utils/internal}/location-watcher.mjs +0 -0
- /package/dist/{sandbox/utils → utils/internal}/logger.d.ts +0 -0
- /package/dist/{sandbox/utils → utils/internal}/logger.mjs +0 -0
- /package/dist/{storage.mjs → utils/storage.mjs} +0 -0
|
@@ -160,13 +160,11 @@ export const fakeOutputAsset = fakeObjectCreator(() => ({
|
|
|
160
160
|
export function fakeOutputFile() {
|
|
161
161
|
return faker.helpers.arrayElement([fakeOutputAsset(), fakeOutputChunk()]);
|
|
162
162
|
}
|
|
163
|
-
export const fakeManifest = fakeObjectCreator(
|
|
164
|
-
()
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
})
|
|
169
|
-
);
|
|
163
|
+
export const fakeManifest = fakeObjectCreator(() => ({
|
|
164
|
+
manifest_version: faker.helpers.arrayElement([2, 3]),
|
|
165
|
+
name: faker.string.alphanumeric(),
|
|
166
|
+
version: `${faker.number.int()}.${faker.number.int()}.${faker.number.int()}`
|
|
167
|
+
}));
|
|
170
168
|
export const fakeUserManifest = fakeObjectCreator(() => ({
|
|
171
169
|
name: faker.string.alphanumeric(),
|
|
172
170
|
version: `${faker.number.int()}.${faker.number.int()}.${faker.number.int()}`
|
|
@@ -193,6 +191,7 @@ export const fakeResolvedConfig = fakeObjectCreator(() => {
|
|
|
193
191
|
env: { browser, command, manifestVersion, mode },
|
|
194
192
|
fsCache: mock(),
|
|
195
193
|
imports: {
|
|
194
|
+
disabled: faker.datatype.boolean(),
|
|
196
195
|
eslintrc: {
|
|
197
196
|
enabled: faker.helpers.arrayElement([false, 8, 9]),
|
|
198
197
|
filePath: fakeFile(),
|
|
@@ -244,12 +243,8 @@ export const fakeResolvedConfig = fakeObjectCreator(() => {
|
|
|
244
243
|
compressionLevel: 9,
|
|
245
244
|
zipSources: false
|
|
246
245
|
},
|
|
247
|
-
transformManifest: () => {
|
|
248
|
-
},
|
|
249
246
|
userConfigMetadata: {},
|
|
250
247
|
alias: {},
|
|
251
|
-
extensionApi: "webextension-polyfill",
|
|
252
|
-
entrypointLoader: "vite-node",
|
|
253
248
|
experimental: {},
|
|
254
249
|
dev: {
|
|
255
250
|
reloadCommand: "Alt+R"
|
|
@@ -299,17 +294,19 @@ export const fakeBuildStepOutput = fakeObjectCreator(() => ({
|
|
|
299
294
|
chunks: fakeArray(fakeOutputChunk),
|
|
300
295
|
entrypoints: fakeArray(fakeEntrypoint)
|
|
301
296
|
}));
|
|
302
|
-
export const fakeManifestCommand = fakeObjectCreator(
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
{
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
}
|
|
297
|
+
export const fakeManifestCommand = fakeObjectCreator(
|
|
298
|
+
() => ({
|
|
299
|
+
description: faker.string.sample(),
|
|
300
|
+
suggested_key: {
|
|
301
|
+
default: `${faker.helpers.arrayElement(["ctrl", "alt"])}+${faker.number.int(
|
|
302
|
+
{
|
|
303
|
+
min: 0,
|
|
304
|
+
max: 9
|
|
305
|
+
}
|
|
306
|
+
)}`
|
|
307
|
+
}
|
|
308
|
+
})
|
|
309
|
+
);
|
|
313
310
|
export const fakeDevServer = fakeObjectCreator(() => ({
|
|
314
311
|
hostname: "localhost",
|
|
315
312
|
origin: "http://localhost",
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* 1. Removes or clears out `main` function from returned object
|
|
4
4
|
* 2. Removes any unused functions/variables outside the definition that aren't being called/used
|
|
5
5
|
* 3. Removes unused imports
|
|
6
|
-
* 3. Removes value-less, side-effect only imports (like `import "./styles.css"` or `import "
|
|
6
|
+
* 3. Removes value-less, side-effect only imports (like `import "./styles.css"` or `import "polyfill"`)
|
|
7
7
|
*/
|
|
8
8
|
export declare function removeMainFunctionCode(code: string): {
|
|
9
9
|
code: string;
|
|
@@ -8,3 +8,5 @@
|
|
|
8
8
|
export type NullablyRequired<T> = {
|
|
9
9
|
[K in keyof Required<T>]: T[K];
|
|
10
10
|
};
|
|
11
|
+
export type ManifestContentScript = NonNullable<chrome.runtime.Manifest['content_scripts']>[number];
|
|
12
|
+
export type ManifestV3WebAccessibleResource = NonNullable<chrome.runtime.ManifestV3['web_accessible_resources']>[number];
|
package/dist/index.d.ts
CHANGED
package/dist/modules.d.ts
CHANGED
package/dist/testing/index.d.ts
CHANGED
|
@@ -17,10 +17,8 @@ export async function WxtVitest(inlineConfig) {
|
|
|
17
17
|
resolveAppConfig(wxt.config),
|
|
18
18
|
extensionApiMock(wxt.config)
|
|
19
19
|
];
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
plugins.push(unimportPlugin(unimport));
|
|
24
|
-
}
|
|
20
|
+
const unimport = createUnimport(wxt.config.imports);
|
|
21
|
+
await unimport.init();
|
|
22
|
+
plugins.push(unimportPlugin(unimport, !wxt.config.imports.disabled));
|
|
25
23
|
return plugins;
|
|
26
24
|
}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import type * as vite from 'vite';
|
|
2
|
-
import type { Manifest, Scripting } from 'wxt/browser';
|
|
3
2
|
import { UnimportOptions, Import } from 'unimport';
|
|
4
3
|
import { LogLevel } from 'consola';
|
|
5
|
-
import type { ContentScriptContext } from './
|
|
4
|
+
import type { ContentScriptContext } from './utils/content-script-context';
|
|
6
5
|
import type { PluginVisualizerOptions } from '@aklinker1/rollup-plugin-visualizer';
|
|
7
6
|
import type { FSWatcher } from 'chokidar';
|
|
8
7
|
import { ResolvedConfig as C12ResolvedConfig } from 'c12';
|
|
9
8
|
import { Hookable, NestedHooks } from 'hookable';
|
|
10
9
|
import type * as Nypm from 'nypm';
|
|
10
|
+
import { ManifestContentScript } from './core/utils/types';
|
|
11
11
|
export interface InlineConfig {
|
|
12
12
|
/**
|
|
13
13
|
* Your project's root directory containing the `package.json` used to fill out the
|
|
@@ -37,7 +37,7 @@ export interface InlineConfig {
|
|
|
37
37
|
*/
|
|
38
38
|
entrypointsDir?: string;
|
|
39
39
|
/**
|
|
40
|
-
* @default "${config.
|
|
40
|
+
* @default "${config.root}/modules"
|
|
41
41
|
*/
|
|
42
42
|
modulesDir?: string;
|
|
43
43
|
/**
|
|
@@ -62,8 +62,8 @@ export interface InlineConfig {
|
|
|
62
62
|
* - <span v-pre>`{{modeSuffix}}`</span>: A suffix based on the mode ('-dev' for development, '' for production)
|
|
63
63
|
* - <span v-pre>`{{command}}`</span>: The WXT command being run (e.g., 'build', 'serve')
|
|
64
64
|
*
|
|
65
|
-
* @example "{{browser}}-mv{{manifestVersion}}
|
|
66
|
-
* @default <span v-pre>`"{{browser}}-mv{{manifestVersion}}"`</span>
|
|
65
|
+
* @example "{{browser}}-mv{{manifestVersion}}"
|
|
66
|
+
* @default <span v-pre>`"{{browser}}-mv{{manifestVersion}}{{modeSuffix}}"`</span>
|
|
67
67
|
*/
|
|
68
68
|
outDirTemplate?: string;
|
|
69
69
|
/**
|
|
@@ -125,9 +125,13 @@ export interface InlineConfig {
|
|
|
125
125
|
*/
|
|
126
126
|
manifest?: UserManifest | Promise<UserManifest> | UserManifestFn;
|
|
127
127
|
/**
|
|
128
|
-
*
|
|
128
|
+
* Configure browser startup. Options set here can be overridden in a `web-ext.config.ts` file.
|
|
129
129
|
*/
|
|
130
|
-
|
|
130
|
+
webExt?: WebExtConfig;
|
|
131
|
+
/**
|
|
132
|
+
* @deprecated Use `webExt` instead. Same option, just renamed.
|
|
133
|
+
*/
|
|
134
|
+
runner?: WebExtConfig;
|
|
131
135
|
zip?: {
|
|
132
136
|
/**
|
|
133
137
|
* Configure the filename output when zipping files.
|
|
@@ -248,25 +252,6 @@ export interface InlineConfig {
|
|
|
248
252
|
*/
|
|
249
253
|
compressionLevel?: 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9;
|
|
250
254
|
};
|
|
251
|
-
/**
|
|
252
|
-
* @deprecated Use `hooks.build.manifestGenerated` to modify your manifest instead. This option
|
|
253
|
-
* will be removed in v1.0
|
|
254
|
-
*
|
|
255
|
-
* Transform the final manifest before it's written to the file system. Edit the `manifest`
|
|
256
|
-
* parameter directly, do not return a new object. Return values are ignored.
|
|
257
|
-
*
|
|
258
|
-
* @example
|
|
259
|
-
* defineConfig({
|
|
260
|
-
* // Add a CSS-only content script.
|
|
261
|
-
* transformManifest(manifest) {
|
|
262
|
-
* manifest.content_scripts.push({
|
|
263
|
-
* matches: ["*://google.com/*"],
|
|
264
|
-
* css: ["content-scripts/some-example.css"],
|
|
265
|
-
* });
|
|
266
|
-
* }
|
|
267
|
-
* })
|
|
268
|
-
*/
|
|
269
|
-
transformManifest?: (manifest: Manifest.WebExtensionManifest) => void;
|
|
270
255
|
analysis?: {
|
|
271
256
|
/**
|
|
272
257
|
* Explicitly include bundle analysis when running `wxt build`. This can be overridden by the
|
|
@@ -324,30 +309,6 @@ export interface InlineConfig {
|
|
|
324
309
|
* }
|
|
325
310
|
*/
|
|
326
311
|
alias?: Record<string, string>;
|
|
327
|
-
/**
|
|
328
|
-
* Which extension API to use.
|
|
329
|
-
*
|
|
330
|
-
* - `"webextension-polyfill"`: Use `browser` and types from [`webextension-polyfill`](https://www.npmjs.com/package/webextension-polyfill).
|
|
331
|
-
* - `"chrome"`: Use the regular `chrome` (or `browser` for Firefox/Safari) globals provided by the browser. Types provided by [`@types/chrome`](https://www.npmjs.com/package/@types/chrome).
|
|
332
|
-
*
|
|
333
|
-
* @default "webextension-polyfill"
|
|
334
|
-
* @since 0.19.0
|
|
335
|
-
*/
|
|
336
|
-
extensionApi?: 'webextension-polyfill' | 'chrome';
|
|
337
|
-
/**
|
|
338
|
-
* @deprecated Will be removed in v0.20.0, please migrate to using `vite-node`, the new default.
|
|
339
|
-
*
|
|
340
|
-
* Method used to import entrypoint files during the build process to extract their options.
|
|
341
|
-
*
|
|
342
|
-
* - `"vite-node"` (default as of 0.19.0): Uses `vite-node` to import the entrypoints. Automatically includes vite config based on your wxt.config.ts file
|
|
343
|
-
* - `"jiti"`: Simplest and fastest, but doesn't allow using any imported variables outside the entrypoint's main function
|
|
344
|
-
*
|
|
345
|
-
* @see {@link https://wxt.dev/guide/go-further/entrypoint-importers.html|Entrypoint Importers}
|
|
346
|
-
*
|
|
347
|
-
* @default "vite-node"
|
|
348
|
-
* @since 0.19.0
|
|
349
|
-
*/
|
|
350
|
-
entrypointLoader?: 'vite-node' | 'jiti';
|
|
351
312
|
/**
|
|
352
313
|
* Experimental settings - use with caution.
|
|
353
314
|
*/
|
|
@@ -428,7 +389,7 @@ export interface WxtHooks {
|
|
|
428
389
|
'vite:devServer:extendConfig': (config: vite.InlineConfig) => HookResult;
|
|
429
390
|
}
|
|
430
391
|
export interface BuildOutput {
|
|
431
|
-
manifest: Manifest
|
|
392
|
+
manifest: chrome.runtime.Manifest;
|
|
432
393
|
publicAssets: OutputAsset[];
|
|
433
394
|
steps: BuildStepOutput[];
|
|
434
395
|
}
|
|
@@ -509,7 +470,7 @@ export interface WxtDevServer extends Omit<WxtBuilderServer, 'listen' | 'close'>
|
|
|
509
470
|
}
|
|
510
471
|
export interface ReloadContentScriptPayload {
|
|
511
472
|
registration?: BaseContentScriptEntrypointOptions['registration'];
|
|
512
|
-
contentScript: Omit<
|
|
473
|
+
contentScript: Omit<chrome.scripting.RegisteredContentScript, 'id'>;
|
|
513
474
|
}
|
|
514
475
|
export type TargetBrowser = string;
|
|
515
476
|
export type TargetManifestVersion = 2 | 3;
|
|
@@ -553,37 +514,37 @@ export interface BackgroundEntrypointOptions extends BaseEntrypointOptions {
|
|
|
553
514
|
type?: PerBrowserOption<'module'>;
|
|
554
515
|
}
|
|
555
516
|
export interface BaseContentScriptEntrypointOptions extends BaseEntrypointOptions {
|
|
556
|
-
matches?: PerBrowserOption<
|
|
517
|
+
matches?: PerBrowserOption<NonNullable<ManifestContentScript['matches']>>;
|
|
557
518
|
/**
|
|
558
519
|
* See https://developer.chrome.com/docs/extensions/mv3/content_scripts/
|
|
559
520
|
* @default "documentIdle"
|
|
560
521
|
*/
|
|
561
|
-
runAt?: PerBrowserOption<
|
|
522
|
+
runAt?: PerBrowserOption<chrome.scripting.RegisteredContentScript['runAt']>;
|
|
562
523
|
/**
|
|
563
524
|
* See https://developer.chrome.com/docs/extensions/mv3/content_scripts/
|
|
564
525
|
* @default false
|
|
565
526
|
*/
|
|
566
|
-
matchAboutBlank?: PerBrowserOption<
|
|
527
|
+
matchAboutBlank?: PerBrowserOption<ManifestContentScript['match_about_blank']>;
|
|
567
528
|
/**
|
|
568
529
|
* See https://developer.chrome.com/docs/extensions/mv3/content_scripts/
|
|
569
530
|
* @default []
|
|
570
531
|
*/
|
|
571
|
-
excludeMatches?: PerBrowserOption<
|
|
532
|
+
excludeMatches?: PerBrowserOption<ManifestContentScript['exclude_matches']>;
|
|
572
533
|
/**
|
|
573
534
|
* See https://developer.chrome.com/docs/extensions/mv3/content_scripts/
|
|
574
535
|
* @default []
|
|
575
536
|
*/
|
|
576
|
-
includeGlobs?: PerBrowserOption<
|
|
537
|
+
includeGlobs?: PerBrowserOption<ManifestContentScript['include_globs']>;
|
|
577
538
|
/**
|
|
578
539
|
* See https://developer.chrome.com/docs/extensions/mv3/content_scripts/
|
|
579
540
|
* @default []
|
|
580
541
|
*/
|
|
581
|
-
excludeGlobs?: PerBrowserOption<
|
|
542
|
+
excludeGlobs?: PerBrowserOption<ManifestContentScript['exclude_globs']>;
|
|
582
543
|
/**
|
|
583
544
|
* See https://developer.chrome.com/docs/extensions/mv3/content_scripts/
|
|
584
545
|
* @default false
|
|
585
546
|
*/
|
|
586
|
-
allFrames?: PerBrowserOption<
|
|
547
|
+
allFrames?: PerBrowserOption<ManifestContentScript['all_frames']>;
|
|
587
548
|
/**
|
|
588
549
|
* See https://developer.chrome.com/docs/extensions/mv3/content_scripts/
|
|
589
550
|
* @default false
|
|
@@ -839,9 +800,13 @@ export interface ConfigEnv {
|
|
|
839
800
|
}
|
|
840
801
|
export type WxtCommand = 'build' | 'serve';
|
|
841
802
|
/**
|
|
842
|
-
*
|
|
803
|
+
* @deprecated Use `WebExtConfig` instead.
|
|
843
804
|
*/
|
|
844
|
-
export
|
|
805
|
+
export type ExtensionRunnerConfig = WebExtConfig;
|
|
806
|
+
/**
|
|
807
|
+
* Options for how [`web-ext`](https://github.com/mozilla/web-ext) starts the browser.
|
|
808
|
+
*/
|
|
809
|
+
export interface WebExtConfig {
|
|
845
810
|
/**
|
|
846
811
|
* Whether or not to open the browser with the extension installed in dev mode.
|
|
847
812
|
*
|
|
@@ -1069,7 +1034,7 @@ export interface WxtHooks {
|
|
|
1069
1034
|
* @param wxt The configured WXT object
|
|
1070
1035
|
* @param manifest The manifest that was generated
|
|
1071
1036
|
*/
|
|
1072
|
-
'build:manifestGenerated': (wxt: Wxt, manifest: Manifest
|
|
1037
|
+
'build:manifestGenerated': (wxt: Wxt, manifest: chrome.runtime.Manifest) => HookResult;
|
|
1073
1038
|
/**
|
|
1074
1039
|
* Called once the names and paths of all entrypoints have been resolved.
|
|
1075
1040
|
* @param wxt The configured WXT object
|
|
@@ -1215,10 +1180,10 @@ export interface ResolvedConfig {
|
|
|
1215
1180
|
manifestVersion: TargetManifestVersion;
|
|
1216
1181
|
env: ConfigEnv;
|
|
1217
1182
|
logger: Logger;
|
|
1218
|
-
imports:
|
|
1183
|
+
imports: WxtResolvedUnimportOptions;
|
|
1219
1184
|
manifest: UserManifest;
|
|
1220
1185
|
fsCache: FsCache;
|
|
1221
|
-
runnerConfig: C12ResolvedConfig<
|
|
1186
|
+
runnerConfig: C12ResolvedConfig<WebExtConfig>;
|
|
1222
1187
|
zip: {
|
|
1223
1188
|
name?: string;
|
|
1224
1189
|
artifactTemplate: string;
|
|
@@ -1235,10 +1200,6 @@ export interface ResolvedConfig {
|
|
|
1235
1200
|
*/
|
|
1236
1201
|
zipSources: boolean;
|
|
1237
1202
|
};
|
|
1238
|
-
/**
|
|
1239
|
-
* @deprecated Use `build:manifestGenerated` hook instead.
|
|
1240
|
-
*/
|
|
1241
|
-
transformManifest?: (manifest: Manifest.WebExtensionManifest) => void;
|
|
1242
1203
|
analysis: {
|
|
1243
1204
|
enabled: boolean;
|
|
1244
1205
|
open: boolean;
|
|
@@ -1256,8 +1217,6 @@ export interface ResolvedConfig {
|
|
|
1256
1217
|
* Import aliases to absolute paths.
|
|
1257
1218
|
*/
|
|
1258
1219
|
alias: Record<string, string>;
|
|
1259
|
-
extensionApi: 'webextension-polyfill' | 'chrome';
|
|
1260
|
-
entrypointLoader: 'vite-node' | 'jiti';
|
|
1261
1220
|
experimental: {};
|
|
1262
1221
|
dev: {
|
|
1263
1222
|
/** Only defined during dev command */
|
|
@@ -1353,6 +1312,12 @@ export type WxtUnimportOptions = Partial<UnimportOptions> & {
|
|
|
1353
1312
|
eslintrc?: Eslintrc;
|
|
1354
1313
|
};
|
|
1355
1314
|
export type WxtResolvedUnimportOptions = Partial<UnimportOptions> & {
|
|
1315
|
+
/**
|
|
1316
|
+
* Set to `true` when the user disabled auto-imports. We still use unimport for the #imports module, but other features should be disabled.
|
|
1317
|
+
*
|
|
1318
|
+
* You don't need to check this value before modifying the auto-import options. Even if `disabled` is `true`, there's no harm in adding imports to the config - they'll just be ignored.
|
|
1319
|
+
*/
|
|
1320
|
+
disabled: boolean;
|
|
1356
1321
|
eslintrc: ResolvedEslintrc;
|
|
1357
1322
|
};
|
|
1358
1323
|
/**
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
import {
|
|
1
|
+
/** @module wxt/utils/content-script-context */
|
|
2
|
+
import { ContentScriptDefinition } from '../types';
|
|
3
|
+
import { WxtLocationChangeEvent } from './internal/custom-events';
|
|
3
4
|
/**
|
|
4
5
|
* Implements [`AbortController`](https://developer.mozilla.org/en-US/docs/Web/API/AbortController).
|
|
5
6
|
* Used to detect and stop content script code when the script is invalidated.
|
|
@@ -10,7 +11,7 @@ import { WxtLocationChangeEvent } from './custom-events';
|
|
|
10
11
|
* To create context for testing, you can use the class's constructor:
|
|
11
12
|
*
|
|
12
13
|
* ```ts
|
|
13
|
-
* import { ContentScriptContext } from 'wxt/
|
|
14
|
+
* import { ContentScriptContext } from 'wxt/utils/content-scripts-context';
|
|
14
15
|
*
|
|
15
16
|
* test("storage listener should be removed when context is invalidated", () => {
|
|
16
17
|
* const ctx = new ContentScriptContext('test');
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { browser } from "wxt/browser";
|
|
2
|
-
import { logger } from "
|
|
3
|
-
import {
|
|
4
|
-
|
|
2
|
+
import { logger } from "../utils/internal/logger.mjs";
|
|
3
|
+
import {
|
|
4
|
+
getUniqueEventName
|
|
5
|
+
} from "./internal/custom-events.mjs";
|
|
6
|
+
import { createLocationWatcher } from "./internal/location-watcher.mjs";
|
|
5
7
|
export class ContentScriptContext {
|
|
6
8
|
constructor(contentScriptName, options) {
|
|
7
9
|
this.contentScriptName = contentScriptName;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { ContentScriptContext } from '../content-script-context';
|
|
2
|
+
import type { ContentScriptUi, ContentScriptUiOptions } from './types';
|
|
3
|
+
/**
|
|
4
|
+
* Create a content script UI using an iframe.
|
|
5
|
+
*
|
|
6
|
+
* @see https://wxt.dev/guide/essentials/content-scripts.html#iframe
|
|
7
|
+
*/
|
|
8
|
+
export declare function createIframeUi<TMounted>(ctx: ContentScriptContext, options: IframeContentScriptUiOptions<TMounted>): IframeContentScriptUi<TMounted>;
|
|
9
|
+
export interface IframeContentScriptUi<TMounted> extends ContentScriptUi<TMounted> {
|
|
10
|
+
/**
|
|
11
|
+
* The iframe added to the DOM.
|
|
12
|
+
*/
|
|
13
|
+
iframe: HTMLIFrameElement;
|
|
14
|
+
/**
|
|
15
|
+
* A wrapper div that assists in positioning.
|
|
16
|
+
*/
|
|
17
|
+
wrapper: HTMLDivElement;
|
|
18
|
+
}
|
|
19
|
+
export type IframeContentScriptUiOptions<TMounted> = ContentScriptUiOptions<TMounted> & {
|
|
20
|
+
/**
|
|
21
|
+
* The path to the HTML page that will be shown in the iframe. This string is passed into
|
|
22
|
+
* `browser.runtime.getURL`.
|
|
23
|
+
*/
|
|
24
|
+
page: import('wxt/browser').HtmlPublicPath;
|
|
25
|
+
/**
|
|
26
|
+
* Callback executed when mounting the UI. Use this function to customize the iframe or wrapper
|
|
27
|
+
* element's appearance. It is called every time `ui.mount()` is called.
|
|
28
|
+
*
|
|
29
|
+
* Optionally return a value that can be accessed at `ui.mounted` or in the `onRemove` callback.
|
|
30
|
+
*/
|
|
31
|
+
onMount?: (wrapper: HTMLElement, iframe: HTMLIFrameElement) => TMounted;
|
|
32
|
+
};
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { browser } from "wxt/browser";
|
|
2
|
+
import { applyPosition, createMountFunctions, mountUi } from "./shared.mjs";
|
|
3
|
+
export function createIframeUi(ctx, options) {
|
|
4
|
+
const wrapper = document.createElement("div");
|
|
5
|
+
wrapper.setAttribute("data-wxt-iframe", "");
|
|
6
|
+
const iframe = document.createElement("iframe");
|
|
7
|
+
iframe.src = browser.runtime.getURL(options.page);
|
|
8
|
+
wrapper.appendChild(iframe);
|
|
9
|
+
let mounted = void 0;
|
|
10
|
+
const mount = () => {
|
|
11
|
+
applyPosition(wrapper, iframe, options);
|
|
12
|
+
mountUi(wrapper, options);
|
|
13
|
+
mounted = options.onMount?.(wrapper, iframe);
|
|
14
|
+
};
|
|
15
|
+
const remove = () => {
|
|
16
|
+
options.onRemove?.(mounted);
|
|
17
|
+
wrapper.remove();
|
|
18
|
+
mounted = void 0;
|
|
19
|
+
};
|
|
20
|
+
const mountFunctions = createMountFunctions({ mount, remove }, options);
|
|
21
|
+
ctx.onInvalidated(remove);
|
|
22
|
+
return {
|
|
23
|
+
get mounted() {
|
|
24
|
+
return mounted;
|
|
25
|
+
},
|
|
26
|
+
iframe,
|
|
27
|
+
wrapper,
|
|
28
|
+
...mountFunctions
|
|
29
|
+
};
|
|
30
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/** @module wxt/utils/content-script-ui/integrated */
|
|
2
|
+
import { ContentScriptContext } from '../content-script-context';
|
|
3
|
+
import type { ContentScriptUi, ContentScriptUiOptions } from './types';
|
|
4
|
+
/**
|
|
5
|
+
* Create a content script UI without any isolation.
|
|
6
|
+
*
|
|
7
|
+
* @see https://wxt.dev/guide/essentials/content-scripts.html#integrated
|
|
8
|
+
*/
|
|
9
|
+
export declare function createIntegratedUi<TMounted>(ctx: ContentScriptContext, options: IntegratedContentScriptUiOptions<TMounted>): IntegratedContentScriptUi<TMounted>;
|
|
10
|
+
/**
|
|
11
|
+
* Shared types for the different `wxt/utils/content-script-ui/*` modules.
|
|
12
|
+
* @module wxt/utils/content-script-ui/types
|
|
13
|
+
*/
|
|
14
|
+
export interface IntegratedContentScriptUi<TMounted> extends ContentScriptUi<TMounted> {
|
|
15
|
+
/**
|
|
16
|
+
* A wrapper div that assists in positioning.
|
|
17
|
+
*/
|
|
18
|
+
wrapper: HTMLElement;
|
|
19
|
+
}
|
|
20
|
+
export type IntegratedContentScriptUiOptions<TMounted> = ContentScriptUiOptions<TMounted> & {
|
|
21
|
+
/**
|
|
22
|
+
* Tag used to create the wrapper element.
|
|
23
|
+
*
|
|
24
|
+
* @default "div"
|
|
25
|
+
*/
|
|
26
|
+
tag?: string;
|
|
27
|
+
/**
|
|
28
|
+
* Callback executed when mounting the UI. This function should create and append the UI to the
|
|
29
|
+
* `wrapper` element. It is called every time `ui.mount()` is called.
|
|
30
|
+
*
|
|
31
|
+
* Optionally return a value that can be accessed at `ui.mounted` or in the `onRemove` callback.
|
|
32
|
+
*/
|
|
33
|
+
onMount: (wrapper: HTMLElement) => TMounted;
|
|
34
|
+
};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { applyPosition, createMountFunctions, mountUi } from "./shared.mjs";
|
|
2
|
+
export function createIntegratedUi(ctx, options) {
|
|
3
|
+
const wrapper = document.createElement(options.tag || "div");
|
|
4
|
+
wrapper.setAttribute("data-wxt-integrated", "");
|
|
5
|
+
let mounted = void 0;
|
|
6
|
+
const mount = () => {
|
|
7
|
+
applyPosition(wrapper, void 0, options);
|
|
8
|
+
mountUi(wrapper, options);
|
|
9
|
+
mounted = options.onMount?.(wrapper);
|
|
10
|
+
};
|
|
11
|
+
const remove = () => {
|
|
12
|
+
options.onRemove?.(mounted);
|
|
13
|
+
wrapper.replaceChildren();
|
|
14
|
+
wrapper.remove();
|
|
15
|
+
mounted = void 0;
|
|
16
|
+
};
|
|
17
|
+
const mountFunctions = createMountFunctions(
|
|
18
|
+
{
|
|
19
|
+
mount,
|
|
20
|
+
remove
|
|
21
|
+
},
|
|
22
|
+
options
|
|
23
|
+
);
|
|
24
|
+
ctx.onInvalidated(remove);
|
|
25
|
+
return {
|
|
26
|
+
get mounted() {
|
|
27
|
+
return mounted;
|
|
28
|
+
},
|
|
29
|
+
wrapper,
|
|
30
|
+
...mountFunctions
|
|
31
|
+
};
|
|
32
|
+
}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { ContentScriptContext } from '../content-script-context';
|
|
2
|
+
import type { ContentScriptUi, ContentScriptUiOptions } from './types';
|
|
3
|
+
/**
|
|
4
|
+
* Create a content script UI inside a [`ShadowRoot`](https://developer.mozilla.org/en-US/docs/Web/API/ShadowRoot).
|
|
5
|
+
*
|
|
6
|
+
* > This function is async because it has to load the CSS via a network call.
|
|
7
|
+
*
|
|
8
|
+
* @see https://wxt.dev/guide/essentials/content-scripts.html#shadow-root
|
|
9
|
+
*/
|
|
10
|
+
export declare function createShadowRootUi<TMounted>(ctx: ContentScriptContext, options: ShadowRootContentScriptUiOptions<TMounted>): Promise<ShadowRootContentScriptUi<TMounted>>;
|
|
11
|
+
export interface ShadowRootContentScriptUi<TMounted> extends ContentScriptUi<TMounted> {
|
|
12
|
+
/**
|
|
13
|
+
* The `HTMLElement` hosting the shadow root used to isolate the UI's styles. This is the element
|
|
14
|
+
* that get's added to the DOM. This element's style is not isolated from the webpage.
|
|
15
|
+
*/
|
|
16
|
+
shadowHost: HTMLElement;
|
|
17
|
+
/**
|
|
18
|
+
* The container element inside the `ShadowRoot` whose styles are isolated. The UI is mounted
|
|
19
|
+
* inside this `HTMLElement`.
|
|
20
|
+
*/
|
|
21
|
+
uiContainer: HTMLElement;
|
|
22
|
+
/**
|
|
23
|
+
* The shadow root performing the isolation.
|
|
24
|
+
*/
|
|
25
|
+
shadow: ShadowRoot;
|
|
26
|
+
}
|
|
27
|
+
export type ShadowRootContentScriptUiOptions<TMounted> = ContentScriptUiOptions<TMounted> & {
|
|
28
|
+
/**
|
|
29
|
+
* The name of the custom component used to host the ShadowRoot. Must be kebab-case.
|
|
30
|
+
*/
|
|
31
|
+
name: string;
|
|
32
|
+
/**
|
|
33
|
+
* Custom CSS text to apply to the UI. If your content script imports/generates CSS and you've
|
|
34
|
+
* set `cssInjectionMode: "ui"`, the imported CSS will be included automatically. You do not need
|
|
35
|
+
* to pass those styles in here. This is for any additional styles not in the imported CSS.
|
|
36
|
+
*/
|
|
37
|
+
css?: string;
|
|
38
|
+
/**
|
|
39
|
+
* ShadowRoot's mode.
|
|
40
|
+
*
|
|
41
|
+
* @see https://developer.mozilla.org/en-US/docs/Web/API/ShadowRoot/mode
|
|
42
|
+
* @default "open"
|
|
43
|
+
*/
|
|
44
|
+
mode?: 'open' | 'closed';
|
|
45
|
+
/**
|
|
46
|
+
* When enabled, `event.stopPropagation` will be called on events trying to bubble out of the
|
|
47
|
+
* shadow root.
|
|
48
|
+
*
|
|
49
|
+
* - Set to `true` to stop the propagation of a default set of events,
|
|
50
|
+
* `["keyup", "keydown", "keypress"]`
|
|
51
|
+
* - Set to an array of event names to stop the propagation of a custom list of events
|
|
52
|
+
*/
|
|
53
|
+
isolateEvents?: boolean | string[];
|
|
54
|
+
/**
|
|
55
|
+
* By default, WXT adds `all: initial` to the shadow root before the rest of
|
|
56
|
+
* your CSS. This resets any inheritable CSS styles that
|
|
57
|
+
* [normally pierce the Shadow DOM](https://open-wc.org/guides/knowledge/styling/styles-piercing-shadow-dom/).
|
|
58
|
+
*
|
|
59
|
+
* WXT resets everything but:
|
|
60
|
+
* - **`rem` Units**: they continue to scale based off the webpage's HTML `font-size`.
|
|
61
|
+
* - **CSS Variables/Custom Properties**: CSS variables defined outside the shadow root can be accessed inside it.
|
|
62
|
+
* - **`@font-face` Definitions**: Fonts defined outside the shadow root can be used inside it.
|
|
63
|
+
*
|
|
64
|
+
* To disable this behavior and inherit styles from the webpage, set `inheritStyles: true`.
|
|
65
|
+
*
|
|
66
|
+
* @default false
|
|
67
|
+
*/
|
|
68
|
+
inheritStyles?: boolean;
|
|
69
|
+
/**
|
|
70
|
+
* Callback executed when mounting the UI. This function should create and append the UI to the
|
|
71
|
+
* `uiContainer` element. It is called every time `ui.mount()` is called.
|
|
72
|
+
*
|
|
73
|
+
* Optionally return a value that can be accessed at `ui.mounted` or in the `onRemove` callback.
|
|
74
|
+
*/
|
|
75
|
+
onMount: (uiContainer: HTMLElement, shadow: ShadowRoot, shadowHost: HTMLElement) => TMounted;
|
|
76
|
+
};
|