diff options
author | 2022-03-07 15:36:22 -0600 | |
---|---|---|
committer | 2022-03-07 15:36:22 -0600 | |
commit | f18ee36dc0abdc5c8ec87734de7962966d16fe65 (patch) | |
tree | c01a7034186cb0bbe5e1d042f4a5dd09bad21ed5 /packages/webapi/src/lib/Storage.ts | |
parent | 10a9c3412b4f6e8607687a74eafdb150d3222047 (diff) | |
download | astro-f18ee36dc0abdc5c8ec87734de7962966d16fe65.tar.gz astro-f18ee36dc0abdc5c8ec87734de7962966d16fe65.tar.zst astro-f18ee36dc0abdc5c8ec87734de7962966d16fe65.zip |
Add `@astrojs/webapi` package (#2729)@astrojs/webapi@0.11.0
* chore: add @astrojs/webapi
* chore: update package.json
* fix: update file case
* fix: remove lowercase file
* chore: update tests to use mocha
* chore: update LICENSE
Diffstat (limited to 'packages/webapi/src/lib/Storage.ts')
-rw-r--r-- | packages/webapi/src/lib/Storage.ts | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/packages/webapi/src/lib/Storage.ts b/packages/webapi/src/lib/Storage.ts new file mode 100644 index 000000000..672c537c8 --- /dev/null +++ b/packages/webapi/src/lib/Storage.ts @@ -0,0 +1,51 @@ +import * as _ from './utils' + +export class Storage { + clear(): void { + _.internalsOf<StorageInternals>(this, 'Storage', 'clear').storage.clear() + } + + getItem(key: string): string | null { + return getStringOrNull( + _.internalsOf<StorageInternals>(this, 'Storage', 'getItem').storage.get(String(key)) + ) + } + + key(index: number): string | null { + return getStringOrNull([ ..._.internalsOf<StorageInternals>(this, 'Storage', 'key').storage.keys() ][Number(index) || 0]) + } + + removeItem(key: string): void { + _.internalsOf<StorageInternals>(this, 'Storage', 'getItem').storage.delete(String(key)) + } + + setItem(key: string, value: any): void { + _.internalsOf<StorageInternals>(this, 'Storage', 'getItem').storage.set(String(key), String(value)) + } + + get length() { + return _.internalsOf<StorageInternals>(this, 'Storage', 'size').storage.size + } +} + +const getStringOrNull = (value: string | void) => typeof value === 'string' ? value : null + +export const initStorage = (target: Target, exclude: Set<string>) => { + if (exclude.has('Storage') || exclude.has('localStorage')) return + + target.localStorage = Object.create(Storage.prototype) + + const storageInternals = new Map<string, string>() + + _.INTERNALS.set(target.localStorage, { + storage: storageInternals + } as StorageInternals) +} + +interface StorageInternals { + storage: Map<string, string> +} + +interface Target { + localStorage: Storage +} |