wxt 0.20.13 → 0.20.15

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 (280) 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 +54 -50
  6. package/dist/cli/commands.mjs +78 -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 +293 -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 +105 -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 +26 -23
  25. package/dist/core/builders/vite/plugins/resolveAppConfig.mjs +26 -24
  26. package/dist/core/builders/vite/plugins/resolveVirtualModules.mjs +28 -26
  27. package/dist/core/builders/vite/plugins/tsconfigPaths.mjs +11 -11
  28. package/dist/core/builders/vite/plugins/wxtPluginLoader.mjs +42 -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 +110 -148
  38. package/dist/core/index.d.mts +9 -0
  39. package/dist/core/index.mjs +12 -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 +15 -10
  53. package/dist/core/runners/manual.mjs +13 -14
  54. package/dist/core/runners/safari.mjs +13 -14
  55. package/dist/core/runners/web-ext.mjs +62 -83
  56. package/dist/core/runners/wsl.mjs +13 -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 +278 -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 +86 -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/index.mjs +3 -0
  80. package/dist/core/utils/log/index.mjs +6 -4
  81. package/dist/core/utils/log/printBuildSummary.mjs +20 -25
  82. package/dist/core/utils/log/printFileList.mjs +30 -33
  83. package/dist/core/utils/log/printHeader.mjs +9 -5
  84. package/dist/core/utils/log/printTable.mjs +19 -21
  85. package/dist/core/utils/manifest.mjs +366 -479
  86. package/dist/core/utils/minimatch-multiple.mjs +26 -15
  87. package/dist/core/utils/network.mjs +27 -33
  88. package/dist/core/utils/number.mjs +7 -3
  89. package/dist/core/utils/package.mjs +20 -13
  90. package/dist/core/utils/paths.d.mts +8 -0
  91. package/dist/core/utils/paths.mjs +26 -7
  92. package/dist/core/utils/strings.mjs +19 -14
  93. package/dist/core/utils/syntax-errors.mjs +14 -16
  94. package/dist/core/utils/time.mjs +19 -15
  95. package/dist/core/utils/transform.mjs +129 -160
  96. package/dist/core/utils/types.d.mts +6 -0
  97. package/dist/core/utils/validation.mjs +43 -50
  98. package/dist/core/utils/virtual-modules.mjs +20 -12
  99. package/dist/core/utils/wsl.mjs +11 -3
  100. package/dist/core/wxt.mjs +65 -60
  101. package/dist/core/{zip.d.ts → zip.d.mts} +6 -2
  102. package/dist/core/zip.mjs +118 -140
  103. package/dist/index.d.mts +13 -0
  104. package/dist/index.mjs +13 -3
  105. package/dist/{modules.d.ts → modules.d.mts} +14 -16
  106. package/dist/modules.mjs +179 -51
  107. package/dist/testing/fake-browser.d.mts +2 -0
  108. package/dist/testing/fake-browser.mjs +3 -1
  109. package/dist/testing/index.d.mts +3 -0
  110. package/dist/testing/index.mjs +4 -2
  111. package/dist/testing/{wxt-vitest-plugin.d.ts → wxt-vitest-plugin.d.mts} +7 -9
  112. package/dist/testing/wxt-vitest-plugin.mjs +38 -19
  113. package/dist/types.d.mts +1475 -0
  114. package/dist/utils/app-config.d.mts +6 -0
  115. package/dist/utils/app-config.mjs +8 -2
  116. package/dist/utils/content-script-context.d.mts +134 -0
  117. package/dist/utils/content-script-context.mjs +187 -175
  118. package/dist/utils/content-script-ui/iframe.d.mts +42 -0
  119. package/dist/utils/content-script-ui/iframe.mjs +42 -27
  120. package/dist/utils/content-script-ui/integrated.d.mts +37 -0
  121. package/dist/utils/content-script-ui/integrated.mjs +36 -29
  122. package/dist/utils/content-script-ui/shadow-root.d.mts +80 -0
  123. package/dist/utils/content-script-ui/shadow-root.mjs +75 -82
  124. package/dist/utils/content-script-ui/shared.mjs +115 -150
  125. package/dist/utils/content-script-ui/types.d.mts +107 -0
  126. package/dist/utils/content-script-ui/types.mjs +1 -0
  127. package/dist/utils/{define-app-config.d.ts → define-app-config.d.mts} +5 -3
  128. package/dist/utils/define-app-config.mjs +22 -2
  129. package/dist/utils/define-background.d.mts +7 -0
  130. package/dist/utils/define-background.mjs +7 -3
  131. package/dist/utils/define-content-script.d.mts +6 -0
  132. package/dist/utils/define-content-script.mjs +6 -2
  133. package/dist/utils/define-unlisted-script.d.mts +7 -0
  134. package/dist/utils/define-unlisted-script.mjs +7 -3
  135. package/dist/utils/define-wxt-plugin.d.mts +6 -0
  136. package/dist/utils/define-wxt-plugin.mjs +6 -2
  137. package/dist/utils/inject-script.d.mts +41 -0
  138. package/dist/utils/inject-script.mjs +44 -34
  139. package/dist/utils/internal/custom-events.d.mts +9 -0
  140. package/dist/utils/internal/custom-events.mjs +18 -10
  141. package/dist/utils/internal/location-watcher.mjs +23 -20
  142. package/dist/utils/internal/logger.mjs +15 -12
  143. package/dist/utils/match-patterns.d.mts +1 -0
  144. package/dist/utils/match-patterns.mjs +3 -1
  145. package/dist/utils/{split-shadow-root-css.d.ts → split-shadow-root-css.d.mts} +6 -3
  146. package/dist/utils/split-shadow-root-css.mjs +16 -7
  147. package/dist/utils/storage.d.mts +1 -0
  148. package/dist/utils/storage.mjs +3 -1
  149. package/dist/version.d.mts +4 -0
  150. package/dist/version.mjs +5 -1
  151. package/dist/virtual/background-entrypoint.d.mts +4 -0
  152. package/dist/virtual/background-entrypoint.mjs +143 -161
  153. package/dist/virtual/content-script-isolated-world-entrypoint.d.mts +4 -0
  154. package/dist/virtual/content-script-isolated-world-entrypoint.mjs +26 -27
  155. package/dist/virtual/content-script-main-world-entrypoint.d.mts +4 -0
  156. package/dist/virtual/content-script-main-world-entrypoint.mjs +24 -24
  157. package/dist/virtual/mock-browser.d.mts +6 -0
  158. package/dist/virtual/mock-browser.mjs +5 -3
  159. package/dist/virtual/reload-html.d.mts +1 -0
  160. package/dist/virtual/reload-html.mjs +57 -53
  161. package/dist/virtual/unlisted-script-entrypoint.d.mts +4 -0
  162. package/dist/virtual/unlisted-script-entrypoint.mjs +35 -43
  163. package/package.json +56 -50
  164. package/dist/browser.d.ts +0 -30
  165. package/dist/builtin-modules/index.d.ts +0 -2
  166. package/dist/builtin-modules/unimport.d.ts +0 -5
  167. package/dist/cli/cli-utils.d.ts +0 -25
  168. package/dist/cli/commands.d.ts +0 -2
  169. package/dist/cli/index.d.ts +0 -1
  170. package/dist/core/builders/vite/index.d.ts +0 -7
  171. package/dist/core/builders/vite/plugins/bundleAnalysis.d.ts +0 -7
  172. package/dist/core/builders/vite/plugins/cssEntrypoints.d.ts +0 -13
  173. package/dist/core/builders/vite/plugins/defineImportMeta.d.ts +0 -14
  174. package/dist/core/builders/vite/plugins/devHtmlPrerender.d.ts +0 -7
  175. package/dist/core/builders/vite/plugins/devServerGlobals.d.ts +0 -6
  176. package/dist/core/builders/vite/plugins/download.d.ts +0 -10
  177. package/dist/core/builders/vite/plugins/entrypointGroupGlobals.d.ts +0 -6
  178. package/dist/core/builders/vite/plugins/extensionApiMock.d.ts +0 -6
  179. package/dist/core/builders/vite/plugins/globals.d.ts +0 -3
  180. package/dist/core/builders/vite/plugins/iifeFooter.d.ts +0 -8
  181. package/dist/core/builders/vite/plugins/index.d.ts +0 -16
  182. package/dist/core/builders/vite/plugins/noopBackground.d.ts +0 -6
  183. package/dist/core/builders/vite/plugins/removeEntrypointMainFunction.d.ts +0 -6
  184. package/dist/core/builders/vite/plugins/resolveAppConfig.d.ts +0 -6
  185. package/dist/core/builders/vite/plugins/resolveVirtualModules.d.ts +0 -6
  186. package/dist/core/builders/vite/plugins/tsconfigPaths.d.ts +0 -3
  187. package/dist/core/builders/vite/plugins/wxtPluginLoader.d.ts +0 -6
  188. package/dist/core/define-config.d.ts +0 -2
  189. package/dist/core/define-web-ext-config.d.ts +0 -9
  190. package/dist/core/generate-wxt-dir.d.ts +0 -5
  191. package/dist/core/index.d.ts +0 -8
  192. package/dist/core/initialize.d.ts +0 -5
  193. package/dist/core/keyboard-shortcuts.d.ts +0 -12
  194. package/dist/core/package-managers/bun.d.ts +0 -2
  195. package/dist/core/package-managers/deno.d.ts +0 -2
  196. package/dist/core/package-managers/index.d.ts +0 -2
  197. package/dist/core/package-managers/npm.d.ts +0 -17
  198. package/dist/core/package-managers/pnpm.d.ts +0 -2
  199. package/dist/core/package-managers/types.d.ts +0 -2
  200. package/dist/core/package-managers/types.mjs +0 -0
  201. package/dist/core/package-managers/yarn.d.ts +0 -2
  202. package/dist/core/prepare.d.ts +0 -2
  203. package/dist/core/resolve-config.d.ts +0 -11
  204. package/dist/core/runners/index.d.ts +0 -2
  205. package/dist/core/runners/manual.d.ts +0 -5
  206. package/dist/core/runners/safari.d.ts +0 -5
  207. package/dist/core/runners/web-ext.d.ts +0 -5
  208. package/dist/core/runners/wsl.d.ts +0 -5
  209. package/dist/core/utils/arrays.d.ts +0 -13
  210. package/dist/core/utils/building/build-entrypoints.d.ts +0 -3
  211. package/dist/core/utils/building/detect-dev-changes.d.ts +0 -61
  212. package/dist/core/utils/building/find-entrypoints.d.ts +0 -5
  213. package/dist/core/utils/building/group-entrypoints.d.ts +0 -8
  214. package/dist/core/utils/building/index.d.ts +0 -6
  215. package/dist/core/utils/building/internal-build.d.ts +0 -12
  216. package/dist/core/utils/building/rebuild.d.ts +0 -23
  217. package/dist/core/utils/cache.d.ts +0 -8
  218. package/dist/core/utils/cli.d.ts +0 -3
  219. package/dist/core/utils/cli.mjs +0 -26
  220. package/dist/core/utils/constants.d.ts +0 -5
  221. package/dist/core/utils/content-scripts.d.ts +0 -12
  222. package/dist/core/utils/content-security-policy.d.ts +0 -14
  223. package/dist/core/utils/entrypoints.d.ts +0 -31
  224. package/dist/core/utils/env.d.ts +0 -5
  225. package/dist/core/utils/environments/browser-environment.d.ts +0 -3
  226. package/dist/core/utils/environments/environment.d.ts +0 -8
  227. package/dist/core/utils/environments/extension-environment.d.ts +0 -6
  228. package/dist/core/utils/environments/index.d.ts +0 -2
  229. package/dist/core/utils/eslint.d.ts +0 -1
  230. package/dist/core/utils/fs.d.ts +0 -13
  231. package/dist/core/utils/globals.d.ts +0 -11
  232. package/dist/core/utils/i18n.d.ts +0 -11
  233. package/dist/core/utils/log/index.d.ts +0 -4
  234. package/dist/core/utils/log/printBuildSummary.d.ts +0 -2
  235. package/dist/core/utils/log/printFileList.d.ts +0 -1
  236. package/dist/core/utils/log/printHeader.d.ts +0 -1
  237. package/dist/core/utils/log/printTable.d.ts +0 -1
  238. package/dist/core/utils/manifest.d.ts +0 -40
  239. package/dist/core/utils/minimatch-multiple.d.ts +0 -15
  240. package/dist/core/utils/network.d.ts +0 -7
  241. package/dist/core/utils/number.d.ts +0 -1
  242. package/dist/core/utils/package.d.ts +0 -6
  243. package/dist/core/utils/paths.d.ts +0 -11
  244. package/dist/core/utils/strings.d.ts +0 -14
  245. package/dist/core/utils/syntax-errors.d.ts +0 -11
  246. package/dist/core/utils/testing/fake-objects.d.ts +0 -11665
  247. package/dist/core/utils/testing/fake-objects.mjs +0 -326
  248. package/dist/core/utils/time.d.ts +0 -9
  249. package/dist/core/utils/transform.d.ts +0 -11
  250. package/dist/core/utils/types.d.ts +0 -13
  251. package/dist/core/utils/types.mjs +0 -0
  252. package/dist/core/utils/validation.d.ts +0 -15
  253. package/dist/core/utils/virtual-modules.d.ts +0 -22
  254. package/dist/core/utils/wsl.d.ts +0 -4
  255. package/dist/core/wxt.d.ts +0 -24
  256. package/dist/index.d.ts +0 -11
  257. package/dist/testing/fake-browser.d.ts +0 -10
  258. package/dist/testing/index.d.ts +0 -10
  259. package/dist/types.d.ts +0 -1459
  260. package/dist/types.mjs +0 -0
  261. package/dist/utils/app-config.d.ts +0 -2
  262. package/dist/utils/content-script-context.d.ts +0 -134
  263. package/dist/utils/content-script-ui/iframe.d.ts +0 -32
  264. package/dist/utils/content-script-ui/integrated.d.ts +0 -34
  265. package/dist/utils/content-script-ui/shadow-root.d.ts +0 -76
  266. package/dist/utils/content-script-ui/shared.d.ts +0 -5
  267. package/dist/utils/content-script-ui/types.d.ts +0 -104
  268. package/dist/utils/define-background.d.ts +0 -4
  269. package/dist/utils/define-content-script.d.ts +0 -3
  270. package/dist/utils/define-unlisted-script.d.ts +0 -4
  271. package/dist/utils/define-wxt-plugin.d.ts +0 -3
  272. package/dist/utils/inject-script.d.ts +0 -36
  273. package/dist/utils/internal/custom-events.d.ts +0 -10
  274. package/dist/utils/internal/dev-server-websocket.d.ts +0 -21
  275. package/dist/utils/internal/dev-server-websocket.mjs +0 -37
  276. package/dist/utils/internal/location-watcher.d.ts +0 -12
  277. package/dist/utils/internal/logger.d.ts +0 -9
  278. package/dist/utils/match-patterns.d.ts +0 -5
  279. package/dist/utils/storage.d.ts +0 -5
  280. package/dist/version.d.ts +0 -1
@@ -1,38 +1,45 @@
1
- export function groupEntrypoints(entrypoints) {
2
- const groupIndexMap = {};
3
- const groups = [];
4
- for (const entry of entrypoints) {
5
- if (entry.skipped) continue;
6
- let group = ENTRY_TYPE_TO_GROUP_MAP[entry.type];
7
- if (entry.type === "background" && entry.options.type === "module") {
8
- group = "esm";
9
- }
10
- if (group === "individual") {
11
- groups.push(entry);
12
- } else {
13
- let groupIndex = groupIndexMap[group];
14
- if (groupIndex == null) {
15
- groupIndex = groups.push([]) - 1;
16
- groupIndexMap[group] = groupIndex;
17
- }
18
- groups[groupIndex].push(entry);
19
- }
20
- }
21
- return groups;
1
+ //#region src/core/utils/building/group-entrypoints.ts
2
+ /**
3
+ * Entrypoints are built in groups. HTML pages can all be built together in a single step,
4
+ * content scripts must be build individually, etc.
5
+ *
6
+ * This function returns the entrypoints put into these types of groups.
7
+ */
8
+ function groupEntrypoints(entrypoints) {
9
+ const groupIndexMap = {};
10
+ const groups = [];
11
+ for (const entry of entrypoints) {
12
+ if (entry.skipped) continue;
13
+ let group = ENTRY_TYPE_TO_GROUP_MAP[entry.type];
14
+ if (entry.type === "background" && entry.options.type === "module") group = "esm";
15
+ if (group === "individual") groups.push(entry);
16
+ else {
17
+ let groupIndex = groupIndexMap[group];
18
+ if (groupIndex == null) {
19
+ groupIndex = groups.push([]) - 1;
20
+ groupIndexMap[group] = groupIndex;
21
+ }
22
+ groups[groupIndex].push(entry);
23
+ }
24
+ }
25
+ return groups;
22
26
  }
23
27
  const ENTRY_TYPE_TO_GROUP_MAP = {
24
- sandbox: "sandboxed-esm",
25
- popup: "esm",
26
- newtab: "esm",
27
- history: "esm",
28
- options: "esm",
29
- devtools: "esm",
30
- bookmarks: "esm",
31
- sidepanel: "esm",
32
- "unlisted-page": "esm",
33
- background: "individual",
34
- "content-script": "individual",
35
- "unlisted-script": "individual",
36
- "unlisted-style": "individual",
37
- "content-script-style": "individual"
28
+ sandbox: "sandboxed-esm",
29
+ popup: "esm",
30
+ newtab: "esm",
31
+ history: "esm",
32
+ options: "esm",
33
+ devtools: "esm",
34
+ bookmarks: "esm",
35
+ sidepanel: "esm",
36
+ "unlisted-page": "esm",
37
+ background: "individual",
38
+ "content-script": "individual",
39
+ "unlisted-script": "individual",
40
+ "unlisted-style": "individual",
41
+ "content-script-style": "individual"
38
42
  };
43
+
44
+ //#endregion
45
+ export { groupEntrypoints };
@@ -1,6 +1,8 @@
1
- export * from "./build-entrypoints.mjs";
2
- export * from "./detect-dev-changes.mjs";
3
- export * from "./find-entrypoints.mjs";
4
- export * from "./group-entrypoints.mjs";
5
- export * from "./internal-build.mjs";
6
- export * from "./rebuild.mjs";
1
+ import { buildEntrypoints } from "./build-entrypoints.mjs";
2
+ import { detectDevChanges } from "./detect-dev-changes.mjs";
3
+ import { findEntrypoints } from "./find-entrypoints.mjs";
4
+ import { groupEntrypoints } from "./group-entrypoints.mjs";
5
+ import { rebuild } from "./rebuild.mjs";
6
+ import { internalBuild } from "./internal-build.mjs";
7
+
8
+ export { };
@@ -1,112 +1,96 @@
1
+ import { unnormalizePath } from "../paths.mjs";
2
+ import { formatDuration } from "../time.mjs";
3
+ import { wxt } from "../../wxt.mjs";
1
4
  import { findEntrypoints } from "./find-entrypoints.mjs";
2
- import pc from "picocolors";
3
- import fs from "fs-extra";
4
5
  import { groupEntrypoints } from "./group-entrypoints.mjs";
5
- import { formatDuration } from "../../utils/time.mjs";
6
- import { printBuildSummary } from "../../utils/log/index.mjs";
7
- import glob from "fast-glob";
8
- import { unnormalizePath } from "../../utils/paths.mjs";
6
+ import { printBuildSummary } from "../log/printBuildSummary.mjs";
7
+ import "../log/index.mjs";
9
8
  import { rebuild } from "./rebuild.mjs";
9
+ import { ValidationError, validateEntrypoints } from "../validation.mjs";
10
+ import fs from "fs-extra";
11
+ import glob from "fast-glob";
10
12
  import { relative } from "node:path";
11
- import {
12
- ValidationError,
13
- validateEntrypoints
14
- } from "../validation.mjs";
15
- import { wxt } from "../../wxt.mjs";
16
13
  import { mergeJsonOutputs } from "@aklinker1/rollup-plugin-visualizer";
14
+ import pc from "picocolors";
17
15
  import { isCI } from "ci-info";
18
- export async function internalBuild() {
19
- await wxt.hooks.callHook("build:before", wxt);
20
- const verb = wxt.config.command === "serve" ? "Pre-rendering" : "Building";
21
- const target = `${wxt.config.browser}-mv${wxt.config.manifestVersion}`;
22
- wxt.logger.info(
23
- `${verb} ${pc.cyan(target)} for ${pc.cyan(wxt.config.mode)} with ${pc.green(
24
- `${wxt.builder.name} ${wxt.builder.version}`
25
- )}`
26
- );
27
- const startTime = Date.now();
28
- await fs.rm(wxt.config.outDir, { recursive: true, force: true });
29
- await fs.ensureDir(wxt.config.outDir);
30
- const entrypoints = await findEntrypoints();
31
- wxt.logger.debug("Detected entrypoints:", entrypoints);
32
- const validationResults = validateEntrypoints(entrypoints);
33
- if (validationResults.errorCount + validationResults.warningCount > 0) {
34
- printValidationResults(validationResults);
35
- }
36
- if (validationResults.errorCount > 0) {
37
- throw new ValidationError(`Entrypoint validation failed`, {
38
- cause: validationResults
39
- });
40
- }
41
- const groups = groupEntrypoints(entrypoints);
42
- await wxt.hooks.callHook("entrypoints:grouped", wxt, groups);
43
- const { output, warnings } = await rebuild(entrypoints, groups, void 0);
44
- await wxt.hooks.callHook("build:done", wxt, output);
45
- await printBuildSummary(
46
- wxt.logger.success,
47
- `Built extension in ${formatDuration(Date.now() - startTime)}`,
48
- output
49
- );
50
- for (const warning of warnings) {
51
- wxt.logger.warn(...warning);
52
- }
53
- if (wxt.config.analysis.enabled) {
54
- await combineAnalysisStats();
55
- const statsPath = relative(wxt.config.root, wxt.config.analysis.outputFile);
56
- wxt.logger.info(
57
- `Analysis complete:
58
- ${pc.gray("\u2514\u2500")} ${pc.yellow(statsPath)}`
59
- );
60
- if (wxt.config.analysis.open) {
61
- if (isCI) {
62
- wxt.logger.debug(`Skipped opening ${pc.yellow(statsPath)} in CI`);
63
- } else {
64
- wxt.logger.info(`Opening ${pc.yellow(statsPath)} in browser...`);
65
- const { default: open } = await import("open");
66
- open(wxt.config.analysis.outputFile);
67
- }
68
- }
69
- }
70
- return output;
16
+
17
+ //#region src/core/utils/building/internal-build.ts
18
+ /**
19
+ * Builds the extension based on an internal config. No more config discovery is performed, the
20
+ * build is based on exactly what is passed in.
21
+ *
22
+ * This function:
23
+ * 1. Cleans the output directory
24
+ * 2. Executes the rebuild function with a blank previous output so everything is built (see
25
+ * `rebuild` for more details)
26
+ * 3. Prints the summary
27
+ */
28
+ async function internalBuild() {
29
+ await wxt.hooks.callHook("build:before", wxt);
30
+ const verb = wxt.config.command === "serve" ? "Pre-rendering" : "Building";
31
+ const target = `${wxt.config.browser}-mv${wxt.config.manifestVersion}`;
32
+ wxt.logger.info(`${verb} ${pc.cyan(target)} for ${pc.cyan(wxt.config.mode)} with ${pc.green(`${wxt.builder.name} ${wxt.builder.version}`)}`);
33
+ const startTime = Date.now();
34
+ await fs.rm(wxt.config.outDir, {
35
+ recursive: true,
36
+ force: true
37
+ });
38
+ await fs.ensureDir(wxt.config.outDir);
39
+ const entrypoints = await findEntrypoints();
40
+ wxt.logger.debug("Detected entrypoints:", entrypoints);
41
+ const validationResults = validateEntrypoints(entrypoints);
42
+ if (validationResults.errorCount + validationResults.warningCount > 0) printValidationResults(validationResults);
43
+ if (validationResults.errorCount > 0) throw new ValidationError(`Entrypoint validation failed`, { cause: validationResults });
44
+ const groups = groupEntrypoints(entrypoints);
45
+ await wxt.hooks.callHook("entrypoints:grouped", wxt, groups);
46
+ const { output, warnings } = await rebuild(entrypoints, groups, void 0);
47
+ await wxt.hooks.callHook("build:done", wxt, output);
48
+ await printBuildSummary(wxt.logger.success, `Built extension in ${formatDuration(Date.now() - startTime)}`, output);
49
+ for (const warning of warnings) wxt.logger.warn(...warning);
50
+ if (wxt.config.analysis.enabled) {
51
+ await combineAnalysisStats();
52
+ const statsPath = relative(wxt.config.root, wxt.config.analysis.outputFile);
53
+ wxt.logger.info(`Analysis complete:\n ${pc.gray("└─")} ${pc.yellow(statsPath)}`);
54
+ if (wxt.config.analysis.open) if (isCI) wxt.logger.debug(`Skipped opening ${pc.yellow(statsPath)} in CI`);
55
+ else {
56
+ wxt.logger.info(`Opening ${pc.yellow(statsPath)} in browser...`);
57
+ const { default: open } = await import("open");
58
+ await open(wxt.config.analysis.outputFile);
59
+ }
60
+ }
61
+ return output;
71
62
  }
72
63
  async function combineAnalysisStats() {
73
- const unixFiles = await glob(`${wxt.config.analysis.outputName}-*.json`, {
74
- cwd: wxt.config.analysis.outputDir,
75
- absolute: true
76
- });
77
- const absolutePaths = unixFiles.map(unnormalizePath);
78
- await mergeJsonOutputs({
79
- inputs: absolutePaths,
80
- template: wxt.config.analysis.template,
81
- filename: wxt.config.analysis.outputFile
82
- });
83
- if (!wxt.config.analysis.keepArtifacts) {
84
- await Promise.all(absolutePaths.map((statsFile) => fs.remove(statsFile)));
85
- }
64
+ const absolutePaths = (await glob(`${wxt.config.analysis.outputName}-*.json`, {
65
+ cwd: wxt.config.analysis.outputDir,
66
+ absolute: true
67
+ })).map(unnormalizePath);
68
+ await mergeJsonOutputs({
69
+ inputs: absolutePaths,
70
+ template: wxt.config.analysis.template,
71
+ filename: wxt.config.analysis.outputFile
72
+ });
73
+ if (!wxt.config.analysis.keepArtifacts) await Promise.all(absolutePaths.map((statsFile) => fs.remove(statsFile)));
86
74
  }
87
- function printValidationResults({
88
- errorCount,
89
- errors,
90
- warningCount
91
- }) {
92
- (errorCount > 0 ? wxt.logger.error : wxt.logger.warn)(
93
- `Entrypoint validation failed: ${errorCount} error${errorCount === 1 ? "" : "s"}, ${warningCount} warning${warningCount === 1 ? "" : "s"}`
94
- );
95
- const cwd = process.cwd();
96
- const entrypointErrors = errors.reduce((map, error) => {
97
- const entryErrors = map.get(error.entrypoint) ?? [];
98
- entryErrors.push(error);
99
- map.set(error.entrypoint, entryErrors);
100
- return map;
101
- }, /* @__PURE__ */ new Map());
102
- Array.from(entrypointErrors.entries()).forEach(([entrypoint, errors2]) => {
103
- wxt.logger.log(relative(cwd, entrypoint.inputPath));
104
- console.log();
105
- errors2.forEach((err) => {
106
- const type = err.type === "error" ? pc.red("ERROR") : pc.yellow("WARN");
107
- const recieved = pc.dim(`(recieved: ${JSON.stringify(err.value)})`);
108
- wxt.logger.log(` - ${type} ${err.message} ${recieved}`);
109
- });
110
- console.log();
111
- });
75
+ function printValidationResults({ errorCount, errors, warningCount }) {
76
+ (errorCount > 0 ? wxt.logger.error : wxt.logger.warn)(`Entrypoint validation failed: ${errorCount} error${errorCount === 1 ? "" : "s"}, ${warningCount} warning${warningCount === 1 ? "" : "s"}`);
77
+ const cwd = process.cwd();
78
+ const entrypointErrors = errors.reduce((map, error) => {
79
+ const entryErrors = map.get(error.entrypoint) ?? [];
80
+ entryErrors.push(error);
81
+ map.set(error.entrypoint, entryErrors);
82
+ return map;
83
+ }, /* @__PURE__ */ new Map());
84
+ Array.from(entrypointErrors.entries()).forEach(([entrypoint, errors]) => {
85
+ wxt.logger.log(relative(cwd, entrypoint.inputPath) + "\n");
86
+ errors.forEach((err) => {
87
+ const type = err.type === "error" ? pc.red("ERROR") : pc.yellow("WARN");
88
+ const received = pc.dim(`(received: ${JSON.stringify(err.value)})`);
89
+ wxt.logger.log(` - ${type} ${err.message} ${received}`);
90
+ });
91
+ console.log();
92
+ });
112
93
  }
94
+
95
+ //#endregion
96
+ export { internalBuild };
@@ -1,33 +1,53 @@
1
- import { generateWxtDir } from "../../generate-wxt-dir.mjs";
2
- import { buildEntrypoints } from "./build-entrypoints.mjs";
3
- import { generateManifest, writeManifest } from "../../utils/manifest.mjs";
4
1
  import { wxt } from "../../wxt.mjs";
5
- export async function rebuild(allEntrypoints, entrypointGroups, existingOutput = {
6
- steps: [],
7
- publicAssets: []
2
+ import { buildEntrypoints } from "./build-entrypoints.mjs";
3
+ import { generateWxtDir } from "../../generate-wxt-dir.mjs";
4
+ import { generateManifest, writeManifest } from "../manifest.mjs";
5
+
6
+ //#region src/core/utils/building/rebuild.ts
7
+ /**
8
+ * Given a configuration, list of entrypoints, and an existing, partial output, build the
9
+ * entrypoints and merge the new output with the existing output.
10
+ *
11
+ * This function will:
12
+ * 1. Generate the .wxt directory's types
13
+ * 2. Build the `entrypointGroups` (and copies public files)
14
+ * 3. Generate the latest manifest for all entrypoints
15
+ * 4. Write the new manifest to the file system
16
+ *
17
+ * @param config Internal config containing all the project information.
18
+ * @param allEntrypoints List of entrypoints used to generate the types inside .wxt directory.
19
+ * @param entrypointGroups The list of entrypoint groups to build.
20
+ * @param existingOutput The previous output to combine the rebuild results into. An emptry array if
21
+ * this is the first build.
22
+ */
23
+ async function rebuild(allEntrypoints, entrypointGroups, existingOutput = {
24
+ steps: [],
25
+ publicAssets: []
8
26
  }) {
9
- const { default: ora } = await import("ora");
10
- const spinner = ora(`Preparing...`).start();
11
- await generateWxtDir(allEntrypoints).catch((err) => {
12
- wxt.logger.warn("Failed to update .wxt directory:", err);
13
- if (wxt.config.command === "build") throw err;
14
- });
15
- const newOutput = await buildEntrypoints(entrypointGroups, spinner);
16
- const mergedOutput = {
17
- steps: [...existingOutput.steps, ...newOutput.steps],
18
- // Do not merge existing because all publicAssets copied everytime
19
- publicAssets: newOutput.publicAssets
20
- };
21
- const { manifest: newManifest, warnings: manifestWarnings } = await generateManifest(allEntrypoints, mergedOutput);
22
- const finalOutput = {
23
- manifest: newManifest,
24
- ...mergedOutput
25
- };
26
- await writeManifest(newManifest, finalOutput);
27
- spinner.clear().stop();
28
- return {
29
- output: finalOutput,
30
- manifest: newManifest,
31
- warnings: manifestWarnings
32
- };
27
+ const { default: ora } = await import("ora");
28
+ const spinner = ora(`Preparing...`).start();
29
+ await generateWxtDir(allEntrypoints).catch((err) => {
30
+ wxt.logger.warn("Failed to update .wxt directory:", err);
31
+ if (wxt.config.command === "build") throw err;
32
+ });
33
+ const newOutput = await buildEntrypoints(entrypointGroups, spinner);
34
+ const mergedOutput = {
35
+ steps: [...existingOutput.steps, ...newOutput.steps],
36
+ publicAssets: newOutput.publicAssets
37
+ };
38
+ const { manifest: newManifest, warnings: manifestWarnings } = await generateManifest(allEntrypoints, mergedOutput);
39
+ const finalOutput = {
40
+ manifest: newManifest,
41
+ ...mergedOutput
42
+ };
43
+ await writeManifest(newManifest, finalOutput);
44
+ spinner.clear().stop();
45
+ return {
46
+ output: finalOutput,
47
+ manifest: newManifest,
48
+ warnings: manifestWarnings
49
+ };
33
50
  }
51
+
52
+ //#endregion
53
+ export { rebuild };
@@ -1,21 +1,32 @@
1
+ import { writeFileIfDifferent } from "./fs.mjs";
1
2
  import fs, { ensureDir } from "fs-extra";
2
3
  import { dirname, resolve } from "path";
3
- import { writeFileIfDifferent } from "./fs.mjs";
4
- export function createFsCache(wxtDir) {
5
- const getPath = (key) => resolve(wxtDir, "cache", encodeURIComponent(key));
6
- return {
7
- async set(key, value) {
8
- const path = getPath(key);
9
- await ensureDir(dirname(path));
10
- await writeFileIfDifferent(path, value);
11
- },
12
- async get(key) {
13
- const path = getPath(key);
14
- try {
15
- return await fs.readFile(path, "utf-8");
16
- } catch {
17
- return void 0;
18
- }
19
- }
20
- };
4
+
5
+ //#region src/core/utils/cache.ts
6
+ /**
7
+ * A basic file system cache stored at `<srcDir>/.wxt/cache/<key>`. Just caches a string in a
8
+ * file for the given key.
9
+ *
10
+ * @param srcDir Absolute path to source directory. See `InternalConfig.srcDir`
11
+ */
12
+ function createFsCache(wxtDir) {
13
+ const getPath = (key) => resolve(wxtDir, "cache", encodeURIComponent(key));
14
+ return {
15
+ async set(key, value) {
16
+ const path = getPath(key);
17
+ await ensureDir(dirname(path));
18
+ await writeFileIfDifferent(path, value);
19
+ },
20
+ async get(key) {
21
+ const path = getPath(key);
22
+ try {
23
+ return await fs.readFile(path, "utf-8");
24
+ } catch {
25
+ return;
26
+ }
27
+ }
28
+ };
21
29
  }
30
+
31
+ //#endregion
32
+ export { createFsCache };
@@ -1 +1,9 @@
1
- export const VIRTUAL_NOOP_BACKGROUND_MODULE_ID = "virtual:user-background";
1
+ //#region src/core/utils/constants.ts
2
+ /**
3
+ * Module ID used to build the background in dev mode if the extension doesn't include a background
4
+ * script/service worker.
5
+ */
6
+ const VIRTUAL_NOOP_BACKGROUND_MODULE_ID = "virtual:user-background";
7
+
8
+ //#endregion
9
+ export { VIRTUAL_NOOP_BACKGROUND_MODULE_ID };
@@ -1,59 +1,61 @@
1
1
  import { getEntrypointBundlePath } from "./entrypoints.mjs";
2
- export function hashContentScriptOptions(options) {
3
- const simplifiedOptions = mapWxtOptionsToContentScript(
4
- options,
5
- void 0,
6
- void 0
7
- );
8
- Object.keys(simplifiedOptions).forEach((key) => {
9
- if (simplifiedOptions[key] == null) delete simplifiedOptions[key];
10
- });
11
- const withDefaults = {
12
- exclude_globs: [],
13
- exclude_matches: [],
14
- include_globs: [],
15
- match_about_blank: false,
16
- run_at: "document_idle",
17
- all_frames: false,
18
- // @ts-expect-error: Untyped
19
- match_origin_as_fallback: false,
20
- world: "ISOLATED",
21
- ...simplifiedOptions
22
- };
23
- return JSON.stringify(
24
- Object.entries(withDefaults).map(([key, value]) => {
25
- if (Array.isArray(value)) return [key, value.sort()];
26
- else return [key, value];
27
- }).sort((l, r) => l[0].localeCompare(r[0]))
28
- );
2
+
3
+ //#region src/core/utils/content-scripts.ts
4
+ /**
5
+ * Returns a unique and consistent string hash based on a content scripts options.
6
+ *
7
+ * It is able to recognize default values,
8
+ */
9
+ function hashContentScriptOptions(options) {
10
+ const simplifiedOptions = mapWxtOptionsToContentScript(options, void 0, void 0);
11
+ Object.keys(simplifiedOptions).forEach((key) => {
12
+ if (simplifiedOptions[key] == null) delete simplifiedOptions[key];
13
+ });
14
+ const withDefaults = {
15
+ exclude_globs: [],
16
+ exclude_matches: [],
17
+ include_globs: [],
18
+ match_about_blank: false,
19
+ run_at: "document_idle",
20
+ all_frames: false,
21
+ match_origin_as_fallback: false,
22
+ world: "ISOLATED",
23
+ ...simplifiedOptions
24
+ };
25
+ return JSON.stringify(Object.entries(withDefaults).map(([key, value]) => {
26
+ if (Array.isArray(value)) return [key, value.sort()];
27
+ else return [key, value];
28
+ }).sort((l, r) => l[0].localeCompare(r[0])));
29
29
  }
30
- export function mapWxtOptionsToContentScript(options, js, css) {
31
- return {
32
- matches: options.matches ?? [],
33
- all_frames: options.allFrames,
34
- match_about_blank: options.matchAboutBlank,
35
- exclude_globs: options.excludeGlobs,
36
- exclude_matches: options.excludeMatches,
37
- include_globs: options.includeGlobs,
38
- run_at: options.runAt,
39
- css,
40
- js,
41
- // @ts-expect-error: Untyped
42
- match_origin_as_fallback: options.matchOriginAsFallback,
43
- world: options.world
44
- };
30
+ function mapWxtOptionsToContentScript(options, js, css) {
31
+ return {
32
+ matches: options.matches ?? [],
33
+ all_frames: options.allFrames,
34
+ match_about_blank: options.matchAboutBlank,
35
+ exclude_globs: options.excludeGlobs,
36
+ exclude_matches: options.excludeMatches,
37
+ include_globs: options.includeGlobs,
38
+ run_at: options.runAt,
39
+ css,
40
+ js,
41
+ match_origin_as_fallback: options.matchOriginAsFallback,
42
+ world: options.world
43
+ };
45
44
  }
46
- export function mapWxtOptionsToRegisteredContentScript(options, js, css) {
47
- return {
48
- allFrames: options.allFrames,
49
- excludeMatches: options.excludeMatches,
50
- matches: options.matches,
51
- runAt: options.runAt,
52
- js,
53
- css,
54
- world: options.world
55
- };
45
+ function mapWxtOptionsToRegisteredContentScript(options, js, css) {
46
+ return {
47
+ allFrames: options.allFrames,
48
+ excludeMatches: options.excludeMatches,
49
+ matches: options.matches,
50
+ runAt: options.runAt,
51
+ js,
52
+ css,
53
+ world: options.world
54
+ };
56
55
  }
57
- export function getContentScriptJs(config, entrypoint) {
58
- return [getEntrypointBundlePath(entrypoint, config.outDir, ".js")];
56
+ function getContentScriptJs(config, entrypoint) {
57
+ return [getEntrypointBundlePath(entrypoint, config.outDir, ".js")];
59
58
  }
59
+
60
+ //#endregion
61
+ export { getContentScriptJs, hashContentScriptOptions, mapWxtOptionsToContentScript, mapWxtOptionsToRegisteredContentScript };
@@ -1,39 +1,36 @@
1
- export class ContentSecurityPolicy {
2
- static DIRECTIVE_ORDER = {
3
- "default-src": 0,
4
- "script-src": 1,
5
- "object-src": 2
6
- };
7
- data;
8
- constructor(csp) {
9
- if (csp) {
10
- const sections = csp.split(";").map((section) => section.trim());
11
- this.data = sections.reduce((data, section) => {
12
- const [key, ...values] = section.split(" ").map((item) => item.trim());
13
- if (key) data[key] = values;
14
- return data;
15
- }, {});
16
- } else {
17
- this.data = {};
18
- }
19
- }
20
- /**
21
- * Ensure a set of values are listed under a directive.
22
- */
23
- add(directive, ...newValues) {
24
- const values = this.data[directive] ?? [];
25
- newValues.forEach((newValue) => {
26
- if (!values.includes(newValue)) values.push(newValue);
27
- });
28
- this.data[directive] = values;
29
- return this;
30
- }
31
- toString() {
32
- const directives = Object.entries(this.data).sort(([l], [r]) => {
33
- const lo = ContentSecurityPolicy.DIRECTIVE_ORDER[l] ?? 2;
34
- const ro = ContentSecurityPolicy.DIRECTIVE_ORDER[r] ?? 2;
35
- return lo - ro;
36
- });
37
- return directives.map((entry) => entry.flat().join(" ")).join("; ") + ";";
38
- }
39
- }
1
+ //#region src/core/utils/content-security-policy.ts
2
+ var ContentSecurityPolicy = class ContentSecurityPolicy {
3
+ static DIRECTIVE_ORDER = {
4
+ "default-src": 0,
5
+ "script-src": 1,
6
+ "object-src": 2
7
+ };
8
+ data;
9
+ constructor(csp) {
10
+ if (csp) this.data = csp.split(";").map((section) => section.trim()).reduce((data, section) => {
11
+ const [key, ...values] = section.split(" ").map((item) => item.trim());
12
+ if (key) data[key] = values;
13
+ return data;
14
+ }, {});
15
+ else this.data = {};
16
+ }
17
+ /**
18
+ * Ensure a set of values are listed under a directive.
19
+ */
20
+ add(directive, ...newValues) {
21
+ const values = this.data[directive] ?? [];
22
+ newValues.forEach((newValue) => {
23
+ if (!values.includes(newValue)) values.push(newValue);
24
+ });
25
+ this.data[directive] = values;
26
+ return this;
27
+ }
28
+ toString() {
29
+ return Object.entries(this.data).sort(([l], [r]) => {
30
+ return (ContentSecurityPolicy.DIRECTIVE_ORDER[l] ?? 2) - (ContentSecurityPolicy.DIRECTIVE_ORDER[r] ?? 2);
31
+ }).map((entry) => entry.flat().join(" ")).join("; ") + ";";
32
+ }
33
+ };
34
+
35
+ //#endregion
36
+ export { ContentSecurityPolicy };