wxt 0.5.5 → 0.6.0-alpha1

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/client.d.ts CHANGED
@@ -1,5 +1,57 @@
1
1
  import { Manifest } from 'webextension-polyfill';
2
2
 
3
+ /**
4
+ * Extends [`AbortController`](https://developer.mozilla.org/en-US/docs/Web/API/AbortController).
5
+ * Used to detect and stop content script code when the script is invalidated.
6
+ *
7
+ * It also provides several utilities like `ctx.setTimeout` and `ctx.setInterval` that should be used in
8
+ * content scripts instead of `window.setTimeout` or `window.setInterval`.
9
+ */
10
+ declare class ContentScriptContext extends AbortController {
11
+ #private;
12
+ private readonly contentScriptName;
13
+ static SCRIPT_STARTED_MESSAGE_TYPE: string;
14
+ constructor(contentScriptName: string);
15
+ get isInvalid(): boolean;
16
+ get isValid(): boolean;
17
+ /**
18
+ * Add a listener that is called when the content script's context is invalidated.
19
+ *
20
+ * @returns A function to remove the listener.
21
+ *
22
+ * @example
23
+ * browser.runtime.onMessage.addListener(cb);
24
+ * const removeInvalidatedListener = ctx.onInvalidated(() => {
25
+ * browser.runtime.onMessage.removeListener(cb);
26
+ * })
27
+ * // ...
28
+ * removeInvalidatedListener();
29
+ */
30
+ onInvalidated(cb: () => void): () => void;
31
+ /**
32
+ * Wrapper around `window.setInterval` that automatically clears the interval when invalidated.
33
+ */
34
+ setInterval(handler: () => void, timeout?: number): number;
35
+ /**
36
+ * Wrapper around `window.setTimeout` that automatically clears the interval when invalidated.
37
+ */
38
+ setTimeout(handler: () => void, timeout?: number): number;
39
+ /**
40
+ * Wrapper around `window.requestAnimationFrame` that automatically cancels the request when
41
+ * invalidated.
42
+ */
43
+ requestAnimationFrame(callback: FrameRequestCallback): number;
44
+ /**
45
+ * Wrapper around `window.requestIdleCallback` that automatically cancels the request when
46
+ * invalidated.
47
+ */
48
+ requestIdleCallback(callback: IdleRequestCallback, options?: IdleRequestOptions): number;
49
+ /**
50
+ * Abort the abort controller and execute all `onInvalidated` listeners.
51
+ */
52
+ notifyInvalidated(): void;
53
+ }
54
+
3
55
  type TargetBrowser = string;
4
56
  interface ContentScriptDefinition extends ExcludableEntrypoint {
5
57
  matches: Manifest.ContentScript['matches'];
@@ -46,7 +98,7 @@ interface ContentScriptDefinition extends ExcludableEntrypoint {
46
98
  /**
47
99
  * Main function executed when the content script is loaded.
48
100
  */
49
- main(): void | Promise<void>;
101
+ main(ctx: ContentScriptContext): void | Promise<void>;
50
102
  }
51
103
  interface BackgroundScriptDefintition extends ExcludableEntrypoint {
52
104
  type?: 'module';
@@ -76,4 +128,4 @@ declare function defineBackground(definition: BackgroundScriptDefintition): Back
76
128
 
77
129
  declare function mountContentScriptUi(): void;
78
130
 
79
- export { defineBackground, defineContentScript, mountContentScriptUi };
131
+ export { ContentScriptContext, defineBackground, defineContentScript, mountContentScriptUi };
package/dist/client.js CHANGED
@@ -14,9 +14,142 @@ function defineBackground(arg) {
14
14
  function mountContentScriptUi() {
15
15
  throw Error("Not implemented: mountContentScriptUi");
16
16
  }
17
+
18
+ // src/client/browser.ts
19
+ import originalBrowser from "webextension-polyfill";
20
+ var browser = originalBrowser;
21
+
22
+ // src/client/utils/logger.ts
23
+ function print(method, ...args) {
24
+ if (typeof args[0] === "string") {
25
+ const message = args.shift();
26
+ method(`[wxt] ${message}`, ...args);
27
+ } else {
28
+ method("[wxt]", ...args);
29
+ }
30
+ }
31
+ var logger = {
32
+ debug: (...args) => print(console.debug, ...args),
33
+ log: (...args) => print(console.log, ...args),
34
+ warn: (...args) => print(console.warn, ...args),
35
+ error: (...args) => print(console.error, ...args)
36
+ };
37
+
38
+ // src/client/utils/ContentScriptContext.ts
39
+ var ContentScriptContext = class _ContentScriptContext extends AbortController {
40
+ constructor(contentScriptName) {
41
+ super();
42
+ this.contentScriptName = contentScriptName;
43
+ if (this.#isTopFrame) {
44
+ this.#stopOldScripts();
45
+ }
46
+ this.setTimeout(() => {
47
+ this.#listenForNewerScripts();
48
+ });
49
+ }
50
+ static SCRIPT_STARTED_MESSAGE_TYPE = "wxt:content-script-started";
51
+ #isTopFrame = window.self === window.top;
52
+ get isInvalid() {
53
+ if (browser.runtime.id == null) {
54
+ this.notifyInvalidated();
55
+ }
56
+ return this.signal.aborted;
57
+ }
58
+ get isValid() {
59
+ return !this.isInvalid;
60
+ }
61
+ /**
62
+ * Add a listener that is called when the content script's context is invalidated.
63
+ *
64
+ * @returns A function to remove the listener.
65
+ *
66
+ * @example
67
+ * browser.runtime.onMessage.addListener(cb);
68
+ * const removeInvalidatedListener = ctx.onInvalidated(() => {
69
+ * browser.runtime.onMessage.removeListener(cb);
70
+ * })
71
+ * // ...
72
+ * removeInvalidatedListener();
73
+ */
74
+ onInvalidated(cb) {
75
+ this.signal.addEventListener("abort", cb);
76
+ return () => this.signal.removeEventListener("abort", cb);
77
+ }
78
+ /**
79
+ * Wrapper around `window.setInterval` that automatically clears the interval when invalidated.
80
+ */
81
+ setInterval(handler, timeout) {
82
+ const id = setInterval(() => {
83
+ if (this.isValid)
84
+ handler();
85
+ }, timeout);
86
+ this.onInvalidated(() => clearInterval(id));
87
+ return id;
88
+ }
89
+ /**
90
+ * Wrapper around `window.setTimeout` that automatically clears the interval when invalidated.
91
+ */
92
+ setTimeout(handler, timeout) {
93
+ const id = setTimeout(() => {
94
+ if (this.isValid)
95
+ handler();
96
+ }, timeout);
97
+ this.onInvalidated(() => clearTimeout(id));
98
+ return id;
99
+ }
100
+ /**
101
+ * Wrapper around `window.requestAnimationFrame` that automatically cancels the request when
102
+ * invalidated.
103
+ */
104
+ requestAnimationFrame(callback) {
105
+ const id = requestAnimationFrame((...args) => {
106
+ if (this.isValid)
107
+ callback(...args);
108
+ });
109
+ this.onInvalidated(() => cancelAnimationFrame(id));
110
+ return id;
111
+ }
112
+ /**
113
+ * Wrapper around `window.requestIdleCallback` that automatically cancels the request when
114
+ * invalidated.
115
+ */
116
+ requestIdleCallback(callback, options) {
117
+ const id = requestIdleCallback((...args) => {
118
+ if (!this.signal.aborted)
119
+ callback(...args);
120
+ }, options);
121
+ this.onInvalidated(() => cancelIdleCallback(id));
122
+ return id;
123
+ }
124
+ /**
125
+ * Abort the abort controller and execute all `onInvalidated` listeners.
126
+ */
127
+ notifyInvalidated() {
128
+ this.abort("Content script context invalidated");
129
+ logger.debug(
130
+ `Content script "${this.contentScriptName}" context invalidated`
131
+ );
132
+ }
133
+ #stopOldScripts() {
134
+ window.postMessage({
135
+ event: _ContentScriptContext.SCRIPT_STARTED_MESSAGE_TYPE,
136
+ contentScriptName: this.contentScriptName
137
+ });
138
+ }
139
+ #listenForNewerScripts() {
140
+ const cb = (event) => {
141
+ if (event.data?.type === _ContentScriptContext.SCRIPT_STARTED_MESSAGE_TYPE && event.data?.contentScriptName === this.contentScriptName) {
142
+ this.notifyInvalidated();
143
+ }
144
+ };
145
+ addEventListener("message", cb);
146
+ this.onInvalidated(() => removeEventListener("message", cb));
147
+ }
148
+ };
17
149
  export {
150
+ ContentScriptContext,
18
151
  defineBackground,
19
152
  defineContentScript,
20
153
  mountContentScriptUi
21
154
  };
22
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2NsaWVudC9kZWZpbmVDb250ZW50U2NyaXB0LnRzIiwgIi4uL3NyYy9jbGllbnQvZGVmaW5lQmFja2dyb3VuZC50cyIsICIuLi9zcmMvY2xpZW50L21vdW50Q29udGVudFNjcmlwdFVpLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgeyBDb250ZW50U2NyaXB0RGVmaW5pdGlvbiB9IGZyb20gJy4uL2NvcmUvdHlwZXMnO1xuXG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lQ29udGVudFNjcmlwdChcbiAgZGVmaW5pdGlvbjogQ29udGVudFNjcmlwdERlZmluaXRpb24sXG4pOiBDb250ZW50U2NyaXB0RGVmaW5pdGlvbiB7XG4gIHJldHVybiBkZWZpbml0aW9uO1xufVxuIiwgImltcG9ydCB7IEJhY2tncm91bmRTY3JpcHREZWZpbnRpdGlvbiB9IGZyb20gJy4uJztcblxuZXhwb3J0IGZ1bmN0aW9uIGRlZmluZUJhY2tncm91bmQobWFpbjogKCkgPT4gdm9pZCk6IEJhY2tncm91bmRTY3JpcHREZWZpbnRpdGlvbjtcbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVCYWNrZ3JvdW5kKFxuICBkZWZpbml0aW9uOiBCYWNrZ3JvdW5kU2NyaXB0RGVmaW50aXRpb24sXG4pOiBCYWNrZ3JvdW5kU2NyaXB0RGVmaW50aXRpb247XG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lQmFja2dyb3VuZChcbiAgYXJnOiAoKCkgPT4gdm9pZCkgfCBCYWNrZ3JvdW5kU2NyaXB0RGVmaW50aXRpb24sXG4pOiBCYWNrZ3JvdW5kU2NyaXB0RGVmaW50aXRpb24ge1xuICBpZiAodHlwZW9mIGFyZyA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIHsgbWFpbjogYXJnIH07XG4gIHJldHVybiBhcmc7XG59XG4iLCAiZXhwb3J0IGZ1bmN0aW9uIG1vdW50Q29udGVudFNjcmlwdFVpKCkge1xuICB0aHJvdyBFcnJvcignTm90IGltcGxlbWVudGVkOiBtb3VudENvbnRlbnRTY3JpcHRVaScpO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjtBQUVPLFNBQVMsb0JBQ2QsWUFDeUI7QUFDekIsU0FBTztBQUNUOzs7QUNBTyxTQUFTLGlCQUNkLEtBQzZCO0FBQzdCLE1BQUksT0FBTyxRQUFRO0FBQVksV0FBTyxFQUFFLE1BQU0sSUFBSTtBQUNsRCxTQUFPO0FBQ1Q7OztBQ1hPLFNBQVMsdUJBQXVCO0FBQ3JDLFFBQU0sTUFBTSx1Q0FBdUM7QUFDckQ7IiwKICAibmFtZXMiOiBbXQp9Cg==
155
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2NsaWVudC9kZWZpbmVDb250ZW50U2NyaXB0LnRzIiwgIi4uL3NyYy9jbGllbnQvZGVmaW5lQmFja2dyb3VuZC50cyIsICIuLi9zcmMvY2xpZW50L21vdW50Q29udGVudFNjcmlwdFVpLnRzIiwgIi4uL3NyYy9jbGllbnQvYnJvd3Nlci50cyIsICIuLi9zcmMvY2xpZW50L3V0aWxzL2xvZ2dlci50cyIsICIuLi9zcmMvY2xpZW50L3V0aWxzL0NvbnRlbnRTY3JpcHRDb250ZXh0LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgeyBDb250ZW50U2NyaXB0RGVmaW5pdGlvbiB9IGZyb20gJy4uL2NvcmUvdHlwZXMnO1xuXG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lQ29udGVudFNjcmlwdChcbiAgZGVmaW5pdGlvbjogQ29udGVudFNjcmlwdERlZmluaXRpb24sXG4pOiBDb250ZW50U2NyaXB0RGVmaW5pdGlvbiB7XG4gIHJldHVybiBkZWZpbml0aW9uO1xufVxuIiwgImltcG9ydCB7IEJhY2tncm91bmRTY3JpcHREZWZpbnRpdGlvbiB9IGZyb20gJy4uJztcblxuZXhwb3J0IGZ1bmN0aW9uIGRlZmluZUJhY2tncm91bmQobWFpbjogKCkgPT4gdm9pZCk6IEJhY2tncm91bmRTY3JpcHREZWZpbnRpdGlvbjtcbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVCYWNrZ3JvdW5kKFxuICBkZWZpbml0aW9uOiBCYWNrZ3JvdW5kU2NyaXB0RGVmaW50aXRpb24sXG4pOiBCYWNrZ3JvdW5kU2NyaXB0RGVmaW50aXRpb247XG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lQmFja2dyb3VuZChcbiAgYXJnOiAoKCkgPT4gdm9pZCkgfCBCYWNrZ3JvdW5kU2NyaXB0RGVmaW50aXRpb24sXG4pOiBCYWNrZ3JvdW5kU2NyaXB0RGVmaW50aXRpb24ge1xuICBpZiAodHlwZW9mIGFyZyA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIHsgbWFpbjogYXJnIH07XG4gIHJldHVybiBhcmc7XG59XG4iLCAiZXhwb3J0IGZ1bmN0aW9uIG1vdW50Q29udGVudFNjcmlwdFVpKCkge1xuICB0aHJvdyBFcnJvcignTm90IGltcGxlbWVudGVkOiBtb3VudENvbnRlbnRTY3JpcHRVaScpO1xufVxuIiwgImltcG9ydCBvcmlnaW5hbEJyb3dzZXIsIHsgQnJvd3NlciwgUnVudGltZSwgSTE4biB9IGZyb20gJ3dlYmV4dGVuc2lvbi1wb2x5ZmlsbCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXVnbWVudGVkQnJvd3NlciBleHRlbmRzIEJyb3dzZXIge1xuICBydW50aW1lOiBXeHRSdW50aW1lO1xuICBpMThuOiBXeHRJMThuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFd4dFJ1bnRpbWUgZXh0ZW5kcyBSdW50aW1lLlN0YXRpYyB7XG4gIC8vIE92ZXJyaWRlbiBwZXItcHJvamVjdFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFd4dEkxOG4gZXh0ZW5kcyBJMThuLlN0YXRpYyB7XG4gIC8vIE92ZXJyaWRlbiBwZXItcHJvamVjdFxufVxuXG5leHBvcnQgY29uc3QgYnJvd3NlcjogQXVnbWVudGVkQnJvd3NlciA9IG9yaWdpbmFsQnJvd3NlcjtcbiIsICJmdW5jdGlvbiBwcmludChtZXRob2Q6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCwgLi4uYXJnczogYW55W10pIHtcbiAgaWYgKHR5cGVvZiBhcmdzWzBdID09PSAnc3RyaW5nJykge1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBhcmdzLnNoaWZ0KCk7XG4gICAgbWV0aG9kKGBbd3h0XSAke21lc3NhZ2V9YCwgLi4uYXJncyk7XG4gIH0gZWxzZSB7XG4gICAgbWV0aG9kKCdbd3h0XScsIC4uLmFyZ3MpO1xuICB9XG59XG5cbi8qKlxuICogV3JhcHBlciBhcm91bmQgYGNvbnNvbGVgIHdpdGggYSBcIlt3eHRdXCIgcHJlZml4XG4gKi9cbmV4cG9ydCBjb25zdCBsb2dnZXIgPSB7XG4gIGRlYnVnOiAoLi4uYXJnczogYW55W10pID0+IHByaW50KGNvbnNvbGUuZGVidWcsIC4uLmFyZ3MpLFxuICBsb2c6ICguLi5hcmdzOiBhbnlbXSkgPT4gcHJpbnQoY29uc29sZS5sb2csIC4uLmFyZ3MpLFxuICB3YXJuOiAoLi4uYXJnczogYW55W10pID0+IHByaW50KGNvbnNvbGUud2FybiwgLi4uYXJncyksXG4gIGVycm9yOiAoLi4uYXJnczogYW55W10pID0+IHByaW50KGNvbnNvbGUuZXJyb3IsIC4uLmFyZ3MpLFxufTtcbiIsICJpbXBvcnQgeyBicm93c2VyIH0gZnJvbSAnLi4vYnJvd3Nlcic7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuL2xvZ2dlcic7XG5cbi8qKlxuICogRXh0ZW5kcyBbYEFib3J0Q29udHJvbGxlcmBdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9BYm9ydENvbnRyb2xsZXIpLlxuICogVXNlZCB0byBkZXRlY3QgYW5kIHN0b3AgY29udGVudCBzY3JpcHQgY29kZSB3aGVuIHRoZSBzY3JpcHQgaXMgaW52YWxpZGF0ZWQuXG4gKlxuICogSXQgYWxzbyBwcm92aWRlcyBzZXZlcmFsIHV0aWxpdGllcyBsaWtlIGBjdHguc2V0VGltZW91dGAgYW5kIGBjdHguc2V0SW50ZXJ2YWxgIHRoYXQgc2hvdWxkIGJlIHVzZWQgaW5cbiAqIGNvbnRlbnQgc2NyaXB0cyBpbnN0ZWFkIG9mIGB3aW5kb3cuc2V0VGltZW91dGAgb3IgYHdpbmRvdy5zZXRJbnRlcnZhbGAuXG4gKi9cbmV4cG9ydCBjbGFzcyBDb250ZW50U2NyaXB0Q29udGV4dCBleHRlbmRzIEFib3J0Q29udHJvbGxlciB7XG4gIHN0YXRpYyBTQ1JJUFRfU1RBUlRFRF9NRVNTQUdFX1RZUEUgPSAnd3h0OmNvbnRlbnQtc2NyaXB0LXN0YXJ0ZWQnO1xuXG4gICNpc1RvcEZyYW1lID0gd2luZG93LnNlbGYgPT09IHdpbmRvdy50b3A7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBjb250ZW50U2NyaXB0TmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIGlmICh0aGlzLiNpc1RvcEZyYW1lKSB7XG4gICAgICB0aGlzLiNzdG9wT2xkU2NyaXB0cygpO1xuICAgIH1cbiAgICB0aGlzLnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgLy8gUnVuIG9uIG5leHQgdGljayBzbyB0aGUgbGlzdGVuZXIgaXQgYWRkcyBpc24ndCB0cmlnZ2VyZWQgYnkgc3RvcE9sZFNjcmlwdFxuICAgICAgdGhpcy4jbGlzdGVuRm9yTmV3ZXJTY3JpcHRzKCk7XG4gICAgfSk7XG4gIH1cblxuICBnZXQgaXNJbnZhbGlkKCk6IGJvb2xlYW4ge1xuICAgIGlmIChicm93c2VyLnJ1bnRpbWUuaWQgPT0gbnVsbCkge1xuICAgICAgdGhpcy5ub3RpZnlJbnZhbGlkYXRlZCgpOyAvLyBTZXRzIGBzaWduYWwuYWJvcnRlZGAgdG8gdHJ1ZVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zaWduYWwuYWJvcnRlZDtcbiAgfVxuXG4gIGdldCBpc1ZhbGlkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5pc0ludmFsaWQ7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgbGlzdGVuZXIgdGhhdCBpcyBjYWxsZWQgd2hlbiB0aGUgY29udGVudCBzY3JpcHQncyBjb250ZXh0IGlzIGludmFsaWRhdGVkLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIGZ1bmN0aW9uIHRvIHJlbW92ZSB0aGUgbGlzdGVuZXIuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGJyb3dzZXIucnVudGltZS5vbk1lc3NhZ2UuYWRkTGlzdGVuZXIoY2IpO1xuICAgKiBjb25zdCByZW1vdmVJbnZhbGlkYXRlZExpc3RlbmVyID0gY3R4Lm9uSW52YWxpZGF0ZWQoKCkgPT4ge1xuICAgKiAgIGJyb3dzZXIucnVudGltZS5vbk1lc3NhZ2UucmVtb3ZlTGlzdGVuZXIoY2IpO1xuICAgKiB9KVxuICAgKiAvLyAuLi5cbiAgICogcmVtb3ZlSW52YWxpZGF0ZWRMaXN0ZW5lcigpO1xuICAgKi9cbiAgb25JbnZhbGlkYXRlZChjYjogKCkgPT4gdm9pZCk6ICgpID0+IHZvaWQge1xuICAgIHRoaXMuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgY2IpO1xuICAgIHJldHVybiAoKSA9PiB0aGlzLnNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIGNiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXcmFwcGVyIGFyb3VuZCBgd2luZG93LnNldEludGVydmFsYCB0aGF0IGF1dG9tYXRpY2FsbHkgY2xlYXJzIHRoZSBpbnRlcnZhbCB3aGVuIGludmFsaWRhdGVkLlxuICAgKi9cbiAgc2V0SW50ZXJ2YWwoaGFuZGxlcjogKCkgPT4gdm9pZCwgdGltZW91dD86IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3QgaWQgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5pc1ZhbGlkKSBoYW5kbGVyKCk7XG4gICAgfSwgdGltZW91dCkgYXMgdW5rbm93biBhcyBudW1iZXI7XG4gICAgdGhpcy5vbkludmFsaWRhdGVkKCgpID0+IGNsZWFySW50ZXJ2YWwoaWQpKTtcbiAgICByZXR1cm4gaWQ7XG4gIH1cblxuICAvKipcbiAgICogV3JhcHBlciBhcm91bmQgYHdpbmRvdy5zZXRUaW1lb3V0YCB0aGF0IGF1dG9tYXRpY2FsbHkgY2xlYXJzIHRoZSBpbnRlcnZhbCB3aGVuIGludmFsaWRhdGVkLlxuICAgKi9cbiAgc2V0VGltZW91dChoYW5kbGVyOiAoKSA9PiB2b2lkLCB0aW1lb3V0PzogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCBpZCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuaXNWYWxpZCkgaGFuZGxlcigpO1xuICAgIH0sIHRpbWVvdXQpIGFzIHVua25vd24gYXMgbnVtYmVyO1xuICAgIHRoaXMub25JbnZhbGlkYXRlZCgoKSA9PiBjbGVhclRpbWVvdXQoaWQpKTtcbiAgICByZXR1cm4gaWQ7XG4gIH1cblxuICAvKipcbiAgICogV3JhcHBlciBhcm91bmQgYHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWVgIHRoYXQgYXV0b21hdGljYWxseSBjYW5jZWxzIHRoZSByZXF1ZXN0IHdoZW5cbiAgICogaW52YWxpZGF0ZWQuXG4gICAqL1xuICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoY2FsbGJhY2s6IEZyYW1lUmVxdWVzdENhbGxiYWNrKTogbnVtYmVyIHtcbiAgICBjb25zdCBpZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSgoLi4uYXJncykgPT4ge1xuICAgICAgaWYgKHRoaXMuaXNWYWxpZCkgY2FsbGJhY2soLi4uYXJncyk7XG4gICAgfSk7XG5cbiAgICB0aGlzLm9uSW52YWxpZGF0ZWQoKCkgPT4gY2FuY2VsQW5pbWF0aW9uRnJhbWUoaWQpKTtcbiAgICByZXR1cm4gaWQ7XG4gIH1cblxuICAvKipcbiAgICogV3JhcHBlciBhcm91bmQgYHdpbmRvdy5yZXF1ZXN0SWRsZUNhbGxiYWNrYCB0aGF0IGF1dG9tYXRpY2FsbHkgY2FuY2VscyB0aGUgcmVxdWVzdCB3aGVuXG4gICAqIGludmFsaWRhdGVkLlxuICAgKi9cbiAgcmVxdWVzdElkbGVDYWxsYmFjayhcbiAgICBjYWxsYmFjazogSWRsZVJlcXVlc3RDYWxsYmFjayxcbiAgICBvcHRpb25zPzogSWRsZVJlcXVlc3RPcHRpb25zLFxuICApOiBudW1iZXIge1xuICAgIGNvbnN0IGlkID0gcmVxdWVzdElkbGVDYWxsYmFjaygoLi4uYXJncykgPT4ge1xuICAgICAgaWYgKCF0aGlzLnNpZ25hbC5hYm9ydGVkKSBjYWxsYmFjayguLi5hcmdzKTtcbiAgICB9LCBvcHRpb25zKTtcblxuICAgIHRoaXMub25JbnZhbGlkYXRlZCgoKSA9PiBjYW5jZWxJZGxlQ2FsbGJhY2soaWQpKTtcbiAgICByZXR1cm4gaWQ7XG4gIH1cblxuICAvKipcbiAgICogQWJvcnQgdGhlIGFib3J0IGNvbnRyb2xsZXIgYW5kIGV4ZWN1dGUgYWxsIGBvbkludmFsaWRhdGVkYCBsaXN0ZW5lcnMuXG4gICAqL1xuICBub3RpZnlJbnZhbGlkYXRlZCgpIHtcbiAgICB0aGlzLmFib3J0KCdDb250ZW50IHNjcmlwdCBjb250ZXh0IGludmFsaWRhdGVkJyk7XG4gICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgYENvbnRlbnQgc2NyaXB0IFwiJHt0aGlzLmNvbnRlbnRTY3JpcHROYW1lfVwiIGNvbnRleHQgaW52YWxpZGF0ZWRgLFxuICAgICk7XG4gIH1cblxuICAjc3RvcE9sZFNjcmlwdHMoKSB7XG4gICAgLy8gVXNlIHBvc3RNZXNzYWdlIHNvIGl0IGdldCdzIHNlbnQgdG8gYWxsIHRoZSBmcmFtZXMgb2YgdGhlIHBhZ2UuXG4gICAgd2luZG93LnBvc3RNZXNzYWdlKHtcbiAgICAgIGV2ZW50OiBDb250ZW50U2NyaXB0Q29udGV4dC5TQ1JJUFRfU1RBUlRFRF9NRVNTQUdFX1RZUEUsXG4gICAgICBjb250ZW50U2NyaXB0TmFtZTogdGhpcy5jb250ZW50U2NyaXB0TmFtZSxcbiAgICB9KTtcbiAgfVxuXG4gICNsaXN0ZW5Gb3JOZXdlclNjcmlwdHMoKSB7XG4gICAgY29uc3QgY2IgPSAoZXZlbnQ6IE1lc3NhZ2VFdmVudCkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICBldmVudC5kYXRhPy50eXBlID09PSBDb250ZW50U2NyaXB0Q29udGV4dC5TQ1JJUFRfU1RBUlRFRF9NRVNTQUdFX1RZUEUgJiZcbiAgICAgICAgZXZlbnQuZGF0YT8uY29udGVudFNjcmlwdE5hbWUgPT09IHRoaXMuY29udGVudFNjcmlwdE5hbWVcbiAgICAgICkge1xuICAgICAgICB0aGlzLm5vdGlmeUludmFsaWRhdGVkKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBjYik7XG4gICAgdGhpcy5vbkludmFsaWRhdGVkKCgpID0+IHJlbW92ZUV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBjYikpO1xuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiO0FBRU8sU0FBUyxvQkFDZCxZQUN5QjtBQUN6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
package/dist/index.cjs CHANGED
@@ -492,6 +492,15 @@ function getGlobals(config) {
492
492
  }
493
493
  ];
494
494
  }
495
+ function getEntrypointGlobals(config, entrypointName) {
496
+ return [
497
+ {
498
+ name: "__ENTRYPOINT__",
499
+ value: entrypointName,
500
+ type: `string`
501
+ }
502
+ ];
503
+ }
495
504
 
496
505
  // src/core/utils/getInternalConfig.ts
497
506
  async function getInternalConfig(inlineConfig, command) {
@@ -538,6 +547,7 @@ async function getInternalConfig(inlineConfig, command) {
538
547
  command,
539
548
  debug,
540
549
  entrypointsDir,
550
+ env,
541
551
  fsCache: createFsCache(wxtDir),
542
552
  imports: mergedConfig.imports ?? {},
543
553
  logger,
@@ -551,16 +561,12 @@ async function getInternalConfig(inlineConfig, command) {
551
561
  runnerConfig,
552
562
  srcDir,
553
563
  typesDir,
554
- vite: {},
564
+ vite: () => ({}),
555
565
  // Real value added after this object is initialized.
556
566
  wxtDir,
557
567
  zip: resolveInternalZipConfig(root, mergedConfig)
558
568
  };
559
- finalConfig.vite = await resolveInternalViteConfig(
560
- env,
561
- mergedConfig,
562
- finalConfig
563
- );
569
+ finalConfig.vite = (env2) => resolveInternalViteConfig(env2, mergedConfig, finalConfig);
564
570
  return finalConfig;
565
571
  }
566
572
  async function resolveManifestConfig(env, manifest) {
@@ -584,9 +590,9 @@ function mergeInlineConfig(inlineConfig, userConfig) {
584
590
  return vite2.mergeConfig(user, inline);
585
591
  };
586
592
  const viteConfig = async (env) => {
587
- const user = await resolveViteConfig(env, userConfig.vite);
588
- const inline = await resolveViteConfig(env, inlineConfig.vite);
589
- return vite2.mergeConfig(user, inline);
593
+ const user = await userConfig.vite?.(env);
594
+ const inline = await inlineConfig.vite?.(env);
595
+ return vite2.mergeConfig(user ?? {}, inline ?? {});
590
596
  };
591
597
  const runner = vite2.mergeConfig(
592
598
  userConfig.runner ?? {},
@@ -614,9 +620,6 @@ function mergeInlineConfig(inlineConfig, userConfig) {
614
620
  zip
615
621
  };
616
622
  }
617
- async function resolveViteConfig(env, vite6) {
618
- return await (typeof vite6 === "function" ? vite6(env) : vite6 ?? {});
619
- }
620
623
  function resolveInternalZipConfig(root, mergedConfig) {
621
624
  return {
622
625
  sourcesTemplate: "{{name}}-{{version}}-sources.zip",
@@ -638,10 +641,7 @@ function resolveInternalZipConfig(root, mergedConfig) {
638
641
  };
639
642
  }
640
643
  async function resolveInternalViteConfig(env, mergedConfig, finalConfig) {
641
- const internalVite = await resolveViteConfig(
642
- env,
643
- mergedConfig.vite
644
- );
644
+ const internalVite = await mergedConfig.vite?.(env) ?? {};
645
645
  internalVite.root = finalConfig.root;
646
646
  internalVite.configFile = false;
647
647
  internalVite.logLevel = "warn";
@@ -851,9 +851,12 @@ async function buildSingleEntrypoint(entrypoint, config) {
851
851
  "process.env.NODE_ENV": JSON.stringify(config.mode)
852
852
  }
853
853
  };
854
+ for (const global of getEntrypointGlobals(config, entrypoint.name)) {
855
+ libMode.define[global.name] = JSON.stringify(global.value);
856
+ }
854
857
  const entryConfig = vite3.mergeConfig(
855
858
  libMode,
856
- config.vite
859
+ await config.vite(config.env)
857
860
  );
858
861
  const result = await vite3.build(entryConfig);
859
862
  return {
@@ -879,11 +882,15 @@ async function buildMultipleEntrypoints(entrypoints, config) {
879
882
  assetFileNames: "assets/[name]-[hash].[ext]"
880
883
  }
881
884
  }
882
- }
885
+ },
886
+ define: {}
883
887
  };
888
+ for (const global of getEntrypointGlobals(config, "html")) {
889
+ multiPage.define[global.name] = JSON.stringify(global.value);
890
+ }
884
891
  const entryConfig = vite3.mergeConfig(
885
892
  multiPage,
886
- config.vite
893
+ await config.vite(config.env)
887
894
  );
888
895
  const result = await vite3.build(entryConfig);
889
896
  return {
@@ -1403,7 +1410,7 @@ declare module "wxt/browser" {
1403
1410
  }
1404
1411
  async function writeGlobalsDeclarationFile(config) {
1405
1412
  const filePath = (0, import_path9.resolve)(config.typesDir, "globals.d.ts");
1406
- const globals = getGlobals(config);
1413
+ const globals = [...getGlobals(config), ...getEntrypointGlobals(config, "")];
1407
1414
  await writeFileIfDifferent(
1408
1415
  filePath,
1409
1416
  [
@@ -2186,7 +2193,7 @@ async function getServerInfo() {
2186
2193
  async function setupServer(serverInfo, config) {
2187
2194
  const runner = createWebExtRunner();
2188
2195
  const viteServer = await vite5.createServer(
2189
- vite5.mergeConfig(serverInfo, config.vite)
2196
+ vite5.mergeConfig(serverInfo, await config.vite(config.env))
2190
2197
  );
2191
2198
  const start = async () => {
2192
2199
  await viteServer.listen(server.port);
@@ -2287,7 +2294,7 @@ async function clean(root = process.cwd()) {
2287
2294
  }
2288
2295
 
2289
2296
  // package.json
2290
- var version2 = "0.5.5";
2297
+ var version2 = "0.6.0-alpha1";
2291
2298
 
2292
2299
  // src/core/utils/defineConfig.ts
2293
2300
  function defineConfig(config) {
@@ -2310,7 +2317,7 @@ async function createServer2(config) {
2310
2317
  return getInternalConfig(
2311
2318
  {
2312
2319
  ...config,
2313
- vite: serverInfo.viteServerConfig
2320
+ vite: () => serverInfo.viteServerConfig
2314
2321
  },
2315
2322
  "serve"
2316
2323
  );