wxt 0.7.4 → 0.8.0

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.
@@ -0,0 +1,28 @@
1
+ type TargetBrowser = string;
2
+ interface UnlistedScriptDefinition extends ExcludableEntrypoint {
3
+ /**
4
+ * Main function executed when the unlisted script is ran.
5
+ */
6
+ main(): void | Promise<void>;
7
+ }
8
+ interface ExcludableEntrypoint {
9
+ /**
10
+ * List of target browsers to include this entrypoint in. Defaults to being included in all
11
+ * builds. Cannot be used with `exclude`. You must choose one of the two options.
12
+ *
13
+ * @default undefined
14
+ */
15
+ include?: TargetBrowser[];
16
+ /**
17
+ * List of target browsers to exclude this entrypoint from. Cannot be used with `include`. You
18
+ * must choose one of the two options.
19
+ *
20
+ * @default undefined
21
+ */
22
+ exclude?: TargetBrowser[];
23
+ }
24
+
25
+ declare function defineUnlistedScript(main: () => void): UnlistedScriptDefinition;
26
+ declare function defineUnlistedScript(definition: UnlistedScriptDefinition): UnlistedScriptDefinition;
27
+
28
+ export { defineUnlistedScript };
@@ -0,0 +1,10 @@
1
+ // src/client/sandbox/defineUnlistedScript.ts
2
+ function defineUnlistedScript(arg) {
3
+ if (typeof arg === "function")
4
+ return { main: arg };
5
+ return arg;
6
+ }
7
+ export {
8
+ defineUnlistedScript
9
+ };
10
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2NsaWVudC9zYW5kYm94L2RlZmluZVVubGlzdGVkU2NyaXB0LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgeyBVbmxpc3RlZFNjcmlwdERlZmluaXRpb24gfSBmcm9tICcuLi8uLi9jb3JlL3R5cGVzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGRlZmluZVVubGlzdGVkU2NyaXB0KFxuICBtYWluOiAoKSA9PiB2b2lkLFxuKTogVW5saXN0ZWRTY3JpcHREZWZpbml0aW9uO1xuZXhwb3J0IGZ1bmN0aW9uIGRlZmluZVVubGlzdGVkU2NyaXB0KFxuICBkZWZpbml0aW9uOiBVbmxpc3RlZFNjcmlwdERlZmluaXRpb24sXG4pOiBVbmxpc3RlZFNjcmlwdERlZmluaXRpb247XG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lVW5saXN0ZWRTY3JpcHQoXG4gIGFyZzogKCgpID0+IHZvaWQpIHwgVW5saXN0ZWRTY3JpcHREZWZpbml0aW9uLFxuKTogVW5saXN0ZWRTY3JpcHREZWZpbml0aW9uIHtcbiAgaWYgKHR5cGVvZiBhcmcgPT09ICdmdW5jdGlvbicpIHJldHVybiB7IG1haW46IGFyZyB9O1xuICByZXR1cm4gYXJnO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjtBQVFPLFNBQVMscUJBQ2QsS0FDMEI7QUFDMUIsTUFBSSxPQUFPLFFBQVE7QUFBWSxXQUFPLEVBQUUsTUFBTSxJQUFJO0FBQ2xELFNBQU87QUFDVDsiLAogICJuYW1lcyI6IFtdCn0K
@@ -125,7 +125,7 @@ try {
125
125
  );
126
126
  }
127
127
  } catch (err) {
128
- logger.error("The background script crashed on startup!");
128
+ logger.error("The background crashed on startup!");
129
129
  throw err;
130
130
  }
131
131
  //# sourceMappingURL=background-entrypoint.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/client/virtual-modules/background-entrypoint.ts","../../src/client/utils/logger.ts","../../src/client/utils/setupWebSocket.ts","../../src/client/utils/keepServiceWorkerAlive.ts","../../src/client/utils/reloadContentScript.ts"],"sourcesContent":["import definition from 'virtual:user-background';\nimport { setupWebSocket } from '../utils/setupWebSocket';\nimport { logger } from '../utils/logger';\nimport browser from 'webextension-polyfill';\nimport { keepServiceWorkerAlive } from '../utils/keepServiceWorkerAlive';\nimport { reloadContentScript } from '../utils/reloadContentScript';\n\nif (__COMMAND__ === 'serve') {\n try {\n const ws = setupWebSocket((message) => {\n if (message.event === 'wxt:reload-extension') browser.runtime.reload();\n if (message.event === 'wxt:reload-content-script' && message.data != null)\n reloadContentScript(message.data);\n });\n\n if (__MANIFEST_VERSION__ === 3) {\n // Tell the server the background script is loaded and ready to go\n ws.addEventListener('open', () => {\n const msg = { type: 'custom', event: 'wxt:background-initialized' };\n ws.send(JSON.stringify(msg));\n });\n\n // Web Socket will disconnect if the service worker is killed\n keepServiceWorkerAlive();\n }\n } catch (err) {\n logger.error('Failed to setup web socket connection with dev server', err);\n }\n}\n\ntry {\n const res = definition.main();\n // @ts-expect-error: res shouldn't be a promise, but we're checking it anyways\n if (res instanceof Promise) {\n console.warn(\n \"The background's main() function return a promise, but it must be synchonous\",\n );\n }\n} catch (err) {\n logger.error('The background script crashed on startup!');\n throw err;\n}\n","function print(method: (...args: any[]) => void, ...args: any[]) {\n if (import.meta.env.MODE === 'production') return;\n\n if (typeof args[0] === 'string') {\n const message = args.shift();\n method(`[wxt] ${message}`, ...args);\n } else {\n method('[wxt]', ...args);\n }\n}\n\n/**\n * Wrapper around `console` with a \"[wxt]\" prefix\n */\nexport const logger = {\n debug: (...args: any[]) => print(console.debug, ...args),\n log: (...args: any[]) => print(console.log, ...args),\n warn: (...args: any[]) => print(console.warn, ...args),\n error: (...args: any[]) => print(console.error, ...args),\n};\n","import { logger } from './logger';\n\ninterface WebSocketMessage {\n type: string;\n event: string;\n data?: any;\n}\n\n/**\n * Connect to the websocket and listen for messages.\n *\n * @param onMessage Optional callback that is called when a message is recieved and we've verified\n * it's structure is what we expect.\n */\nexport function setupWebSocket(\n onMessage?: (message: WebSocketMessage) => void,\n) {\n const serverUrl = `${__DEV_SERVER_PROTOCOL__}//${__DEV_SERVER_HOSTNAME__}:${__DEV_SERVER_PORT__}`;\n logger.debug('Connecting to dev server @', serverUrl);\n const ws = new WebSocket(serverUrl, 'vite-hmr');\n\n ws.addEventListener('open', () => {\n logger.debug('Connected to dev server');\n });\n ws.addEventListener('close', () => {\n logger.debug('Disconnected from dev server');\n });\n ws.addEventListener('error', (event) => {\n logger.error('Failed to connect to dev server', event);\n });\n\n ws.addEventListener('message', (e) => {\n try {\n const message = JSON.parse(e.data) as WebSocketMessage;\n if (message.type === 'custom' && message.event?.startsWith?.('wxt:')) {\n onMessage?.(message);\n }\n } catch (err) {\n logger.error('Failed to handle message', err);\n }\n });\n\n return ws;\n}\n","import browser from 'webextension-polyfill';\n\n/**\n * https://developer.chrome.com/blog/longer-esw-lifetimes/\n */\nexport function keepServiceWorkerAlive() {\n setInterval(async () => {\n // Calling an async browser API resets the service worker's timeout\n await browser.runtime.getPlatformInfo();\n }, 5e3);\n}\n","import browser, { Manifest } from 'webextension-polyfill';\nimport { logger } from './logger';\nimport { MatchPattern } from '@webext-core/match-patterns';\n\nexport function reloadContentScript(contentScript: Manifest.ContentScript) {\n const manifest = browser.runtime.getManifest();\n if (manifest.manifest_version == 2) {\n void reloadContentScriptMv2(contentScript);\n } else {\n void reloadContentScriptMv3(contentScript);\n }\n}\n\nexport async function reloadContentScriptMv3(\n contentScript: Manifest.ContentScript,\n) {\n const id = `wxt:${contentScript.js![0]}`;\n logger.log('Reloading content script:', contentScript);\n const registered = await browser.scripting.getRegisteredContentScripts();\n logger.debug('Existing scripts:', registered);\n\n const existing = registered.find((cs) => cs.id === id);\n\n if (existing) {\n logger.debug('Updating content script', existing);\n await browser.scripting.updateContentScripts([{ ...contentScript, id }]);\n } else {\n logger.debug('Registering new content script...');\n await browser.scripting.registerContentScripts([{ ...contentScript, id }]);\n }\n\n const allTabs = await browser.tabs.query({});\n const matchPatterns = contentScript.matches.map(\n (match) => new MatchPattern(match),\n );\n const matchingTabs = allTabs.filter((tab) => {\n const url = tab.url;\n if (!url) return false;\n return !!matchPatterns.find((pattern) => pattern.includes(url));\n });\n await Promise.all(matchingTabs.map((tab) => browser.tabs.reload(tab.id)));\n}\n\nexport async function reloadContentScriptMv2(\n contentScript: Manifest.ContentScript,\n) {\n throw Error('TODO: reloadContentScriptMv2');\n}\n"],"mappings":";AAAA,OAAO,gBAAgB;;;ACAvB,SAAS,MAAM,WAAqC,MAAa;AAC/D,MAAI,YAAY,IAAI,SAAS;AAAc;AAE3C,MAAI,OAAO,KAAK,CAAC,MAAM,UAAU;AAC/B,UAAM,UAAU,KAAK,MAAM;AAC3B,WAAO,SAAS,OAAO,IAAI,GAAG,IAAI;AAAA,EACpC,OAAO;AACL,WAAO,SAAS,GAAG,IAAI;AAAA,EACzB;AACF;AAKO,IAAM,SAAS;AAAA,EACpB,OAAO,IAAI,SAAgB,MAAM,QAAQ,OAAO,GAAG,IAAI;AAAA,EACvD,KAAK,IAAI,SAAgB,MAAM,QAAQ,KAAK,GAAG,IAAI;AAAA,EACnD,MAAM,IAAI,SAAgB,MAAM,QAAQ,MAAM,GAAG,IAAI;AAAA,EACrD,OAAO,IAAI,SAAgB,MAAM,QAAQ,OAAO,GAAG,IAAI;AACzD;;;ACLO,SAAS,eACd,WACA;AACA,QAAM,YAAY,GAAG,uBAAuB,KAAK,uBAAuB,IAAI,mBAAmB;AAC/F,SAAO,MAAM,8BAA8B,SAAS;AACpD,QAAM,KAAK,IAAI,UAAU,WAAW,UAAU;AAE9C,KAAG,iBAAiB,QAAQ,MAAM;AAChC,WAAO,MAAM,yBAAyB;AAAA,EACxC,CAAC;AACD,KAAG,iBAAiB,SAAS,MAAM;AACjC,WAAO,MAAM,8BAA8B;AAAA,EAC7C,CAAC;AACD,KAAG,iBAAiB,SAAS,CAAC,UAAU;AACtC,WAAO,MAAM,mCAAmC,KAAK;AAAA,EACvD,CAAC;AAED,KAAG,iBAAiB,WAAW,CAAC,MAAM;AACpC,QAAI;AACF,YAAM,UAAU,KAAK,MAAM,EAAE,IAAI;AACjC,UAAI,QAAQ,SAAS,YAAY,QAAQ,OAAO,aAAa,MAAM,GAAG;AACpE,oBAAY,OAAO;AAAA,MACrB;AAAA,IACF,SAAS,KAAK;AACZ,aAAO,MAAM,4BAA4B,GAAG;AAAA,IAC9C;AAAA,EACF,CAAC;AAED,SAAO;AACT;;;AFxCA,OAAOA,cAAa;;;AGHpB,OAAO,aAAa;AAKb,SAAS,yBAAyB;AACvC,cAAY,YAAY;AAEtB,UAAM,QAAQ,QAAQ,gBAAgB;AAAA,EACxC,GAAG,GAAG;AACR;;;ACVA,OAAOC,cAA2B;AAElC,SAAS,oBAAoB;AAEtB,SAAS,oBAAoB,eAAuC;AACzE,QAAM,WAAWC,SAAQ,QAAQ,YAAY;AAC7C,MAAI,SAAS,oBAAoB,GAAG;AAClC,SAAK,uBAAuB,aAAa;AAAA,EAC3C,OAAO;AACL,SAAK,uBAAuB,aAAa;AAAA,EAC3C;AACF;AAEA,eAAsB,uBACpB,eACA;AACA,QAAM,KAAK,OAAO,cAAc,GAAI,CAAC,CAAC;AACtC,SAAO,IAAI,6BAA6B,aAAa;AACrD,QAAM,aAAa,MAAMA,SAAQ,UAAU,4BAA4B;AACvE,SAAO,MAAM,qBAAqB,UAAU;AAE5C,QAAM,WAAW,WAAW,KAAK,CAAC,OAAO,GAAG,OAAO,EAAE;AAErD,MAAI,UAAU;AACZ,WAAO,MAAM,2BAA2B,QAAQ;AAChD,UAAMA,SAAQ,UAAU,qBAAqB,CAAC,EAAE,GAAG,eAAe,GAAG,CAAC,CAAC;AAAA,EACzE,OAAO;AACL,WAAO,MAAM,mCAAmC;AAChD,UAAMA,SAAQ,UAAU,uBAAuB,CAAC,EAAE,GAAG,eAAe,GAAG,CAAC,CAAC;AAAA,EAC3E;AAEA,QAAM,UAAU,MAAMA,SAAQ,KAAK,MAAM,CAAC,CAAC;AAC3C,QAAM,gBAAgB,cAAc,QAAQ;AAAA,IAC1C,CAAC,UAAU,IAAI,aAAa,KAAK;AAAA,EACnC;AACA,QAAM,eAAe,QAAQ,OAAO,CAAC,QAAQ;AAC3C,UAAM,MAAM,IAAI;AAChB,QAAI,CAAC;AAAK,aAAO;AACjB,WAAO,CAAC,CAAC,cAAc,KAAK,CAAC,YAAY,QAAQ,SAAS,GAAG,CAAC;AAAA,EAChE,CAAC;AACD,QAAM,QAAQ,IAAI,aAAa,IAAI,CAAC,QAAQA,SAAQ,KAAK,OAAO,IAAI,EAAE,CAAC,CAAC;AAC1E;AAEA,eAAsB,uBACpB,eACA;AACA,QAAM,MAAM,8BAA8B;AAC5C;;;AJxCA,IAAI,gBAAgB,SAAS;AAC3B,MAAI;AACF,UAAM,KAAK,eAAe,CAAC,YAAY;AACrC,UAAI,QAAQ,UAAU;AAAwB,QAAAC,SAAQ,QAAQ,OAAO;AACrE,UAAI,QAAQ,UAAU,+BAA+B,QAAQ,QAAQ;AACnE,4BAAoB,QAAQ,IAAI;AAAA,IACpC,CAAC;AAED,QAAI,yBAAyB,GAAG;AAE9B,SAAG,iBAAiB,QAAQ,MAAM;AAChC,cAAM,MAAM,EAAE,MAAM,UAAU,OAAO,6BAA6B;AAClE,WAAG,KAAK,KAAK,UAAU,GAAG,CAAC;AAAA,MAC7B,CAAC;AAGD,6BAAuB;AAAA,IACzB;AAAA,EACF,SAAS,KAAK;AACZ,WAAO,MAAM,yDAAyD,GAAG;AAAA,EAC3E;AACF;AAEA,IAAI;AACF,QAAM,MAAM,WAAW,KAAK;AAE5B,MAAI,eAAe,SAAS;AAC1B,YAAQ;AAAA,MACN;AAAA,IACF;AAAA,EACF;AACF,SAAS,KAAK;AACZ,SAAO,MAAM,2CAA2C;AACxD,QAAM;AACR;","names":["browser","browser","browser","browser"]}
1
+ {"version":3,"sources":["../../src/client/virtual-modules/background-entrypoint.ts","../../src/client/utils/logger.ts","../../src/client/utils/setupWebSocket.ts","../../src/client/utils/keepServiceWorkerAlive.ts","../../src/client/utils/reloadContentScript.ts"],"sourcesContent":["import definition from 'virtual:user-background';\nimport { setupWebSocket } from '../utils/setupWebSocket';\nimport { logger } from '../utils/logger';\nimport browser from 'webextension-polyfill';\nimport { keepServiceWorkerAlive } from '../utils/keepServiceWorkerAlive';\nimport { reloadContentScript } from '../utils/reloadContentScript';\n\nif (__COMMAND__ === 'serve') {\n try {\n const ws = setupWebSocket((message) => {\n if (message.event === 'wxt:reload-extension') browser.runtime.reload();\n if (message.event === 'wxt:reload-content-script' && message.data != null)\n reloadContentScript(message.data);\n });\n\n if (__MANIFEST_VERSION__ === 3) {\n // Tell the server the background script is loaded and ready to go\n ws.addEventListener('open', () => {\n const msg = { type: 'custom', event: 'wxt:background-initialized' };\n ws.send(JSON.stringify(msg));\n });\n\n // Web Socket will disconnect if the service worker is killed\n keepServiceWorkerAlive();\n }\n } catch (err) {\n logger.error('Failed to setup web socket connection with dev server', err);\n }\n}\n\ntry {\n const res = definition.main();\n // @ts-expect-error: res shouldn't be a promise, but we're checking it anyways\n if (res instanceof Promise) {\n console.warn(\n \"The background's main() function return a promise, but it must be synchonous\",\n );\n }\n} catch (err) {\n logger.error('The background crashed on startup!');\n throw err;\n}\n","function print(method: (...args: any[]) => void, ...args: any[]) {\n if (import.meta.env.MODE === 'production') return;\n\n if (typeof args[0] === 'string') {\n const message = args.shift();\n method(`[wxt] ${message}`, ...args);\n } else {\n method('[wxt]', ...args);\n }\n}\n\n/**\n * Wrapper around `console` with a \"[wxt]\" prefix\n */\nexport const logger = {\n debug: (...args: any[]) => print(console.debug, ...args),\n log: (...args: any[]) => print(console.log, ...args),\n warn: (...args: any[]) => print(console.warn, ...args),\n error: (...args: any[]) => print(console.error, ...args),\n};\n","import { logger } from './logger';\n\ninterface WebSocketMessage {\n type: string;\n event: string;\n data?: any;\n}\n\n/**\n * Connect to the websocket and listen for messages.\n *\n * @param onMessage Optional callback that is called when a message is recieved and we've verified\n * it's structure is what we expect.\n */\nexport function setupWebSocket(\n onMessage?: (message: WebSocketMessage) => void,\n) {\n const serverUrl = `${__DEV_SERVER_PROTOCOL__}//${__DEV_SERVER_HOSTNAME__}:${__DEV_SERVER_PORT__}`;\n logger.debug('Connecting to dev server @', serverUrl);\n const ws = new WebSocket(serverUrl, 'vite-hmr');\n\n ws.addEventListener('open', () => {\n logger.debug('Connected to dev server');\n });\n ws.addEventListener('close', () => {\n logger.debug('Disconnected from dev server');\n });\n ws.addEventListener('error', (event) => {\n logger.error('Failed to connect to dev server', event);\n });\n\n ws.addEventListener('message', (e) => {\n try {\n const message = JSON.parse(e.data) as WebSocketMessage;\n if (message.type === 'custom' && message.event?.startsWith?.('wxt:')) {\n onMessage?.(message);\n }\n } catch (err) {\n logger.error('Failed to handle message', err);\n }\n });\n\n return ws;\n}\n","import browser from 'webextension-polyfill';\n\n/**\n * https://developer.chrome.com/blog/longer-esw-lifetimes/\n */\nexport function keepServiceWorkerAlive() {\n setInterval(async () => {\n // Calling an async browser API resets the service worker's timeout\n await browser.runtime.getPlatformInfo();\n }, 5e3);\n}\n","import browser, { Manifest } from 'webextension-polyfill';\nimport { logger } from './logger';\nimport { MatchPattern } from '@webext-core/match-patterns';\n\nexport function reloadContentScript(contentScript: Manifest.ContentScript) {\n const manifest = browser.runtime.getManifest();\n if (manifest.manifest_version == 2) {\n void reloadContentScriptMv2(contentScript);\n } else {\n void reloadContentScriptMv3(contentScript);\n }\n}\n\nexport async function reloadContentScriptMv3(\n contentScript: Manifest.ContentScript,\n) {\n const id = `wxt:${contentScript.js![0]}`;\n logger.log('Reloading content script:', contentScript);\n const registered = await browser.scripting.getRegisteredContentScripts();\n logger.debug('Existing scripts:', registered);\n\n const existing = registered.find((cs) => cs.id === id);\n\n if (existing) {\n logger.debug('Updating content script', existing);\n await browser.scripting.updateContentScripts([{ ...contentScript, id }]);\n } else {\n logger.debug('Registering new content script...');\n await browser.scripting.registerContentScripts([{ ...contentScript, id }]);\n }\n\n const allTabs = await browser.tabs.query({});\n const matchPatterns = contentScript.matches.map(\n (match) => new MatchPattern(match),\n );\n const matchingTabs = allTabs.filter((tab) => {\n const url = tab.url;\n if (!url) return false;\n return !!matchPatterns.find((pattern) => pattern.includes(url));\n });\n await Promise.all(matchingTabs.map((tab) => browser.tabs.reload(tab.id)));\n}\n\nexport async function reloadContentScriptMv2(\n contentScript: Manifest.ContentScript,\n) {\n throw Error('TODO: reloadContentScriptMv2');\n}\n"],"mappings":"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","names":["browser","browser","browser","browser"]}
@@ -178,7 +178,10 @@ var ContentScriptContext = class _ContentScriptContext extends AbortController {
178
178
  const ctx = new ContentScriptContext(__ENTRYPOINT__, options);
179
179
  await main(ctx);
180
180
  } catch (err) {
181
- logger.error("The content script crashed on startup!", err);
181
+ logger.error(
182
+ `The content script "${__ENTRYPOINT__}" crashed on startup!`,
183
+ err
184
+ );
182
185
  }
183
186
  })();
184
187
  //# sourceMappingURL=content-script-entrypoint.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/client/virtual-modules/content-script-entrypoint.ts","../../src/client/utils/logger.ts","../../src/client/browser.ts","../../src/client/utils/ContentScriptContext.ts"],"sourcesContent":["import definition from 'virtual:user-content-script';\nimport { logger } from '../utils/logger';\nimport { ContentScriptContext } from '../utils/ContentScriptContext';\n\n(async () => {\n try {\n const { main, ...options } = definition;\n const ctx = new ContentScriptContext(__ENTRYPOINT__, options);\n\n await main(ctx);\n } catch (err) {\n logger.error('The content script crashed on startup!', err);\n }\n})();\n","function print(method: (...args: any[]) => void, ...args: any[]) {\n if (import.meta.env.MODE === 'production') return;\n\n if (typeof args[0] === 'string') {\n const message = args.shift();\n method(`[wxt] ${message}`, ...args);\n } else {\n method('[wxt]', ...args);\n }\n}\n\n/**\n * Wrapper around `console` with a \"[wxt]\" prefix\n */\nexport const logger = {\n debug: (...args: any[]) => print(console.debug, ...args),\n log: (...args: any[]) => print(console.log, ...args),\n warn: (...args: any[]) => print(console.warn, ...args),\n error: (...args: any[]) => print(console.error, ...args),\n};\n","import originalBrowser, { Browser, Runtime, I18n } from 'webextension-polyfill';\n\nexport interface AugmentedBrowser extends Browser {\n runtime: WxtRuntime;\n i18n: WxtI18n;\n}\n\nexport interface WxtRuntime extends Runtime.Static {\n // Overriden per-project\n}\n\nexport interface WxtI18n extends I18n.Static {\n // Overriden per-project\n}\n\nexport const browser: AugmentedBrowser = originalBrowser;\n","import { ContentScriptDefinition } from '../../core/types';\nimport { browser } from '../browser';\nimport { logger } from './logger';\n\n/**\n * Extends [`AbortController`](https://developer.mozilla.org/en-US/docs/Web/API/AbortController).\n * Used to detect and stop content script code when the script is invalidated.\n *\n * It also provides several utilities like `ctx.setTimeout` and `ctx.setInterval` that should be used in\n * content scripts instead of `window.setTimeout` or `window.setInterval`.\n */\nexport class ContentScriptContext extends AbortController {\n static SCRIPT_STARTED_MESSAGE_TYPE = 'wxt:content-script-started';\n\n #isTopFrame = window.self === window.top;\n\n constructor(\n private readonly contentScriptName: string,\n public readonly options?: Omit<ContentScriptDefinition, 'main'>,\n ) {\n super();\n\n if (this.#isTopFrame) {\n this.#stopOldScripts();\n }\n this.setTimeout(() => {\n // Run on next tick so the listener it adds isn't triggered by stopOldScript\n this.#listenForNewerScripts();\n });\n }\n\n get isInvalid(): boolean {\n if (browser.runtime.id == null) {\n this.notifyInvalidated(); // Sets `signal.aborted` to true\n }\n return this.signal.aborted;\n }\n\n get isValid(): boolean {\n return !this.isInvalid;\n }\n\n /**\n * Add a listener that is called when the content script's context is invalidated.\n *\n * @returns A function to remove the listener.\n *\n * @example\n * browser.runtime.onMessage.addListener(cb);\n * const removeInvalidatedListener = ctx.onInvalidated(() => {\n * browser.runtime.onMessage.removeListener(cb);\n * })\n * // ...\n * removeInvalidatedListener();\n */\n onInvalidated(cb: () => void): () => void {\n this.signal.addEventListener('abort', cb);\n return () => this.signal.removeEventListener('abort', cb);\n }\n\n /**\n * Return a promise that never resolves. Useful if you have an async function that shouldn't run\n * after the context is expired.\n *\n * @example\n * const getValueFromStorage = async () => {\n * if (ctx.isInvalid) return ctx.block();\n *\n * // ...\n * }\n */\n block<T>(): Promise<T> {\n return new Promise(() => {\n // noop\n });\n }\n\n /**\n * Wrapper around `window.setInterval` that automatically clears the interval when invalidated.\n */\n setInterval(handler: () => void, timeout?: number): number {\n const id = setInterval(() => {\n if (this.isValid) handler();\n }, timeout) as unknown as number;\n this.onInvalidated(() => clearInterval(id));\n return id;\n }\n\n /**\n * Wrapper around `window.setTimeout` that automatically clears the interval when invalidated.\n */\n setTimeout(handler: () => void, timeout?: number): number {\n const id = setTimeout(() => {\n if (this.isValid) handler();\n }, timeout) as unknown as number;\n this.onInvalidated(() => clearTimeout(id));\n return id;\n }\n\n /**\n * Wrapper around `window.requestAnimationFrame` that automatically cancels the request when\n * invalidated.\n */\n requestAnimationFrame(callback: FrameRequestCallback): number {\n const id = requestAnimationFrame((...args) => {\n if (this.isValid) callback(...args);\n });\n\n this.onInvalidated(() => cancelAnimationFrame(id));\n return id;\n }\n\n /**\n * Wrapper around `window.requestIdleCallback` that automatically cancels the request when\n * invalidated.\n */\n requestIdleCallback(\n callback: IdleRequestCallback,\n options?: IdleRequestOptions,\n ): number {\n const id = requestIdleCallback((...args) => {\n if (!this.signal.aborted) callback(...args);\n }, options);\n\n this.onInvalidated(() => cancelIdleCallback(id));\n return id;\n }\n\n /**\n * Call `target.addEventListener` and remove the event listener when the context is invalidated.\n *\n * @example\n * ctx.addEventListener(window, \"mousemove\", () => {\n * // ...\n * });\n * ctx.addEventListener(document, \"visibilitychange\", () => {\n * // ...\n * });\n */\n addEventListener(\n target: any,\n type: string,\n handler: (event: Event) => void,\n options?: AddEventListenerOptions,\n ) {\n target.addEventListener?.(type, handler, options);\n this.onInvalidated(\n () => target.removeEventListener?.(type, handler, options),\n );\n }\n\n /**\n * Abort the abort controller and execute all `onInvalidated` listeners.\n */\n notifyInvalidated() {\n this.abort('Content script context invalidated');\n logger.debug(\n `Content script \"${this.contentScriptName}\" context invalidated`,\n );\n }\n\n #stopOldScripts() {\n // Use postMessage so it get's sent to all the frames of the page.\n window.postMessage(\n {\n event: ContentScriptContext.SCRIPT_STARTED_MESSAGE_TYPE,\n contentScriptName: this.contentScriptName,\n },\n '*',\n );\n }\n\n #listenForNewerScripts() {\n const cb = (event: MessageEvent) => {\n if (\n event.data?.type === ContentScriptContext.SCRIPT_STARTED_MESSAGE_TYPE &&\n event.data?.contentScriptName === this.contentScriptName\n ) {\n this.notifyInvalidated();\n }\n };\n\n addEventListener('message', cb);\n this.onInvalidated(() => removeEventListener('message', cb));\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/client/virtual-modules/content-script-entrypoint.ts","../../src/client/utils/logger.ts","../../src/client/browser.ts","../../src/client/utils/ContentScriptContext.ts"],"sourcesContent":["import definition from 'virtual:user-content-script';\nimport { logger } from '../utils/logger';\nimport { ContentScriptContext } from '../utils/ContentScriptContext';\n\n(async () => {\n try {\n const { main, ...options } = definition;\n const ctx = new ContentScriptContext(__ENTRYPOINT__, options);\n\n await main(ctx);\n } catch (err) {\n logger.error(\n `The content script \"${__ENTRYPOINT__}\" crashed on startup!`,\n err,\n );\n }\n})();\n","function print(method: (...args: any[]) => void, ...args: any[]) {\n if (import.meta.env.MODE === 'production') return;\n\n if (typeof args[0] === 'string') {\n const message = args.shift();\n method(`[wxt] ${message}`, ...args);\n } else {\n method('[wxt]', ...args);\n }\n}\n\n/**\n * Wrapper around `console` with a \"[wxt]\" prefix\n */\nexport const logger = {\n debug: (...args: any[]) => print(console.debug, ...args),\n log: (...args: any[]) => print(console.log, ...args),\n warn: (...args: any[]) => print(console.warn, ...args),\n error: (...args: any[]) => print(console.error, ...args),\n};\n","import originalBrowser, { Browser, Runtime, I18n } from 'webextension-polyfill';\n\nexport interface AugmentedBrowser extends Browser {\n runtime: WxtRuntime;\n i18n: WxtI18n;\n}\n\nexport interface WxtRuntime extends Runtime.Static {\n // Overriden per-project\n}\n\nexport interface WxtI18n extends I18n.Static {\n // Overriden per-project\n}\n\nexport const browser: AugmentedBrowser = originalBrowser;\n","import { ContentScriptDefinition } from '../../core/types';\nimport { browser } from '../browser';\nimport { logger } from './logger';\n\n/**\n * Extends [`AbortController`](https://developer.mozilla.org/en-US/docs/Web/API/AbortController).\n * Used to detect and stop content script code when the script is invalidated.\n *\n * It also provides several utilities like `ctx.setTimeout` and `ctx.setInterval` that should be used in\n * content scripts instead of `window.setTimeout` or `window.setInterval`.\n */\nexport class ContentScriptContext extends AbortController {\n static SCRIPT_STARTED_MESSAGE_TYPE = 'wxt:content-script-started';\n\n #isTopFrame = window.self === window.top;\n\n constructor(\n private readonly contentScriptName: string,\n public readonly options?: Omit<ContentScriptDefinition, 'main'>,\n ) {\n super();\n\n if (this.#isTopFrame) {\n this.#stopOldScripts();\n }\n this.setTimeout(() => {\n // Run on next tick so the listener it adds isn't triggered by stopOldScript\n this.#listenForNewerScripts();\n });\n }\n\n get isInvalid(): boolean {\n if (browser.runtime.id == null) {\n this.notifyInvalidated(); // Sets `signal.aborted` to true\n }\n return this.signal.aborted;\n }\n\n get isValid(): boolean {\n return !this.isInvalid;\n }\n\n /**\n * Add a listener that is called when the content script's context is invalidated.\n *\n * @returns A function to remove the listener.\n *\n * @example\n * browser.runtime.onMessage.addListener(cb);\n * const removeInvalidatedListener = ctx.onInvalidated(() => {\n * browser.runtime.onMessage.removeListener(cb);\n * })\n * // ...\n * removeInvalidatedListener();\n */\n onInvalidated(cb: () => void): () => void {\n this.signal.addEventListener('abort', cb);\n return () => this.signal.removeEventListener('abort', cb);\n }\n\n /**\n * Return a promise that never resolves. Useful if you have an async function that shouldn't run\n * after the context is expired.\n *\n * @example\n * const getValueFromStorage = async () => {\n * if (ctx.isInvalid) return ctx.block();\n *\n * // ...\n * }\n */\n block<T>(): Promise<T> {\n return new Promise(() => {\n // noop\n });\n }\n\n /**\n * Wrapper around `window.setInterval` that automatically clears the interval when invalidated.\n */\n setInterval(handler: () => void, timeout?: number): number {\n const id = setInterval(() => {\n if (this.isValid) handler();\n }, timeout) as unknown as number;\n this.onInvalidated(() => clearInterval(id));\n return id;\n }\n\n /**\n * Wrapper around `window.setTimeout` that automatically clears the interval when invalidated.\n */\n setTimeout(handler: () => void, timeout?: number): number {\n const id = setTimeout(() => {\n if (this.isValid) handler();\n }, timeout) as unknown as number;\n this.onInvalidated(() => clearTimeout(id));\n return id;\n }\n\n /**\n * Wrapper around `window.requestAnimationFrame` that automatically cancels the request when\n * invalidated.\n */\n requestAnimationFrame(callback: FrameRequestCallback): number {\n const id = requestAnimationFrame((...args) => {\n if (this.isValid) callback(...args);\n });\n\n this.onInvalidated(() => cancelAnimationFrame(id));\n return id;\n }\n\n /**\n * Wrapper around `window.requestIdleCallback` that automatically cancels the request when\n * invalidated.\n */\n requestIdleCallback(\n callback: IdleRequestCallback,\n options?: IdleRequestOptions,\n ): number {\n const id = requestIdleCallback((...args) => {\n if (!this.signal.aborted) callback(...args);\n }, options);\n\n this.onInvalidated(() => cancelIdleCallback(id));\n return id;\n }\n\n /**\n * Call `target.addEventListener` and remove the event listener when the context is invalidated.\n *\n * @example\n * ctx.addEventListener(window, \"mousemove\", () => {\n * // ...\n * });\n * ctx.addEventListener(document, \"visibilitychange\", () => {\n * // ...\n * });\n */\n addEventListener(\n target: any,\n type: string,\n handler: (event: Event) => void,\n options?: AddEventListenerOptions,\n ) {\n target.addEventListener?.(type, handler, options);\n this.onInvalidated(\n () => target.removeEventListener?.(type, handler, options),\n );\n }\n\n /**\n * Abort the abort controller and execute all `onInvalidated` listeners.\n */\n notifyInvalidated() {\n this.abort('Content script context invalidated');\n logger.debug(\n `Content script \"${this.contentScriptName}\" context invalidated`,\n );\n }\n\n #stopOldScripts() {\n // Use postMessage so it get's sent to all the frames of the page.\n window.postMessage(\n {\n event: ContentScriptContext.SCRIPT_STARTED_MESSAGE_TYPE,\n contentScriptName: this.contentScriptName,\n },\n '*',\n );\n }\n\n #listenForNewerScripts() {\n const cb = (event: MessageEvent) => {\n if (\n event.data?.type === ContentScriptContext.SCRIPT_STARTED_MESSAGE_TYPE &&\n event.data?.contentScriptName === this.contentScriptName\n ) {\n this.notifyInvalidated();\n }\n };\n\n addEventListener('message', cb);\n this.onInvalidated(() => removeEventListener('message', cb));\n }\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,33 @@
1
+ // src/client/virtual-modules/unlisted-script-entrypoint.ts
2
+ import definition from "virtual:user-unlisted-script";
3
+
4
+ // src/client/utils/logger.ts
5
+ function print(method, ...args) {
6
+ if (import.meta.env.MODE === "production")
7
+ return;
8
+ if (typeof args[0] === "string") {
9
+ const message = args.shift();
10
+ method(`[wxt] ${message}`, ...args);
11
+ } else {
12
+ method("[wxt]", ...args);
13
+ }
14
+ }
15
+ var logger = {
16
+ debug: (...args) => print(console.debug, ...args),
17
+ log: (...args) => print(console.log, ...args),
18
+ warn: (...args) => print(console.warn, ...args),
19
+ error: (...args) => print(console.error, ...args)
20
+ };
21
+
22
+ // src/client/virtual-modules/unlisted-script-entrypoint.ts
23
+ (async () => {
24
+ try {
25
+ await definition.main();
26
+ } catch (err) {
27
+ logger.error(
28
+ `The unlisted script "${__ENTRYPOINT__}" crashed on startup!`,
29
+ err
30
+ );
31
+ }
32
+ })();
33
+ //# sourceMappingURL=unlisted-script-entrypoint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/client/virtual-modules/unlisted-script-entrypoint.ts","../../src/client/utils/logger.ts"],"sourcesContent":["import definition from 'virtual:user-unlisted-script';\nimport { logger } from '../utils/logger';\n\n(async () => {\n try {\n await definition.main();\n } catch (err) {\n logger.error(\n `The unlisted script \"${__ENTRYPOINT__}\" crashed on startup!`,\n err,\n );\n }\n})();\n","function print(method: (...args: any[]) => void, ...args: any[]) {\n if (import.meta.env.MODE === 'production') return;\n\n if (typeof args[0] === 'string') {\n const message = args.shift();\n method(`[wxt] ${message}`, ...args);\n } else {\n method('[wxt]', ...args);\n }\n}\n\n/**\n * Wrapper around `console` with a \"[wxt]\" prefix\n */\nexport const logger = {\n debug: (...args: any[]) => print(console.debug, ...args),\n log: (...args: any[]) => print(console.log, ...args),\n warn: (...args: any[]) => print(console.warn, ...args),\n error: (...args: any[]) => print(console.error, ...args),\n};\n"],"mappings":";AAAA,OAAO,gBAAgB;;;ACAvB,SAAS,MAAM,WAAqC,MAAa;AAC/D,MAAI,YAAY,IAAI,SAAS;AAAc;AAE3C,MAAI,OAAO,KAAK,CAAC,MAAM,UAAU;AAC/B,UAAM,UAAU,KAAK,MAAM;AAC3B,WAAO,SAAS,OAAO,IAAI,GAAG,IAAI;AAAA,EACpC,OAAO;AACL,WAAO,SAAS,GAAG,IAAI;AAAA,EACzB;AACF;AAKO,IAAM,SAAS;AAAA,EACpB,OAAO,IAAI,SAAgB,MAAM,QAAQ,OAAO,GAAG,IAAI;AAAA,EACvD,KAAK,IAAI,SAAgB,MAAM,QAAQ,KAAK,GAAG,IAAI;AAAA,EACnD,MAAM,IAAI,SAAgB,MAAM,QAAQ,MAAM,GAAG,IAAI;AAAA,EACrD,OAAO,IAAI,SAAgB,MAAM,QAAQ,OAAO,GAAG,IAAI;AACzD;;;CDhBC,YAAY;AACX,MAAI;AACF,UAAM,WAAW,KAAK;AAAA,EACxB,SAAS,KAAK;AACZ,WAAO;AAAA,MACL,wBAAwB,cAAc;AAAA,MACtC;AAAA,IACF;AAAA,EACF;AACF,GAAG;","names":[]}
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "wxt",
3
3
  "type": "module",
4
- "version": "0.7.4",
4
+ "version": "0.8.0",
5
5
  "description": "Next gen framework for developing web extensions",
6
6
  "engines": {
7
- "node": ">=18.16.0",
7
+ "node": ">=18",
8
8
  "pnpm": ">=8"
9
9
  },
10
10
  "repository": {
@@ -44,6 +44,10 @@
44
44
  "import": "./dist/client.js",
45
45
  "types": "./dist/client.d.ts"
46
46
  },
47
+ "./sandbox": {
48
+ "import": "./dist/sandbox.js",
49
+ "types": "./dist/sandbox.d.ts"
50
+ },
47
51
  "./browser": {
48
52
  "import": "./dist/browser.js",
49
53
  "types": "./dist/browser.d.ts"
@@ -75,7 +79,7 @@
75
79
  "prompts": "^2.4.2",
76
80
  "rollup-plugin-visualizer": "^5.9.2",
77
81
  "unimport": "^3.1.0",
78
- "vite": "^4.4.7",
82
+ "vite": "^4.4.11",
79
83
  "web-ext-run": "^0.1.0",
80
84
  "webextension-polyfill": "^0.10.0",
81
85
  "zip-dir": "^2.0.0"
@@ -84,9 +88,9 @@
84
88
  "@faker-js/faker": "^8.0.2",
85
89
  "@types/fs-extra": "^11.0.1",
86
90
  "@types/lodash.merge": "^4.6.7",
87
- "@types/node": "^20.4.5",
91
+ "@types/node": "^20.8.6",
88
92
  "@types/prompts": "^2.4.4",
89
- "@vitest/coverage-v8": "^0.34.1",
93
+ "@vitest/coverage-v8": "^0.34.6",
90
94
  "execa": "^7.2.0",
91
95
  "jsdom": "^22.1.0",
92
96
  "lint-staged": "^14.0.0",
@@ -99,8 +103,8 @@
99
103
  "tsx": "^3.12.7",
100
104
  "typescript": "^5.2.2",
101
105
  "vitepress": "1.0.0-rc.10",
102
- "vitest": "^0.34.1",
103
- "vitest-mock-extended": "^1.1.4",
106
+ "vitest": "^0.34.6",
107
+ "vitest-mock-extended": "^1.3.1",
104
108
  "vue": "^3.3.4",
105
109
  "webextension-polyfill": "^0.10.0"
106
110
  },