summaryrefslogtreecommitdiff
path: root/packages/webapi/src/lib/Storage.ts
diff options
context:
space:
mode:
authorGravatar Nate Moore <natemoo-re@users.noreply.github.com> 2022-03-07 15:36:22 -0600
committerGravatar GitHub <noreply@github.com> 2022-03-07 15:36:22 -0600
commitf18ee36dc0abdc5c8ec87734de7962966d16fe65 (patch)
treec01a7034186cb0bbe5e1d042f4a5dd09bad21ed5 /packages/webapi/src/lib/Storage.ts
parent10a9c3412b4f6e8607687a74eafdb150d3222047 (diff)
downloadastro-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.ts51
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
+}