Skip to content

Commit 392b301

Browse files
atkgithub-actions[bot]
authored andcommitted
Format
1 parent 41204c8 commit 392b301

File tree

3 files changed

+100
-85
lines changed

3 files changed

+100
-85
lines changed

packages/storage/README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ Instead of wrapping the resource itself, it is far simpler to use the `storage`
5555
persisted signal or [deep signal](../resource/#createdeepsignal):
5656

5757
```ts
58-
const [resource] = createResource(fetcher, {storage: makePersisted(createSignal())});
58+
const [resource] = createResource(fetcher, { storage: makePersisted(createSignal()) });
5959
```
6060

6161
If you are using an asynchronous storage to persist the state of a resource, it might receive an update due to being
@@ -246,7 +246,7 @@ cookieStorage._cookies = [CookieAbstraction, 'cookie'];
246246
access to the storage API:
247247

248248
```ts
249-
const [value, setValue] = createStorageSignal("value", {api: cookieStorage});
249+
const [value, setValue] = createStorageSignal("value", { api: cookieStorage });
250250

251251
setValue("value");
252252
value(); // 'value'

packages/storage/src/cookies.ts

Lines changed: 68 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
import {isServer} from "solid-js/web";
2-
import {StorageProps, StorageSignalProps, StorageWithOptions} from "./types.js";
3-
import {addClearMethod} from "./tools.js";
4-
import {createStorage, createStorageSignal} from "./storage.js";
5-
import type {PageEvent} from "solid-start";
1+
import { isServer } from "solid-js/web";
2+
import { StorageProps, StorageSignalProps, StorageWithOptions } from "./types.js";
3+
import { addClearMethod } from "./tools.js";
4+
import { createStorage, createStorageSignal } from "./storage.js";
5+
import type { PageEvent } from "solid-start";
66

77
export type CookieOptions = CookieProperties & {
88
getRequest?: (() => Request) | (() => PageEvent);
@@ -17,27 +17,33 @@ type CookieProperties = {
1717
httpOnly?: boolean;
1818
maxAge?: number;
1919
sameSite?: "None" | "Lax" | "Strict";
20-
}
21-
22-
const cookiePropertyKeys = ["domain", "expires", "path", "secure", "httpOnly", "maxAge", "sameSite"] as const;
20+
};
2321

22+
const cookiePropertyKeys = [
23+
"domain",
24+
"expires",
25+
"path",
26+
"secure",
27+
"httpOnly",
28+
"maxAge",
29+
"sameSite",
30+
] as const;
2431

2532
function serializeCookieOptions(options?: CookieOptions) {
2633
if (!options) {
2734
return "";
2835
}
2936
let memo = "";
3037
for (const key in options) {
31-
if (!cookiePropertyKeys.includes(key as keyof CookieProperties))
32-
continue;
38+
if (!cookiePropertyKeys.includes(key as keyof CookieProperties)) continue;
3339

3440
const value = options[key as keyof CookieProperties];
3541
memo +=
3642
value instanceof Date
3743
? `; ${key}=${value.toUTCString()}`
3844
: typeof value === "boolean"
39-
? `; ${key}`
40-
: `; ${key}=${value}`;
45+
? `; ${key}`
46+
: `; ${key}=${value}`;
4147
}
4248
return memo;
4349
}
@@ -52,9 +58,11 @@ try {
5258
} catch (e) {
5359
useRequest = () => {
5460
// eslint-disable-next-line no-console
55-
console.warn("It seems you attempt to use cookieStorage on the server without having solid-start installed or use vite.");
61+
console.warn(
62+
"It seems you attempt to use cookieStorage on the server without having solid-start installed or use vite.",
63+
);
5664
return {
57-
request: {headers: {get: () => ""}} as unknown as Request,
65+
request: { headers: { get: () => "" } } as unknown as Request,
5866
} as unknown as PageEvent;
5967
};
6068
}
@@ -81,35 +89,45 @@ try {
8189
export const cookieStorage: StorageWithOptions<CookieOptions> = addClearMethod({
8290
_read: isServer
8391
? (options?: CookieOptions) => {
84-
const eventOrRequest = options?.getRequest?.() || useRequest();
85-
const request = eventOrRequest && ("request" in eventOrRequest ? eventOrRequest.request : eventOrRequest);
86-
let result = ""
87-
if (eventOrRequest.responseHeaders) // Check if we really got a pageEvent
88-
{
89-
const responseHeaders = eventOrRequest.responseHeaders as Headers;
90-
result += responseHeaders.get("Set-Cookie")?.split(",").map(cookie => !cookie.match(/\\w*\\s*=\\s*[^;]+/)).join(";") ?? "";
92+
const eventOrRequest = options?.getRequest?.() || useRequest();
93+
const request =
94+
eventOrRequest && ("request" in eventOrRequest ? eventOrRequest.request : eventOrRequest);
95+
let result = "";
96+
if (eventOrRequest.responseHeaders) {
97+
// Check if we really got a pageEvent
98+
const responseHeaders = eventOrRequest.responseHeaders as Headers;
99+
result +=
100+
responseHeaders
101+
.get("Set-Cookie")
102+
?.split(",")
103+
.map(cookie => !cookie.match(/\\w*\\s*=\\s*[^;]+/))
104+
.join(";") ?? "";
105+
}
106+
return `${result};${request?.headers?.get("Cookie") ?? ""}`; // because first cookie will be preferred we don't have to worry about duplicates
91107
}
92-
return `${result};${request?.headers?.get("Cookie") ?? ""}`; // because first cookie will be preferred we don't have to worry about duplicates
93-
}
94108
: () => document.cookie,
95109
_write: isServer
96110
? (key: string, value: string, options?: CookieOptions) => {
97-
if (options?.setCookie) {
98-
options?.setCookie?.(key, value, options)
99-
return
111+
if (options?.setCookie) {
112+
options?.setCookie?.(key, value, options);
113+
return;
114+
}
115+
const pageEvent: PageEvent = options?.getRequest?.() || useRequest();
116+
if (!pageEvent.responseHeaders)
117+
// Check if we really got a pageEvent
118+
return;
119+
const responseHeaders = pageEvent.responseHeaders as Headers;
120+
const cookies =
121+
responseHeaders
122+
.get("Set-Cookie")
123+
?.split(",")
124+
.filter(cookie => !cookie.match(`\\s*${key}\\s*=`)) ?? [];
125+
cookies.push(`${key}=${value}${serializeCookieOptions(options)}`);
126+
responseHeaders.set("Set-Cookie", cookies.join(","));
100127
}
101-
const pageEvent: PageEvent = options?.getRequest?.() || useRequest();
102-
if (!pageEvent.responseHeaders) // Check if we really got a pageEvent
103-
return
104-
const responseHeaders = pageEvent.responseHeaders as Headers;
105-
const cookies = responseHeaders.get("Set-Cookie")?.split(",")
106-
.filter((cookie) => !cookie.match(`\\s*${key}\\s*=`)) ?? [];
107-
cookies.push(`${key}=${value}${serializeCookieOptions(options)}`)
108-
responseHeaders.set("Set-Cookie", cookies.join(","))
109-
}
110128
: (key: string, value: string, options?: CookieOptions) => {
111-
document.cookie = `${key}=${value}${serializeCookieOptions(options)}`;
112-
},
129+
document.cookie = `${key}=${value}${serializeCookieOptions(options)}`;
130+
},
113131
getItem: (key: string, options?: CookieOptions) =>
114132
deserializeCookieOptions(cookieStorage._read(options), key),
115133
setItem: (key: string, value: string, options?: CookieOptions) => {
@@ -128,17 +146,19 @@ export const cookieStorage: StorageWithOptions<CookieOptions> = addClearMethod({
128146
}
129147
},
130148
removeItem: (key: string, options?: CookieOptions) => {
131-
cookieStorage._write(key, "deleted", {...options, expires: new Date(0)});
149+
cookieStorage._write(key, "deleted", { ...options, expires: new Date(0) });
132150
},
133151
key: (index: number, options?: CookieOptions) => {
134152
let key: string | null = null;
135153
let count = 0;
136-
cookieStorage._read(options).replace(/(?:^|;)\s*(.+?)\s*=\s*[^;]+/g, (_: string, found: string) => {
137-
if (!key && found && count++ === index) {
138-
key = found;
139-
}
140-
return "";
141-
});
154+
cookieStorage
155+
._read(options)
156+
.replace(/(?:^|;)\s*(.+?)\s*=\s*[^;]+/g, (_: string, found: string) => {
157+
if (!key && found && count++ === index) {
158+
key = found;
159+
}
160+
return "";
161+
});
142162
return key;
143163
},
144164
getLength: (options?: CookieOptions) => {
@@ -150,8 +170,8 @@ export const cookieStorage: StorageWithOptions<CookieOptions> = addClearMethod({
150170
return length;
151171
},
152172
get length() {
153-
return this.getLength()
154-
}
173+
return this.getLength();
174+
},
155175
});
156176

157177
/**
@@ -160,7 +180,7 @@ export const cookieStorage: StorageWithOptions<CookieOptions> = addClearMethod({
160180
*/
161181
export const createCookieStorage = <T, O = CookieOptions, A = StorageWithOptions<CookieOptions>>(
162182
props?: Omit<StorageProps<T, A, O>, "api">,
163-
) => createStorage<O, T>({...props, api: cookieStorage} as any);
183+
) => createStorage<O, T>({ ...props, api: cookieStorage } as any);
164184

165185
/**
166186
* creates a reactive signal, but bound to document.cookie
@@ -174,4 +194,4 @@ export const createCookieStorageSignal = <
174194
key: string,
175195
initialValue?: T,
176196
props?: Omit<StorageSignalProps<T, A, O>, "api">,
177-
) => createStorageSignal<T, O>(key, initialValue, {...props, api: cookieStorage} as any);
197+
) => createStorageSignal<T, O>(key, initialValue, { ...props, api: cookieStorage } as any);

packages/storage/src/persisted.ts

Lines changed: 30 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,23 @@
1-
import type {Accessor, Setter, Signal} from "solid-js";
2-
import {createUniqueId, untrack} from "solid-js";
3-
import type {SetStoreFunction, Store} from "solid-js/store";
4-
import {reconcile} from "solid-js/store";
5-
import type {AsyncStorage, AsyncStorageWithOptions, StorageWithOptions} from "./types.js";
1+
import type { Accessor, Setter, Signal } from "solid-js";
2+
import { createUniqueId, untrack } from "solid-js";
3+
import type { SetStoreFunction, Store } from "solid-js/store";
4+
import { reconcile } from "solid-js/store";
5+
import type { AsyncStorage, AsyncStorageWithOptions, StorageWithOptions } from "./types.js";
66

77
export type PersistenceBaseOptions<T> = {
88
name?: string;
99
serialize?: (data: T) => string;
1010
deserialize?: (data: string) => T;
11-
}
11+
};
1212

13-
export type PersistenceOptions<T, O extends Record<string, any>> =
14-
PersistenceBaseOptions<T> & (
15-
{
16-
storage: StorageWithOptions<O> | AsyncStorageWithOptions<O>;
17-
storageOptions: O;
18-
} |
19-
{ storage?: Storage | AsyncStorage; })
13+
export type PersistenceOptions<T, O extends Record<string, any>> = PersistenceBaseOptions<T> &
14+
(
15+
| {
16+
storage: StorageWithOptions<O> | AsyncStorageWithOptions<O>;
17+
storageOptions: O;
18+
}
19+
| { storage?: Storage | AsyncStorage }
20+
);
2021

2122
/**
2223
* Persists a signal, store or similar API
@@ -40,10 +41,9 @@ export type PersistenceOptions<T, O extends Record<string, any>> =
4041
*/
4142
export function makePersisted<T>(
4243
signal: [Accessor<T>, Setter<T>],
43-
options?: PersistenceOptions<T,{}>,
44+
options?: PersistenceOptions<T, {}>,
4445
): [Accessor<T>, Setter<T>];
4546

46-
4747
/**
4848
* Persists a signal, store or similar API
4949
* ```ts
@@ -91,7 +91,7 @@ export function makePersisted<T, O extends Record<string, any>>(
9191
*/
9292
export function makePersisted<T>(
9393
signal: [get: Store<T>, set: SetStoreFunction<T>],
94-
options?: PersistenceOptions<T,{}>,
94+
options?: PersistenceOptions<T, {}>,
9595
): [get: Store<T>, set: SetStoreFunction<T>];
9696

9797
/**
@@ -119,7 +119,6 @@ export function makePersisted<T, O extends Record<string, any>>(
119119
options: PersistenceOptions<T, O>,
120120
): [get: Store<T>, set: SetStoreFunction<T>];
121121

122-
123122
/**
124123
* Persists a signal, store or similar API
125124
* ```ts
@@ -160,30 +159,26 @@ export function makePersisted<T, O extends Record<string, any> = {}>(
160159
: (data: string) => (signal[1] as any)(reconcile(deserialize(data)));
161160
let unchanged = true;
162161

163-
if (init instanceof Promise)
164-
init.then(data => unchanged && data && set(data));
165-
else if (init)
166-
set(init);
162+
if (init instanceof Promise) init.then(data => unchanged && data && set(data));
163+
else if (init) set(init);
167164

168165
return [
169166
signal[0],
170167
typeof signal[0] === "function"
171168
? (value?: T | ((prev: T) => T)) => {
172-
const output = (signal[1] as Setter<T>)(value as any);
169+
const output = (signal[1] as Setter<T>)(value as any);
173170

174-
if (value)
175-
storage.setItem(name, serialize(output), storageOptions);
176-
else
177-
storage.removeItem(name, storageOptions);
178-
unchanged = false;
179-
return output;
180-
}
171+
if (value) storage.setItem(name, serialize(output), storageOptions);
172+
else storage.removeItem(name, storageOptions);
173+
unchanged = false;
174+
return output;
175+
}
181176
: (...args: any[]) => {
182-
(signal[1] as any)(...args);
183-
const value = serialize(untrack(() => signal[0] as any));
184-
// @ts-ignore
185-
storage.setItem(name, value, storageOptions);
186-
unchanged = false;
187-
},
177+
(signal[1] as any)(...args);
178+
const value = serialize(untrack(() => signal[0] as any));
179+
// @ts-ignore
180+
storage.setItem(name, value, storageOptions);
181+
unchanged = false;
182+
},
188183
] as typeof signal;
189184
}

0 commit comments

Comments
 (0)