wxt 0.19.14 → 0.19.16

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.
@@ -7,7 +7,7 @@ export default defineWxtModule({
7
7
  const options = wxt.config.imports;
8
8
  if (options === false) return;
9
9
  let unimport;
10
- wxt.hooks.hook("ready", () => {
10
+ wxt.hooks.hook("config:resolved", () => {
11
11
  const addModuleImports = (module) => {
12
12
  if (!module.imports) return;
13
13
  options.imports ??= [];
@@ -17,7 +17,7 @@ export default defineWxtModule({
17
17
  wxt.config.userModules.forEach(addModuleImports);
18
18
  });
19
19
  wxt.hooks.afterEach((event) => {
20
- if (event.name === "ready") {
20
+ if (event.name === "config:resolved") {
21
21
  unimport = createUnimport(options);
22
22
  }
23
23
  });
@@ -14,7 +14,9 @@ export class ContentScriptContext {
14
14
  this.listenForNewerScripts();
15
15
  }
16
16
  }
17
- static SCRIPT_STARTED_MESSAGE_TYPE = "wxt:content-script-started";
17
+ static SCRIPT_STARTED_MESSAGE_TYPE = getUniqueEventName(
18
+ "wxt:content-script-started"
19
+ );
18
20
  isTopFrame = window.self === window.top;
19
21
  abortController;
20
22
  locationWatcher = createLocationWatcher(this);
@@ -43,7 +43,7 @@ async function getPathsDeclarationEntry(entrypoints) {
43
43
  wxt.config.outDir,
44
44
  isHtmlEntrypoint(entry) ? ".html" : ".js"
45
45
  )
46
- ).concat(await getPublicFiles());
46
+ ).concat([""]).concat(await getPublicFiles());
47
47
  await wxt.hooks.callHook("prepare:publicPaths", wxt, paths);
48
48
  const unions = paths.map(normalizePath).sort().map((path2) => ` | "/${path2}"`).join("\n");
49
49
  const template = `// Generated by wxt
@@ -125,7 +125,7 @@ ${commentLines.map((line) => ` * ${line}`.trimEnd()).join("\n")}
125
125
  message.message
126
126
  )
127
127
  ),
128
- // Include a final union-based override so TS accepts valid string templates or concatinations
128
+ // Include a final union-based override so TS accepts valid string templates or concatenations
129
129
  // ie: browser.i18n.getMessage(`some_enum_${enumValue}`)
130
130
  renderGetMessageOverload(
131
131
  messages.map((message) => `"${message.name}"`).join(" | ")
@@ -1570,6 +1570,7 @@ export declare const fakeResolvedConfig: (overrides?: {
1570
1570
  'vite:build:extendConfig'?: {} | undefined;
1571
1571
  'vite:devServer:extendConfig'?: {} | undefined;
1572
1572
  ready?: {} | undefined;
1573
+ 'config:resolved'?: {} | undefined;
1573
1574
  'prepare:types'?: {} | undefined;
1574
1575
  'prepare:publicPaths'?: {} | undefined;
1575
1576
  'build:before'?: {} | undefined;
@@ -1620,6 +1621,11 @@ export declare const fakeResolvedConfig: (overrides?: {
1620
1621
  extendConfig?: {} | undefined;
1621
1622
  } | undefined;
1622
1623
  } | undefined;
1624
+ config?: {
1625
+ resolved?: {} | undefined;
1626
+ } | {
1627
+ resolved?: {} | undefined;
1628
+ } | undefined;
1623
1629
  prepare?: {
1624
1630
  types?: {} | undefined;
1625
1631
  publicPaths?: {} | undefined;
@@ -1710,6 +1716,11 @@ export declare const fakeResolvedConfig: (overrides?: {
1710
1716
  extendConfig?: {} | undefined;
1711
1717
  } | undefined;
1712
1718
  } | undefined;
1719
+ config?: {
1720
+ resolved?: {} | undefined;
1721
+ } | {
1722
+ resolved?: {} | undefined;
1723
+ } | undefined;
1713
1724
  prepare?: {
1714
1725
  types?: {} | undefined;
1715
1726
  publicPaths?: {} | undefined;
@@ -2279,6 +2290,7 @@ export declare const fakeResolvedConfig: (overrides?: {
2279
2290
  'vite:build:extendConfig'?: {} | undefined;
2280
2291
  'vite:devServer:extendConfig'?: {} | undefined;
2281
2292
  ready?: {} | undefined;
2293
+ 'config:resolved'?: {} | undefined;
2282
2294
  'prepare:types'?: {} | undefined;
2283
2295
  'prepare:publicPaths'?: {} | undefined;
2284
2296
  'build:before'?: {} | undefined;
@@ -2329,6 +2341,11 @@ export declare const fakeResolvedConfig: (overrides?: {
2329
2341
  extendConfig?: {} | undefined;
2330
2342
  } | undefined;
2331
2343
  } | undefined;
2344
+ config?: {
2345
+ resolved?: {} | undefined;
2346
+ } | {
2347
+ resolved?: {} | undefined;
2348
+ } | undefined;
2332
2349
  prepare?: {
2333
2350
  types?: {} | undefined;
2334
2351
  publicPaths?: {} | undefined;
@@ -2419,6 +2436,11 @@ export declare const fakeResolvedConfig: (overrides?: {
2419
2436
  extendConfig?: {} | undefined;
2420
2437
  } | undefined;
2421
2438
  } | undefined;
2439
+ config?: {
2440
+ resolved?: {} | undefined;
2441
+ } | {
2442
+ resolved?: {} | undefined;
2443
+ } | undefined;
2422
2444
  prepare?: {
2423
2445
  types?: {} | undefined;
2424
2446
  publicPaths?: {} | undefined;
@@ -3014,6 +3036,7 @@ export declare const fakeResolvedConfig: (overrides?: {
3014
3036
  'vite:build:extendConfig'?: {} | undefined;
3015
3037
  'vite:devServer:extendConfig'?: {} | undefined;
3016
3038
  ready?: {} | undefined;
3039
+ 'config:resolved'?: {} | undefined;
3017
3040
  'prepare:types'?: {} | undefined;
3018
3041
  'prepare:publicPaths'?: {} | undefined;
3019
3042
  'build:before'?: {} | undefined;
@@ -3064,6 +3087,11 @@ export declare const fakeResolvedConfig: (overrides?: {
3064
3087
  extendConfig?: {} | undefined;
3065
3088
  } | undefined;
3066
3089
  } | undefined;
3090
+ config?: {
3091
+ resolved?: {} | undefined;
3092
+ } | {
3093
+ resolved?: {} | undefined;
3094
+ } | undefined;
3067
3095
  prepare?: {
3068
3096
  types?: {} | undefined;
3069
3097
  publicPaths?: {} | undefined;
@@ -3154,6 +3182,11 @@ export declare const fakeResolvedConfig: (overrides?: {
3154
3182
  extendConfig?: {} | undefined;
3155
3183
  } | undefined;
3156
3184
  } | undefined;
3185
+ config?: {
3186
+ resolved?: {} | undefined;
3187
+ } | {
3188
+ resolved?: {} | undefined;
3189
+ } | undefined;
3157
3190
  prepare?: {
3158
3191
  types?: {} | undefined;
3159
3192
  publicPaths?: {} | undefined;
@@ -3249,6 +3282,7 @@ export declare const fakeResolvedConfig: (overrides?: {
3249
3282
  'vite:build:extendConfig'?: {} | undefined;
3250
3283
  'vite:devServer:extendConfig'?: {} | undefined;
3251
3284
  ready?: {} | undefined;
3285
+ 'config:resolved'?: {} | undefined;
3252
3286
  'prepare:types'?: {} | undefined;
3253
3287
  'prepare:publicPaths'?: {} | undefined;
3254
3288
  'build:before'?: {} | undefined;
@@ -3299,6 +3333,11 @@ export declare const fakeResolvedConfig: (overrides?: {
3299
3333
  extendConfig?: {} | undefined;
3300
3334
  } | undefined;
3301
3335
  } | undefined;
3336
+ config?: {
3337
+ resolved?: {} | undefined;
3338
+ } | {
3339
+ resolved?: {} | undefined;
3340
+ } | undefined;
3302
3341
  prepare?: {
3303
3342
  types?: {} | undefined;
3304
3343
  publicPaths?: {} | undefined;
@@ -3389,6 +3428,11 @@ export declare const fakeResolvedConfig: (overrides?: {
3389
3428
  extendConfig?: {} | undefined;
3390
3429
  } | undefined;
3391
3430
  } | undefined;
3431
+ config?: {
3432
+ resolved?: {} | undefined;
3433
+ } | {
3434
+ resolved?: {} | undefined;
3435
+ } | undefined;
3392
3436
  prepare?: {
3393
3437
  types?: {} | undefined;
3394
3438
  publicPaths?: {} | undefined;
@@ -3470,6 +3514,7 @@ export declare const fakeResolvedConfig: (overrides?: {
3470
3514
  'vite:build:extendConfig'?: {} | undefined;
3471
3515
  'vite:devServer:extendConfig'?: {} | undefined;
3472
3516
  ready?: {} | undefined;
3517
+ 'config:resolved'?: {} | undefined;
3473
3518
  'prepare:types'?: {} | undefined;
3474
3519
  'prepare:publicPaths'?: {} | undefined;
3475
3520
  'build:before'?: {} | undefined;
@@ -3520,6 +3565,11 @@ export declare const fakeResolvedConfig: (overrides?: {
3520
3565
  extendConfig?: {} | undefined;
3521
3566
  } | undefined;
3522
3567
  } | undefined;
3568
+ config?: {
3569
+ resolved?: {} | undefined;
3570
+ } | {
3571
+ resolved?: {} | undefined;
3572
+ } | undefined;
3523
3573
  prepare?: {
3524
3574
  types?: {} | undefined;
3525
3575
  publicPaths?: {} | undefined;
@@ -3610,6 +3660,11 @@ export declare const fakeResolvedConfig: (overrides?: {
3610
3660
  extendConfig?: {} | undefined;
3611
3661
  } | undefined;
3612
3662
  } | undefined;
3663
+ config?: {
3664
+ resolved?: {} | undefined;
3665
+ } | {
3666
+ resolved?: {} | undefined;
3667
+ } | undefined;
3613
3668
  prepare?: {
3614
3669
  types?: {} | undefined;
3615
3670
  publicPaths?: {} | undefined;
@@ -3695,6 +3750,7 @@ export declare const fakeResolvedConfig: (overrides?: {
3695
3750
  'vite:build:extendConfig'?: {} | undefined;
3696
3751
  'vite:devServer:extendConfig'?: {} | undefined;
3697
3752
  ready?: {} | undefined;
3753
+ 'config:resolved'?: {} | undefined;
3698
3754
  'prepare:types'?: {} | undefined;
3699
3755
  'prepare:publicPaths'?: {} | undefined;
3700
3756
  'build:before'?: {} | undefined;
@@ -3745,6 +3801,11 @@ export declare const fakeResolvedConfig: (overrides?: {
3745
3801
  extendConfig?: {} | undefined;
3746
3802
  } | undefined;
3747
3803
  } | undefined;
3804
+ config?: {
3805
+ resolved?: {} | undefined;
3806
+ } | {
3807
+ resolved?: {} | undefined;
3808
+ } | undefined;
3748
3809
  prepare?: {
3749
3810
  types?: {} | undefined;
3750
3811
  publicPaths?: {} | undefined;
@@ -3835,6 +3896,11 @@ export declare const fakeResolvedConfig: (overrides?: {
3835
3896
  extendConfig?: {} | undefined;
3836
3897
  } | undefined;
3837
3898
  } | undefined;
3899
+ config?: {
3900
+ resolved?: {} | undefined;
3901
+ } | {
3902
+ resolved?: {} | undefined;
3903
+ } | undefined;
3838
3904
  prepare?: {
3839
3905
  types?: {} | undefined;
3840
3906
  publicPaths?: {} | undefined;
@@ -5051,6 +5117,7 @@ export declare const fakeWxt: (overrides?: {
5051
5117
  'vite:build:extendConfig'?: {} | undefined;
5052
5118
  'vite:devServer:extendConfig'?: {} | undefined;
5053
5119
  ready?: {} | undefined;
5120
+ 'config:resolved'?: {} | undefined;
5054
5121
  'prepare:types'?: {} | undefined;
5055
5122
  'prepare:publicPaths'?: {} | undefined;
5056
5123
  'build:before'?: {} | undefined;
@@ -5101,6 +5168,11 @@ export declare const fakeWxt: (overrides?: {
5101
5168
  extendConfig?: {} | undefined;
5102
5169
  } | undefined;
5103
5170
  } | undefined;
5171
+ config?: {
5172
+ resolved?: {} | undefined;
5173
+ } | {
5174
+ resolved?: {} | undefined;
5175
+ } | undefined;
5104
5176
  prepare?: {
5105
5177
  types?: {} | undefined;
5106
5178
  publicPaths?: {} | undefined;
@@ -5191,6 +5263,11 @@ export declare const fakeWxt: (overrides?: {
5191
5263
  extendConfig?: {} | undefined;
5192
5264
  } | undefined;
5193
5265
  } | undefined;
5266
+ config?: {
5267
+ resolved?: {} | undefined;
5268
+ } | {
5269
+ resolved?: {} | undefined;
5270
+ } | undefined;
5194
5271
  prepare?: {
5195
5272
  types?: {} | undefined;
5196
5273
  publicPaths?: {} | undefined;
@@ -5760,6 +5837,7 @@ export declare const fakeWxt: (overrides?: {
5760
5837
  'vite:build:extendConfig'?: {} | undefined;
5761
5838
  'vite:devServer:extendConfig'?: {} | undefined;
5762
5839
  ready?: {} | undefined;
5840
+ 'config:resolved'?: {} | undefined;
5763
5841
  'prepare:types'?: {} | undefined;
5764
5842
  'prepare:publicPaths'?: {} | undefined;
5765
5843
  'build:before'?: {} | undefined;
@@ -5810,6 +5888,11 @@ export declare const fakeWxt: (overrides?: {
5810
5888
  extendConfig?: {} | undefined;
5811
5889
  } | undefined;
5812
5890
  } | undefined;
5891
+ config?: {
5892
+ resolved?: {} | undefined;
5893
+ } | {
5894
+ resolved?: {} | undefined;
5895
+ } | undefined;
5813
5896
  prepare?: {
5814
5897
  types?: {} | undefined;
5815
5898
  publicPaths?: {} | undefined;
@@ -5900,6 +5983,11 @@ export declare const fakeWxt: (overrides?: {
5900
5983
  extendConfig?: {} | undefined;
5901
5984
  } | undefined;
5902
5985
  } | undefined;
5986
+ config?: {
5987
+ resolved?: {} | undefined;
5988
+ } | {
5989
+ resolved?: {} | undefined;
5990
+ } | undefined;
5903
5991
  prepare?: {
5904
5992
  types?: {} | undefined;
5905
5993
  publicPaths?: {} | undefined;
@@ -6495,6 +6583,7 @@ export declare const fakeWxt: (overrides?: {
6495
6583
  'vite:build:extendConfig'?: {} | undefined;
6496
6584
  'vite:devServer:extendConfig'?: {} | undefined;
6497
6585
  ready?: {} | undefined;
6586
+ 'config:resolved'?: {} | undefined;
6498
6587
  'prepare:types'?: {} | undefined;
6499
6588
  'prepare:publicPaths'?: {} | undefined;
6500
6589
  'build:before'?: {} | undefined;
@@ -6545,6 +6634,11 @@ export declare const fakeWxt: (overrides?: {
6545
6634
  extendConfig?: {} | undefined;
6546
6635
  } | undefined;
6547
6636
  } | undefined;
6637
+ config?: {
6638
+ resolved?: {} | undefined;
6639
+ } | {
6640
+ resolved?: {} | undefined;
6641
+ } | undefined;
6548
6642
  prepare?: {
6549
6643
  types?: {} | undefined;
6550
6644
  publicPaths?: {} | undefined;
@@ -6635,6 +6729,11 @@ export declare const fakeWxt: (overrides?: {
6635
6729
  extendConfig?: {} | undefined;
6636
6730
  } | undefined;
6637
6731
  } | undefined;
6732
+ config?: {
6733
+ resolved?: {} | undefined;
6734
+ } | {
6735
+ resolved?: {} | undefined;
6736
+ } | undefined;
6638
6737
  prepare?: {
6639
6738
  types?: {} | undefined;
6640
6739
  publicPaths?: {} | undefined;
@@ -6730,6 +6829,7 @@ export declare const fakeWxt: (overrides?: {
6730
6829
  'vite:build:extendConfig'?: {} | undefined;
6731
6830
  'vite:devServer:extendConfig'?: {} | undefined;
6732
6831
  ready?: {} | undefined;
6832
+ 'config:resolved'?: {} | undefined;
6733
6833
  'prepare:types'?: {} | undefined;
6734
6834
  'prepare:publicPaths'?: {} | undefined;
6735
6835
  'build:before'?: {} | undefined;
@@ -6780,6 +6880,11 @@ export declare const fakeWxt: (overrides?: {
6780
6880
  extendConfig?: {} | undefined;
6781
6881
  } | undefined;
6782
6882
  } | undefined;
6883
+ config?: {
6884
+ resolved?: {} | undefined;
6885
+ } | {
6886
+ resolved?: {} | undefined;
6887
+ } | undefined;
6783
6888
  prepare?: {
6784
6889
  types?: {} | undefined;
6785
6890
  publicPaths?: {} | undefined;
@@ -6870,6 +6975,11 @@ export declare const fakeWxt: (overrides?: {
6870
6975
  extendConfig?: {} | undefined;
6871
6976
  } | undefined;
6872
6977
  } | undefined;
6978
+ config?: {
6979
+ resolved?: {} | undefined;
6980
+ } | {
6981
+ resolved?: {} | undefined;
6982
+ } | undefined;
6873
6983
  prepare?: {
6874
6984
  types?: {} | undefined;
6875
6985
  publicPaths?: {} | undefined;
@@ -6951,6 +7061,7 @@ export declare const fakeWxt: (overrides?: {
6951
7061
  'vite:build:extendConfig'?: {} | undefined;
6952
7062
  'vite:devServer:extendConfig'?: {} | undefined;
6953
7063
  ready?: {} | undefined;
7064
+ 'config:resolved'?: {} | undefined;
6954
7065
  'prepare:types'?: {} | undefined;
6955
7066
  'prepare:publicPaths'?: {} | undefined;
6956
7067
  'build:before'?: {} | undefined;
@@ -7001,6 +7112,11 @@ export declare const fakeWxt: (overrides?: {
7001
7112
  extendConfig?: {} | undefined;
7002
7113
  } | undefined;
7003
7114
  } | undefined;
7115
+ config?: {
7116
+ resolved?: {} | undefined;
7117
+ } | {
7118
+ resolved?: {} | undefined;
7119
+ } | undefined;
7004
7120
  prepare?: {
7005
7121
  types?: {} | undefined;
7006
7122
  publicPaths?: {} | undefined;
@@ -7091,6 +7207,11 @@ export declare const fakeWxt: (overrides?: {
7091
7207
  extendConfig?: {} | undefined;
7092
7208
  } | undefined;
7093
7209
  } | undefined;
7210
+ config?: {
7211
+ resolved?: {} | undefined;
7212
+ } | {
7213
+ resolved?: {} | undefined;
7214
+ } | undefined;
7094
7215
  prepare?: {
7095
7216
  types?: {} | undefined;
7096
7217
  publicPaths?: {} | undefined;
@@ -7176,6 +7297,7 @@ export declare const fakeWxt: (overrides?: {
7176
7297
  'vite:build:extendConfig'?: {} | undefined;
7177
7298
  'vite:devServer:extendConfig'?: {} | undefined;
7178
7299
  ready?: {} | undefined;
7300
+ 'config:resolved'?: {} | undefined;
7179
7301
  'prepare:types'?: {} | undefined;
7180
7302
  'prepare:publicPaths'?: {} | undefined;
7181
7303
  'build:before'?: {} | undefined;
@@ -7226,6 +7348,11 @@ export declare const fakeWxt: (overrides?: {
7226
7348
  extendConfig?: {} | undefined;
7227
7349
  } | undefined;
7228
7350
  } | undefined;
7351
+ config?: {
7352
+ resolved?: {} | undefined;
7353
+ } | {
7354
+ resolved?: {} | undefined;
7355
+ } | undefined;
7229
7356
  prepare?: {
7230
7357
  types?: {} | undefined;
7231
7358
  publicPaths?: {} | undefined;
@@ -7316,6 +7443,11 @@ export declare const fakeWxt: (overrides?: {
7316
7443
  extendConfig?: {} | undefined;
7317
7444
  } | undefined;
7318
7445
  } | undefined;
7446
+ config?: {
7447
+ resolved?: {} | undefined;
7448
+ } | {
7449
+ resolved?: {} | undefined;
7450
+ } | undefined;
7319
7451
  prepare?: {
7320
7452
  types?: {} | undefined;
7321
7453
  publicPaths?: {} | undefined;
package/dist/core/wxt.mjs CHANGED
@@ -21,6 +21,7 @@ export async function registerWxt(command, inlineConfig = {}, getServer) {
21
21
  },
22
22
  async reloadConfig() {
23
23
  wxt.config = await resolveConfig(inlineConfig, command);
24
+ await wxt.hooks.callHook("config:resolved", wxt);
24
25
  },
25
26
  pm,
26
27
  builder,
@@ -51,6 +52,7 @@ export async function registerWxt(command, inlineConfig = {}, getServer) {
51
52
  });
52
53
  }
53
54
  await wxt.hooks.callHook("ready", wxt);
55
+ await wxt.hooks.callHook("config:resolved", wxt);
54
56
  }
55
57
  export function setWxtForTesting(testInstance) {
56
58
  wxt = testInstance;
package/dist/modules.d.ts CHANGED
@@ -11,7 +11,7 @@ export declare function defineWxtModule<TOptions extends WxtModuleOptions>(modul
11
11
  /**
12
12
  * Adds a TS/JS file as an entrypoint to the project. This file will be bundled
13
13
  * along with the other entrypoints.
14
-
14
+ *
15
15
  * If you're publishing the module to NPM, you should probably pre-build the
16
16
  * entrypoint and use `addPublicAssets` instead to copy pre-bundled assets into
17
17
  * the output directory. This will speed up project builds since it just has to
package/dist/modules.mjs CHANGED
@@ -7,7 +7,7 @@ export function defineWxtModule(module) {
7
7
  return module;
8
8
  }
9
9
  export function addEntrypoint(wxt, entrypoint) {
10
- wxt.hooks.hook("entrypoints:resolved", (wxt2, entrypoints) => {
10
+ wxt.hooks.hook("entrypoints:resolved", (_, entrypoints) => {
11
11
  entrypoints.push(entrypoint);
12
12
  });
13
13
  }
@@ -24,7 +24,7 @@ export function addPublicAssets(wxt, dir) {
24
24
  });
25
25
  }
26
26
  export function addViteConfig(wxt, viteConfig) {
27
- wxt.hooks.hook("ready", (wxt2) => {
27
+ wxt.hooks.hook("config:resolved", (wxt2) => {
28
28
  const userVite = wxt2.config.vite;
29
29
  wxt2.config.vite = async (env) => {
30
30
  const fromUser = await userVite(env);
@@ -34,12 +34,12 @@ export function addViteConfig(wxt, viteConfig) {
34
34
  });
35
35
  }
36
36
  export function addWxtPlugin(wxt, plugin) {
37
- wxt.hooks.hook("ready", (wxt2) => {
37
+ wxt.hooks.hook("config:resolved", (wxt2) => {
38
38
  wxt2.config.plugins.push(plugin);
39
39
  });
40
40
  }
41
41
  export function addImportPreset(wxt, preset) {
42
- wxt.hooks.hook("ready", (wxt2) => {
42
+ wxt.hooks.hook("config:resolved", (wxt2) => {
43
43
  if (!wxt2.config.imports) return;
44
44
  wxt2.config.imports.presets ??= [];
45
45
  if (wxt2.config.imports.presets.includes(preset)) return;
@@ -47,12 +47,13 @@ export function addImportPreset(wxt, preset) {
47
47
  });
48
48
  }
49
49
  export function addAlias(wxt, alias, path) {
50
- wxt.hooks.hook("ready", (wxt2) => {
50
+ wxt.hooks.hook("config:resolved", (wxt2) => {
51
51
  const target = resolve(wxt2.config.root, path);
52
- if (wxt2.config.alias[alias] != null) {
52
+ if (wxt2.config.alias[alias] != null && wxt2.config.alias[alias] !== target) {
53
53
  wxt2.logger.warn(
54
54
  `Skipped adding alias (${alias} => ${target}) because an alias with the same name already exists: ${alias} => ${wxt2.config.alias[alias]}`
55
55
  );
56
+ return;
56
57
  }
57
58
  wxt2.config.alias[alias] = target;
58
59
  });
package/dist/storage.d.ts CHANGED
@@ -1,263 +1,4 @@
1
- export declare const storage: WxtStorage;
2
- export interface WxtStorage {
3
- /**
4
- * Get an item from storage, or return `null` if it doesn't exist.
5
- *
6
- * @example
7
- * await storage.getItem<number>("local:installDate");
8
- */
9
- getItem<TValue>(key: StorageItemKey, opts: GetItemOptions<TValue> & {
10
- fallback: TValue;
11
- }): Promise<TValue>;
12
- getItem<TValue>(key: StorageItemKey, opts?: GetItemOptions<TValue>): Promise<TValue | null>;
13
- /**
14
- * Get multiple items from storage. The return order is guaranteed to be the same as the order
15
- * requested.
16
- *
17
- * @example
18
- * await storage.getItems(["local:installDate", "session:someCounter"]);
19
- */
20
- getItems(keys: Array<StorageItemKey | WxtStorageItem<any, any> | {
21
- key: StorageItemKey;
22
- options?: GetItemOptions<any>;
23
- }>): Promise<Array<{
24
- key: StorageItemKey;
25
- value: any;
26
- }>>;
27
- /**
28
- * Return an object containing metadata about the key. Object is stored at `key + "$"`. If value
29
- * is not an object, it returns an empty object.
30
- *
31
- * @example
32
- * await storage.getMeta("local:installDate");
33
- */
34
- getMeta<T extends Record<string, unknown>>(key: StorageItemKey): Promise<T>;
35
- /**
36
- * Get the metadata of multiple storage items.
37
- *
38
- * @param items List of keys or items to get the metadata of.
39
- * @returns An array containing storage keys and their metadata.
40
- */
41
- getMetas(keys: Array<StorageItemKey | WxtStorageItem<any, any>>): Promise<Array<{
42
- key: StorageItemKey;
43
- meta: any;
44
- }>>;
45
- /**
46
- * Set a value in storage. Setting a value to `null` or `undefined` is equivalent to calling
47
- * `removeItem`.
48
- *
49
- * @example
50
- * await storage.setItem<number>("local:installDate", Date.now());
51
- */
52
- setItem<T>(key: StorageItemKey, value: T | null): Promise<void>;
53
- /**
54
- * Set multiple values in storage. If a value is set to `null` or `undefined`, the key is removed.
55
- *
56
- * @example
57
- * await storage.setItem([
58
- * { key: "local:installDate", value: Date.now() },
59
- * { key: "session:someCounter, value: 5 },
60
- * ]);
61
- */
62
- setItems(values: Array<{
63
- key: StorageItemKey;
64
- value: any;
65
- } | {
66
- item: WxtStorageItem<any, any>;
67
- value: any;
68
- }>): Promise<void>;
69
- /**
70
- * Sets metadata properties. If some properties are already set, but are not included in the
71
- * `properties` parameter, they will not be removed.
72
- *
73
- * @example
74
- * await storage.setMeta("local:installDate", { appVersion });
75
- */
76
- setMeta<T extends Record<string, unknown>>(key: StorageItemKey, properties: T | null): Promise<void>;
77
- /**
78
- * Set the metadata of multiple storage items.
79
- *
80
- * @param items List of storage keys or items and metadata to set for each.
81
- */
82
- setMetas(metas: Array<{
83
- key: StorageItemKey;
84
- meta: Record<string, any>;
85
- } | {
86
- item: WxtStorageItem<any, any>;
87
- meta: Record<string, any>;
88
- }>): Promise<void>;
89
- /**
90
- * Removes an item from storage.
91
- *
92
- * @example
93
- * await storage.removeItem("local:installDate");
94
- */
95
- removeItem(key: StorageItemKey, opts?: RemoveItemOptions): Promise<void>;
96
- /**
97
- * Remove a list of keys from storage.
98
- */
99
- removeItems(keys: Array<StorageItemKey | WxtStorageItem<any, any> | {
100
- key: StorageItemKey;
101
- options?: RemoveItemOptions;
102
- } | {
103
- item: WxtStorageItem<any, any>;
104
- options?: RemoveItemOptions;
105
- }>): Promise<void>;
106
- /**
107
- * Remove the entire metadata for a key, or specific properties by name.
108
- *
109
- * @example
110
- * // Remove all metadata properties from the item
111
- * await storage.removeMeta("local:installDate");
112
- *
113
- * // Remove only specific the "v" field
114
- * await storage.removeMeta("local:installDate", "v")
115
- */
116
- removeMeta(key: StorageItemKey, properties?: string | string[]): Promise<void>;
117
- /**
118
- * Return all the items in storage.
119
- */
120
- snapshot(base: StorageArea, opts?: SnapshotOptions): Promise<Record<string, unknown>>;
121
- /**
122
- * Restores the results of `snapshot`. If new properties have been saved since the snapshot, they are
123
- * not overridden. Only values existing in the snapshot are overridden.
124
- */
125
- restoreSnapshot(base: StorageArea, data: any): Promise<void>;
126
- /**
127
- * Watch for changes to a specific key in storage.
128
- */
129
- watch<T>(key: StorageItemKey, cb: WatchCallback<T | null>): Unwatch;
130
- /**
131
- * Remove all watch listeners.
132
- */
133
- unwatch(): void;
134
- /**
135
- * Define a storage item with a default value, type, or versioning.
136
- *
137
- * Read full docs: https://wxt.dev/guide/extension-apis/storage.html#defining-storage-items
138
- */
139
- defineItem<TValue, TMetadata extends Record<string, unknown> = {}>(key: StorageItemKey): WxtStorageItem<TValue | null, TMetadata>;
140
- defineItem<TValue, TMetadata extends Record<string, unknown> = {}>(key: StorageItemKey, options: WxtStorageItemOptions<TValue>): WxtStorageItem<TValue, TMetadata>;
141
- }
142
- export interface WxtStorageItem<TValue, TMetadata extends Record<string, unknown>> {
143
- /**
144
- * The storage key passed when creating the storage item.
145
- */
146
- key: StorageItemKey;
147
- /**
148
- * @deprecated Renamed to fallback, use it instead.
149
- */
150
- defaultValue: TValue;
151
- /**
152
- * The value provided by the `fallback` option.
153
- */
154
- fallback: TValue;
155
- /**
156
- * Get the latest value from storage.
157
- */
158
- getValue(): Promise<TValue>;
159
- /**
160
- * Get metadata.
161
- */
162
- getMeta(): Promise<NullablePartial<TMetadata>>;
163
- /**
164
- * Set the value in storage.
165
- */
166
- setValue(value: TValue): Promise<void>;
167
- /**
168
- * Set metadata properties.
169
- */
170
- setMeta(properties: NullablePartial<TMetadata>): Promise<void>;
171
- /**
172
- * Remove the value from storage.
173
- */
174
- removeValue(opts?: RemoveItemOptions): Promise<void>;
175
- /**
176
- * Remove all metadata or certain properties from metadata.
177
- */
178
- removeMeta(properties?: string[]): Promise<void>;
179
- /**
180
- * Listen for changes to the value in storage.
181
- */
182
- watch(cb: WatchCallback<TValue>): Unwatch;
183
- /**
184
- * If there are migrations defined on the storage item, migrate to the latest version.
185
- *
186
- * **This function is ran automatically whenever the extension updates**, so you don't have to call it
187
- * manually.
188
- */
189
- migrate(): Promise<void>;
190
- }
191
- export type StorageArea = 'local' | 'session' | 'sync' | 'managed';
192
- export type StorageItemKey = `${StorageArea}:${string}`;
193
- export interface GetItemOptions<T> {
194
- /**
195
- * @deprecated Renamed to `fallback`, use it instead.
196
- */
197
- defaultValue?: T;
198
- /**
199
- * Default value returned when `getItem` would otherwise return `null`.
200
- */
201
- fallback?: T;
202
- }
203
- export interface RemoveItemOptions {
204
- /**
205
- * Optionally remove metadata when deleting a key.
206
- *
207
- * @default false
208
- */
209
- removeMeta?: boolean;
210
- }
211
- export interface SnapshotOptions {
212
- /**
213
- * Exclude a list of keys. The storage area prefix should be removed since the snapshot is for a
214
- * specific storage area already.
215
- */
216
- excludeKeys?: string[];
217
- }
218
- export interface WxtStorageItemOptions<T> {
219
- /**
220
- * @deprecated Renamed to `fallback`, use it instead.
221
- */
222
- defaultValue?: T;
223
- /**
224
- * Default value returned when `getValue` would otherwise return `null`.
225
- */
226
- fallback?: T;
227
- /**
228
- * If passed, a value in storage will be initialized immediately after
229
- * defining the storage item. This function returns the value that will be
230
- * saved to storage during the initialization process if a value doesn't
231
- * already exist.
232
- */
233
- init?: () => T | Promise<T>;
234
- /**
235
- * Provide a version number for the storage item to enable migrations. When changing the version
236
- * in the future, migration functions will be ran on application startup.
237
- */
238
- version?: number;
239
- /**
240
- * A map of version numbers to the functions used to migrate the data to that version.
241
- */
242
- migrations?: Record<number, (oldValue: any) => any>;
243
- }
244
1
  /**
245
- * Same as `Partial`, but includes `| null`. It makes all the properties of an object optional and
246
- * nullable.
2
+ * @module @wxt-dev/storage
247
3
  */
248
- export type NullablePartial<T> = {
249
- [key in keyof T]+?: T[key] | undefined | null;
250
- };
251
- /**
252
- * Callback called when a value in storage is changed.
253
- */
254
- export type WatchCallback<T> = (newValue: T, oldValue: T) => void;
255
- /**
256
- * Call to remove a watch listener
257
- */
258
- export type Unwatch = () => void;
259
- export declare class MigrationError extends Error {
260
- key: string;
261
- version: number;
262
- constructor(key: string, version: number, options?: ErrorOptions);
263
- }
4
+ export * from '@wxt-dev/storage';
package/dist/storage.mjs CHANGED
@@ -1,483 +1 @@
1
- import { browser } from "wxt/browser";
2
- import { dequal } from "dequal/lite";
3
- import { logger } from "./sandbox/utils/logger.mjs";
4
- import { toArray } from "./core/utils/arrays.mjs";
5
- import { Mutex } from "async-mutex";
6
- export const storage = createStorage();
7
- function createStorage() {
8
- const drivers = {
9
- local: createDriver("local"),
10
- session: createDriver("session"),
11
- sync: createDriver("sync"),
12
- managed: createDriver("managed")
13
- };
14
- const getDriver = (area) => {
15
- const driver = drivers[area];
16
- if (driver == null) {
17
- const areaNames = Object.keys(drivers).join(", ");
18
- throw Error(`Invalid area "${area}". Options: ${areaNames}`);
19
- }
20
- return driver;
21
- };
22
- const resolveKey = (key) => {
23
- const deliminatorIndex = key.indexOf(":");
24
- const driverArea = key.substring(0, deliminatorIndex);
25
- const driverKey = key.substring(deliminatorIndex + 1);
26
- if (driverKey == null)
27
- throw Error(
28
- `Storage key should be in the form of "area:key", but received "${key}"`
29
- );
30
- return {
31
- driverArea,
32
- driverKey,
33
- driver: getDriver(driverArea)
34
- };
35
- };
36
- const getMetaKey = (key) => key + "$";
37
- const mergeMeta = (oldMeta, newMeta) => {
38
- const newFields = { ...oldMeta };
39
- Object.entries(newMeta).forEach(([key, value]) => {
40
- if (value == null) delete newFields[key];
41
- else newFields[key] = value;
42
- });
43
- return newFields;
44
- };
45
- const getValueOrFallback = (value, fallback) => value ?? fallback ?? null;
46
- const getMetaValue = (properties) => typeof properties === "object" && !Array.isArray(properties) ? properties : {};
47
- const getItem = async (driver, driverKey, opts) => {
48
- const res = await driver.getItem(driverKey);
49
- return getValueOrFallback(res, opts?.fallback ?? opts?.defaultValue);
50
- };
51
- const getMeta = async (driver, driverKey) => {
52
- const metaKey = getMetaKey(driverKey);
53
- const res = await driver.getItem(metaKey);
54
- return getMetaValue(res);
55
- };
56
- const setItem = async (driver, driverKey, value) => {
57
- await driver.setItem(driverKey, value ?? null);
58
- };
59
- const setMeta = async (driver, driverKey, properties) => {
60
- const metaKey = getMetaKey(driverKey);
61
- const existingFields = getMetaValue(await driver.getItem(metaKey));
62
- await driver.setItem(metaKey, mergeMeta(existingFields, properties));
63
- };
64
- const removeItem = async (driver, driverKey, opts) => {
65
- await driver.removeItem(driverKey);
66
- if (opts?.removeMeta) {
67
- const metaKey = getMetaKey(driverKey);
68
- await driver.removeItem(metaKey);
69
- }
70
- };
71
- const removeMeta = async (driver, driverKey, properties) => {
72
- const metaKey = getMetaKey(driverKey);
73
- if (properties == null) {
74
- await driver.removeItem(metaKey);
75
- } else {
76
- const newFields = getMetaValue(await driver.getItem(metaKey));
77
- toArray(properties).forEach((field) => delete newFields[field]);
78
- await driver.setItem(metaKey, newFields);
79
- }
80
- };
81
- const watch = (driver, driverKey, cb) => {
82
- return driver.watch(driverKey, cb);
83
- };
84
- const storage2 = {
85
- getItem: async (key, opts) => {
86
- const { driver, driverKey } = resolveKey(key);
87
- return await getItem(driver, driverKey, opts);
88
- },
89
- getItems: async (keys) => {
90
- const areaToKeyMap = /* @__PURE__ */ new Map();
91
- const keyToOptsMap = /* @__PURE__ */ new Map();
92
- const orderedKeys = [];
93
- keys.forEach((key) => {
94
- let keyStr;
95
- let opts;
96
- if (typeof key === "string") {
97
- keyStr = key;
98
- } else if ("getValue" in key) {
99
- keyStr = key.key;
100
- opts = { fallback: key.fallback };
101
- } else {
102
- keyStr = key.key;
103
- opts = key.options;
104
- }
105
- orderedKeys.push(keyStr);
106
- const { driverArea, driverKey } = resolveKey(keyStr);
107
- const areaKeys = areaToKeyMap.get(driverArea) ?? [];
108
- areaToKeyMap.set(driverArea, areaKeys.concat(driverKey));
109
- keyToOptsMap.set(keyStr, opts);
110
- });
111
- const resultsMap = /* @__PURE__ */ new Map();
112
- await Promise.all(
113
- Array.from(areaToKeyMap.entries()).map(async ([driverArea, keys2]) => {
114
- const driverResults = await drivers[driverArea].getItems(keys2);
115
- driverResults.forEach((driverResult) => {
116
- const key = `${driverArea}:${driverResult.key}`;
117
- const opts = keyToOptsMap.get(key);
118
- const value = getValueOrFallback(
119
- driverResult.value,
120
- opts?.fallback ?? opts?.defaultValue
121
- );
122
- resultsMap.set(key, value);
123
- });
124
- })
125
- );
126
- return orderedKeys.map((key) => ({
127
- key,
128
- value: resultsMap.get(key)
129
- }));
130
- },
131
- getMeta: async (key) => {
132
- const { driver, driverKey } = resolveKey(key);
133
- return await getMeta(driver, driverKey);
134
- },
135
- getMetas: async (args) => {
136
- const keys = args.map((arg) => {
137
- const key = typeof arg === "string" ? arg : arg.key;
138
- const { driverArea, driverKey } = resolveKey(key);
139
- return {
140
- key,
141
- driverArea,
142
- driverKey,
143
- driverMetaKey: getMetaKey(driverKey)
144
- };
145
- });
146
- const areaToDriverMetaKeysMap = keys.reduce((map, key) => {
147
- map[key.driverArea] ??= [];
148
- map[key.driverArea].push(key);
149
- return map;
150
- }, {});
151
- const resultsMap = {};
152
- await Promise.all(
153
- Object.entries(areaToDriverMetaKeysMap).map(async ([area, keys2]) => {
154
- const areaRes = await browser.storage[area].get(
155
- keys2.map((key) => key.driverMetaKey)
156
- );
157
- keys2.forEach((key) => {
158
- resultsMap[key.key] = areaRes[key.driverMetaKey] ?? {};
159
- });
160
- })
161
- );
162
- return keys.map((key) => ({
163
- key: key.key,
164
- meta: resultsMap[key.key]
165
- }));
166
- },
167
- setItem: async (key, value) => {
168
- const { driver, driverKey } = resolveKey(key);
169
- await setItem(driver, driverKey, value);
170
- },
171
- setItems: async (items) => {
172
- const areaToKeyValueMap = {};
173
- items.forEach((item) => {
174
- const { driverArea, driverKey } = resolveKey(
175
- "key" in item ? item.key : item.item.key
176
- );
177
- areaToKeyValueMap[driverArea] ??= [];
178
- areaToKeyValueMap[driverArea].push({
179
- key: driverKey,
180
- value: item.value
181
- });
182
- });
183
- await Promise.all(
184
- Object.entries(areaToKeyValueMap).map(async ([driverArea, values]) => {
185
- const driver = getDriver(driverArea);
186
- await driver.setItems(values);
187
- })
188
- );
189
- },
190
- setMeta: async (key, properties) => {
191
- const { driver, driverKey } = resolveKey(key);
192
- await setMeta(driver, driverKey, properties);
193
- },
194
- setMetas: async (items) => {
195
- const areaToMetaUpdatesMap = {};
196
- items.forEach((item) => {
197
- const { driverArea, driverKey } = resolveKey(
198
- "key" in item ? item.key : item.item.key
199
- );
200
- areaToMetaUpdatesMap[driverArea] ??= [];
201
- areaToMetaUpdatesMap[driverArea].push({
202
- key: driverKey,
203
- properties: item.meta
204
- });
205
- });
206
- await Promise.all(
207
- Object.entries(areaToMetaUpdatesMap).map(
208
- async ([storageArea, updates]) => {
209
- const driver = getDriver(storageArea);
210
- const metaKeys = updates.map(({ key }) => getMetaKey(key));
211
- console.log(storageArea, metaKeys);
212
- const existingMetas = await driver.getItems(metaKeys);
213
- const existingMetaMap = Object.fromEntries(
214
- existingMetas.map(({ key, value }) => [key, getMetaValue(value)])
215
- );
216
- const metaUpdates = updates.map(({ key, properties }) => {
217
- const metaKey = getMetaKey(key);
218
- return {
219
- key: metaKey,
220
- value: mergeMeta(existingMetaMap[metaKey] ?? {}, properties)
221
- };
222
- });
223
- await driver.setItems(metaUpdates);
224
- }
225
- )
226
- );
227
- },
228
- removeItem: async (key, opts) => {
229
- const { driver, driverKey } = resolveKey(key);
230
- await removeItem(driver, driverKey, opts);
231
- },
232
- removeItems: async (keys) => {
233
- const areaToKeysMap = {};
234
- keys.forEach((key) => {
235
- let keyStr;
236
- let opts;
237
- if (typeof key === "string") {
238
- keyStr = key;
239
- } else if ("getValue" in key) {
240
- keyStr = key.key;
241
- } else if ("item" in key) {
242
- keyStr = key.item.key;
243
- opts = key.options;
244
- } else {
245
- keyStr = key.key;
246
- opts = key.options;
247
- }
248
- const { driverArea, driverKey } = resolveKey(keyStr);
249
- areaToKeysMap[driverArea] ??= [];
250
- areaToKeysMap[driverArea].push(driverKey);
251
- if (opts?.removeMeta) {
252
- areaToKeysMap[driverArea].push(getMetaKey(driverKey));
253
- }
254
- });
255
- await Promise.all(
256
- Object.entries(areaToKeysMap).map(async ([driverArea, keys2]) => {
257
- const driver = getDriver(driverArea);
258
- await driver.removeItems(keys2);
259
- })
260
- );
261
- },
262
- removeMeta: async (key, properties) => {
263
- const { driver, driverKey } = resolveKey(key);
264
- await removeMeta(driver, driverKey, properties);
265
- },
266
- snapshot: async (base, opts) => {
267
- const driver = getDriver(base);
268
- const data = await driver.snapshot();
269
- opts?.excludeKeys?.forEach((key) => {
270
- delete data[key];
271
- delete data[getMetaKey(key)];
272
- });
273
- return data;
274
- },
275
- restoreSnapshot: async (base, data) => {
276
- const driver = getDriver(base);
277
- await driver.restoreSnapshot(data);
278
- },
279
- watch: (key, cb) => {
280
- const { driver, driverKey } = resolveKey(key);
281
- return watch(driver, driverKey, cb);
282
- },
283
- unwatch() {
284
- Object.values(drivers).forEach((driver) => {
285
- driver.unwatch();
286
- });
287
- },
288
- defineItem: (key, opts) => {
289
- const { driver, driverKey } = resolveKey(key);
290
- const { version: targetVersion = 1, migrations = {} } = opts ?? {};
291
- if (targetVersion < 1) {
292
- throw Error(
293
- "Storage item version cannot be less than 1. Initial versions should be set to 1, not 0."
294
- );
295
- }
296
- const migrate = async () => {
297
- const driverMetaKey = getMetaKey(driverKey);
298
- const [{ value }, { value: meta }] = await driver.getItems([
299
- driverKey,
300
- driverMetaKey
301
- ]);
302
- if (value == null) return;
303
- const currentVersion = meta?.v ?? 1;
304
- if (currentVersion > targetVersion) {
305
- throw Error(
306
- `Version downgrade detected (v${currentVersion} -> v${targetVersion}) for "${key}"`
307
- );
308
- }
309
- logger.debug(
310
- `Running storage migration for ${key}: v${currentVersion} -> v${targetVersion}`
311
- );
312
- const migrationsToRun = Array.from(
313
- { length: targetVersion - currentVersion },
314
- (_, i) => currentVersion + i + 1
315
- );
316
- let migratedValue = value;
317
- for (const migrateToVersion of migrationsToRun) {
318
- try {
319
- migratedValue = await migrations?.[migrateToVersion]?.(migratedValue) ?? migratedValue;
320
- } catch (err) {
321
- throw Error(`v${migrateToVersion} migration failed for "${key}"`, {
322
- cause: err
323
- });
324
- }
325
- }
326
- await driver.setItems([
327
- { key: driverKey, value: migratedValue },
328
- { key: driverMetaKey, value: { ...meta, v: targetVersion } }
329
- ]);
330
- logger.debug(
331
- `Storage migration completed for ${key} v${targetVersion}`,
332
- { migratedValue }
333
- );
334
- };
335
- const migrationsDone = opts?.migrations == null ? Promise.resolve() : migrate().catch((err) => {
336
- logger.error(`Migration failed for ${key}`, err);
337
- });
338
- const initMutex = new Mutex();
339
- const getFallback = () => opts?.fallback ?? opts?.defaultValue ?? null;
340
- const getOrInitValue = () => initMutex.runExclusive(async () => {
341
- const value = await driver.getItem(driverKey);
342
- if (value != null || opts?.init == null) return value;
343
- const newValue = await opts.init();
344
- await driver.setItem(driverKey, newValue);
345
- return newValue;
346
- });
347
- migrationsDone.then(getOrInitValue);
348
- return {
349
- key,
350
- get defaultValue() {
351
- return getFallback();
352
- },
353
- get fallback() {
354
- return getFallback();
355
- },
356
- getValue: async () => {
357
- await migrationsDone;
358
- if (opts?.init) {
359
- return await getOrInitValue();
360
- } else {
361
- return await getItem(driver, driverKey, opts);
362
- }
363
- },
364
- getMeta: async () => {
365
- await migrationsDone;
366
- return await getMeta(driver, driverKey);
367
- },
368
- setValue: async (value) => {
369
- await migrationsDone;
370
- return await setItem(driver, driverKey, value);
371
- },
372
- setMeta: async (properties) => {
373
- await migrationsDone;
374
- return await setMeta(driver, driverKey, properties);
375
- },
376
- removeValue: async (opts2) => {
377
- await migrationsDone;
378
- return await removeItem(driver, driverKey, opts2);
379
- },
380
- removeMeta: async (properties) => {
381
- await migrationsDone;
382
- return await removeMeta(driver, driverKey, properties);
383
- },
384
- watch: (cb) => watch(
385
- driver,
386
- driverKey,
387
- (newValue, oldValue) => cb(newValue ?? getFallback(), oldValue ?? getFallback())
388
- ),
389
- migrate
390
- };
391
- }
392
- };
393
- return storage2;
394
- }
395
- function createDriver(storageArea) {
396
- const getStorageArea = () => {
397
- if (browser.runtime == null) {
398
- throw Error(
399
- [
400
- "'wxt/storage' must be loaded in a web extension environment",
401
- "\n - If thrown during a build, see https://github.com/wxt-dev/wxt/issues/371",
402
- " - If thrown during tests, mock 'wxt/browser' correctly. See https://wxt.dev/guide/go-further/testing.html\n"
403
- ].join("\n")
404
- );
405
- }
406
- if (browser.storage == null) {
407
- throw Error(
408
- "You must add the 'storage' permission to your manifest to use 'wxt/storage'"
409
- );
410
- }
411
- const area = browser.storage[storageArea];
412
- if (area == null)
413
- throw Error(`"browser.storage.${storageArea}" is undefined`);
414
- return area;
415
- };
416
- const watchListeners = /* @__PURE__ */ new Set();
417
- return {
418
- getItem: async (key) => {
419
- const res = await getStorageArea().get(key);
420
- return res[key];
421
- },
422
- getItems: async (keys) => {
423
- const result = await getStorageArea().get(keys);
424
- return keys.map((key) => ({ key, value: result[key] ?? null }));
425
- },
426
- setItem: async (key, value) => {
427
- if (value == null) {
428
- await getStorageArea().remove(key);
429
- } else {
430
- await getStorageArea().set({ [key]: value });
431
- }
432
- },
433
- setItems: async (values) => {
434
- const map = values.reduce(
435
- (map2, { key, value }) => {
436
- map2[key] = value;
437
- return map2;
438
- },
439
- {}
440
- );
441
- await getStorageArea().set(map);
442
- },
443
- removeItem: async (key) => {
444
- await getStorageArea().remove(key);
445
- },
446
- removeItems: async (keys) => {
447
- await getStorageArea().remove(keys);
448
- },
449
- snapshot: async () => {
450
- return await getStorageArea().get();
451
- },
452
- restoreSnapshot: async (data) => {
453
- await getStorageArea().set(data);
454
- },
455
- watch(key, cb) {
456
- const listener = (changes) => {
457
- const change = changes[key];
458
- if (change == null) return;
459
- if (dequal(change.newValue, change.oldValue)) return;
460
- cb(change.newValue ?? null, change.oldValue ?? null);
461
- };
462
- getStorageArea().onChanged.addListener(listener);
463
- watchListeners.add(listener);
464
- return () => {
465
- getStorageArea().onChanged.removeListener(listener);
466
- watchListeners.delete(listener);
467
- };
468
- },
469
- unwatch() {
470
- watchListeners.forEach((listener) => {
471
- getStorageArea().onChanged.removeListener(listener);
472
- });
473
- watchListeners.clear();
474
- }
475
- };
476
- }
477
- export class MigrationError extends Error {
478
- constructor(key, version, options) {
479
- super(`v${version} migration failed for "${key}"`, options);
480
- this.key = key;
481
- this.version = version;
482
- }
483
- }
1
+ export * from "@wxt-dev/storage";
package/dist/types.d.ts CHANGED
@@ -984,11 +984,15 @@ export interface ServerInfo {
984
984
  export type HookResult = Promise<void> | void;
985
985
  export interface WxtHooks {
986
986
  /**
987
- * Called after WXT initialization, when the WXT instance is ready to work.
987
+ * Called only one time after WXT initialization, when the WXT instance is ready to work.
988
988
  * @param wxt The configured WXT object
989
- * @returns Promise
990
989
  */
991
990
  ready: (wxt: Wxt) => HookResult;
991
+ /**
992
+ * Called whenever config is loaded or reloaded. Use this hook to modify config by modifying `wxt.config`.
993
+ * @param wxt The configured WXT object
994
+ */
995
+ 'config:resolved': (wxt: Wxt) => HookResult;
992
996
  /**
993
997
  * Called before WXT writes .wxt/tsconfig.json and .wxt/wxt.d.ts, allowing
994
998
  * addition of custom references and declarations in wxt.d.ts, or directly
package/dist/version.mjs CHANGED
@@ -1 +1 @@
1
- export const version = "0.19.14";
1
+ export const version = "0.19.16";
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "wxt",
3
3
  "type": "module",
4
- "version": "0.19.14",
4
+ "version": "0.19.16",
5
5
  "description": "Next gen framework for developing web extensions",
6
6
  "repository": {
7
7
  "type": "git",
@@ -76,6 +76,7 @@
76
76
  "@webext-core/fake-browser": "^1.3.1",
77
77
  "@webext-core/isolated-element": "^1.1.2",
78
78
  "@webext-core/match-patterns": "^1.0.3",
79
+ "@wxt-dev/storage": "^1.0.0",
79
80
  "async-mutex": "^0.5.0",
80
81
  "c12": "^1.11.2",
81
82
  "cac": "^6.7.14",
@@ -83,7 +84,6 @@
83
84
  "ci-info": "^4.1.0",
84
85
  "consola": "^3.2.3",
85
86
  "defu": "^6.1.4",
86
- "dequal": "^2.0.3",
87
87
  "dotenv": "^16.4.5",
88
88
  "esbuild": "^0.21.5",
89
89
  "fast-glob": "^3.3.2",