wxt 0.17.4 → 0.17.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.
package/dist/index.d.cts CHANGED
@@ -1,5 +1,5 @@
1
- import { I as InlineConfig, B as BuildOutput, U as UserConfig, E as ExtensionRunnerConfig, W as WxtDevServer } from './index-vpYNIeCJ.cjs';
2
- export { v as BackgroundDefinition, l as BackgroundEntrypoint, g as BackgroundEntrypointOptions, h as BaseContentScriptEntrypointOptions, k as BaseEntrypoint, f as BaseEntrypointOptions, d as BuildStepOutput, F as ConfigEnv, u as ContentScriptDefinition, C as ContentScriptEntrypoint, p as Entrypoint, q as EntrypointGroup, $ as EslintGlobalsPropValue, a0 as Eslintrc, Z as ExtensionRunner, Y as FsCache, G as GenericEntrypoint, N as HookResult, s as IsolatedWorldContentScriptDefinition, i as IsolatedWorldContentScriptEntrypointOptions, L as Logger, t as MainWorldContentScriptDefinition, M as MainWorldContentScriptEntrypointOptions, r as OnContentScriptStopped, n as OptionsEntrypoint, j as OptionsEntrypointOptions, c as OutputAsset, b as OutputChunk, O as OutputFile, y as PerBrowserMap, x as PerBrowserOption, m as PopupEntrypoint, P as PopupEntrypointOptions, R as ReloadContentScriptPayload, X as ResolvedConfig, a1 as ResolvedEslintrc, z as ResolvedPerBrowserOptions, K as ServerInfo, o as SidepanelEntrypoint, S as SidepanelEntrypointOptions, T as TargetBrowser, e as TargetManifestVersion, w as UnlistedScriptDefinition, A as UserManifest, D as UserManifestFn, _ as VirtualEntrypointType, V as Wxt, H as WxtBuilder, J as WxtBuilderServer, Q as WxtHooks, a3 as WxtResolvedUnimportOptions, a2 as WxtUnimportOptions, a as WxtViteConfig } from './index-vpYNIeCJ.cjs';
1
+ import { I as InlineConfig, B as BuildOutput, U as UserConfig, E as ExtensionRunnerConfig, W as WxtDevServer } from './index-5w9cnXgy.cjs';
2
+ export { v as BackgroundDefinition, l as BackgroundEntrypoint, g as BackgroundEntrypointOptions, h as BaseContentScriptEntrypointOptions, k as BaseEntrypoint, f as BaseEntrypointOptions, d as BuildStepOutput, F as ConfigEnv, u as ContentScriptDefinition, C as ContentScriptEntrypoint, a5 as Dependency, p as Entrypoint, q as EntrypointGroup, $ as EslintGlobalsPropValue, a0 as Eslintrc, Z as ExtensionRunner, Y as FsCache, G as GenericEntrypoint, N as HookResult, s as IsolatedWorldContentScriptDefinition, i as IsolatedWorldContentScriptEntrypointOptions, L as Logger, t as MainWorldContentScriptDefinition, M as MainWorldContentScriptEntrypointOptions, r as OnContentScriptStopped, n as OptionsEntrypoint, j as OptionsEntrypointOptions, c as OutputAsset, b as OutputChunk, O as OutputFile, y as PerBrowserMap, x as PerBrowserOption, m as PopupEntrypoint, P as PopupEntrypointOptions, R as ReloadContentScriptPayload, X as ResolvedConfig, a1 as ResolvedEslintrc, z as ResolvedPerBrowserOptions, K as ServerInfo, o as SidepanelEntrypoint, S as SidepanelEntrypointOptions, T as TargetBrowser, e as TargetManifestVersion, w as UnlistedScriptDefinition, A as UserManifest, D as UserManifestFn, _ as VirtualEntrypointType, V as Wxt, H as WxtBuilder, J as WxtBuilderServer, Q as WxtHooks, a4 as WxtPackageManager, a3 as WxtResolvedUnimportOptions, a2 as WxtUnimportOptions, a as WxtViteConfig } from './index-5w9cnXgy.cjs';
3
3
  import 'vite';
4
4
  import 'webextension-polyfill';
5
5
  import 'unimport';
@@ -8,6 +8,7 @@ import '@aklinker1/rollup-plugin-visualizer';
8
8
  import 'chokidar';
9
9
  import 'c12';
10
10
  import 'hookable';
11
+ import 'nypm';
11
12
 
12
13
  /**
13
14
  * Bundles the extension for production. Returns a promise of the build result. Discovers the `wxt.config.ts` file in
@@ -59,11 +60,11 @@ declare function prepare(config: InlineConfig): Promise<void>;
59
60
 
60
61
  /**
61
62
  * Build and zip the extension for distribution.
62
- * @param config Opitonal config that will override your `<root>/wxt.config.ts`.
63
+ * @param config Optional config that will override your `<root>/wxt.config.ts`.
63
64
  * @returns A list of all files included in the ZIP.
64
65
  */
65
66
  declare function zip(config?: InlineConfig): Promise<string[]>;
66
67
 
67
- var version = "0.17.4";
68
+ var version = "0.17.5";
68
69
 
69
70
  export { BuildOutput, ExtensionRunnerConfig, InlineConfig, UserConfig, WxtDevServer, build, clean, createServer, defineConfig, defineRunnerConfig, initialize, prepare, version, zip };
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { I as InlineConfig, B as BuildOutput, U as UserConfig, E as ExtensionRunnerConfig, W as WxtDevServer } from './index-vpYNIeCJ.js';
2
- export { v as BackgroundDefinition, l as BackgroundEntrypoint, g as BackgroundEntrypointOptions, h as BaseContentScriptEntrypointOptions, k as BaseEntrypoint, f as BaseEntrypointOptions, d as BuildStepOutput, F as ConfigEnv, u as ContentScriptDefinition, C as ContentScriptEntrypoint, p as Entrypoint, q as EntrypointGroup, $ as EslintGlobalsPropValue, a0 as Eslintrc, Z as ExtensionRunner, Y as FsCache, G as GenericEntrypoint, N as HookResult, s as IsolatedWorldContentScriptDefinition, i as IsolatedWorldContentScriptEntrypointOptions, L as Logger, t as MainWorldContentScriptDefinition, M as MainWorldContentScriptEntrypointOptions, r as OnContentScriptStopped, n as OptionsEntrypoint, j as OptionsEntrypointOptions, c as OutputAsset, b as OutputChunk, O as OutputFile, y as PerBrowserMap, x as PerBrowserOption, m as PopupEntrypoint, P as PopupEntrypointOptions, R as ReloadContentScriptPayload, X as ResolvedConfig, a1 as ResolvedEslintrc, z as ResolvedPerBrowserOptions, K as ServerInfo, o as SidepanelEntrypoint, S as SidepanelEntrypointOptions, T as TargetBrowser, e as TargetManifestVersion, w as UnlistedScriptDefinition, A as UserManifest, D as UserManifestFn, _ as VirtualEntrypointType, V as Wxt, H as WxtBuilder, J as WxtBuilderServer, Q as WxtHooks, a3 as WxtResolvedUnimportOptions, a2 as WxtUnimportOptions, a as WxtViteConfig } from './index-vpYNIeCJ.js';
1
+ import { I as InlineConfig, B as BuildOutput, U as UserConfig, E as ExtensionRunnerConfig, W as WxtDevServer } from './index-5w9cnXgy.js';
2
+ export { v as BackgroundDefinition, l as BackgroundEntrypoint, g as BackgroundEntrypointOptions, h as BaseContentScriptEntrypointOptions, k as BaseEntrypoint, f as BaseEntrypointOptions, d as BuildStepOutput, F as ConfigEnv, u as ContentScriptDefinition, C as ContentScriptEntrypoint, a5 as Dependency, p as Entrypoint, q as EntrypointGroup, $ as EslintGlobalsPropValue, a0 as Eslintrc, Z as ExtensionRunner, Y as FsCache, G as GenericEntrypoint, N as HookResult, s as IsolatedWorldContentScriptDefinition, i as IsolatedWorldContentScriptEntrypointOptions, L as Logger, t as MainWorldContentScriptDefinition, M as MainWorldContentScriptEntrypointOptions, r as OnContentScriptStopped, n as OptionsEntrypoint, j as OptionsEntrypointOptions, c as OutputAsset, b as OutputChunk, O as OutputFile, y as PerBrowserMap, x as PerBrowserOption, m as PopupEntrypoint, P as PopupEntrypointOptions, R as ReloadContentScriptPayload, X as ResolvedConfig, a1 as ResolvedEslintrc, z as ResolvedPerBrowserOptions, K as ServerInfo, o as SidepanelEntrypoint, S as SidepanelEntrypointOptions, T as TargetBrowser, e as TargetManifestVersion, w as UnlistedScriptDefinition, A as UserManifest, D as UserManifestFn, _ as VirtualEntrypointType, V as Wxt, H as WxtBuilder, J as WxtBuilderServer, Q as WxtHooks, a4 as WxtPackageManager, a3 as WxtResolvedUnimportOptions, a2 as WxtUnimportOptions, a as WxtViteConfig } from './index-5w9cnXgy.js';
3
3
  import 'vite';
4
4
  import 'webextension-polyfill';
5
5
  import 'unimport';
@@ -8,6 +8,7 @@ import '@aklinker1/rollup-plugin-visualizer';
8
8
  import 'chokidar';
9
9
  import 'c12';
10
10
  import 'hookable';
11
+ import 'nypm';
11
12
 
12
13
  /**
13
14
  * Bundles the extension for production. Returns a promise of the build result. Discovers the `wxt.config.ts` file in
@@ -59,11 +60,11 @@ declare function prepare(config: InlineConfig): Promise<void>;
59
60
 
60
61
  /**
61
62
  * Build and zip the extension for distribution.
62
- * @param config Opitonal config that will override your `<root>/wxt.config.ts`.
63
+ * @param config Optional config that will override your `<root>/wxt.config.ts`.
63
64
  * @returns A list of all files included in the ZIP.
64
65
  */
65
66
  declare function zip(config?: InlineConfig): Promise<string[]>;
66
67
 
67
- var version = "0.17.4";
68
+ var version = "0.17.5";
68
69
 
69
70
  export { BuildOutput, ExtensionRunnerConfig, InlineConfig, UserConfig, WxtDevServer, build, clean, createServer, defineConfig, defineRunnerConfig, initialize, prepare, version, zip };
package/dist/index.js CHANGED
@@ -11,14 +11,15 @@ import {
11
11
  isHtmlEntrypoint,
12
12
  kebabCaseAlphanumeric,
13
13
  mapWxtOptionsToRegisteredContentScript,
14
+ normalizePath,
14
15
  printFileList,
15
16
  rebuild,
16
17
  registerWxt,
17
18
  unnormalizePath,
18
19
  version,
19
20
  wxt
20
- } from "./chunk-E5MGUY6P.js";
21
- import "./chunk-P57PW2II.js";
21
+ } from "./chunk-4K4AQ5GV.js";
22
+ import "./chunk-VBXJIVYU.js";
22
23
 
23
24
  // src/core/build.ts
24
25
  async function build(config) {
@@ -271,8 +272,8 @@ async function createServer(inlineConfig) {
271
272
  reloadContentScript(payload) {
272
273
  server.ws.send("wxt:reload-content-script", payload);
273
274
  },
274
- reloadPage(path3) {
275
- server.ws.send("wxt:reload-page", path3);
275
+ reloadPage(path4) {
276
+ server.ws.send("wxt:reload-page", path4);
276
277
  },
277
278
  reloadExtension() {
278
279
  server.ws.send("wxt:reload-extension");
@@ -303,11 +304,11 @@ async function getPort() {
303
304
  function createFileReloader(server) {
304
305
  const fileChangedMutex = new Mutex();
305
306
  const changeQueue = [];
306
- return async (event, path3) => {
307
+ return async (event, path4) => {
307
308
  await wxt.reloadConfig();
308
- if (path3.startsWith(wxt.config.outBaseDir))
309
+ if (path4.startsWith(wxt.config.outBaseDir))
309
310
  return;
310
- changeQueue.push([event, path3]);
311
+ changeQueue.push([event, path4]);
311
312
  await fileChangedMutex.runExclusive(async () => {
312
313
  if (server.currentOutput == null)
313
314
  return;
@@ -386,8 +387,8 @@ function reloadContentScripts(steps, server) {
386
387
  function reloadHtmlPages(groups, server) {
387
388
  const htmlEntries = groups.flat().filter(isHtmlEntrypoint);
388
389
  htmlEntries.forEach((entry) => {
389
- const path3 = getEntrypointBundlePath(entry, wxt.config.outDir, ".html");
390
- server.reloadPage(path3);
390
+ const path4 = getEntrypointBundlePath(entry, wxt.config.outDir, ".html");
391
+ server.reloadPage(path4);
391
392
  });
392
393
  return {
393
394
  reloadedNames: htmlEntries.map((entry) => entry.name)
@@ -543,10 +544,11 @@ async function prepare(config) {
543
544
  }
544
545
 
545
546
  // src/core/zip.ts
546
- import zipdir from "zip-dir";
547
- import { dirname, relative as relative5, resolve } from "node:path";
547
+ import path3 from "node:path";
548
548
  import fs3 from "fs-extra";
549
549
  import { minimatch } from "minimatch";
550
+ import JSZip from "jszip";
551
+ import glob2 from "fast-glob";
550
552
  async function zip(config) {
551
553
  await registerWxt("build", config);
552
554
  const output = await internalBuild();
@@ -554,7 +556,7 @@ async function zip(config) {
554
556
  wxt.logger.info("Zipping extension...");
555
557
  const zipFiles = [];
556
558
  const projectName = wxt.config.zip.name ?? kebabCaseAlphanumeric(
557
- (await getPackageJson())?.name || dirname(process.cwd())
559
+ (await getPackageJson())?.name || path3.dirname(process.cwd())
558
560
  );
559
561
  const applyTemplate = (template) => template.replaceAll("{{name}}", projectName).replaceAll("{{browser}}", wxt.config.browser).replaceAll(
560
562
  "{{version}}",
@@ -562,24 +564,25 @@ async function zip(config) {
562
564
  ).replaceAll("{{manifestVersion}}", `mv${wxt.config.manifestVersion}`);
563
565
  await fs3.ensureDir(wxt.config.outBaseDir);
564
566
  const outZipFilename = applyTemplate(wxt.config.zip.artifactTemplate);
565
- const outZipPath = resolve(wxt.config.outBaseDir, outZipFilename);
566
- await zipdir(wxt.config.outDir, {
567
- saveTo: outZipPath
568
- });
567
+ const outZipPath = path3.resolve(wxt.config.outBaseDir, outZipFilename);
568
+ await zipDir(wxt.config.outDir, outZipPath);
569
569
  zipFiles.push(outZipPath);
570
570
  if (wxt.config.browser === "firefox") {
571
+ const { overrides, files: downloadedPackages } = await downloadPrivatePackages();
571
572
  const sourcesZipFilename = applyTemplate(wxt.config.zip.sourcesTemplate);
572
- const sourcesZipPath = resolve(wxt.config.outBaseDir, sourcesZipFilename);
573
- await zipdir(wxt.config.zip.sourcesRoot, {
574
- saveTo: sourcesZipPath,
575
- filter(path3) {
576
- const relativePath = relative5(wxt.config.zip.sourcesRoot, path3);
577
- return wxt.config.zip.includeSources.some(
578
- (pattern) => minimatch(relativePath, pattern)
579
- ) || !wxt.config.zip.excludeSources.some(
580
- (pattern) => minimatch(relativePath, pattern)
581
- );
582
- }
573
+ const sourcesZipPath = path3.resolve(
574
+ wxt.config.outBaseDir,
575
+ sourcesZipFilename
576
+ );
577
+ await zipDir(wxt.config.zip.sourcesRoot, sourcesZipPath, {
578
+ include: wxt.config.zip.includeSources,
579
+ exclude: wxt.config.zip.excludeSources,
580
+ transform(file, content) {
581
+ if (file.endsWith("package.json")) {
582
+ return addOverridesToPackageJson(content, overrides);
583
+ }
584
+ },
585
+ additionalFiles: downloadedPackages
583
586
  });
584
587
  zipFiles.push(sourcesZipPath);
585
588
  }
@@ -591,6 +594,81 @@ async function zip(config) {
591
594
  );
592
595
  return zipFiles;
593
596
  }
597
+ async function zipDir(directory, outputPath, options) {
598
+ const archive = new JSZip();
599
+ const files = (await glob2("**/*", {
600
+ cwd: directory,
601
+ // Ignore node_modules, otherwise this glob step takes forever
602
+ ignore: ["**/node_modules"],
603
+ onlyFiles: true
604
+ })).filter((relativePath) => {
605
+ return wxt.config.zip.includeSources.some(
606
+ (pattern) => minimatch(relativePath, pattern)
607
+ ) || !wxt.config.zip.excludeSources.some(
608
+ (pattern) => minimatch(relativePath, pattern)
609
+ );
610
+ });
611
+ const filesToZip = [
612
+ ...files,
613
+ ...(options?.additionalFiles ?? []).map(
614
+ (file) => path3.relative(directory, file)
615
+ )
616
+ ];
617
+ for (const file of filesToZip) {
618
+ const absolutePath = path3.resolve(directory, file);
619
+ if (file.endsWith(".json")) {
620
+ const content = await fs3.readFile(absolutePath, "utf-8");
621
+ archive.file(
622
+ file,
623
+ await options?.transform?.(file, content) || content
624
+ );
625
+ } else {
626
+ const content = await fs3.readFile(absolutePath);
627
+ archive.file(file, content);
628
+ }
629
+ }
630
+ await options?.additionalWork?.(archive);
631
+ const buffer = await archive.generateAsync({ type: "base64" });
632
+ await fs3.writeFile(outputPath, buffer, "base64");
633
+ }
634
+ async function downloadPrivatePackages() {
635
+ const overrides = {};
636
+ const files = [];
637
+ if (wxt.config.zip.downloadPackages.length > 0) {
638
+ const _downloadPackages = new Set(wxt.config.zip.downloadPackages);
639
+ const allPackages = await wxt.pm.listDependencies({
640
+ all: true,
641
+ cwd: wxt.config.root
642
+ });
643
+ const downloadPackages = allPackages.filter(
644
+ (pkg) => _downloadPackages.has(pkg.name)
645
+ );
646
+ for (const pkg of downloadPackages) {
647
+ wxt.logger.info(`Downloading package: ${pkg.name}@${pkg.version}`);
648
+ const id = `${pkg.name}@${pkg.version}`;
649
+ const tgzPath = await wxt.pm.downloadDependency(
650
+ id,
651
+ wxt.config.zip.downloadedPackagesDir
652
+ );
653
+ files.push(tgzPath);
654
+ overrides[id] = "file://./" + normalizePath(path3.relative(wxt.config.root, tgzPath));
655
+ }
656
+ }
657
+ return { overrides, files };
658
+ }
659
+ function addOverridesToPackageJson(content, overrides) {
660
+ if (Object.keys(overrides).length === 0)
661
+ return content;
662
+ const oldPackage = JSON.parse(content);
663
+ const newPackage = {
664
+ ...oldPackage,
665
+ [wxt.pm.overridesKey]: {
666
+ ...oldPackage[wxt.pm.overridesKey],
667
+ ...overrides
668
+ }
669
+ };
670
+ return JSON.stringify(newPackage, null, 2);
671
+ }
594
672
  export {
595
673
  build,
596
674
  clean,
package/dist/storage.js CHANGED
@@ -1,4 +1,4 @@
1
- import "./chunk-P57PW2II.js";
1
+ import "./chunk-VBXJIVYU.js";
2
2
 
3
3
  // src/browser.ts
4
4
  import originalBrowser from "webextension-polyfill";
package/dist/testing.cjs CHANGED
@@ -44,8 +44,8 @@ var import_node_path2 = __toESM(require("path"), 1);
44
44
  // src/core/utils/paths.ts
45
45
  var import_node_path = __toESM(require("path"), 1);
46
46
  var import_normalize_path = __toESM(require("normalize-path"), 1);
47
- function normalizePath(path7) {
48
- return (0, import_normalize_path.default)(path7);
47
+ function normalizePath(path8) {
48
+ return (0, import_normalize_path.default)(path8);
49
49
  }
50
50
  var CSS_EXTENSIONS = ["css", "scss", "sass", "less", "styl", "stylus"];
51
51
  var CSS_EXTENSIONS_PATTERN = `+(${CSS_EXTENSIONS.join("|")})`;
@@ -191,10 +191,10 @@ function pointToDevServer(config, server, id, document, querySelector, attr) {
191
191
  (0, import_node_path3.relative)(config.root, resolvedAbsolutePath)
192
192
  );
193
193
  if (relativePath.startsWith(".")) {
194
- let path7 = normalizePath(resolvedAbsolutePath);
195
- if (!path7.startsWith("/"))
196
- path7 = "/" + path7;
197
- element.setAttribute(attr, `${server.origin}/@fs${path7}`);
194
+ let path8 = normalizePath(resolvedAbsolutePath);
195
+ if (!path8.startsWith("/"))
196
+ path8 = "/" + path8;
197
+ element.setAttribute(attr, `${server.origin}/@fs${path8}`);
198
198
  } else {
199
199
  const url = new URL(relativePath, server.origin);
200
200
  element.setAttribute(attr, url.href);
@@ -647,26 +647,33 @@ function defineImportMeta() {
647
647
  }
648
648
 
649
649
  // src/core/utils/fs.ts
650
- var import_fs_extra3 = __toESM(require("fs-extra"), 1);
650
+ var import_fs_extra4 = __toESM(require("fs-extra"), 1);
651
651
  var import_fast_glob = __toESM(require("fast-glob"), 1);
652
652
 
653
653
  // src/core/wxt.ts
654
654
  var import_hookable = require("hookable");
655
655
 
656
+ // src/core/package-managers/index.ts
657
+ var import_nypm = require("nypm");
658
+
659
+ // src/core/package-managers/npm.ts
660
+ var import_node_path7 = __toESM(require("path"), 1);
661
+ var import_fs_extra3 = require("fs-extra");
662
+
656
663
  // src/core/utils/fs.ts
657
664
  async function writeFileIfDifferent(file, newContents) {
658
- const existingContents = await import_fs_extra3.default.readFile(file, "utf-8").catch(() => void 0);
665
+ const existingContents = await import_fs_extra4.default.readFile(file, "utf-8").catch(() => void 0);
659
666
  if (existingContents !== newContents) {
660
- await import_fs_extra3.default.writeFile(file, newContents);
667
+ await import_fs_extra4.default.writeFile(file, newContents);
661
668
  }
662
669
  }
663
670
 
664
671
  // src/core/utils/building/build-entrypoints.ts
665
- var import_fs_extra4 = __toESM(require("fs-extra"), 1);
672
+ var import_fs_extra5 = __toESM(require("fs-extra"), 1);
666
673
  var import_picocolors = __toESM(require("picocolors"), 1);
667
674
 
668
675
  // src/core/utils/building/find-entrypoints.ts
669
- var import_fs_extra5 = __toESM(require("fs-extra"), 1);
676
+ var import_fs_extra6 = __toESM(require("fs-extra"), 1);
670
677
  var import_minimatch = require("minimatch");
671
678
  var import_linkedom2 = require("linkedom");
672
679
  var import_json5 = __toESM(require("json5"), 1);
@@ -714,28 +721,28 @@ var PATH_GLOB_TO_TYPE_MAP = {
714
721
 
715
722
  // src/core/utils/building/generate-wxt-dir.ts
716
723
  var import_unimport2 = require("unimport");
717
- var import_fs_extra6 = __toESM(require("fs-extra"), 1);
718
- var import_node_path7 = __toESM(require("path"), 1);
724
+ var import_fs_extra7 = __toESM(require("fs-extra"), 1);
725
+ var import_node_path8 = __toESM(require("path"), 1);
719
726
 
720
727
  // src/core/utils/building/resolve-config.ts
721
728
  var import_c12 = require("c12");
722
- var import_node_path9 = __toESM(require("path"), 1);
729
+ var import_node_path10 = __toESM(require("path"), 1);
723
730
 
724
731
  // src/core/utils/cache.ts
725
- var import_fs_extra7 = __toESM(require("fs-extra"), 1);
732
+ var import_fs_extra8 = __toESM(require("fs-extra"), 1);
726
733
  var import_path3 = require("path");
727
734
  function createFsCache(wxtDir) {
728
735
  const getPath = (key) => (0, import_path3.resolve)(wxtDir, "cache", encodeURIComponent(key));
729
736
  return {
730
737
  async set(key, value) {
731
- const path7 = getPath(key);
732
- await (0, import_fs_extra7.ensureDir)((0, import_path3.dirname)(path7));
733
- await writeFileIfDifferent(path7, value);
738
+ const path8 = getPath(key);
739
+ await (0, import_fs_extra8.ensureDir)((0, import_path3.dirname)(path8));
740
+ await writeFileIfDifferent(path8, value);
734
741
  },
735
742
  async get(key) {
736
- const path7 = getPath(key);
743
+ const path8 = getPath(key);
737
744
  try {
738
- return await import_fs_extra7.default.readFile(path7, "utf-8");
745
+ return await import_fs_extra8.default.readFile(path8, "utf-8");
739
746
  } catch {
740
747
  return void 0;
741
748
  }
@@ -969,8 +976,8 @@ function getRollupEntry(entrypoint) {
969
976
  var import_defu = __toESM(require("defu"), 1);
970
977
 
971
978
  // src/core/utils/package.ts
972
- var import_node_path8 = require("path");
973
- var import_fs_extra8 = __toESM(require("fs-extra"), 1);
979
+ var import_node_path9 = require("path");
980
+ var import_fs_extra9 = __toESM(require("fs-extra"), 1);
974
981
  function isModuleInstalled(name) {
975
982
  return import(name).then(() => true).catch(() => false);
976
983
  }
@@ -1002,21 +1009,21 @@ async function resolveConfig(inlineConfig, command, server) {
1002
1009
  const manifestVersion = mergedConfig.manifestVersion ?? (browser === "firefox" || browser === "safari" ? 2 : 3);
1003
1010
  const mode = mergedConfig.mode ?? (command === "build" ? "production" : "development");
1004
1011
  const env = { browser, command, manifestVersion, mode };
1005
- const root = import_node_path9.default.resolve(
1012
+ const root = import_node_path10.default.resolve(
1006
1013
  inlineConfig.root ?? userConfig.root ?? process.cwd()
1007
1014
  );
1008
- const wxtDir = import_node_path9.default.resolve(root, ".wxt");
1015
+ const wxtDir = import_node_path10.default.resolve(root, ".wxt");
1009
1016
  const wxtModuleDir = await resolveWxtModuleDir();
1010
- const srcDir = import_node_path9.default.resolve(root, mergedConfig.srcDir ?? root);
1011
- const entrypointsDir = import_node_path9.default.resolve(
1017
+ const srcDir = import_node_path10.default.resolve(root, mergedConfig.srcDir ?? root);
1018
+ const entrypointsDir = import_node_path10.default.resolve(
1012
1019
  srcDir,
1013
1020
  mergedConfig.entrypointsDir ?? "entrypoints"
1014
1021
  );
1015
1022
  const filterEntrypoints = !!mergedConfig.filterEntrypoints?.length ? new Set(mergedConfig.filterEntrypoints) : void 0;
1016
- const publicDir = import_node_path9.default.resolve(srcDir, mergedConfig.publicDir ?? "public");
1017
- const typesDir = import_node_path9.default.resolve(wxtDir, "types");
1018
- const outBaseDir = import_node_path9.default.resolve(root, mergedConfig.outDir ?? ".output");
1019
- const outDir = import_node_path9.default.resolve(outBaseDir, `${browser}-mv${manifestVersion}`);
1023
+ const publicDir = import_node_path10.default.resolve(srcDir, mergedConfig.publicDir ?? "public");
1024
+ const typesDir = import_node_path10.default.resolve(wxtDir, "types");
1025
+ const outBaseDir = import_node_path10.default.resolve(root, mergedConfig.outDir ?? ".output");
1026
+ const outDir = import_node_path10.default.resolve(outBaseDir, `${browser}-mv${manifestVersion}`);
1020
1027
  const reloadCommand = mergedConfig.dev?.reloadCommand ?? "Alt+R";
1021
1028
  const runnerConfig = await (0, import_c12.loadConfig)({
1022
1029
  name: "web-ext",
@@ -1033,14 +1040,14 @@ async function resolveConfig(inlineConfig, command, server) {
1033
1040
  "~": srcDir,
1034
1041
  "@@": root,
1035
1042
  "~~": root
1036
- }).map(([key, value]) => [key, import_node_path9.default.resolve(root, value)])
1043
+ }).map(([key, value]) => [key, import_node_path10.default.resolve(root, value)])
1037
1044
  );
1038
- const analysisOutputFile = import_node_path9.default.resolve(
1045
+ const analysisOutputFile = import_node_path10.default.resolve(
1039
1046
  root,
1040
1047
  mergedConfig.analysis?.outputFile ?? "stats.html"
1041
1048
  );
1042
- const analysisOutputDir = import_node_path9.default.dirname(analysisOutputFile);
1043
- const analysisOutputName = import_node_path9.default.parse(analysisOutputFile).name;
1049
+ const analysisOutputDir = import_node_path10.default.dirname(analysisOutputFile);
1050
+ const analysisOutputName = import_node_path10.default.parse(analysisOutputFile).name;
1044
1051
  const finalConfig = {
1045
1052
  browser,
1046
1053
  command,
@@ -1165,6 +1172,7 @@ function mergeInlineConfig(inlineConfig, userConfig) {
1165
1172
  };
1166
1173
  }
1167
1174
  function resolveInternalZipConfig(root, mergedConfig) {
1175
+ const downloadedPackagesDir = import_node_path10.default.resolve(root, ".wxt/local_modules");
1168
1176
  return {
1169
1177
  name: void 0,
1170
1178
  sourcesTemplate: "{{name}}-{{version}}-sources.zip",
@@ -1183,7 +1191,9 @@ function resolveInternalZipConfig(root, mergedConfig) {
1183
1191
  "**/*.+(test|spec).?(c|m)+(j|t)s?(x)",
1184
1192
  // From user
1185
1193
  ...mergedConfig.zip?.excludeSources ?? []
1186
- ]
1194
+ ],
1195
+ downloadPackages: mergedConfig.zip?.downloadPackages ?? [],
1196
+ downloadedPackagesDir
1187
1197
  };
1188
1198
  }
1189
1199
  async function getUnimportOptions(wxtDir, logger, config) {
@@ -1215,7 +1225,7 @@ async function getUnimportOptions(wxtDir, logger, config) {
1215
1225
  dirs: ["components", "composables", "hooks", "utils"],
1216
1226
  eslintrc: {
1217
1227
  enabled,
1218
- filePath: import_node_path9.default.resolve(wxtDir, "eslintrc-auto-import.json"),
1228
+ filePath: import_node_path10.default.resolve(wxtDir, "eslintrc-auto-import.json"),
1219
1229
  globalsPropValue: true
1220
1230
  }
1221
1231
  };
@@ -1226,25 +1236,25 @@ async function getUnimportOptions(wxtDir, logger, config) {
1226
1236
  }
1227
1237
  async function resolveWxtModuleDir() {
1228
1238
  const requireResolve = require?.resolve ?? (await import("module")).default.createRequire(import_meta.url).resolve;
1229
- return import_node_path9.default.resolve(requireResolve("wxt"), "../..");
1239
+ return import_node_path10.default.resolve(requireResolve("wxt"), "../..");
1230
1240
  }
1231
1241
 
1232
1242
  // src/core/utils/building/import-entrypoint.ts
1233
1243
  var import_jiti = __toESM(require("jiti"), 1);
1234
1244
  var import_unimport3 = require("unimport");
1235
- var import_fs_extra9 = __toESM(require("fs-extra"), 1);
1236
- var import_node_path10 = require("path");
1245
+ var import_fs_extra10 = __toESM(require("fs-extra"), 1);
1246
+ var import_node_path11 = require("path");
1237
1247
  var import_esbuild = require("esbuild");
1238
1248
  var import_node_url = require("url");
1239
1249
 
1240
1250
  // src/core/utils/building/internal-build.ts
1241
1251
  var import_picocolors5 = __toESM(require("picocolors"), 1);
1242
- var import_fs_extra12 = __toESM(require("fs-extra"), 1);
1252
+ var import_fs_extra13 = __toESM(require("fs-extra"), 1);
1243
1253
 
1244
1254
  // src/core/utils/log/printFileList.ts
1245
- var import_node_path11 = __toESM(require("path"), 1);
1255
+ var import_node_path12 = __toESM(require("path"), 1);
1246
1256
  var import_picocolors3 = __toESM(require("picocolors"), 1);
1247
- var import_fs_extra10 = __toESM(require("fs-extra"), 1);
1257
+ var import_fs_extra11 = __toESM(require("fs-extra"), 1);
1248
1258
  var import_filesize = require("filesize");
1249
1259
  var DEFAULT_COLOR = import_picocolors3.default.blue;
1250
1260
  var CHUNK_COLORS = {
@@ -1267,11 +1277,11 @@ var import_consola2 = require("consola");
1267
1277
  var import_fast_glob3 = __toESM(require("fast-glob"), 1);
1268
1278
 
1269
1279
  // src/core/utils/manifest.ts
1270
- var import_fs_extra11 = __toESM(require("fs-extra"), 1);
1280
+ var import_fs_extra12 = __toESM(require("fs-extra"), 1);
1271
1281
  var import_defu2 = __toESM(require("defu"), 1);
1272
1282
 
1273
1283
  // src/core/utils/building/internal-build.ts
1274
- var import_node_path12 = require("path");
1284
+ var import_node_path13 = require("path");
1275
1285
  var import_consola3 = __toESM(require("consola"), 1);
1276
1286
  var import_rollup_plugin_visualizer2 = require("@aklinker1/rollup-plugin-visualizer");
1277
1287
 
@@ -1,6 +1,6 @@
1
1
  export { FakeBrowser, fakeBrowser } from '@webext-core/fake-browser';
2
2
  import * as vite from 'vite';
3
- import { I as InlineConfig } from './index-vpYNIeCJ.cjs';
3
+ import { I as InlineConfig } from './index-5w9cnXgy.cjs';
4
4
  import 'webextension-polyfill';
5
5
  import 'unimport';
6
6
  import 'consola';
@@ -8,6 +8,7 @@ import '@aklinker1/rollup-plugin-visualizer';
8
8
  import 'chokidar';
9
9
  import 'c12';
10
10
  import 'hookable';
11
+ import 'nypm';
11
12
 
12
13
  /**
13
14
  * Vite plugin that configures Vitest with everything required to test a WXT extension, based on the `<root>/wxt.config.ts`
package/dist/testing.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  export { FakeBrowser, fakeBrowser } from '@webext-core/fake-browser';
2
2
  import * as vite from 'vite';
3
- import { I as InlineConfig } from './index-vpYNIeCJ.js';
3
+ import { I as InlineConfig } from './index-5w9cnXgy.js';
4
4
  import 'webextension-polyfill';
5
5
  import 'unimport';
6
6
  import 'consola';
@@ -8,6 +8,7 @@ import '@aklinker1/rollup-plugin-visualizer';
8
8
  import 'chokidar';
9
9
  import 'c12';
10
10
  import 'hookable';
11
+ import 'nypm';
11
12
 
12
13
  /**
13
14
  * Vite plugin that configures Vitest with everything required to test a WXT extension, based on the `<root>/wxt.config.ts`
package/dist/testing.js CHANGED
@@ -5,8 +5,8 @@ import {
5
5
  tsconfigPaths,
6
6
  unimport,
7
7
  webextensionPolyfillMock
8
- } from "./chunk-E5MGUY6P.js";
9
- import "./chunk-P57PW2II.js";
8
+ } from "./chunk-4K4AQ5GV.js";
9
+ import "./chunk-VBXJIVYU.js";
10
10
 
11
11
  // src/testing/fake-browser.ts
12
12
  import { fakeBrowser } from "@webext-core/fake-browser";
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "wxt",
3
3
  "type": "module",
4
- "version": "0.17.4",
4
+ "version": "0.17.5",
5
5
  "description": "Next gen framework for developing web extensions",
6
6
  "engines": {
7
7
  "node": ">=18",
@@ -107,10 +107,12 @@
107
107
  "is-wsl": "^3.0.0",
108
108
  "jiti": "^1.21.0",
109
109
  "json5": "^2.2.3",
110
+ "jszip": "^3.10.1",
110
111
  "linkedom": "^0.16.1",
111
112
  "minimatch": "^9.0.3",
112
113
  "natural-compare": "^1.4.0",
113
114
  "normalize-path": "^3.0.0",
115
+ "nypm": "^0.3.6",
114
116
  "ora": "^7.0.1",
115
117
  "picocolors": "^1.0.0",
116
118
  "prompts": "^2.4.2",
@@ -118,8 +120,7 @@
118
120
  "unimport": "^3.4.0",
119
121
  "vite": "^5.1.3",
120
122
  "web-ext-run": "^0.2.0",
121
- "webextension-polyfill": "^0.10.0",
122
- "zip-dir": "^2.0.0"
123
+ "webextension-polyfill": "^0.10.0"
123
124
  },
124
125
  "devDependencies": {
125
126
  "@faker-js/faker": "^8.3.1",
@@ -131,6 +132,7 @@
131
132
  "@types/prompts": "^2.4.9",
132
133
  "@vitest/coverage-v8": "^1.0.1",
133
134
  "execa": "^8.0.1",
135
+ "extract-zip": "^2.0.1",
134
136
  "happy-dom": "^13.3.8",
135
137
  "lint-staged": "^15.2.0",
136
138
  "lodash.merge": "^4.6.2",
@@ -1,11 +0,0 @@
1
- var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
2
- get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
3
- }) : x)(function(x) {
4
- if (typeof require !== "undefined")
5
- return require.apply(this, arguments);
6
- throw Error('Dynamic require of "' + x + '" is not supported');
7
- });
8
-
9
- export {
10
- __require
11
- };