UNPKG

webext-storage

Version:

A more usable typed storage API for Web Extensions

54 lines (53 loc) 2.2 kB
/* eslint-disable @typescript-eslint/ban-types */ /* eslint-disable no-new -- Type tests only */ import { expectType, expectNotAssignable, expectAssignable } from 'tsd'; import { StorageItem } from './storage-item.js'; new StorageItem('key', { area: 'local' }); new StorageItem('key', { area: 'sync' }); // No type, no default, return `unknown` const unknownItem = new StorageItem('key'); expectAssignable(unknownItem.get()); await unknownItem.set(1); await unknownItem.set(null); // Explicit type, no default, return `T | undefined` const objectNoDefault = new StorageItem('key'); expectType(objectNoDefault.get()); expectType(objectNoDefault.set({ name: 'new name' })); // NonNullable from default const stringDefault = new StorageItem('key', { defaultValue: 'SMASHING' }); expectAssignable(stringDefault.get()); expectNotAssignable(stringDefault.get()); expectType(stringDefault.get()); expectType(stringDefault.set('some string')); // NonNullable from default, includes broader type as generic // The second type parameter must be re-specified because TypeScript stops inferring it // https://github.com/microsoft/TypeScript/issues/26242 const broadGeneric = new StorageItem('key', { defaultValue: { a: 1 } }); expectAssignable(broadGeneric.get()); // Allows null as a value via default value const storeNull = new StorageItem('key', { defaultValue: null }); await storeNull.set(null); expectType(storeNull.get()); // Allows null as a value type parameters const storeSomeNull = new StorageItem('key'); await storeSomeNull.set(1); await storeSomeNull.set(null); expectType(storeSomeNull.get()); // @ts-expect-error Type is string await stringDefault.set(1); // @ts-expect-error Type is string await stringDefault.set(true); // @ts-expect-error Type is string await stringDefault.set([true, 'string']); // @ts-expect-error Type is string await stringDefault.set({ wow: [true, 'string'] }); // @ts-expect-error Type is string await stringDefault.set(1, { days: 1 }); stringDefault.onChanged(value => { expectType(value); }); objectNoDefault.onChanged(value => { expectType(value); }); // @ts-expect-error Don't allow mismatched types new StorageItem('key', { defaultValue: 'SMASHING' });