wxt 0.21.4 → 0.21.5

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 (139) hide show
  1. package/README.md +1 -1
  2. package/dist/{core/build.d.mts → build.d.mts} +2 -2
  3. package/dist/{core/build.mjs → build.mjs} +3 -4
  4. package/dist/{core/clean.d.mts → clean.d.mts} +2 -2
  5. package/dist/{core/clean.mjs → clean.mjs} +3 -3
  6. package/dist/cli/cli-utils.mjs +6 -6
  7. package/dist/cli/commands.mjs +10 -9
  8. package/dist/{core/create-server.d.mts → create-server.d.mts} +2 -2
  9. package/dist/{core/create-server.mjs → create-server.mjs} +13 -14
  10. package/dist/define-config.d.mts +6 -0
  11. package/dist/{core/define-config.mjs → define-config.mjs} +1 -1
  12. package/dist/{core/define-web-ext-config.d.mts → define-web-ext-config.d.mts} +2 -2
  13. package/dist/{core/define-web-ext-config.mjs → define-web-ext-config.mjs} +1 -1
  14. package/dist/index.d.mts +12 -12
  15. package/dist/index.mjs +10 -11
  16. package/dist/{core/initialize.d.mts → initialize.d.mts} +2 -1
  17. package/dist/{core/initialize.mjs → initialize.mjs} +22 -7
  18. package/dist/inline/dotenv-expand/index.mjs +31 -0
  19. package/dist/{core/utils/building → internal}/build-entrypoints.mjs +5 -5
  20. package/dist/internal/builders/unknown.mjs +22 -0
  21. package/dist/{core → internal}/builders/vite/index.mjs +136 -138
  22. package/dist/internal/builders/vite/plugins/add-entrypoint-group-runtime-env-entries.mjs +16 -0
  23. package/dist/internal/builders/vite/plugins/add-runtime-env-entries.mjs +14 -0
  24. package/dist/{core/builders/vite/plugins/bundleAnalysis.mjs → internal/builders/vite/plugins/bundle-analysis.mjs} +1 -1
  25. package/dist/{core/builders/vite/plugins/cssEntrypoints.mjs → internal/builders/vite/plugins/css-entrypoints.mjs} +2 -2
  26. package/dist/{core/builders/vite/plugins/defineImportMeta.mjs → internal/builders/vite/plugins/define-import-meta.mjs} +1 -1
  27. package/dist/{core/builders/vite/plugins/devHtmlPrerender.mjs → internal/builders/vite/plugins/dev-html-prerender.mjs} +4 -5
  28. package/dist/{core/builders/vite/plugins/devServerGlobals.mjs → internal/builders/vite/plugins/dev-server-globals.mjs} +1 -1
  29. package/dist/{core/builders/vite/plugins/extensionApiMock.mjs → internal/builders/vite/plugins/extension-api-mock.mjs} +1 -1
  30. package/dist/{core/builders/vite/plugins/iifeAnonymous.mjs → internal/builders/vite/plugins/iife-anonymous.mjs} +1 -1
  31. package/dist/{core/builders/vite/plugins/iifeFooter.mjs → internal/builders/vite/plugins/iife-footer.mjs} +1 -1
  32. package/dist/internal/builders/vite/plugins/index.mjs +17 -0
  33. package/dist/{core/builders/vite/plugins/noopBackground.mjs → internal/builders/vite/plugins/noop-background.mjs} +2 -2
  34. package/dist/{core/builders/vite/plugins/removeEntrypointMainFunction.mjs → internal/builders/vite/plugins/remove-entrypoint-main-function.mjs} +3 -4
  35. package/dist/{core/builders/vite/plugins/resolveAppConfig.mjs → internal/builders/vite/plugins/resolve-app-config.mjs} +2 -2
  36. package/dist/{core/builders/vite/plugins/resolveVirtualModules.mjs → internal/builders/vite/plugins/resolve-virtual-modules.mjs} +8 -6
  37. package/dist/{core/builders/vite/plugins/tsconfigPaths.mjs → internal/builders/vite/plugins/tsconfig-paths.mjs} +1 -1
  38. package/dist/internal/builders/vite/plugins/wxt-plugin-loader.mjs +77 -0
  39. package/dist/{builtin-modules → internal/builtin-modules}/escape-unicode.mjs +2 -2
  40. package/dist/{builtin-modules → internal/builtin-modules}/favicon-permission.mjs +2 -2
  41. package/dist/{builtin-modules → internal/builtin-modules}/index.mjs +4 -2
  42. package/dist/internal/builtin-modules/plugins.mjs +21 -0
  43. package/dist/{builtin-modules → internal/builtin-modules}/unimport.mjs +17 -6
  44. package/dist/{core/utils → internal}/constants.mjs +1 -1
  45. package/dist/internal/detect-builder.mjs +9 -0
  46. package/dist/{core/utils/building → internal}/detect-dev-changes.mjs +4 -4
  47. package/dist/internal/detect-runner.mjs +11 -0
  48. package/dist/internal/entrypoint-finders/flat.mjs +84 -0
  49. package/dist/internal/environments/browser-environment.mjs +48 -0
  50. package/dist/{core/utils → internal}/environments/environment.mjs +1 -1
  51. package/dist/{core/utils → internal}/environments/extension-environment.mjs +1 -1
  52. package/dist/{core/utils/create-file-reloader.mjs → internal/file-reloader.mjs} +10 -11
  53. package/dist/{core/utils/building → internal}/find-entrypoints.mjs +8 -73
  54. package/dist/{core → internal}/generate-wxt-dir.mjs +10 -10
  55. package/dist/internal/get-public-files.mjs +14 -0
  56. package/dist/{core/utils/building → internal}/group-entrypoints.mjs +1 -1
  57. package/dist/{core/utils → internal}/i18n.mjs +1 -1
  58. package/dist/{core/utils/building → internal}/internal-build.mjs +10 -10
  59. package/dist/{core → internal}/keyboard-shortcuts.mjs +1 -1
  60. package/dist/{core/utils → internal}/manifest.mjs +9 -9
  61. package/dist/{core → internal}/package-managers/bun.mjs +1 -1
  62. package/dist/{core → internal}/package-managers/deno.mjs +1 -1
  63. package/dist/{core → internal}/package-managers/index.mjs +1 -1
  64. package/dist/{core → internal}/package-managers/npm.mjs +1 -1
  65. package/dist/{core → internal}/package-managers/pnpm.mjs +1 -1
  66. package/dist/{core → internal}/package-managers/yarn.mjs +1 -1
  67. package/dist/{core/utils → internal}/package.mjs +3 -3
  68. package/dist/{core/utils/building → internal}/rebuild.mjs +5 -5
  69. package/dist/{core → internal}/resolve-config.mjs +14 -32
  70. package/dist/internal/runners/manual.mjs +22 -0
  71. package/dist/internal/runners/web-ext.mjs +79 -0
  72. package/dist/{core/utils/globals.mjs → internal/runtime-env-entries.mjs} +4 -4
  73. package/dist/{core/utils → internal}/spinner.mjs +1 -1
  74. package/dist/{core/utils → internal}/syntax-errors.mjs +2 -2
  75. package/dist/{core/utils → internal}/theme-icons.mjs +3 -3
  76. package/dist/{core/utils → internal}/transform.mjs +1 -1
  77. package/dist/{core/utils → internal}/validation.mjs +1 -1
  78. package/dist/{core → internal}/wxt.mjs +24 -7
  79. package/dist/{core/utils/arrays.mjs → internal-utils/array-utils.mjs} +1 -1
  80. package/dist/{core/utils/cache.mjs → internal-utils/cache-utils.mjs} +3 -3
  81. package/dist/{core/utils/content-scripts.mjs → internal-utils/content-script-utils.mjs} +2 -2
  82. package/dist/{core/utils/content-security-policy.mjs → internal-utils/csp-utils.mjs} +1 -1
  83. package/dist/{core/utils/entrypoints.d.mts → internal-utils/entrypoint-utils.d.mts} +2 -2
  84. package/dist/{core/utils/entrypoints.mjs → internal-utils/entrypoint-utils.mjs} +2 -2
  85. package/dist/{core/utils/env.mjs → internal-utils/env-utils.mjs} +3 -3
  86. package/dist/internal-utils/eslint-utils.mjs +8 -0
  87. package/dist/{core/utils/fs.mjs → internal-utils/fs-utils.mjs} +2 -12
  88. package/dist/internal-utils/log/index.mjs +6 -0
  89. package/dist/{core/utils/log/printBuildSummary.mjs → internal-utils/log/print-build-summary.mjs} +3 -3
  90. package/dist/{core/utils/log/printFileList.mjs → internal-utils/log/print-file-list.mjs} +7 -6
  91. package/dist/{core/utils/log/printHeader.mjs → internal-utils/log/print-header.mjs} +2 -2
  92. package/dist/{core/utils/log/printTable.mjs → internal-utils/log/print-table.mjs} +1 -1
  93. package/dist/{core/utils/log/wxtLogger.mjs → internal-utils/log/wxt-logger.mjs} +1 -1
  94. package/dist/internal-utils/module-utils.mjs +32 -0
  95. package/dist/{core/utils/number.mjs → internal-utils/number-utils.mjs} +1 -1
  96. package/dist/{core/utils/paths.d.mts → internal-utils/path-utils.d.mts} +1 -1
  97. package/dist/{core/utils/paths.mjs → internal-utils/path-utils.mjs} +2 -2
  98. package/dist/{core/utils/strings.mjs → internal-utils/string-utils.mjs} +2 -2
  99. package/dist/{core/utils/time.mjs → internal-utils/time-utils.mjs} +1 -1
  100. package/dist/{core/utils/types.d.mts → internal-utils/type-utils.d.mts} +2 -1
  101. package/dist/{modules.d.mts → modules/index.d.mts} +10 -4
  102. package/dist/{modules.mjs → modules/index.mjs} +14 -5
  103. package/dist/prepare.d.mts +6 -0
  104. package/dist/prepare.mjs +11 -0
  105. package/dist/testing/wxt-vitest-plugin.mjs +7 -7
  106. package/dist/types.d.mts +72 -19
  107. package/dist/utils/content-script-context.d.mts +1 -1
  108. package/dist/utils/content-script-ui/iframe.d.mts +5 -0
  109. package/dist/utils/content-script-ui/integrated.d.mts +5 -0
  110. package/dist/utils/content-script-ui/shadow-root.d.mts +5 -0
  111. package/dist/utils/content-script-ui/types.d.mts +23 -7
  112. package/dist/utils/internal/custom-events.d.mts +11 -1
  113. package/dist/utils/internal/custom-events.mjs +4 -0
  114. package/dist/version.mjs +1 -1
  115. package/dist/virtual/background-entrypoint.mjs +11 -0
  116. package/dist/{core/zip.d.mts → zip.d.mts} +2 -2
  117. package/dist/{core/zip.mjs → zip.mjs} +11 -13
  118. package/package.json +7 -7
  119. package/dist/core/builders/vite/plugins/entrypointGroupGlobals.mjs +0 -16
  120. package/dist/core/builders/vite/plugins/globals.mjs +0 -14
  121. package/dist/core/builders/vite/plugins/index.mjs +0 -17
  122. package/dist/core/builders/vite/plugins/wxtPluginLoader.mjs +0 -56
  123. package/dist/core/define-config.d.mts +0 -6
  124. package/dist/core/index.d.mts +0 -10
  125. package/dist/core/index.mjs +0 -12
  126. package/dist/core/prepare.d.mts +0 -6
  127. package/dist/core/prepare.mjs +0 -12
  128. package/dist/core/runners/manual.mjs +0 -11
  129. package/dist/core/runners/safari.mjs +0 -14
  130. package/dist/core/runners/web-ext.mjs +0 -63
  131. package/dist/core/runners/wsl.mjs +0 -14
  132. package/dist/core/utils/building/index.mjs +0 -7
  133. package/dist/core/utils/environments/browser-environment.mjs +0 -18
  134. package/dist/core/utils/eslint.mjs +0 -11
  135. package/dist/core/utils/index.d.mts +0 -2
  136. package/dist/core/utils/index.mjs +0 -3
  137. package/dist/core/utils/log/index.mjs +0 -6
  138. /package/dist/{core/utils → internal}/environments/index.mjs +0 -0
  139. /package/dist/{core/utils → internal}/virtual-modules.mjs +0 -0
@@ -1,80 +1,150 @@
1
- import { normalizePath } from "../../utils/paths.mjs";
2
- import { getEntrypointBundlePath, isHtmlEntrypoint } from "../../utils/entrypoints.mjs";
3
- import "../../utils/index.mjs";
4
- import { toArray } from "../../utils/arrays.mjs";
5
- import { createExtensionEnvironment } from "../../utils/environments/extension-environment.mjs";
6
- import "../../utils/environments/index.mjs";
7
- import { safeVarName } from "../../utils/strings.mjs";
8
- import { devHtmlPrerender } from "./plugins/devHtmlPrerender.mjs";
9
- import { devServerGlobals } from "./plugins/devServerGlobals.mjs";
10
- import { resolveVirtualModules } from "./plugins/resolveVirtualModules.mjs";
11
- import { tsconfigPaths } from "./plugins/tsconfigPaths.mjs";
12
- import { noopBackground } from "./plugins/noopBackground.mjs";
13
- import { cssEntrypoints } from "./plugins/cssEntrypoints.mjs";
14
- import { bundleAnalysis } from "./plugins/bundleAnalysis.mjs";
15
- import { globals } from "./plugins/globals.mjs";
16
- import { entrypointGroupGlobals } from "./plugins/entrypointGroupGlobals.mjs";
17
- import { defineImportMeta } from "./plugins/defineImportMeta.mjs";
18
- import { removeEntrypointMainFunction } from "./plugins/removeEntrypointMainFunction.mjs";
19
- import { wxtPluginLoader } from "./plugins/wxtPluginLoader.mjs";
20
- import { resolveAppConfig } from "./plugins/resolveAppConfig.mjs";
21
- import { iifeFooter } from "./plugins/iifeFooter.mjs";
22
- import { iifeAnonymous } from "./plugins/iifeAnonymous.mjs";
1
+ import { normalizePath } from "../../../internal-utils/path-utils.mjs";
2
+ import { getEntrypointBundlePath, isHtmlEntrypoint } from "../../../internal-utils/entrypoint-utils.mjs";
3
+ import { toArray } from "../../../internal-utils/array-utils.mjs";
4
+ import { createExtensionEnvironment } from "../../environments/extension-environment.mjs";
5
+ import "../../environments/index.mjs";
6
+ import { safeVarName } from "../../../internal-utils/string-utils.mjs";
7
+ import { entrypointGroupGlobals } from "./plugins/add-entrypoint-group-runtime-env-entries.mjs";
8
+ import { addRuntimeEnvEntries } from "./plugins/add-runtime-env-entries.mjs";
9
+ import { bundleAnalysis } from "./plugins/bundle-analysis.mjs";
10
+ import { cssEntrypoints } from "./plugins/css-entrypoints.mjs";
11
+ import { defineImportMeta } from "./plugins/define-import-meta.mjs";
12
+ import { devHtmlPrerender } from "./plugins/dev-html-prerender.mjs";
13
+ import { devServerGlobals } from "./plugins/dev-server-globals.mjs";
14
+ import { iifeAnonymous } from "./plugins/iife-anonymous.mjs";
15
+ import { iifeFooter } from "./plugins/iife-footer.mjs";
16
+ import { noopBackground } from "./plugins/noop-background.mjs";
17
+ import { removeEntrypointMainFunction } from "./plugins/remove-entrypoint-main-function.mjs";
18
+ import { resolveAppConfig } from "./plugins/resolve-app-config.mjs";
19
+ import { tsconfigPaths } from "./plugins/tsconfig-paths.mjs";
23
20
  import "./plugins/index.mjs";
24
21
  import { mkdir, readdir, rename, rmdir, stat } from "node:fs/promises";
25
22
  import { dirname, extname, join, relative, resolve } from "node:path";
26
- //#region src/core/builders/vite/index.ts
27
- async function createViteBuilder(wxtConfig, hooks, getWxtDevServer) {
28
- const vite = await import("vite");
23
+ //#region src/internal/builders/vite/index.ts
24
+ var ViteBuilder = class {
25
+ name = "Vite";
26
+ version;
27
+ constructor(vite, config, hooks, getWxtDevServer) {
28
+ this.vite = vite;
29
+ this.config = config;
30
+ this.hooks = hooks;
31
+ this.getWxtDevServer = getWxtDevServer;
32
+ this.version = vite.version;
33
+ }
34
+ async build(group) {
35
+ let entryConfig;
36
+ if (Array.isArray(group)) entryConfig = this.getMultiPageConfig(group);
37
+ else if (group.type === "content-script-style" || group.type === "unlisted-style") entryConfig = this.getCssConfig(group);
38
+ else entryConfig = this.getLibModeConfig(group);
39
+ const buildConfig = this.vite.mergeConfig(await this.getBaseConfig(), entryConfig);
40
+ await this.hooks.callHook("vite:build:extendConfig", toArray(group), buildConfig);
41
+ const chunks = getBuildOutputChunks(await this.vite.build(buildConfig));
42
+ return {
43
+ entrypoints: group,
44
+ chunks: await moveHtmlFiles(this.config, group, chunks)
45
+ };
46
+ }
47
+ async createServer(info) {
48
+ const serverConfig = { server: {
49
+ host: info.host,
50
+ port: info.port,
51
+ strictPort: true,
52
+ origin: info.origin
53
+ } };
54
+ const baseConfig = await this.getBaseConfig();
55
+ const finalConfig = this.vite.mergeConfig(baseConfig, serverConfig);
56
+ await this.hooks.callHook("vite:devServer:extendConfig", finalConfig);
57
+ const viteServer = await this.vite.createServer(finalConfig);
58
+ return {
59
+ async listen() {
60
+ await viteServer.listen(info.port);
61
+ },
62
+ async close() {
63
+ await viteServer.close();
64
+ },
65
+ transformHtml(...args) {
66
+ return viteServer.transformIndexHtml(...args);
67
+ },
68
+ ws: {
69
+ send(message, payload) {
70
+ return viteServer.ws.send(message, payload);
71
+ },
72
+ on(message, cb) {
73
+ viteServer.ws.on(message, cb);
74
+ }
75
+ },
76
+ watcher: viteServer.watcher,
77
+ on(event, cb) {
78
+ viteServer.httpServer?.on(event, cb);
79
+ }
80
+ };
81
+ }
82
+ async importEntrypoint(path) {
83
+ const [module] = await this.importEntrypoints([path]);
84
+ return module;
85
+ }
86
+ async importEntrypoints(paths) {
87
+ const context = createExtensionEnvironment();
88
+ const environment = await this.createImporterEnvironment(paths);
89
+ try {
90
+ return await context.run(async () => await Promise.all(paths.map(async (path) => {
91
+ const module = await environment.runner.import(path);
92
+ this.requireDefaultExport(path, module);
93
+ return module.default;
94
+ })));
95
+ } finally {
96
+ await environment.close();
97
+ }
98
+ }
29
99
  /**
30
100
  * Returns the base vite config shared by all builds based on the inline and
31
101
  * user config.
32
102
  */
33
- const getBaseConfig = async (baseConfigOptions) => {
34
- const config = await wxtConfig.vite(wxtConfig.env);
35
- config.root = wxtConfig.root;
103
+ async getBaseConfig(options) {
104
+ const config = await this.config.vite(this.config.env);
105
+ config.root = this.config.root;
36
106
  config.configFile = false;
37
107
  config.logLevel = "warn";
38
- config.mode = wxtConfig.mode;
108
+ config.mode = this.config.mode;
39
109
  config.envPrefix ??= ["VITE_", "WXT_"];
40
110
  config.build ??= {};
41
- config.publicDir = wxtConfig.publicDir;
111
+ config.publicDir = this.config.publicDir;
42
112
  config.build.copyPublicDir = false;
43
- config.build.outDir = wxtConfig.outDir;
113
+ config.build.outDir = this.config.outDir;
44
114
  config.build.emptyOutDir = false;
45
- if (config.build.minify == null && wxtConfig.command === "serve") config.build.minify = false;
46
- if (config.build.sourcemap == null && wxtConfig.command === "serve") config.build.sourcemap = "inline";
115
+ if (config.build.minify == null && this.config.command === "serve") config.build.minify = false;
116
+ if (config.build.sourcemap == null && this.config.command === "serve") config.build.sourcemap = "inline";
47
117
  config.server ??= {};
48
118
  config.server.watch = {
49
- ...wxtConfig.watchOptions,
119
+ ...this.config.watchOptions,
50
120
  ignored: [
51
- `${wxtConfig.outBaseDir}/**`,
52
- `${wxtConfig.wxtDir}/**`,
53
- ...getRunnerProfileWatchIgnores(wxtConfig),
54
- ...toArray(wxtConfig.watchOptions.ignored ?? [])
121
+ `${this.config.outBaseDir}/**`,
122
+ `${this.config.wxtDir}/**`,
123
+ ...getRunnerProfileWatchIgnores(this.config),
124
+ ...toArray(this.config.watchOptions.ignored ?? [])
55
125
  ]
56
126
  };
57
127
  config.legacy ??= {};
58
128
  config.legacy.skipWebSocketTokenCheck = true;
59
- if (isRolldownVersion(vite.version)) {} else {
129
+ if (isRolldownVersion(this.vite.version)) {} else {
60
130
  config.esbuild ??= {};
61
131
  if (config.esbuild) config.esbuild.charset = "ascii";
62
132
  }
63
- const server = getWxtDevServer?.();
133
+ const server = this.getWxtDevServer?.();
64
134
  config.plugins ??= [];
65
- config.plugins.push(devHtmlPrerender(wxtConfig, server), resolveVirtualModules(wxtConfig), devServerGlobals(wxtConfig, server), tsconfigPaths(wxtConfig), noopBackground(), globals(wxtConfig), defineImportMeta(), wxtPluginLoader(wxtConfig), resolveAppConfig(wxtConfig));
66
- if (wxtConfig.analysis.enabled && !baseConfigOptions?.excludeAnalysisPlugin) config.plugins.push(bundleAnalysis(wxtConfig));
135
+ config.plugins.push(devHtmlPrerender(this.config, server), devServerGlobals(this.config, server), tsconfigPaths(this.config), noopBackground(), addRuntimeEnvEntries(this.config), defineImportMeta(), resolveAppConfig(this.config));
136
+ if (this.config.analysis.enabled && !options?.excludeAnalysisPlugin) config.plugins.push(bundleAnalysis(this.config));
67
137
  return config;
68
- };
138
+ }
69
139
  /**
70
140
  * Return the basic config for building an entrypoint in [lib
71
141
  * mode](https://vitejs.dev/guide/build.html#library-mode).
72
142
  */
73
- const getLibModeConfig = (entrypoint) => {
143
+ getLibModeConfig(entrypoint) {
74
144
  const entry = getRollupEntry(entrypoint);
75
145
  const plugins = [entrypointGroupGlobals(entrypoint)];
76
146
  let iifeReturnValueName = safeVarName(entrypoint.name);
77
- if (entrypoint.type === "content-script-style" || entrypoint.type === "unlisted-style") plugins.push(cssEntrypoints(entrypoint, wxtConfig));
147
+ if (entrypoint.type === "content-script-style" || entrypoint.type === "unlisted-style") plugins.push(cssEntrypoints(entrypoint, this.config));
78
148
  if (entrypoint.type === "content-script" || entrypoint.type === "unlisted-script") {
79
149
  if (typeof entrypoint.options.globalName === "string") iifeReturnValueName = entrypoint.options.globalName;
80
150
  else if (typeof entrypoint.options.globalName === "function") iifeReturnValueName = entrypoint.options.globalName(entrypoint);
@@ -82,7 +152,7 @@ async function createViteBuilder(wxtConfig, hooks, getWxtDevServer) {
82
152
  else plugins.push(iifeFooter(iifeReturnValueName));
83
153
  }
84
154
  return {
85
- mode: wxtConfig.mode,
155
+ mode: this.config.mode,
86
156
  plugins,
87
157
  build: {
88
158
  lib: {
@@ -92,24 +162,24 @@ async function createViteBuilder(wxtConfig, hooks, getWxtDevServer) {
92
162
  fileName: entrypoint.name
93
163
  },
94
164
  rollupOptions: { output: {
95
- entryFileNames: getEntrypointBundlePath(entrypoint, wxtConfig.outDir, ".js"),
165
+ entryFileNames: getEntrypointBundlePath(entrypoint, this.config.outDir, ".js"),
96
166
  assetFileNames: (assetInfo) => {
97
167
  if (entrypoint.type === "content-script" && getRollupAssetNames(assetInfo).some((name) => name.endsWith("css"))) return `content-scripts/${entrypoint.name}.[ext]`;
98
168
  else return `assets/${entrypoint.name}.[ext]`;
99
169
  }
100
170
  } }
101
171
  },
102
- define: { "process.env.NODE_ENV": JSON.stringify(wxtConfig.mode) }
172
+ define: { "process.env.NODE_ENV": JSON.stringify(this.config.mode) }
103
173
  };
104
- };
174
+ }
105
175
  /**
106
176
  * Return the basic config for building multiple entrypoints in [multi-page
107
177
  * mode](https://vitejs.dev/guide/build.html#multi-page-app).
108
178
  */
109
- const getMultiPageConfig = (entrypoints) => {
179
+ getMultiPageConfig(entrypoints) {
110
180
  const htmlEntrypoints = new Set(entrypoints.filter(isHtmlEntrypoint).map((e) => e.name));
111
181
  return {
112
- mode: wxtConfig.mode,
182
+ mode: this.config.mode,
113
183
  plugins: [entrypointGroupGlobals(entrypoints)],
114
184
  build: { rollupOptions: {
115
185
  input: entrypoints.reduce((input, entry) => {
@@ -126,14 +196,10 @@ async function createViteBuilder(wxtConfig, hooks, getWxtDevServer) {
126
196
  }
127
197
  } }
128
198
  };
129
- };
130
- /**
131
- * Return the basic config for building a single CSS entrypoint in [multi-page
132
- * mode](https://vitejs.dev/guide/build.html#multi-page-app).
133
- */
134
- const getCssConfig = (entrypoint) => {
199
+ }
200
+ getCssConfig(entrypoint) {
135
201
  return {
136
- mode: wxtConfig.mode,
202
+ mode: this.config.mode,
137
203
  plugins: [entrypointGroupGlobals(entrypoint)],
138
204
  build: { rollupOptions: {
139
205
  input: { [entrypoint.name]: entrypoint.inputPath },
@@ -143,15 +209,15 @@ async function createViteBuilder(wxtConfig, hooks, getWxtDevServer) {
143
209
  } }
144
210
  } }
145
211
  };
146
- };
147
- const createImporterEnvironment = async (paths) => {
148
- const baseConfig = await getBaseConfig({ excludeAnalysisPlugin: true });
212
+ }
213
+ async createImporterEnvironment(paths) {
214
+ const baseConfig = await this.getBaseConfig({ excludeAnalysisPlugin: true });
149
215
  baseConfig.optimizeDeps ??= {};
150
216
  baseConfig.optimizeDeps.noDiscovery = true;
151
217
  baseConfig.optimizeDeps.include = [];
152
- const envConfig = { plugins: paths.map((path) => removeEntrypointMainFunction(wxtConfig, path)) };
153
- const importerConfig = vite.mergeConfig(baseConfig, envConfig);
154
- const config = await vite.resolveConfig(vite.mergeConfig(importerConfig || {}, {
218
+ const envConfig = { plugins: paths.map((path) => removeEntrypointMainFunction(this.config, path)) };
219
+ const importerConfig = this.vite.mergeConfig(baseConfig, envConfig);
220
+ const config = await this.vite.resolveConfig(this.vite.mergeConfig(importerConfig || {}, {
155
221
  configFile: false,
156
222
  envDir: false,
157
223
  cacheDir: process.cwd(),
@@ -165,89 +231,21 @@ async function createViteBuilder(wxtConfig, hooks, getWxtDevServer) {
165
231
  }
166
232
  } }
167
233
  }), "serve");
168
- const environment = vite.createRunnableDevEnvironment("inline", config, {
234
+ const environment = this.vite.createRunnableDevEnvironment("inline", config, {
169
235
  runnerOptions: { hmr: { logger: false } },
170
236
  hot: false
171
237
  });
172
238
  await environment.init();
173
239
  return environment;
174
- };
175
- function requireDefaultExport(path, mod) {
176
- const relativePath = relative(wxtConfig.root, path);
240
+ }
241
+ requireDefaultExport(path, mod) {
242
+ const relativePath = relative(this.config.root, path);
177
243
  if (mod?.default == null) {
178
244
  const defineFn = relativePath.includes(".content") ? "defineContentScript" : relativePath.includes("background") ? "defineBackground" : "defineUnlistedScript";
179
245
  throw Error(`${relativePath}: Default export not found, did you forget to call "export default ${defineFn}(...)"?`);
180
246
  }
181
247
  }
182
- return {
183
- name: "Vite",
184
- version: vite.version,
185
- async importEntrypoint(path) {
186
- const [module] = await this.importEntrypoints([path]);
187
- return module;
188
- },
189
- async importEntrypoints(paths) {
190
- const context = createExtensionEnvironment();
191
- const environment = await createImporterEnvironment(paths);
192
- try {
193
- return await context.run(async () => await Promise.all(paths.map(async (path) => {
194
- const module = await environment.runner.import(path);
195
- requireDefaultExport(path, module);
196
- return module.default;
197
- })));
198
- } finally {
199
- await environment.close();
200
- }
201
- },
202
- async build(group) {
203
- let entryConfig;
204
- if (Array.isArray(group)) entryConfig = getMultiPageConfig(group);
205
- else if (group.type === "content-script-style" || group.type === "unlisted-style") entryConfig = getCssConfig(group);
206
- else entryConfig = getLibModeConfig(group);
207
- const buildConfig = vite.mergeConfig(await getBaseConfig(), entryConfig);
208
- await hooks.callHook("vite:build:extendConfig", toArray(group), buildConfig);
209
- return {
210
- entrypoints: group,
211
- chunks: await moveHtmlFiles(wxtConfig, group, getBuildOutputChunks(await vite.build(buildConfig)))
212
- };
213
- },
214
- async createServer(info) {
215
- const serverConfig = { server: {
216
- host: info.host,
217
- port: info.port,
218
- strictPort: true,
219
- origin: info.origin
220
- } };
221
- const baseConfig = await getBaseConfig();
222
- const finalConfig = vite.mergeConfig(baseConfig, serverConfig);
223
- await hooks.callHook("vite:devServer:extendConfig", finalConfig);
224
- const viteServer = await vite.createServer(finalConfig);
225
- return {
226
- async listen() {
227
- await viteServer.listen(info.port);
228
- },
229
- async close() {
230
- await viteServer.close();
231
- },
232
- transformHtml(...args) {
233
- return viteServer.transformIndexHtml(...args);
234
- },
235
- ws: {
236
- send(message, payload) {
237
- return viteServer.ws.send(message, payload);
238
- },
239
- on(message, cb) {
240
- viteServer.ws.on(message, cb);
241
- }
242
- },
243
- watcher: viteServer.watcher,
244
- on(event, cb) {
245
- viteServer.httpServer?.on(event, cb);
246
- }
247
- };
248
- }
249
- };
250
- }
248
+ };
251
249
  function getRunnerProfileWatchIgnores(wxtConfig) {
252
250
  const root = normalizePath(wxtConfig.root);
253
251
  const chromiumArgProfiles = extractPathArgs(wxtConfig.webExt.config?.chromiumArgs, "--user-data-dir");
@@ -364,4 +362,4 @@ function isRolldownVersion(version) {
364
362
  return Number(version.split(".")[0]) >= 8;
365
363
  }
366
364
  //#endregion
367
- export { createViteBuilder };
365
+ export { ViteBuilder };
@@ -0,0 +1,16 @@
1
+ import { getEntrypointRuntimeEnvEntries } from "../../../runtime-env-entries.mjs";
2
+ //#region src/internal/builders/vite/plugins/add-entrypoint-group-runtime-env-entries.ts
3
+ /** Define a set of global variables specific to an entrypoint. */
4
+ function entrypointGroupGlobals(entrypointGroup) {
5
+ return {
6
+ name: "wxt:add-entrypoint-group-runtime-env-entries",
7
+ config() {
8
+ const define = {};
9
+ let name = Array.isArray(entrypointGroup) ? "html" : entrypointGroup.name;
10
+ for (const global of getEntrypointRuntimeEnvEntries(name)) define[`import.meta.env.${global.name}`] = JSON.stringify(global.value);
11
+ return { define };
12
+ }
13
+ };
14
+ }
15
+ //#endregion
16
+ export { entrypointGroupGlobals };
@@ -0,0 +1,14 @@
1
+ import { getRuntimeEnvEntries } from "../../../runtime-env-entries.mjs";
2
+ //#region src/internal/builders/vite/plugins/add-runtime-env-entries.ts
3
+ function addRuntimeEnvEntries(config) {
4
+ return {
5
+ name: "wxt:add-runtime-env-entries",
6
+ config() {
7
+ const define = {};
8
+ for (const global of getRuntimeEnvEntries(config)) define[`import.meta.env.${global.name}`] = JSON.stringify(global.value);
9
+ return { define };
10
+ }
11
+ };
12
+ }
13
+ //#endregion
14
+ export { addRuntimeEnvEntries };
@@ -1,6 +1,6 @@
1
1
  import path from "node:path";
2
2
  import { visualizer } from "@aklinker1/rollup-plugin-visualizer";
3
- //#region src/core/builders/vite/plugins/bundleAnalysis.ts
3
+ //#region src/internal/builders/vite/plugins/bundle-analysis.ts
4
4
  let increment = 0;
5
5
  function bundleAnalysis(config) {
6
6
  return visualizer({
@@ -1,5 +1,5 @@
1
- import { getEntrypointBundlePath } from "../../../utils/entrypoints.mjs";
2
- //#region src/core/builders/vite/plugins/cssEntrypoints.ts
1
+ import { getEntrypointBundlePath } from "../../../../internal-utils/entrypoint-utils.mjs";
2
+ //#region src/internal/builders/vite/plugins/css-entrypoints.ts
3
3
  /**
4
4
  * Rename CSS entrypoint outputs to ensure a JS file is not generated, and that
5
5
  * the CSS file is placed in the correct place.
@@ -1,4 +1,4 @@
1
- //#region src/core/builders/vite/plugins/defineImportMeta.ts
1
+ //#region src/internal/builders/vite/plugins/define-import-meta.ts
2
2
  /**
3
3
  * Overrides definitions for `import.meta.*`
4
4
  *
@@ -1,10 +1,9 @@
1
- import { normalizePath } from "../../../utils/paths.mjs";
2
- import { getEntrypointName } from "../../../utils/entrypoints.mjs";
3
- import "../../../utils/index.mjs";
1
+ import { normalizePath } from "../../../../internal-utils/path-utils.mjs";
2
+ import { getEntrypointName } from "../../../../internal-utils/entrypoint-utils.mjs";
4
3
  import { c } from "../../../../inline/ohash/index.mjs";
5
- import { dirname, relative, resolve } from "node:path";
6
4
  import { parseHTML } from "linkedom";
7
- //#region src/core/builders/vite/plugins/devHtmlPrerender.ts
5
+ import { dirname, relative, resolve } from "node:path";
6
+ //#region src/internal/builders/vite/plugins/dev-html-prerender.ts
8
7
  const inlineScriptContents = {};
9
8
  /**
10
9
  * Pre-renders the HTML entrypoints when building the extension to connect to
@@ -1,4 +1,4 @@
1
- //#region src/core/builders/vite/plugins/devServerGlobals.ts
1
+ //#region src/internal/builders/vite/plugins/dev-server-globals.ts
2
2
  /**
3
3
  * Defines global constants about the dev server. Helps scripts connect to the
4
4
  * server's web socket.
@@ -1,5 +1,5 @@
1
1
  import path from "node:path";
2
- //#region src/core/builders/vite/plugins/extensionApiMock.ts
2
+ //#region src/internal/builders/vite/plugins/extension-api-mock.ts
3
3
  /**
4
4
  * Mock `wxt/browser` and stub the global `browser`/`chrome` types with a fake
5
5
  * version of the extension APIs
@@ -1,4 +1,4 @@
1
- //#region src/core/builders/vite/plugins/iifeAnonymous.ts
1
+ //#region src/internal/builders/vite/plugins/iife-anonymous.ts
2
2
  function iifeAnonymous(iifeReturnValueName) {
3
3
  return {
4
4
  name: "wxt:iife-anonymous",
@@ -1,4 +1,4 @@
1
- //#region src/core/builders/vite/plugins/iifeFooter.ts
1
+ //#region src/internal/builders/vite/plugins/iife-footer.ts
2
2
  /**
3
3
  * Add a footer with the returned value so it can return values to
4
4
  * `scripting.executeScript` Footer is added a part of esbuild to make sure it's
@@ -0,0 +1,17 @@
1
+ import "./resolve-virtual-modules.mjs";
2
+ import "./wxt-plugin-loader.mjs";
3
+ import "./add-entrypoint-group-runtime-env-entries.mjs";
4
+ import "./add-runtime-env-entries.mjs";
5
+ import "./bundle-analysis.mjs";
6
+ import "./css-entrypoints.mjs";
7
+ import "./define-import-meta.mjs";
8
+ import "./dev-html-prerender.mjs";
9
+ import "./dev-server-globals.mjs";
10
+ import "./extension-api-mock.mjs";
11
+ import "./iife-anonymous.mjs";
12
+ import "./iife-footer.mjs";
13
+ import "./noop-background.mjs";
14
+ import "./remove-entrypoint-main-function.mjs";
15
+ import "./resolve-app-config.mjs";
16
+ import "./tsconfig-paths.mjs";
17
+ export {};
@@ -1,5 +1,5 @@
1
- import { VIRTUAL_NOOP_BACKGROUND_MODULE_ID } from "../../../utils/constants.mjs";
2
- //#region src/core/builders/vite/plugins/noopBackground.ts
1
+ import { VIRTUAL_NOOP_BACKGROUND_MODULE_ID } from "../../../constants.mjs";
2
+ //#region src/internal/builders/vite/plugins/noop-background.ts
3
3
  /**
4
4
  * In dev mode, if there's not a background script listed, we need to add one so
5
5
  * that the web socket connection is setup and the extension reloads HTML pages
@@ -1,8 +1,7 @@
1
- import { normalizePath } from "../../../utils/paths.mjs";
2
- import "../../../utils/index.mjs";
3
- import { removeMainFunctionCode } from "../../../utils/transform.mjs";
1
+ import { normalizePath } from "../../../../internal-utils/path-utils.mjs";
2
+ import { removeMainFunctionCode } from "../../../transform.mjs";
4
3
  import { resolve } from "node:path";
5
- //#region src/core/builders/vite/plugins/removeEntrypointMainFunction.ts
4
+ //#region src/internal/builders/vite/plugins/remove-entrypoint-main-function.ts
6
5
  /**
7
6
  * Transforms entrypoints, removing the main function from the entrypoint if it
8
7
  * exists.
@@ -1,6 +1,6 @@
1
- import { pathExists } from "../../../utils/fs.mjs";
1
+ import { pathExists } from "../../../../internal-utils/fs-utils.mjs";
2
2
  import { resolve } from "node:path";
3
- //#region src/core/builders/vite/plugins/resolveAppConfig.ts
3
+ //#region src/internal/builders/vite/plugins/resolve-app-config.ts
4
4
  /**
5
5
  * When importing `virtual:app-config`, resolve it to the `app.config.ts` file
6
6
  * in the project.
@@ -1,9 +1,9 @@
1
- import { normalizePath } from "../../../utils/paths.mjs";
2
- import "../../../utils/index.mjs";
3
- import { virtualModuleNames } from "../../../utils/virtual-modules.mjs";
4
- import { readFile } from "node:fs/promises";
1
+ import { normalizePath } from "../../../../internal-utils/path-utils.mjs";
2
+ import { getEntrypointName } from "../../../../internal-utils/entrypoint-utils.mjs";
3
+ import { virtualModuleNames } from "../../../virtual-modules.mjs";
5
4
  import { resolve } from "path";
6
- //#region src/core/builders/vite/plugins/resolveVirtualModules.ts
5
+ import { readFile } from "node:fs/promises";
6
+ //#region src/internal/builders/vite/plugins/resolve-virtual-modules.ts
7
7
  /**
8
8
  * Resolve all the virtual modules to the `node_modules/wxt/dist/virtual`
9
9
  * directory.
@@ -24,7 +24,9 @@ function resolveVirtualModules(config) {
24
24
  filter: { id: new RegExp(`^${resolvedVirtualId}`) },
25
25
  async handler(id) {
26
26
  const inputPath = id.replace(resolvedVirtualId, "");
27
- return (await readFile(resolve(config.wxtModuleDir, `dist/virtual/${name}.mjs`), "utf-8")).replace(`virtual:user-${name}`, inputPath);
27
+ const template = await readFile(resolve(config.wxtModuleDir, `dist/virtual/${name}.mjs`), "utf-8");
28
+ const entrypointName = getEntrypointName(config.entrypointsDir, inputPath);
29
+ return template.replace(`virtual:user-${name}`, inputPath).replace("virtual:wxt-plugins", `virtual:wxt-plugins?entrypoint=${encodeURIComponent(entrypointName)}`);
28
30
  }
29
31
  }
30
32
  };
@@ -1,4 +1,4 @@
1
- //#region src/core/builders/vite/plugins/tsconfigPaths.ts
1
+ //#region src/internal/builders/vite/plugins/tsconfig-paths.ts
2
2
  function tsconfigPaths(config) {
3
3
  return {
4
4
  name: "wxt:aliases",
@@ -0,0 +1,77 @@
1
+ import { normalizePath } from "../../../../internal-utils/path-utils.mjs";
2
+ import { getEntrypointName } from "../../../../internal-utils/entrypoint-utils.mjs";
3
+ import { parseHTML } from "linkedom";
4
+ //#region src/internal/builders/vite/plugins/wxt-plugin-loader.ts
5
+ function getPluginModules(plugins, entrypoint) {
6
+ return plugins.map((plugin) => typeof plugin === "string" ? { module: plugin } : plugin).filter((plugin) => entrypoint == null || (plugin.apply?.(entrypoint) ?? true)).map((plugin) => plugin.module);
7
+ }
8
+ /**
9
+ * Resolve and load plugins for each entrypoint. This handles both JS
10
+ * entrypoints via the `virtual:wxt-plugins` import, and HTML files by adding
11
+ * `virtual:wxt-html-plugins` to the document's `<head>`. Accepts an optional
12
+ * `?entrypoint=<name>` query to evaluate plugin `apply` hooks per request.
13
+ *
14
+ * @param getEntrypoints Returns the most recently resolved entrypoints.
15
+ * Injected by the caller instead of read from a global, so this plugin
16
+ * doesn't depend on global `wxt` state.
17
+ */
18
+ function wxtPluginLoader(config, getEntrypoints) {
19
+ const virtualModuleId = "virtual:wxt-plugins";
20
+ const resolvedVirtualModuleId = "\0" + virtualModuleId;
21
+ const virtualHtmlModuleId = "virtual:wxt-html-plugins";
22
+ const resolvedVirtualHtmlModuleId = "\0" + virtualHtmlModuleId;
23
+ function getEntrypointFromId(id) {
24
+ const queryIndex = id.indexOf("?");
25
+ if (queryIndex === -1) return void 0;
26
+ const entrypointNameFromQueryParam = new URLSearchParams(id.slice(queryIndex)).get("entrypoint");
27
+ if (!entrypointNameFromQueryParam) return void 0;
28
+ return getEntrypoints().find((entry) => entry.name === entrypointNameFromQueryParam);
29
+ }
30
+ return {
31
+ name: "wxt:plugin-loader",
32
+ resolveId: {
33
+ filter: { id: [new RegExp(`^${virtualModuleId}`), new RegExp(`^${virtualHtmlModuleId}`)] },
34
+ handler(id) {
35
+ return "\0" + id;
36
+ }
37
+ },
38
+ load: {
39
+ filter: { id: [new RegExp(`^${resolvedVirtualModuleId}`), new RegExp(`^${resolvedVirtualHtmlModuleId}`)] },
40
+ handler(id) {
41
+ const bareId = id.slice(1);
42
+ const entrypoint = getEntrypointFromId(bareId);
43
+ if (bareId === virtualModuleId || bareId.startsWith(`${virtualModuleId}?`)) {
44
+ const modules = getPluginModules(config.plugins, entrypoint);
45
+ return `${modules.map((module, i) => `import initPlugin${i} from '${normalizePath(module)}';`).join("\n")}\n\nexport function initPlugins() {\n${modules.map((_, i) => ` initPlugin${i}();`).join("\n")}\n}`;
46
+ } else return `import { initPlugins } from '${entrypoint ? `${virtualModuleId}?entrypoint=${encodeURIComponent(entrypoint.name)}` : virtualModuleId}';
47
+ try {
48
+ initPlugins();
49
+ } catch (err) {
50
+ console.error("[wxt] Failed to initialize plugins", err);
51
+ }`;
52
+ }
53
+ },
54
+ transformIndexHtml: {
55
+ order: "pre",
56
+ handler(html, ctx) {
57
+ const entrypointName = getEntrypointName(config.entrypointsDir, ctx.filename);
58
+ const entrypoint = getEntrypoints().find((entry) => entry.name === entrypointName);
59
+ const htmlModuleId = `${virtualHtmlModuleId}${entrypoint ? `?entrypoint=${encodeURIComponent(entrypoint.name)}` : ""}`;
60
+ const src = config.command === "serve" ? `${config.dev.server?.origin}/@id/${htmlModuleId}` : htmlModuleId;
61
+ const { document } = parseHTML(html);
62
+ if (document.querySelector(`script[src='${src}']`)) return;
63
+ const script = document.createElement("script");
64
+ script.type = "module";
65
+ script.src = src;
66
+ if (document.head == null) {
67
+ const newHead = document.createElement("head");
68
+ document.documentElement.prepend(newHead);
69
+ }
70
+ document.head?.prepend(script);
71
+ return document.toString();
72
+ }
73
+ }
74
+ };
75
+ }
76
+ //#endregion
77
+ export { getPluginModules, wxtPluginLoader };