wxt 0.20.13 → 0.20.14

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.
Files changed (278) hide show
  1. package/dist/browser.d.mts +20 -0
  2. package/dist/browser.mjs +18 -3
  3. package/dist/builtin-modules/index.mjs +7 -2
  4. package/dist/builtin-modules/unimport.mjs +69 -75
  5. package/dist/cli/cli-utils.mjs +52 -50
  6. package/dist/cli/commands.mjs +77 -103
  7. package/dist/cli/index.d.mts +1 -0
  8. package/dist/cli/index.mjs +9 -4
  9. package/dist/core/{build.d.ts → build.d.mts} +6 -2
  10. package/dist/core/build.mjs +23 -4
  11. package/dist/core/builders/vite/index.mjs +292 -343
  12. package/dist/core/builders/vite/plugins/bundleAnalysis.mjs +11 -12
  13. package/dist/core/builders/vite/plugins/cssEntrypoints.mjs +27 -20
  14. package/dist/core/builders/vite/plugins/defineImportMeta.mjs +17 -12
  15. package/dist/core/builders/vite/plugins/devHtmlPrerender.mjs +104 -136
  16. package/dist/core/builders/vite/plugins/devServerGlobals.mjs +15 -14
  17. package/dist/core/builders/vite/plugins/download.mjs +23 -12
  18. package/dist/core/builders/vite/plugins/entrypointGroupGlobals.mjs +18 -14
  19. package/dist/core/builders/vite/plugins/extensionApiMock.mjs +31 -33
  20. package/dist/core/builders/vite/plugins/globals.mjs +14 -13
  21. package/dist/core/builders/vite/plugins/iifeFooter.mjs +17 -11
  22. package/dist/core/builders/vite/plugins/index.mjs +18 -16
  23. package/dist/core/builders/vite/plugins/noopBackground.mjs +21 -15
  24. package/dist/core/builders/vite/plugins/removeEntrypointMainFunction.mjs +25 -23
  25. package/dist/core/builders/vite/plugins/resolveAppConfig.mjs +25 -23
  26. package/dist/core/builders/vite/plugins/resolveVirtualModules.mjs +27 -26
  27. package/dist/core/builders/vite/plugins/tsconfigPaths.mjs +11 -11
  28. package/dist/core/builders/vite/plugins/wxtPluginLoader.mjs +41 -47
  29. package/dist/core/{clean.d.ts → clean.d.mts} +7 -3
  30. package/dist/core/clean.mjs +38 -35
  31. package/dist/core/{create-server.d.ts → create-server.d.mts} +6 -2
  32. package/dist/core/create-server.mjs +236 -247
  33. package/dist/core/define-config.d.mts +6 -0
  34. package/dist/core/define-config.mjs +6 -2
  35. package/dist/core/define-web-ext-config.d.mts +13 -0
  36. package/dist/core/define-web-ext-config.mjs +16 -7
  37. package/dist/core/generate-wxt-dir.mjs +109 -148
  38. package/dist/core/index.d.mts +8 -0
  39. package/dist/core/index.mjs +10 -8
  40. package/dist/core/initialize.d.mts +8 -0
  41. package/dist/core/initialize.mjs +110 -124
  42. package/dist/core/keyboard-shortcuts.mjs +30 -28
  43. package/dist/core/package-managers/bun.mjs +18 -16
  44. package/dist/core/package-managers/deno.mjs +12 -8
  45. package/dist/core/package-managers/index.mjs +52 -60
  46. package/dist/core/package-managers/npm.mjs +51 -52
  47. package/dist/core/package-managers/pnpm.mjs +21 -18
  48. package/dist/core/package-managers/yarn.mjs +31 -28
  49. package/dist/core/prepare.d.mts +6 -0
  50. package/dist/core/prepare.mjs +12 -7
  51. package/dist/core/resolve-config.mjs +393 -462
  52. package/dist/core/runners/index.mjs +11 -6
  53. package/dist/core/runners/manual.mjs +16 -14
  54. package/dist/core/runners/safari.mjs +16 -14
  55. package/dist/core/runners/web-ext.mjs +62 -83
  56. package/dist/core/runners/wsl.mjs +16 -14
  57. package/dist/core/utils/arrays.mjs +23 -12
  58. package/dist/core/utils/building/build-entrypoints.mjs +44 -40
  59. package/dist/core/utils/building/detect-dev-changes.mjs +84 -105
  60. package/dist/core/utils/building/find-entrypoints.mjs +275 -359
  61. package/dist/core/utils/building/group-entrypoints.mjs +42 -35
  62. package/dist/core/utils/building/index.mjs +8 -6
  63. package/dist/core/utils/building/internal-build.mjs +87 -102
  64. package/dist/core/utils/building/rebuild.mjs +50 -30
  65. package/dist/core/utils/cache.mjs +29 -18
  66. package/dist/core/utils/constants.mjs +9 -1
  67. package/dist/core/utils/content-scripts.mjs +56 -54
  68. package/dist/core/utils/content-security-policy.mjs +36 -39
  69. package/dist/core/utils/entrypoints.mjs +51 -28
  70. package/dist/core/utils/env.mjs +22 -17
  71. package/dist/core/utils/environments/browser-environment.mjs +13 -12
  72. package/dist/core/utils/environments/environment.mjs +36 -33
  73. package/dist/core/utils/environments/extension-environment.mjs +15 -10
  74. package/dist/core/utils/environments/index.mjs +4 -2
  75. package/dist/core/utils/eslint.mjs +11 -10
  76. package/dist/core/utils/fs.mjs +23 -11
  77. package/dist/core/utils/globals.mjs +53 -51
  78. package/dist/core/utils/i18n.mjs +41 -32
  79. package/dist/core/utils/log/index.mjs +6 -4
  80. package/dist/core/utils/log/printBuildSummary.mjs +20 -25
  81. package/dist/core/utils/log/printFileList.mjs +30 -33
  82. package/dist/core/utils/log/printHeader.mjs +10 -5
  83. package/dist/core/utils/log/printTable.mjs +19 -21
  84. package/dist/core/utils/manifest.mjs +364 -479
  85. package/dist/core/utils/minimatch-multiple.mjs +26 -15
  86. package/dist/core/utils/network.mjs +30 -33
  87. package/dist/core/utils/number.mjs +7 -3
  88. package/dist/core/utils/package.mjs +20 -13
  89. package/dist/core/utils/paths.mjs +26 -7
  90. package/dist/core/utils/strings.mjs +19 -14
  91. package/dist/core/utils/syntax-errors.mjs +14 -16
  92. package/dist/core/utils/time.mjs +19 -15
  93. package/dist/core/utils/transform.mjs +129 -160
  94. package/dist/core/utils/types.d.mts +6 -0
  95. package/dist/core/utils/validation.mjs +43 -50
  96. package/dist/core/utils/virtual-modules.mjs +20 -12
  97. package/dist/core/utils/wsl.mjs +10 -3
  98. package/dist/core/wxt.mjs +66 -60
  99. package/dist/core/{zip.d.ts → zip.d.mts} +6 -2
  100. package/dist/core/zip.mjs +116 -140
  101. package/dist/index.d.mts +12 -0
  102. package/dist/index.mjs +12 -3
  103. package/dist/{modules.d.ts → modules.d.mts} +14 -16
  104. package/dist/modules.mjs +181 -51
  105. package/dist/testing/fake-browser.d.mts +2 -0
  106. package/dist/testing/fake-browser.mjs +3 -1
  107. package/dist/testing/index.d.mts +3 -0
  108. package/dist/testing/index.mjs +4 -2
  109. package/dist/testing/{wxt-vitest-plugin.d.ts → wxt-vitest-plugin.d.mts} +7 -9
  110. package/dist/testing/wxt-vitest-plugin.mjs +38 -19
  111. package/dist/types.d.mts +1453 -0
  112. package/dist/utils/app-config.d.mts +6 -0
  113. package/dist/utils/app-config.mjs +8 -2
  114. package/dist/utils/content-script-context.d.mts +137 -0
  115. package/dist/utils/content-script-context.mjs +192 -175
  116. package/dist/utils/content-script-ui/iframe.d.mts +42 -0
  117. package/dist/utils/content-script-ui/iframe.mjs +42 -27
  118. package/dist/utils/content-script-ui/integrated.d.mts +37 -0
  119. package/dist/utils/content-script-ui/integrated.mjs +36 -29
  120. package/dist/utils/content-script-ui/shadow-root.d.mts +80 -0
  121. package/dist/utils/content-script-ui/shadow-root.mjs +75 -82
  122. package/dist/utils/content-script-ui/shared.mjs +117 -150
  123. package/dist/utils/content-script-ui/types.d.mts +107 -0
  124. package/dist/utils/content-script-ui/types.mjs +1 -0
  125. package/dist/utils/{define-app-config.d.ts → define-app-config.d.mts} +5 -3
  126. package/dist/utils/define-app-config.mjs +22 -2
  127. package/dist/utils/define-background.d.mts +7 -0
  128. package/dist/utils/define-background.mjs +7 -3
  129. package/dist/utils/define-content-script.d.mts +6 -0
  130. package/dist/utils/define-content-script.mjs +6 -2
  131. package/dist/utils/define-unlisted-script.d.mts +7 -0
  132. package/dist/utils/define-unlisted-script.mjs +7 -3
  133. package/dist/utils/define-wxt-plugin.d.mts +6 -0
  134. package/dist/utils/define-wxt-plugin.mjs +6 -2
  135. package/dist/utils/inject-script.d.mts +41 -0
  136. package/dist/utils/inject-script.mjs +44 -34
  137. package/dist/utils/internal/custom-events.d.mts +9 -0
  138. package/dist/utils/internal/custom-events.mjs +18 -10
  139. package/dist/utils/internal/location-watcher.mjs +23 -20
  140. package/dist/utils/internal/logger.mjs +15 -12
  141. package/dist/utils/match-patterns.d.mts +1 -0
  142. package/dist/utils/match-patterns.mjs +3 -1
  143. package/dist/utils/{split-shadow-root-css.d.ts → split-shadow-root-css.d.mts} +6 -3
  144. package/dist/utils/split-shadow-root-css.mjs +16 -7
  145. package/dist/utils/storage.d.mts +1 -0
  146. package/dist/utils/storage.mjs +3 -1
  147. package/dist/version.d.mts +4 -0
  148. package/dist/version.mjs +5 -1
  149. package/dist/virtual/background-entrypoint.d.mts +4 -0
  150. package/dist/virtual/background-entrypoint.mjs +146 -161
  151. package/dist/virtual/content-script-isolated-world-entrypoint.d.mts +4 -0
  152. package/dist/virtual/content-script-isolated-world-entrypoint.mjs +26 -27
  153. package/dist/virtual/content-script-main-world-entrypoint.d.mts +4 -0
  154. package/dist/virtual/content-script-main-world-entrypoint.mjs +24 -24
  155. package/dist/virtual/mock-browser.d.mts +6 -0
  156. package/dist/virtual/mock-browser.mjs +5 -3
  157. package/dist/virtual/reload-html.d.mts +1 -0
  158. package/dist/virtual/reload-html.mjs +60 -53
  159. package/dist/virtual/unlisted-script-entrypoint.d.mts +4 -0
  160. package/dist/virtual/unlisted-script-entrypoint.mjs +35 -43
  161. package/package.json +47 -49
  162. package/dist/browser.d.ts +0 -30
  163. package/dist/builtin-modules/index.d.ts +0 -2
  164. package/dist/builtin-modules/unimport.d.ts +0 -5
  165. package/dist/cli/cli-utils.d.ts +0 -25
  166. package/dist/cli/commands.d.ts +0 -2
  167. package/dist/cli/index.d.ts +0 -1
  168. package/dist/core/builders/vite/index.d.ts +0 -7
  169. package/dist/core/builders/vite/plugins/bundleAnalysis.d.ts +0 -7
  170. package/dist/core/builders/vite/plugins/cssEntrypoints.d.ts +0 -13
  171. package/dist/core/builders/vite/plugins/defineImportMeta.d.ts +0 -14
  172. package/dist/core/builders/vite/plugins/devHtmlPrerender.d.ts +0 -7
  173. package/dist/core/builders/vite/plugins/devServerGlobals.d.ts +0 -6
  174. package/dist/core/builders/vite/plugins/download.d.ts +0 -10
  175. package/dist/core/builders/vite/plugins/entrypointGroupGlobals.d.ts +0 -6
  176. package/dist/core/builders/vite/plugins/extensionApiMock.d.ts +0 -6
  177. package/dist/core/builders/vite/plugins/globals.d.ts +0 -3
  178. package/dist/core/builders/vite/plugins/iifeFooter.d.ts +0 -8
  179. package/dist/core/builders/vite/plugins/index.d.ts +0 -16
  180. package/dist/core/builders/vite/plugins/noopBackground.d.ts +0 -6
  181. package/dist/core/builders/vite/plugins/removeEntrypointMainFunction.d.ts +0 -6
  182. package/dist/core/builders/vite/plugins/resolveAppConfig.d.ts +0 -6
  183. package/dist/core/builders/vite/plugins/resolveVirtualModules.d.ts +0 -6
  184. package/dist/core/builders/vite/plugins/tsconfigPaths.d.ts +0 -3
  185. package/dist/core/builders/vite/plugins/wxtPluginLoader.d.ts +0 -6
  186. package/dist/core/define-config.d.ts +0 -2
  187. package/dist/core/define-web-ext-config.d.ts +0 -9
  188. package/dist/core/generate-wxt-dir.d.ts +0 -5
  189. package/dist/core/index.d.ts +0 -8
  190. package/dist/core/initialize.d.ts +0 -5
  191. package/dist/core/keyboard-shortcuts.d.ts +0 -12
  192. package/dist/core/package-managers/bun.d.ts +0 -2
  193. package/dist/core/package-managers/deno.d.ts +0 -2
  194. package/dist/core/package-managers/index.d.ts +0 -2
  195. package/dist/core/package-managers/npm.d.ts +0 -17
  196. package/dist/core/package-managers/pnpm.d.ts +0 -2
  197. package/dist/core/package-managers/types.d.ts +0 -2
  198. package/dist/core/package-managers/types.mjs +0 -0
  199. package/dist/core/package-managers/yarn.d.ts +0 -2
  200. package/dist/core/prepare.d.ts +0 -2
  201. package/dist/core/resolve-config.d.ts +0 -11
  202. package/dist/core/runners/index.d.ts +0 -2
  203. package/dist/core/runners/manual.d.ts +0 -5
  204. package/dist/core/runners/safari.d.ts +0 -5
  205. package/dist/core/runners/web-ext.d.ts +0 -5
  206. package/dist/core/runners/wsl.d.ts +0 -5
  207. package/dist/core/utils/arrays.d.ts +0 -13
  208. package/dist/core/utils/building/build-entrypoints.d.ts +0 -3
  209. package/dist/core/utils/building/detect-dev-changes.d.ts +0 -61
  210. package/dist/core/utils/building/find-entrypoints.d.ts +0 -5
  211. package/dist/core/utils/building/group-entrypoints.d.ts +0 -8
  212. package/dist/core/utils/building/index.d.ts +0 -6
  213. package/dist/core/utils/building/internal-build.d.ts +0 -12
  214. package/dist/core/utils/building/rebuild.d.ts +0 -23
  215. package/dist/core/utils/cache.d.ts +0 -8
  216. package/dist/core/utils/cli.d.ts +0 -3
  217. package/dist/core/utils/cli.mjs +0 -26
  218. package/dist/core/utils/constants.d.ts +0 -5
  219. package/dist/core/utils/content-scripts.d.ts +0 -12
  220. package/dist/core/utils/content-security-policy.d.ts +0 -14
  221. package/dist/core/utils/entrypoints.d.ts +0 -31
  222. package/dist/core/utils/env.d.ts +0 -5
  223. package/dist/core/utils/environments/browser-environment.d.ts +0 -3
  224. package/dist/core/utils/environments/environment.d.ts +0 -8
  225. package/dist/core/utils/environments/extension-environment.d.ts +0 -6
  226. package/dist/core/utils/environments/index.d.ts +0 -2
  227. package/dist/core/utils/eslint.d.ts +0 -1
  228. package/dist/core/utils/fs.d.ts +0 -13
  229. package/dist/core/utils/globals.d.ts +0 -11
  230. package/dist/core/utils/i18n.d.ts +0 -11
  231. package/dist/core/utils/log/index.d.ts +0 -4
  232. package/dist/core/utils/log/printBuildSummary.d.ts +0 -2
  233. package/dist/core/utils/log/printFileList.d.ts +0 -1
  234. package/dist/core/utils/log/printHeader.d.ts +0 -1
  235. package/dist/core/utils/log/printTable.d.ts +0 -1
  236. package/dist/core/utils/manifest.d.ts +0 -40
  237. package/dist/core/utils/minimatch-multiple.d.ts +0 -15
  238. package/dist/core/utils/network.d.ts +0 -7
  239. package/dist/core/utils/number.d.ts +0 -1
  240. package/dist/core/utils/package.d.ts +0 -6
  241. package/dist/core/utils/paths.d.ts +0 -11
  242. package/dist/core/utils/strings.d.ts +0 -14
  243. package/dist/core/utils/syntax-errors.d.ts +0 -11
  244. package/dist/core/utils/testing/fake-objects.d.ts +0 -11665
  245. package/dist/core/utils/testing/fake-objects.mjs +0 -326
  246. package/dist/core/utils/time.d.ts +0 -9
  247. package/dist/core/utils/transform.d.ts +0 -11
  248. package/dist/core/utils/types.d.ts +0 -13
  249. package/dist/core/utils/types.mjs +0 -0
  250. package/dist/core/utils/validation.d.ts +0 -15
  251. package/dist/core/utils/virtual-modules.d.ts +0 -22
  252. package/dist/core/utils/wsl.d.ts +0 -4
  253. package/dist/core/wxt.d.ts +0 -24
  254. package/dist/index.d.ts +0 -11
  255. package/dist/testing/fake-browser.d.ts +0 -10
  256. package/dist/testing/index.d.ts +0 -10
  257. package/dist/types.d.ts +0 -1459
  258. package/dist/types.mjs +0 -0
  259. package/dist/utils/app-config.d.ts +0 -2
  260. package/dist/utils/content-script-context.d.ts +0 -134
  261. package/dist/utils/content-script-ui/iframe.d.ts +0 -32
  262. package/dist/utils/content-script-ui/integrated.d.ts +0 -34
  263. package/dist/utils/content-script-ui/shadow-root.d.ts +0 -76
  264. package/dist/utils/content-script-ui/shared.d.ts +0 -5
  265. package/dist/utils/content-script-ui/types.d.ts +0 -104
  266. package/dist/utils/define-background.d.ts +0 -4
  267. package/dist/utils/define-content-script.d.ts +0 -3
  268. package/dist/utils/define-unlisted-script.d.ts +0 -4
  269. package/dist/utils/define-wxt-plugin.d.ts +0 -3
  270. package/dist/utils/inject-script.d.ts +0 -36
  271. package/dist/utils/internal/custom-events.d.ts +0 -10
  272. package/dist/utils/internal/dev-server-websocket.d.ts +0 -21
  273. package/dist/utils/internal/dev-server-websocket.mjs +0 -37
  274. package/dist/utils/internal/location-watcher.d.ts +0 -12
  275. package/dist/utils/internal/logger.d.ts +0 -9
  276. package/dist/utils/match-patterns.d.ts +0 -5
  277. package/dist/utils/storage.d.ts +0 -5
  278. package/dist/version.d.ts +0 -1
@@ -1,264 +1,253 @@
1
- import { debounce } from "perfect-debounce";
2
- import chokidar from "chokidar";
1
+ import { unnormalizePath } from "./utils/paths.mjs";
3
2
  import { getEntrypointBundlePath, isHtmlEntrypoint } from "./utils/entrypoints.mjs";
4
- import {
5
- getContentScriptCssFiles,
6
- getContentScriptsCssMap
7
- } from "./utils/manifest.mjs";
8
- import {
9
- internalBuild,
10
- detectDevChanges,
11
- rebuild,
12
- findEntrypoints
13
- } from "./utils/building/index.mjs";
14
- import { createExtensionRunner } from "./runners/index.mjs";
15
- import { Mutex } from "async-mutex";
16
- import pc from "picocolors";
17
- import { relative } from "node:path";
18
3
  import { deinitWxtModules, initWxtModules, registerWxt, wxt } from "./wxt.mjs";
19
- import { unnormalizePath } from "./utils/paths.mjs";
20
- import {
21
- getContentScriptJs,
22
- mapWxtOptionsToRegisteredContentScript
23
- } from "./utils/content-scripts.mjs";
4
+ import { detectDevChanges } from "./utils/building/detect-dev-changes.mjs";
5
+ import { findEntrypoints } from "./utils/building/find-entrypoints.mjs";
6
+ import { getContentScriptJs, mapWxtOptionsToRegisteredContentScript } from "./utils/content-scripts.mjs";
7
+ import { getContentScriptCssFiles, getContentScriptsCssMap } from "./utils/manifest.mjs";
8
+ import { rebuild } from "./utils/building/rebuild.mjs";
9
+ import { internalBuild } from "./utils/building/internal-build.mjs";
10
+ import "./utils/building/index.mjs";
11
+ import { createExtensionRunner } from "./runners/index.mjs";
24
12
  import { createKeyboardShortcuts } from "./keyboard-shortcuts.mjs";
25
13
  import { isBabelSyntaxError, logBabelSyntaxError } from "./utils/syntax-errors.mjs";
26
- export async function createServer(inlineConfig) {
27
- await registerWxt("serve", inlineConfig);
28
- wxt.server = await createServerInternal();
29
- await wxt.hooks.callHook("server:created", wxt, wxt.server);
30
- return wxt.server;
14
+ import { relative } from "node:path";
15
+ import pc from "picocolors";
16
+ import { debounce } from "perfect-debounce";
17
+ import chokidar from "chokidar";
18
+ import { Mutex } from "async-mutex";
19
+
20
+ //#region src/core/create-server.ts
21
+ /**
22
+ * Creates a dev server and pre-builds all the files that need to exist before loading the extension.
23
+ *
24
+ * @example
25
+ * const server = await wxt.createServer({
26
+ * // Enter config...
27
+ * });
28
+ * await server.start();
29
+ */
30
+ async function createServer(inlineConfig) {
31
+ await registerWxt("serve", inlineConfig);
32
+ wxt.server = await createServerInternal();
33
+ await wxt.hooks.callHook("server:created", wxt, wxt.server);
34
+ return wxt.server;
31
35
  }
32
36
  async function createServerInternal() {
33
- const getServerInfo = () => {
34
- const { host, port, origin } = wxt.config.dev.server;
35
- return { host, port, origin };
36
- };
37
- let [runner, builderServer] = await Promise.all([
38
- createExtensionRunner(),
39
- wxt.builder.createServer(getServerInfo())
40
- ]);
41
- let wasStopped = false;
42
- const server = {
43
- get host() {
44
- return getServerInfo().host;
45
- },
46
- get port() {
47
- return getServerInfo().port;
48
- },
49
- get origin() {
50
- return getServerInfo().origin;
51
- },
52
- get watcher() {
53
- return builderServer.watcher;
54
- },
55
- get ws() {
56
- return builderServer.ws;
57
- },
58
- currentOutput: void 0,
59
- async start() {
60
- if (wasStopped) {
61
- await wxt.reloadConfig();
62
- runner = await createExtensionRunner();
63
- builderServer = await wxt.builder.createServer(getServerInfo());
64
- await initWxtModules();
65
- }
66
- await builderServer.listen();
67
- const hostInfo = server.host === "localhost" ? "" : ` (listening on ${server.host})`;
68
- wxt.logger.success(`Started dev server @ ${server.origin}${hostInfo}`);
69
- await wxt.hooks.callHook("server:started", wxt, server);
70
- server.ws.on("wxt:background-initialized", () => {
71
- if (server.currentOutput == null) return;
72
- reloadContentScripts(server.currentOutput.steps, server);
73
- });
74
- await buildAndOpenBrowser();
75
- const reloadOnChange = createFileReloader(server);
76
- server.watcher.on("all", async (...args) => {
77
- await reloadOnChange(args[0], args[1]);
78
- keyboardShortcuts.start();
79
- });
80
- keyboardShortcuts.printHelp({
81
- canReopenBrowser: !wxt.config.runnerConfig.config.disabled && !!runner.canOpen?.()
82
- });
83
- },
84
- async stop() {
85
- wasStopped = true;
86
- keyboardShortcuts.stop();
87
- await runner.closeBrowser();
88
- await builderServer.close();
89
- await wxt.hooks.callHook("server:closed", wxt, server);
90
- deinitWxtModules();
91
- server.currentOutput = void 0;
92
- },
93
- async restart() {
94
- await server.stop();
95
- await server.start();
96
- },
97
- transformHtml(url, html, originalUrl) {
98
- return builderServer.transformHtml(url, html, originalUrl);
99
- },
100
- reloadContentScript(payload) {
101
- server.ws.send("wxt:reload-content-script", payload);
102
- },
103
- reloadPage(path) {
104
- server.ws.send("wxt:reload-page", path);
105
- },
106
- reloadExtension() {
107
- server.ws.send("wxt:reload-extension");
108
- },
109
- async restartBrowser() {
110
- await runner.closeBrowser();
111
- keyboardShortcuts.stop();
112
- await wxt.reloadConfig();
113
- runner = await createExtensionRunner();
114
- await runner.openBrowser();
115
- keyboardShortcuts.start();
116
- }
117
- };
118
- const keyboardShortcuts = createKeyboardShortcuts(server);
119
- const buildAndOpenBrowser = async () => {
120
- try {
121
- server.currentOutput = await internalBuild();
122
- } catch (err) {
123
- if (!isBabelSyntaxError(err)) {
124
- throw err;
125
- }
126
- logBabelSyntaxError(err);
127
- wxt.logger.info("Waiting for syntax error to be fixed...");
128
- await new Promise((resolve) => {
129
- const watcher = chokidar.watch(err.id, { ignoreInitial: true });
130
- watcher.on("all", () => {
131
- watcher.close();
132
- wxt.logger.info("Syntax error resolved, rebuilding...");
133
- resolve();
134
- });
135
- });
136
- return buildAndOpenBrowser();
137
- }
138
- try {
139
- server.watcher.add(getExternalOutputDependencies(server));
140
- } catch (err) {
141
- wxt.config.logger.warn("Failed to register additional file paths:", err);
142
- }
143
- await runner.openBrowser();
144
- };
145
- builderServer.on?.("close", () => keyboardShortcuts.stop());
146
- return server;
37
+ const getServerInfo = () => {
38
+ const { host, port, origin } = wxt.config.dev.server;
39
+ return {
40
+ host,
41
+ port,
42
+ origin
43
+ };
44
+ };
45
+ let [runner, builderServer] = await Promise.all([createExtensionRunner(), wxt.builder.createServer(getServerInfo())]);
46
+ let wasStopped = false;
47
+ const server = {
48
+ get host() {
49
+ return getServerInfo().host;
50
+ },
51
+ get port() {
52
+ return getServerInfo().port;
53
+ },
54
+ get origin() {
55
+ return getServerInfo().origin;
56
+ },
57
+ get watcher() {
58
+ return builderServer.watcher;
59
+ },
60
+ get ws() {
61
+ return builderServer.ws;
62
+ },
63
+ currentOutput: void 0,
64
+ async start() {
65
+ if (wasStopped) {
66
+ await wxt.reloadConfig();
67
+ runner = await createExtensionRunner();
68
+ builderServer = await wxt.builder.createServer(getServerInfo());
69
+ await initWxtModules();
70
+ }
71
+ await builderServer.listen();
72
+ const hostInfo = server.host === "localhost" ? "" : ` (listening on ${server.host})`;
73
+ wxt.logger.success(`Started dev server @ ${server.origin}${hostInfo}`);
74
+ await wxt.hooks.callHook("server:started", wxt, server);
75
+ server.ws.on("wxt:background-initialized", () => {
76
+ if (server.currentOutput == null) return;
77
+ reloadContentScripts(server.currentOutput.steps, server);
78
+ });
79
+ await buildAndOpenBrowser();
80
+ const reloadOnChange = createFileReloader(server);
81
+ server.watcher.on("all", async (...args) => {
82
+ await reloadOnChange(args[0], args[1]);
83
+ keyboardShortcuts.start();
84
+ });
85
+ keyboardShortcuts.printHelp({ canReopenBrowser: !wxt.config.runnerConfig.config.disabled && !!runner.canOpen?.() });
86
+ },
87
+ async stop() {
88
+ wasStopped = true;
89
+ keyboardShortcuts.stop();
90
+ await runner.closeBrowser();
91
+ await builderServer.close();
92
+ await wxt.hooks.callHook("server:closed", wxt, server);
93
+ deinitWxtModules();
94
+ server.currentOutput = void 0;
95
+ },
96
+ async restart() {
97
+ await server.stop();
98
+ await server.start();
99
+ },
100
+ transformHtml(url, html, originalUrl) {
101
+ return builderServer.transformHtml(url, html, originalUrl);
102
+ },
103
+ reloadContentScript(payload) {
104
+ server.ws.send("wxt:reload-content-script", payload);
105
+ },
106
+ reloadPage(path) {
107
+ server.ws.send("wxt:reload-page", path);
108
+ },
109
+ reloadExtension() {
110
+ server.ws.send("wxt:reload-extension");
111
+ },
112
+ async restartBrowser() {
113
+ await runner.closeBrowser();
114
+ keyboardShortcuts.stop();
115
+ await wxt.reloadConfig();
116
+ runner = await createExtensionRunner();
117
+ await runner.openBrowser();
118
+ keyboardShortcuts.start();
119
+ }
120
+ };
121
+ const keyboardShortcuts = createKeyboardShortcuts(server);
122
+ const buildAndOpenBrowser = async () => {
123
+ try {
124
+ server.currentOutput = await internalBuild();
125
+ } catch (err) {
126
+ if (!isBabelSyntaxError(err)) throw err;
127
+ logBabelSyntaxError(err);
128
+ wxt.logger.info("Waiting for syntax error to be fixed...");
129
+ await new Promise((resolve) => {
130
+ const watcher = chokidar.watch(err.id, { ignoreInitial: true });
131
+ watcher.on("all", () => {
132
+ watcher.close();
133
+ wxt.logger.info("Syntax error resolved, rebuilding...");
134
+ resolve();
135
+ });
136
+ });
137
+ return buildAndOpenBrowser();
138
+ }
139
+ try {
140
+ server.watcher.add(getExternalOutputDependencies(server));
141
+ } catch (err) {
142
+ wxt.config.logger.warn("Failed to register additional file paths:", err);
143
+ }
144
+ await runner.openBrowser();
145
+ };
146
+ builderServer.on?.("close", () => keyboardShortcuts.stop());
147
+ return server;
147
148
  }
149
+ /**
150
+ * Returns a function responsible for reloading different parts of the extension when a file
151
+ * changes.
152
+ */
148
153
  function createFileReloader(server) {
149
- const fileChangedMutex = new Mutex();
150
- const changeQueue = [];
151
- const cb = async (event, path) => {
152
- changeQueue.push([event, path]);
153
- const reloading = fileChangedMutex.runExclusive(async () => {
154
- if (server.currentOutput == null) return;
155
- const fileChanges = changeQueue.splice(0, changeQueue.length).map(([_, file]) => file);
156
- if (fileChanges.length === 0) return;
157
- await wxt.reloadConfig();
158
- const changes = detectDevChanges(fileChanges, server.currentOutput);
159
- if (changes.type === "no-change") return;
160
- if (changes.type === "full-restart") {
161
- wxt.logger.info("Config changed, restarting server...");
162
- server.restart();
163
- return;
164
- }
165
- if (changes.type === "browser-restart") {
166
- wxt.logger.info("Runner config changed, restarting browser...");
167
- server.restartBrowser();
168
- return;
169
- }
170
- wxt.logger.info(
171
- `Changed: ${Array.from(new Set(fileChanges)).map((file) => pc.dim(relative(wxt.config.root, file))).join(", ")}`
172
- );
173
- const allEntrypoints = await findEntrypoints();
174
- try {
175
- const { output: newOutput } = await rebuild(
176
- allEntrypoints,
177
- // TODO: this excludes new entrypoints, so they're not built until the dev command is restarted
178
- changes.rebuildGroups,
179
- changes.cachedOutput
180
- );
181
- server.currentOutput = newOutput;
182
- switch (changes.type) {
183
- case "extension-reload":
184
- server.reloadExtension();
185
- wxt.logger.success(`Reloaded extension`);
186
- break;
187
- case "html-reload":
188
- const { reloadedNames } = reloadHtmlPages(
189
- changes.rebuildGroups,
190
- server
191
- );
192
- wxt.logger.success(`Reloaded: ${getFilenameList(reloadedNames)}`);
193
- break;
194
- case "content-script-reload":
195
- reloadContentScripts(changes.changedSteps, server);
196
- const rebuiltNames = changes.rebuildGroups.flat().map((entry) => entry.name);
197
- wxt.logger.success(`Reloaded: ${getFilenameList(rebuiltNames)}`);
198
- break;
199
- }
200
- } catch {
201
- }
202
- });
203
- await reloading.catch((error) => {
204
- if (!isBabelSyntaxError(error)) {
205
- throw error;
206
- }
207
- logBabelSyntaxError(error);
208
- });
209
- };
210
- return debounce(cb, wxt.config.dev.server.watchDebounce, {
211
- leading: true,
212
- trailing: false
213
- });
154
+ const fileChangedMutex = new Mutex();
155
+ const changeQueue = [];
156
+ const cb = async (event, path) => {
157
+ changeQueue.push([event, path]);
158
+ await fileChangedMutex.runExclusive(async () => {
159
+ if (server.currentOutput == null) return;
160
+ const fileChanges = changeQueue.splice(0, changeQueue.length).map(([_, file]) => file);
161
+ if (fileChanges.length === 0) return;
162
+ await wxt.reloadConfig();
163
+ const changes = detectDevChanges(fileChanges, server.currentOutput);
164
+ if (changes.type === "no-change") return;
165
+ if (changes.type === "full-restart") {
166
+ wxt.logger.info("Config changed, restarting server...");
167
+ server.restart();
168
+ return;
169
+ }
170
+ if (changes.type === "browser-restart") {
171
+ wxt.logger.info("Runner config changed, restarting browser...");
172
+ server.restartBrowser();
173
+ return;
174
+ }
175
+ wxt.logger.info(`Changed: ${Array.from(new Set(fileChanges)).map((file) => pc.dim(relative(wxt.config.root, file))).join(", ")}`);
176
+ const allEntrypoints = await findEntrypoints();
177
+ try {
178
+ const { output: newOutput } = await rebuild(allEntrypoints, changes.rebuildGroups, changes.cachedOutput);
179
+ server.currentOutput = newOutput;
180
+ switch (changes.type) {
181
+ case "extension-reload":
182
+ server.reloadExtension();
183
+ wxt.logger.success(`Reloaded extension`);
184
+ break;
185
+ case "html-reload":
186
+ const { reloadedNames } = reloadHtmlPages(changes.rebuildGroups, server);
187
+ wxt.logger.success(`Reloaded: ${getFilenameList(reloadedNames)}`);
188
+ break;
189
+ case "content-script-reload":
190
+ reloadContentScripts(changes.changedSteps, server);
191
+ const rebuiltNames = changes.rebuildGroups.flat().map((entry) => entry.name);
192
+ wxt.logger.success(`Reloaded: ${getFilenameList(rebuiltNames)}`);
193
+ break;
194
+ }
195
+ } catch {}
196
+ }).catch((error) => {
197
+ if (!isBabelSyntaxError(error)) throw error;
198
+ logBabelSyntaxError(error);
199
+ });
200
+ };
201
+ return debounce(cb, wxt.config.dev.server.watchDebounce, {
202
+ leading: true,
203
+ trailing: false
204
+ });
214
205
  }
206
+ /**
207
+ * From the server, tell the client to reload content scripts from the provided build step outputs.
208
+ */
215
209
  function reloadContentScripts(steps, server) {
216
- if (wxt.config.manifestVersion === 3) {
217
- steps.forEach((step) => {
218
- if (server.currentOutput == null) return;
219
- const entry = step.entrypoints;
220
- if (Array.isArray(entry) || entry.type !== "content-script") return;
221
- const js = getContentScriptJs(wxt.config, entry);
222
- const cssMap = getContentScriptsCssMap(server.currentOutput, [entry]);
223
- const css = getContentScriptCssFiles([entry], cssMap);
224
- server.reloadContentScript({
225
- registration: entry.options.registration,
226
- contentScript: mapWxtOptionsToRegisteredContentScript(
227
- entry.options,
228
- js,
229
- css
230
- )
231
- });
232
- });
233
- } else {
234
- server.reloadExtension();
235
- }
210
+ if (wxt.config.manifestVersion === 3) steps.forEach((step) => {
211
+ if (server.currentOutput == null) return;
212
+ const entry = step.entrypoints;
213
+ if (Array.isArray(entry) || entry.type !== "content-script") return;
214
+ const js = getContentScriptJs(wxt.config, entry);
215
+ const cssMap = getContentScriptsCssMap(server.currentOutput, [entry]);
216
+ const css = getContentScriptCssFiles([entry], cssMap);
217
+ server.reloadContentScript({
218
+ registration: entry.options.registration,
219
+ contentScript: mapWxtOptionsToRegisteredContentScript(entry.options, js, css)
220
+ });
221
+ });
222
+ else server.reloadExtension();
236
223
  }
237
224
  function reloadHtmlPages(groups, server) {
238
- const htmlEntries = groups.flat().filter(isHtmlEntrypoint);
239
- htmlEntries.forEach((entry) => {
240
- const path = getEntrypointBundlePath(entry, wxt.config.outDir, ".html");
241
- server.reloadPage(path);
242
- });
243
- return {
244
- reloadedNames: htmlEntries.map((entry) => entry.name)
245
- };
225
+ const htmlEntries = groups.flat().filter(isHtmlEntrypoint);
226
+ htmlEntries.forEach((entry) => {
227
+ const path = getEntrypointBundlePath(entry, wxt.config.outDir, ".html");
228
+ server.reloadPage(path);
229
+ });
230
+ return { reloadedNames: htmlEntries.map((entry) => entry.name) };
246
231
  }
247
232
  function getFilenameList(names) {
248
- return names.map((name) => {
249
- return pc.cyan(name);
250
- }).join(pc.dim(", "));
233
+ return names.map((name) => {
234
+ return pc.cyan(name);
235
+ }).join(pc.dim(", "));
251
236
  }
237
+ /**
238
+ * Based on the current build output, return a list of files that are:
239
+ * 1. Not in node_modules
240
+ * 2. Not inside project root
241
+ */
252
242
  function getExternalOutputDependencies(server) {
253
- return server.currentOutput?.steps.flatMap((step, i) => {
254
- if (Array.isArray(step.entrypoints) && i === 0) {
255
- return [];
256
- }
257
- return step.chunks.flatMap((chunk) => {
258
- if (chunk.type === "asset") return [];
259
- return chunk.moduleIds;
260
- });
261
- }).filter(
262
- (file) => !file.includes("node_modules") && !file.startsWith("\0")
263
- ).map(unnormalizePath).filter((file) => !file.startsWith(wxt.config.root)) ?? [];
243
+ return server.currentOutput?.steps.flatMap((step, i) => {
244
+ if (Array.isArray(step.entrypoints) && i === 0) return [];
245
+ return step.chunks.flatMap((chunk) => {
246
+ if (chunk.type === "asset") return [];
247
+ return chunk.moduleIds;
248
+ });
249
+ }).filter((file) => !file.includes("node_modules") && !file.startsWith("\0")).map(unnormalizePath).filter((file) => !file.startsWith(wxt.config.root)) ?? [];
264
250
  }
251
+
252
+ //#endregion
253
+ export { createServer };
@@ -0,0 +1,6 @@
1
+ import { UserConfig } from "../types.mjs";
2
+
3
+ //#region src/core/define-config.d.ts
4
+ declare function defineConfig(config: UserConfig): UserConfig;
5
+ //#endregion
6
+ export { defineConfig };
@@ -1,3 +1,7 @@
1
- export function defineConfig(config) {
2
- return config;
1
+ //#region src/core/define-config.ts
2
+ function defineConfig(config) {
3
+ return config;
3
4
  }
5
+
6
+ //#endregion
7
+ export { defineConfig };
@@ -0,0 +1,13 @@
1
+ import { WebExtConfig } from "../types.mjs";
2
+
3
+ //#region src/core/define-web-ext-config.d.ts
4
+ /**
5
+ * @deprecated Use `defineWebExtConfig` instead. Same function, different name.
6
+ */
7
+ declare function defineRunnerConfig(config: WebExtConfig): WebExtConfig;
8
+ /**
9
+ * Configure how [`web-ext`](https://github.com/mozilla/web-ext) starts the browser during development.
10
+ */
11
+ declare function defineWebExtConfig(config: WebExtConfig): WebExtConfig;
12
+ //#endregion
13
+ export { defineRunnerConfig, defineWebExtConfig };
@@ -1,10 +1,19 @@
1
1
  import consola from "consola";
2
- export function defineRunnerConfig(config) {
3
- consola.warn(
4
- "`defineRunnerConfig` is deprecated, use `defineWebExtConfig` instead. See https://wxt.dev/guide/resources/upgrading.html#v0-19-0-rarr-v0-20-0"
5
- );
6
- return defineWebExtConfig(config);
2
+
3
+ //#region src/core/define-web-ext-config.ts
4
+ /**
5
+ * @deprecated Use `defineWebExtConfig` instead. Same function, different name.
6
+ */
7
+ function defineRunnerConfig(config) {
8
+ consola.warn("`defineRunnerConfig` is deprecated, use `defineWebExtConfig` instead. See https://wxt.dev/guide/resources/upgrading.html#v0-19-0-rarr-v0-20-0");
9
+ return defineWebExtConfig(config);
7
10
  }
8
- export function defineWebExtConfig(config) {
9
- return config;
11
+ /**
12
+ * Configure how [`web-ext`](https://github.com/mozilla/web-ext) starts the browser during development.
13
+ */
14
+ function defineWebExtConfig(config) {
15
+ return config;
10
16
  }
17
+
18
+ //#endregion
19
+ export { defineRunnerConfig, defineWebExtConfig };