wxt 0.19.14 → 0.19.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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
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/version.mjs CHANGED
@@ -1 +1 @@
1
- export const version = "0.19.14";
1
+ export const version = "0.19.15";
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.15",
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",