@nemigo/svelte 0.0.1
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.
- package/dist/loader.d.ts +15 -0
- package/dist/loader.js +66 -0
- package/dist/value.svelte.d.ts +12 -0
- package/dist/value.svelte.js +24 -0
- package/package.json +35 -0
package/dist/loader.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export type LoaderHook = ReturnType<LoaderStore["hook"]>;
|
|
2
|
+
export declare class LoaderStore {
|
|
3
|
+
store: import("./value.svelte.js").ValueStoreType<boolean>;
|
|
4
|
+
private queue;
|
|
5
|
+
private caller;
|
|
6
|
+
_hydratable: boolean;
|
|
7
|
+
constructor(hydratable?: boolean);
|
|
8
|
+
private check;
|
|
9
|
+
private awaiter;
|
|
10
|
+
private reset;
|
|
11
|
+
push(promise: Promise<unknown>): void;
|
|
12
|
+
hook(): () => void;
|
|
13
|
+
run<T = any>(call: () => Promise<T>, external?: (v: boolean) => void): Promise<T>;
|
|
14
|
+
hydrate(): void;
|
|
15
|
+
}
|
package/dist/loader.js
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { ValueStore } from "./value.svelte.js";
|
|
2
|
+
import { delay } from "@nemigo/helpers/async";
|
|
3
|
+
import { isSSR } from "@nemigo/helpers/html";
|
|
4
|
+
import { onMount } from "svelte";
|
|
5
|
+
export class LoaderStore {
|
|
6
|
+
store = ValueStore(false);
|
|
7
|
+
queue = [];
|
|
8
|
+
caller = 0;
|
|
9
|
+
_hydratable;
|
|
10
|
+
constructor(hydratable = false) {
|
|
11
|
+
this._hydratable = hydratable;
|
|
12
|
+
this.store.set(this._hydratable);
|
|
13
|
+
}
|
|
14
|
+
check(caller) {
|
|
15
|
+
if (this.queue.length === 0)
|
|
16
|
+
return this.reset(caller);
|
|
17
|
+
Promise.allSettled(this.queue).then(() => {
|
|
18
|
+
if (this.caller !== caller)
|
|
19
|
+
return;
|
|
20
|
+
delay(20).then(() => this.reset(caller));
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
awaiter(caller) {
|
|
24
|
+
this.store.set(true);
|
|
25
|
+
this.check(caller);
|
|
26
|
+
}
|
|
27
|
+
reset(caller) {
|
|
28
|
+
if (this.caller !== caller)
|
|
29
|
+
return;
|
|
30
|
+
this.store.set(false);
|
|
31
|
+
this.caller = 0;
|
|
32
|
+
this.queue = [];
|
|
33
|
+
}
|
|
34
|
+
push(promise) {
|
|
35
|
+
this.caller++;
|
|
36
|
+
this.queue.push(promise);
|
|
37
|
+
this.awaiter(this.caller);
|
|
38
|
+
}
|
|
39
|
+
hook() {
|
|
40
|
+
if (isSSR)
|
|
41
|
+
return () => { };
|
|
42
|
+
let resolver;
|
|
43
|
+
const promise = new Promise((resolve) => (resolver = resolve));
|
|
44
|
+
this.push(promise);
|
|
45
|
+
return resolver;
|
|
46
|
+
}
|
|
47
|
+
async run(call, external) {
|
|
48
|
+
const hook = this.hook();
|
|
49
|
+
external?.(true);
|
|
50
|
+
try {
|
|
51
|
+
return await call();
|
|
52
|
+
}
|
|
53
|
+
finally {
|
|
54
|
+
external?.(false);
|
|
55
|
+
hook();
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
hydrate() {
|
|
59
|
+
if (this._hydratable) {
|
|
60
|
+
onMount(() => {
|
|
61
|
+
if (this.store.value)
|
|
62
|
+
this.check(this.caller);
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface ValueStoreType<T = boolean | undefined> {
|
|
2
|
+
/**
|
|
3
|
+
* @reactive
|
|
4
|
+
*/
|
|
5
|
+
value: T;
|
|
6
|
+
get(): T;
|
|
7
|
+
set(state: T): void;
|
|
8
|
+
untrack<R>(call: (state: T) => R): R;
|
|
9
|
+
}
|
|
10
|
+
declare function ValueStore<T = boolean>(): ValueStoreType<T | undefined>;
|
|
11
|
+
declare function ValueStore<T = boolean>(initial: T): ValueStoreType<T>;
|
|
12
|
+
export { ValueStore };
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { untrack } from "svelte";
|
|
2
|
+
function ValueStore(initial) {
|
|
3
|
+
let _value = $state(initial);
|
|
4
|
+
return {
|
|
5
|
+
get value() {
|
|
6
|
+
return _value;
|
|
7
|
+
},
|
|
8
|
+
set value(state) {
|
|
9
|
+
_value = state;
|
|
10
|
+
},
|
|
11
|
+
get() {
|
|
12
|
+
return untrack(() => this.value);
|
|
13
|
+
},
|
|
14
|
+
set(state) {
|
|
15
|
+
untrack(() => {
|
|
16
|
+
_value = state;
|
|
17
|
+
});
|
|
18
|
+
},
|
|
19
|
+
untrack(call) {
|
|
20
|
+
return untrack(() => call(_value));
|
|
21
|
+
},
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
export { ValueStore };
|
package/package.json
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@nemigo/svelte",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"private": false,
|
|
5
|
+
"author": {
|
|
6
|
+
"name": "Vlad Logvin",
|
|
7
|
+
"email": "vlad.logvin84@gmail.com"
|
|
8
|
+
},
|
|
9
|
+
"type": "module",
|
|
10
|
+
"scripts": {
|
|
11
|
+
"build": "svelte-package && rimraf .svelte-kit",
|
|
12
|
+
"check": "tsc --noemit",
|
|
13
|
+
"lint": "eslint ./",
|
|
14
|
+
"format": "prettier --write ./"
|
|
15
|
+
},
|
|
16
|
+
"exports": {
|
|
17
|
+
".": {
|
|
18
|
+
"types": "./dist/value.svelte.d.ts",
|
|
19
|
+
"default": "./dist/value.svelte.js"
|
|
20
|
+
},
|
|
21
|
+
"./loader": {
|
|
22
|
+
"types": "./dist/loader.d.ts",
|
|
23
|
+
"default": "./dist/loader.js"
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
"peerDependencies": {
|
|
27
|
+
"@nemigo/helpers": "^0.2.0",
|
|
28
|
+
"svelte": "^5.0.0"
|
|
29
|
+
},
|
|
30
|
+
"devDependencies": {
|
|
31
|
+
"@nemigo/configs": "workspace:*",
|
|
32
|
+
"@nemigo/helpers": "workspace:*",
|
|
33
|
+
"svelte": "5.38.6"
|
|
34
|
+
}
|
|
35
|
+
}
|