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,390 +1,309 @@
1
- import { relative, resolve } from "path";
1
+ import { CSS_EXTENSIONS_PATTERN } from "../paths.mjs";
2
+ import { getEntrypointName, isHtmlEntrypoint, isJsEntrypoint, resolvePerBrowserOptions } from "../entrypoints.mjs";
3
+ import { VIRTUAL_NOOP_BACKGROUND_MODULE_ID } from "../constants.mjs";
4
+ import { wxt } from "../../wxt.mjs";
2
5
  import fs from "fs-extra";
3
- import { minimatch } from "minimatch";
4
- import { parseHTML } from "linkedom";
5
- import JSON5 from "json5";
6
6
  import glob from "fast-glob";
7
- import {
8
- getEntrypointName,
9
- isHtmlEntrypoint,
10
- isJsEntrypoint,
11
- resolvePerBrowserOptions
12
- } from "../../utils/entrypoints.mjs";
13
- import { VIRTUAL_NOOP_BACKGROUND_MODULE_ID } from "../../utils/constants.mjs";
14
- import { CSS_EXTENSIONS_PATTERN } from "../../utils/paths.mjs";
15
- import pc from "picocolors";
16
- import { wxt } from "../../wxt.mjs";
7
+ import { relative, resolve } from "path";
8
+ import { parseHTML } from "linkedom";
17
9
  import { camelCase } from "scule";
18
- export async function findEntrypoints() {
19
- await fs.mkdir(wxt.config.wxtDir, { recursive: true });
20
- try {
21
- await fs.writeJson(
22
- resolve(wxt.config.wxtDir, "tsconfig.json"),
23
- {},
24
- { flag: "wx" }
25
- );
26
- } catch (err) {
27
- if (!(err instanceof Error) || !("code" in err) || err.code !== "EEXIST") {
28
- throw err;
29
- }
30
- }
31
- const relativePaths = await glob(Object.keys(PATH_GLOB_TO_TYPE_MAP), {
32
- cwd: wxt.config.entrypointsDir
33
- });
34
- relativePaths.sort();
35
- const pathGlobs = Object.keys(PATH_GLOB_TO_TYPE_MAP);
36
- const entrypointInfos = relativePaths.reduce((results, relativePath) => {
37
- const inputPath = resolve(wxt.config.entrypointsDir, relativePath);
38
- const name = getEntrypointName(wxt.config.entrypointsDir, inputPath);
39
- const matchingGlob = pathGlobs.find(
40
- (glob2) => minimatch(relativePath, glob2)
41
- );
42
- if (matchingGlob) {
43
- const type = PATH_GLOB_TO_TYPE_MAP[matchingGlob];
44
- results.push({ name, inputPath, type });
45
- }
46
- return results;
47
- }, []).filter(({ name, inputPath }, _, entrypointInfos2) => {
48
- if (inputPath.endsWith(".html")) return true;
49
- const isIndexFile = /index\..+$/.test(inputPath);
50
- if (!isIndexFile) return true;
51
- const hasIndexHtml = entrypointInfos2.some(
52
- (entry) => entry.name === name && entry.inputPath.endsWith("index.html")
53
- );
54
- if (hasIndexHtml) return false;
55
- return true;
56
- });
57
- await wxt.hooks.callHook("entrypoints:found", wxt, entrypointInfos);
58
- preventNoEntrypoints(entrypointInfos);
59
- preventDuplicateEntrypointNames(entrypointInfos);
60
- let hasBackground = false;
61
- const entrypointOptions = await importEntrypoints(entrypointInfos);
62
- const entrypointsWithoutSkipped = await Promise.all(
63
- entrypointInfos.map(async (info) => {
64
- const { type } = info;
65
- const options = entrypointOptions[info.inputPath] ?? {};
66
- switch (type) {
67
- case "popup":
68
- return await getPopupEntrypoint(info, options);
69
- case "sidepanel":
70
- return await getSidepanelEntrypoint(info, options);
71
- case "options":
72
- return await getOptionsEntrypoint(info, options);
73
- case "background":
74
- hasBackground = true;
75
- return await getBackgroundEntrypoint(info, options);
76
- case "content-script":
77
- return await getContentScriptEntrypoint(info, options);
78
- case "unlisted-page":
79
- return await getUnlistedPageEntrypoint(info, options);
80
- case "unlisted-script":
81
- return await getUnlistedScriptEntrypoint(info, options);
82
- case "content-script-style":
83
- return {
84
- ...info,
85
- type,
86
- outputDir: resolve(wxt.config.outDir, CONTENT_SCRIPT_OUT_DIR),
87
- options: {
88
- include: options.include,
89
- exclude: options.exclude
90
- }
91
- };
92
- default:
93
- return {
94
- ...info,
95
- type,
96
- outputDir: wxt.config.outDir,
97
- options: {
98
- include: options.include,
99
- exclude: options.exclude
100
- }
101
- };
102
- }
103
- })
104
- );
105
- if (wxt.config.command === "serve" && !hasBackground) {
106
- entrypointsWithoutSkipped.push(
107
- await getBackgroundEntrypoint(
108
- {
109
- inputPath: VIRTUAL_NOOP_BACKGROUND_MODULE_ID,
110
- name: "background",
111
- type: "background"
112
- },
113
- {}
114
- )
115
- );
116
- }
117
- const entrypoints = entrypointsWithoutSkipped.map((entry) => ({
118
- ...entry,
119
- skipped: isEntrypointSkipped(entry)
120
- }));
121
- await wxt.hooks.callHook("entrypoints:resolved", wxt, entrypoints);
122
- wxt.logger.debug("All entrypoints:", entrypoints);
123
- const skippedEntrypointNames = entrypoints.filter((item) => item.skipped).map((item) => item.name);
124
- if (skippedEntrypointNames.length) {
125
- wxt.logger.warn(
126
- [
127
- "The following entrypoints have been skipped:",
128
- ...skippedEntrypointNames.map(
129
- (item) => `${pc.dim("-")} ${pc.cyan(item)}`
130
- )
131
- ].join("\n")
132
- );
133
- }
134
- return entrypoints;
10
+ import pc from "picocolors";
11
+ import { minimatch } from "minimatch";
12
+ import JSON5 from "json5";
13
+
14
+ //#region src/core/utils/building/find-entrypoints.ts
15
+ /**
16
+ * Return entrypoints and their configuration by looking through the project's files.
17
+ */
18
+ async function findEntrypoints() {
19
+ await fs.mkdir(wxt.config.wxtDir, { recursive: true });
20
+ try {
21
+ await fs.writeJson(resolve(wxt.config.wxtDir, "tsconfig.json"), {}, { flag: "wx" });
22
+ } catch (err) {
23
+ if (!(err instanceof Error) || !("code" in err) || err.code !== "EEXIST") throw err;
24
+ }
25
+ const relativePaths = await glob(Object.keys(PATH_GLOB_TO_TYPE_MAP), { cwd: wxt.config.entrypointsDir });
26
+ relativePaths.sort();
27
+ const pathGlobs = Object.keys(PATH_GLOB_TO_TYPE_MAP);
28
+ const entrypointInfos = relativePaths.reduce((results, relativePath) => {
29
+ const inputPath = resolve(wxt.config.entrypointsDir, relativePath);
30
+ const name = getEntrypointName(wxt.config.entrypointsDir, inputPath);
31
+ const matchingGlob = pathGlobs.find((glob) => minimatch(relativePath, glob));
32
+ if (matchingGlob) {
33
+ const type = PATH_GLOB_TO_TYPE_MAP[matchingGlob];
34
+ results.push({
35
+ name,
36
+ inputPath,
37
+ type
38
+ });
39
+ }
40
+ return results;
41
+ }, []).filter(({ name, inputPath }, _, entrypointInfos) => {
42
+ if (inputPath.endsWith(".html")) return true;
43
+ if (!/index\..+$/.test(inputPath)) return true;
44
+ return !entrypointInfos.some((entry) => entry.name === name && entry.inputPath.endsWith("index.html"));
45
+ });
46
+ await wxt.hooks.callHook("entrypoints:found", wxt, entrypointInfos);
47
+ preventNoEntrypoints(entrypointInfos);
48
+ preventDuplicateEntrypointNames(entrypointInfos);
49
+ let hasBackground = false;
50
+ const entrypointOptions = await importEntrypoints(entrypointInfos);
51
+ const entrypointsWithoutSkipped = await Promise.all(entrypointInfos.map(async (info) => {
52
+ const { type } = info;
53
+ const options = entrypointOptions[info.inputPath] ?? {};
54
+ switch (type) {
55
+ case "popup": return await getPopupEntrypoint(info, options);
56
+ case "sidepanel": return await getSidepanelEntrypoint(info, options);
57
+ case "options": return await getOptionsEntrypoint(info, options);
58
+ case "background":
59
+ hasBackground = true;
60
+ return await getBackgroundEntrypoint(info, options);
61
+ case "content-script": return await getContentScriptEntrypoint(info, options);
62
+ case "unlisted-page": return await getUnlistedPageEntrypoint(info, options);
63
+ case "unlisted-script": return await getUnlistedScriptEntrypoint(info, options);
64
+ case "content-script-style": return {
65
+ ...info,
66
+ type,
67
+ outputDir: resolve(wxt.config.outDir, CONTENT_SCRIPT_OUT_DIR),
68
+ options: {
69
+ include: options.include,
70
+ exclude: options.exclude
71
+ }
72
+ };
73
+ default: return {
74
+ ...info,
75
+ type,
76
+ outputDir: wxt.config.outDir,
77
+ options: {
78
+ include: options.include,
79
+ exclude: options.exclude
80
+ }
81
+ };
82
+ }
83
+ }));
84
+ if (wxt.config.command === "serve" && !hasBackground) entrypointsWithoutSkipped.push(await getBackgroundEntrypoint({
85
+ inputPath: VIRTUAL_NOOP_BACKGROUND_MODULE_ID,
86
+ name: "background",
87
+ type: "background"
88
+ }, {}));
89
+ const entrypoints = entrypointsWithoutSkipped.map((entry) => ({
90
+ ...entry,
91
+ skipped: isEntrypointSkipped(entry)
92
+ }));
93
+ await wxt.hooks.callHook("entrypoints:resolved", wxt, entrypoints);
94
+ wxt.logger.debug("All entrypoints:", entrypoints);
95
+ const skippedEntrypointNames = entrypoints.filter((item) => item.skipped).map((item) => item.name);
96
+ if (skippedEntrypointNames.length) wxt.logger.warn(["The following entrypoints have been skipped:", ...skippedEntrypointNames.map((item) => `${pc.dim("-")} ${pc.cyan(item)}`)].join("\n"));
97
+ return entrypoints;
135
98
  }
99
+ /** Returns a map of input paths to the file's options. */
136
100
  async function importEntrypoints(infos) {
137
- const resMap = {};
138
- const htmlInfos = infos.filter((info) => isHtmlEntrypoint(info));
139
- const jsInfos = infos.filter((info) => isJsEntrypoint(info));
140
- await Promise.all([
141
- // HTML
142
- ...htmlInfos.map(async (info) => {
143
- const res = await importHtmlEntrypoint(info);
144
- resMap[info.inputPath] = res;
145
- }),
146
- // JS
147
- (async () => {
148
- const res = await wxt.builder.importEntrypoints(
149
- jsInfos.map((info) => info.inputPath)
150
- );
151
- res.forEach((res2, i) => {
152
- resMap[jsInfos[i].inputPath] = res2;
153
- });
154
- })()
155
- // CSS - never has options
156
- ]);
157
- return resMap;
101
+ const resMap = {};
102
+ const htmlInfos = infos.filter((info) => isHtmlEntrypoint(info));
103
+ const jsInfos = infos.filter((info) => isJsEntrypoint(info));
104
+ await Promise.all([...htmlInfos.map(async (info) => {
105
+ resMap[info.inputPath] = await importHtmlEntrypoint(info);
106
+ }), (async () => {
107
+ (await wxt.builder.importEntrypoints(jsInfos.map((info) => info.inputPath))).forEach((res, i) => {
108
+ resMap[jsInfos[i].inputPath] = res;
109
+ });
110
+ })()]);
111
+ return resMap;
158
112
  }
113
+ /** Extract `manifest.` options from meta tags, converting snake_case keys to camelCase */
159
114
  async function importHtmlEntrypoint(info) {
160
- const content = await fs.readFile(info.inputPath, "utf-8");
161
- const { document } = parseHTML(content);
162
- const metaTags = document.querySelectorAll("meta");
163
- const res = {
164
- title: document.querySelector("title")?.textContent || void 0
165
- };
166
- metaTags.forEach((tag) => {
167
- const name = tag.name;
168
- if (!name.startsWith("manifest.")) return;
169
- const key = camelCase(name.slice(9));
170
- try {
171
- res[key] = JSON5.parse(tag.content);
172
- } catch {
173
- res[key] = tag.content;
174
- }
175
- });
176
- return res;
115
+ const { document } = parseHTML(await fs.readFile(info.inputPath, "utf-8"));
116
+ const metaTags = document.querySelectorAll("meta");
117
+ const res = { title: document.querySelector("title")?.textContent || void 0 };
118
+ metaTags.forEach((tag) => {
119
+ const name = tag.name;
120
+ if (!name.startsWith("manifest.")) return;
121
+ const key = camelCase(name.slice(9));
122
+ try {
123
+ res[key] = JSON5.parse(tag.content);
124
+ } catch {
125
+ res[key] = tag.content;
126
+ }
127
+ });
128
+ return res;
177
129
  }
178
130
  function preventDuplicateEntrypointNames(files) {
179
- const namesToPaths = files.reduce(
180
- (map, { name, inputPath }) => {
181
- map[name] ??= [];
182
- map[name].push(inputPath);
183
- return map;
184
- },
185
- {}
186
- );
187
- const errorLines = Object.entries(namesToPaths).reduce(
188
- (lines, [name, absolutePaths]) => {
189
- if (absolutePaths.length > 1) {
190
- lines.push(`- ${name}`);
191
- absolutePaths.forEach((absolutePath) => {
192
- lines.push(` - ${relative(wxt.config.root, absolutePath)}`);
193
- });
194
- }
195
- return lines;
196
- },
197
- []
198
- );
199
- if (errorLines.length > 0) {
200
- const errorContent = errorLines.join("\n");
201
- throw Error(
202
- `Multiple entrypoints with the same name detected, only one entrypoint for each name is allowed.
203
-
204
- ${errorContent}`
205
- );
206
- }
131
+ const namesToPaths = files.reduce((map, { name, inputPath }) => {
132
+ map[name] ??= [];
133
+ map[name].push(inputPath);
134
+ return map;
135
+ }, {});
136
+ const errorLines = Object.entries(namesToPaths).reduce((lines, [name, absolutePaths]) => {
137
+ if (absolutePaths.length > 1) {
138
+ lines.push(`- ${name}`);
139
+ absolutePaths.forEach((absolutePath) => {
140
+ lines.push(` - ${relative(wxt.config.root, absolutePath)}`);
141
+ });
142
+ }
143
+ return lines;
144
+ }, []);
145
+ if (errorLines.length > 0) {
146
+ const errorContent = errorLines.join("\n");
147
+ throw Error(`Multiple entrypoints with the same name detected, only one entrypoint for each name is allowed.\n\n${errorContent}`);
148
+ }
207
149
  }
208
150
  function preventNoEntrypoints(files) {
209
- if (files.length === 0) {
210
- throw Error(`No entrypoints found in ${wxt.config.entrypointsDir}`);
211
- }
151
+ if (files.length === 0) throw Error(`No entrypoints found in ${wxt.config.entrypointsDir}`);
212
152
  }
213
153
  async function getPopupEntrypoint(info, options) {
214
- const stictOptions = resolvePerBrowserOptions(
215
- {
216
- browserStyle: options.browserStyle,
217
- exclude: options.exclude,
218
- include: options.include,
219
- defaultIcon: options.defaultIcon,
220
- defaultTitle: options.title,
221
- mv2Key: options.type
222
- },
223
- wxt.config.browser
224
- );
225
- if (stictOptions.mv2Key && stictOptions.mv2Key !== "page_action")
226
- stictOptions.mv2Key = "browser_action";
227
- return {
228
- type: "popup",
229
- name: "popup",
230
- options: stictOptions,
231
- inputPath: info.inputPath,
232
- outputDir: wxt.config.outDir
233
- };
154
+ const strictOptions = resolvePerBrowserOptions({
155
+ browserStyle: options.browserStyle,
156
+ exclude: options.exclude,
157
+ include: options.include,
158
+ defaultIcon: options.defaultIcon,
159
+ defaultTitle: options.title,
160
+ mv2Key: options.type,
161
+ defaultArea: options.defaultArea
162
+ }, wxt.config.browser);
163
+ if (strictOptions.mv2Key && strictOptions.mv2Key !== "page_action") strictOptions.mv2Key = "browser_action";
164
+ const themeIcons = options.themeIcons;
165
+ return {
166
+ type: "popup",
167
+ name: "popup",
168
+ options: {
169
+ ...strictOptions,
170
+ themeIcons
171
+ },
172
+ inputPath: info.inputPath,
173
+ outputDir: wxt.config.outDir
174
+ };
234
175
  }
235
176
  async function getOptionsEntrypoint(info, options) {
236
- return {
237
- type: "options",
238
- name: "options",
239
- options: resolvePerBrowserOptions(
240
- {
241
- browserStyle: options.browserStyle,
242
- chromeStyle: options.chromeStyle,
243
- exclude: options.exclude,
244
- include: options.include,
245
- openInTab: options.openInTab
246
- },
247
- wxt.config.browser
248
- ),
249
- inputPath: info.inputPath,
250
- outputDir: wxt.config.outDir
251
- };
177
+ return {
178
+ type: "options",
179
+ name: "options",
180
+ options: resolvePerBrowserOptions({
181
+ browserStyle: options.browserStyle,
182
+ chromeStyle: options.chromeStyle,
183
+ exclude: options.exclude,
184
+ include: options.include,
185
+ openInTab: options.openInTab
186
+ }, wxt.config.browser),
187
+ inputPath: info.inputPath,
188
+ outputDir: wxt.config.outDir
189
+ };
252
190
  }
253
191
  async function getUnlistedPageEntrypoint(info, options) {
254
- return {
255
- type: "unlisted-page",
256
- name: info.name,
257
- inputPath: info.inputPath,
258
- outputDir: wxt.config.outDir,
259
- options: {
260
- include: options.include,
261
- exclude: options.exclude
262
- }
263
- };
192
+ return {
193
+ type: "unlisted-page",
194
+ name: info.name,
195
+ inputPath: info.inputPath,
196
+ outputDir: wxt.config.outDir,
197
+ options: {
198
+ include: options.include,
199
+ exclude: options.exclude
200
+ }
201
+ };
264
202
  }
265
203
  async function getUnlistedScriptEntrypoint({ inputPath, name }, options) {
266
- return {
267
- type: "unlisted-script",
268
- name,
269
- inputPath,
270
- outputDir: wxt.config.outDir,
271
- options: resolvePerBrowserOptions(
272
- {
273
- include: options.include,
274
- exclude: options.exclude
275
- },
276
- wxt.config.browser
277
- )
278
- };
204
+ return {
205
+ type: "unlisted-script",
206
+ name,
207
+ inputPath,
208
+ outputDir: wxt.config.outDir,
209
+ options: resolvePerBrowserOptions({
210
+ include: options.include,
211
+ exclude: options.exclude
212
+ }, wxt.config.browser)
213
+ };
279
214
  }
280
215
  async function getBackgroundEntrypoint({ inputPath, name }, options) {
281
- const strictOptions = resolvePerBrowserOptions(
282
- {
283
- include: options.include,
284
- exclude: options.exclude,
285
- persistent: options.persistent,
286
- type: options.type
287
- },
288
- wxt.config.browser
289
- );
290
- if (wxt.config.manifestVersion !== 3) {
291
- delete strictOptions.type;
292
- }
293
- return {
294
- type: "background",
295
- name,
296
- inputPath,
297
- outputDir: wxt.config.outDir,
298
- options: strictOptions
299
- };
216
+ const strictOptions = resolvePerBrowserOptions({
217
+ include: options.include,
218
+ exclude: options.exclude,
219
+ persistent: options.persistent,
220
+ type: options.type
221
+ }, wxt.config.browser);
222
+ if (wxt.config.manifestVersion !== 3) delete strictOptions.type;
223
+ return {
224
+ type: "background",
225
+ name,
226
+ inputPath,
227
+ outputDir: wxt.config.outDir,
228
+ options: strictOptions
229
+ };
300
230
  }
301
231
  async function getContentScriptEntrypoint({ inputPath, name }, options) {
302
- return {
303
- type: "content-script",
304
- name,
305
- inputPath,
306
- outputDir: resolve(wxt.config.outDir, CONTENT_SCRIPT_OUT_DIR),
307
- options: resolvePerBrowserOptions(
308
- options,
309
- wxt.config.browser
310
- )
311
- };
232
+ return {
233
+ type: "content-script",
234
+ name,
235
+ inputPath,
236
+ outputDir: resolve(wxt.config.outDir, CONTENT_SCRIPT_OUT_DIR),
237
+ options: resolvePerBrowserOptions(options, wxt.config.browser)
238
+ };
312
239
  }
313
240
  async function getSidepanelEntrypoint(info, options) {
314
- return {
315
- type: "sidepanel",
316
- name: info.name,
317
- options: resolvePerBrowserOptions(
318
- {
319
- browserStyle: options.browserStyle,
320
- exclude: options.exclude,
321
- include: options.include,
322
- defaultIcon: options.defaultIcon,
323
- defaultTitle: options.title,
324
- openAtInstall: options.openAtInstall
325
- },
326
- wxt.config.browser
327
- ),
328
- inputPath: info.inputPath,
329
- outputDir: wxt.config.outDir
330
- };
241
+ return {
242
+ type: "sidepanel",
243
+ name: info.name,
244
+ options: resolvePerBrowserOptions({
245
+ browserStyle: options.browserStyle,
246
+ exclude: options.exclude,
247
+ include: options.include,
248
+ defaultIcon: options.defaultIcon,
249
+ defaultTitle: options.title,
250
+ openAtInstall: options.openAtInstall
251
+ }, wxt.config.browser),
252
+ inputPath: info.inputPath,
253
+ outputDir: wxt.config.outDir
254
+ };
331
255
  }
332
256
  function isEntrypointSkipped(entry) {
333
- if (wxt.config.filterEntrypoints != null) {
334
- return !wxt.config.filterEntrypoints.has(entry.name);
335
- }
336
- const { include, exclude } = entry.options;
337
- if (include?.length && exclude?.length) {
338
- wxt.logger.warn(
339
- `The ${entry.name} entrypoint lists both include and exclude, but only one can be used per entrypoint. Entrypoint skipped.`
340
- );
341
- return true;
342
- }
343
- if (exclude?.length && !include?.length) {
344
- return exclude.includes(wxt.config.browser);
345
- }
346
- if (include?.length && !exclude?.length) {
347
- return !include.includes(wxt.config.browser);
348
- }
349
- return false;
257
+ if (wxt.config.filterEntrypoints != null) return !wxt.config.filterEntrypoints.has(entry.name);
258
+ const { include, exclude } = entry.options;
259
+ if (include?.length && exclude?.length) {
260
+ wxt.logger.warn(`The ${entry.name} entrypoint lists both include and exclude, but only one can be used per entrypoint. Entrypoint skipped.`);
261
+ return true;
262
+ }
263
+ if (exclude?.length && !include?.length) return exclude.includes(wxt.config.browser);
264
+ if (include?.length && !exclude?.length) return !include.includes(wxt.config.browser);
265
+ return false;
350
266
  }
351
267
  const PATH_GLOB_TO_TYPE_MAP = {
352
- "sandbox.html": "sandbox",
353
- "sandbox/index.html": "sandbox",
354
- "*.sandbox.html": "sandbox",
355
- "*.sandbox/index.html": "sandbox",
356
- "bookmarks.html": "bookmarks",
357
- "bookmarks/index.html": "bookmarks",
358
- "history.html": "history",
359
- "history/index.html": "history",
360
- "newtab.html": "newtab",
361
- "newtab/index.html": "newtab",
362
- "sidepanel.html": "sidepanel",
363
- "sidepanel/index.html": "sidepanel",
364
- "*.sidepanel.html": "sidepanel",
365
- "*.sidepanel/index.html": "sidepanel",
366
- "devtools.html": "devtools",
367
- "devtools/index.html": "devtools",
368
- "background.[jt]s": "background",
369
- "background/index.[jt]s": "background",
370
- [VIRTUAL_NOOP_BACKGROUND_MODULE_ID]: "background",
371
- "content.[jt]s?(x)": "content-script",
372
- "content/index.[jt]s?(x)": "content-script",
373
- "*.content.[jt]s?(x)": "content-script",
374
- "*.content/index.[jt]s?(x)": "content-script",
375
- [`content.${CSS_EXTENSIONS_PATTERN}`]: "content-script-style",
376
- [`*.content.${CSS_EXTENSIONS_PATTERN}`]: "content-script-style",
377
- [`content/index.${CSS_EXTENSIONS_PATTERN}`]: "content-script-style",
378
- [`*.content/index.${CSS_EXTENSIONS_PATTERN}`]: "content-script-style",
379
- "popup.html": "popup",
380
- "popup/index.html": "popup",
381
- "options.html": "options",
382
- "options/index.html": "options",
383
- "*.html": "unlisted-page",
384
- "*/index.html": "unlisted-page",
385
- "*.[jt]s?(x)": "unlisted-script",
386
- "*/index.[jt]s?(x)": "unlisted-script",
387
- [`*.${CSS_EXTENSIONS_PATTERN}`]: "unlisted-style",
388
- [`*/index.${CSS_EXTENSIONS_PATTERN}`]: "unlisted-style"
268
+ "sandbox.html": "sandbox",
269
+ "sandbox/index.html": "sandbox",
270
+ "*.sandbox.html": "sandbox",
271
+ "*.sandbox/index.html": "sandbox",
272
+ "bookmarks.html": "bookmarks",
273
+ "bookmarks/index.html": "bookmarks",
274
+ "history.html": "history",
275
+ "history/index.html": "history",
276
+ "newtab.html": "newtab",
277
+ "newtab/index.html": "newtab",
278
+ "sidepanel.html": "sidepanel",
279
+ "sidepanel/index.html": "sidepanel",
280
+ "*.sidepanel.html": "sidepanel",
281
+ "*.sidepanel/index.html": "sidepanel",
282
+ "devtools.html": "devtools",
283
+ "devtools/index.html": "devtools",
284
+ "background.[jt]s": "background",
285
+ "background/index.[jt]s": "background",
286
+ [VIRTUAL_NOOP_BACKGROUND_MODULE_ID]: "background",
287
+ "content.[jt]s?(x)": "content-script",
288
+ "content/index.[jt]s?(x)": "content-script",
289
+ "*.content.[jt]s?(x)": "content-script",
290
+ "*.content/index.[jt]s?(x)": "content-script",
291
+ [`content.${CSS_EXTENSIONS_PATTERN}`]: "content-script-style",
292
+ [`*.content.${CSS_EXTENSIONS_PATTERN}`]: "content-script-style",
293
+ [`content/index.${CSS_EXTENSIONS_PATTERN}`]: "content-script-style",
294
+ [`*.content/index.${CSS_EXTENSIONS_PATTERN}`]: "content-script-style",
295
+ "popup.html": "popup",
296
+ "popup/index.html": "popup",
297
+ "options.html": "options",
298
+ "options/index.html": "options",
299
+ "*.html": "unlisted-page",
300
+ "*/index.html": "unlisted-page",
301
+ "*.[jt]s?(x)": "unlisted-script",
302
+ "*/index.[jt]s?(x)": "unlisted-script",
303
+ [`*.${CSS_EXTENSIONS_PATTERN}`]: "unlisted-style",
304
+ [`*/index.${CSS_EXTENSIONS_PATTERN}`]: "unlisted-style"
389
305
  };
390
306
  const CONTENT_SCRIPT_OUT_DIR = "content-scripts";
307
+
308
+ //#endregion
309
+ export { findEntrypoints };