valyrian.js 7.2.12 → 8.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/README.md +6 -6
- package/dist/flux-store/index.d.ts +32 -0
- package/dist/flux-store/index.d.ts.map +1 -0
- package/dist/flux-store/index.js +267 -0
- package/dist/flux-store/index.js.map +7 -0
- package/dist/flux-store/index.min.js +1 -0
- package/dist/flux-store/index.min.js.map +1 -0
- package/dist/flux-store/index.mjs +246 -0
- package/dist/flux-store/index.mjs.map +7 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +35 -51
- package/dist/hooks/index.js.map +3 -3
- package/dist/hooks/index.min.js +1 -0
- package/dist/hooks/index.min.js.map +1 -0
- package/dist/hooks/index.mjs +36 -52
- package/dist/hooks/index.mjs.map +3 -3
- package/dist/index.d.ts +18 -14
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +107 -88
- package/dist/index.js.map +3 -3
- package/dist/index.min.js +1 -1
- package/dist/index.min.js.map +1 -1
- package/dist/index.mjs +107 -88
- package/dist/index.mjs.map +3 -3
- package/dist/native-store/index.d.ts +14 -0
- package/dist/native-store/index.d.ts.map +1 -0
- package/dist/native-store/index.js +103 -0
- package/dist/native-store/index.js.map +7 -0
- package/dist/native-store/index.min.js +1 -0
- package/dist/native-store/index.min.js.map +1 -0
- package/dist/native-store/index.mjs +82 -0
- package/dist/native-store/index.mjs.map +7 -0
- package/dist/node/index.d.ts +1 -1
- package/dist/node/index.d.ts.map +1 -1
- package/dist/node/index.js +125 -10
- package/dist/node/index.js.map +4 -4
- package/dist/node/index.mjs +125 -10
- package/dist/node/index.mjs.map +4 -4
- package/dist/node/node.sw.js +152 -0
- package/dist/node/utils/icons.d.ts +4 -5
- package/dist/node/utils/icons.d.ts.map +1 -1
- package/dist/node/utils/inline.d.ts +1 -1
- package/dist/node/utils/inline.d.ts.map +1 -1
- package/dist/node/utils/node.sw.js +152 -0
- package/dist/node/utils/session-storage.d.ts +22 -0
- package/dist/node/utils/session-storage.d.ts.map +1 -0
- package/dist/node/utils/sw.d.ts.map +1 -1
- package/dist/node/utils/tree-adapter.d.ts +5 -1
- package/dist/node/utils/tree-adapter.d.ts.map +1 -1
- package/dist/pulse-store/index.d.ts +16 -0
- package/dist/pulse-store/index.d.ts.map +1 -0
- package/dist/pulse-store/index.js +143 -0
- package/dist/pulse-store/index.js.map +7 -0
- package/dist/pulse-store/index.min.js +1 -0
- package/dist/pulse-store/index.min.js.map +1 -0
- package/dist/pulse-store/index.mjs +122 -0
- package/dist/pulse-store/index.mjs.map +7 -0
- package/dist/request/index.d.ts +11 -11
- package/dist/request/index.d.ts.map +1 -1
- package/dist/request/index.js +63 -84
- package/dist/request/index.js.map +2 -2
- package/dist/request/index.min.js +1 -0
- package/dist/request/index.min.js.map +1 -0
- package/dist/request/index.mjs +63 -84
- package/dist/request/index.mjs.map +2 -2
- package/dist/router/index.d.ts +36 -33
- package/dist/router/index.d.ts.map +1 -1
- package/dist/router/index.js +247 -96
- package/dist/router/index.js.map +3 -3
- package/dist/router/index.min.js +1 -0
- package/dist/router/index.min.js.map +1 -0
- package/dist/router/index.mjs +247 -96
- package/dist/router/index.mjs.map +3 -3
- package/dist/signals/index.d.ts +6 -0
- package/dist/signals/index.d.ts.map +1 -0
- package/dist/signals/index.js +92 -0
- package/dist/signals/index.js.map +7 -0
- package/dist/signals/index.min.js +1 -0
- package/dist/signals/index.min.js.map +1 -0
- package/dist/signals/index.mjs +71 -0
- package/dist/signals/index.mjs.map +7 -0
- package/dist/suspense/index.d.ts +6 -0
- package/dist/suspense/index.d.ts.map +1 -0
- package/dist/suspense/index.js +67 -0
- package/dist/suspense/index.js.map +7 -0
- package/dist/suspense/index.min.js +1 -0
- package/dist/suspense/index.min.js.map +1 -0
- package/dist/suspense/index.mjs +46 -0
- package/dist/suspense/index.mjs.map +7 -0
- package/dist/sw/index.min.js +1 -0
- package/dist/sw/index.min.js.map +1 -0
- package/dist/translate/index.d.ts +19 -0
- package/dist/translate/index.d.ts.map +1 -0
- package/dist/translate/index.js +150 -0
- package/dist/translate/index.js.map +7 -0
- package/dist/translate/index.min.js +1 -0
- package/dist/translate/index.min.js.map +1 -0
- package/dist/translate/index.mjs +129 -0
- package/dist/translate/index.mjs.map +7 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/utils/deep-freeze.d.ts +3 -0
- package/dist/utils/deep-freeze.d.ts.map +1 -0
- package/dist/utils/getter-setter.d.ts +3 -0
- package/dist/utils/getter-setter.d.ts.map +1 -0
- package/dist/utils/has-changed.d.ts +2 -0
- package/dist/utils/has-changed.d.ts.map +1 -0
- package/dist/utils/index.d.ts +4 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +138 -0
- package/dist/utils/index.js.map +7 -0
- package/dist/utils/index.min.js +1 -0
- package/dist/utils/index.min.js.map +1 -0
- package/dist/utils/index.mjs +115 -0
- package/dist/utils/index.mjs.map +7 -0
- package/lib/flux-store/index.ts +312 -0
- package/lib/hooks/index.ts +39 -57
- package/lib/index.ts +135 -118
- package/lib/native-store/index.ts +106 -0
- package/lib/node/index.ts +3 -1
- package/lib/node/utils/icons.ts +4 -4
- package/lib/node/utils/inline.ts +2 -0
- package/lib/node/utils/node.sw.js +152 -0
- package/lib/node/utils/session-storage.ts +117 -0
- package/lib/node/utils/sw.ts +34 -10
- package/lib/node/utils/tree-adapter.ts +19 -1
- package/lib/pulse-store/index.ts +188 -0
- package/lib/request/index.ts +92 -122
- package/lib/router/index.ts +353 -164
- package/lib/signals/index.ts +98 -0
- package/lib/suspense/index.ts +57 -0
- package/lib/translate/index.ts +156 -0
- package/lib/utils/deep-freeze.ts +54 -0
- package/lib/utils/getter-setter.ts +40 -0
- package/lib/utils/has-changed.ts +43 -0
- package/lib/utils/index.ts +3 -0
- package/package.json +40 -57
- package/tsconfig.json +5 -4
- package/dist/dataset/index.d.ts +0 -24
- package/dist/dataset/index.d.ts.map +0 -1
- package/dist/dataset/index.js +0 -178
- package/dist/dataset/index.js.map +0 -7
- package/dist/dataset/index.mjs +0 -157
- package/dist/dataset/index.mjs.map +0 -7
- package/dist/node/node.sw.tpl +0 -133
- package/dist/node/utils/node.sw.tpl +0 -133
- package/dist/proxy-signal/index.d.ts +0 -23
- package/dist/proxy-signal/index.d.ts.map +0 -1
- package/dist/proxy-signal/index.js +0 -138
- package/dist/proxy-signal/index.js.map +0 -7
- package/dist/proxy-signal/index.mjs +0 -117
- package/dist/proxy-signal/index.mjs.map +0 -7
- package/dist/signal/index.d.ts +0 -9
- package/dist/signal/index.d.ts.map +0 -1
- package/dist/signal/index.js +0 -76
- package/dist/signal/index.js.map +0 -7
- package/dist/signal/index.mjs +0 -55
- package/dist/signal/index.mjs.map +0 -7
- package/dist/store/index.d.ts +0 -16
- package/dist/store/index.d.ts.map +0 -1
- package/dist/store/index.js +0 -93
- package/dist/store/index.js.map +0 -7
- package/dist/store/index.mjs +0 -72
- package/dist/store/index.mjs.map +0 -7
- package/lib/dataset/index.ts +0 -193
- package/lib/node/utils/node.sw.tpl +0 -133
- package/lib/proxy-signal/index.ts +0 -187
- package/lib/signal/index.ts +0 -86
- package/lib/store/index.ts +0 -101
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
// eslint-disable-next-line no-console
|
|
2
|
+
const Log = console.log;
|
|
3
|
+
|
|
4
|
+
const config = {
|
|
5
|
+
version: "v1.2::",
|
|
6
|
+
name: "Valyrian.js",
|
|
7
|
+
// Critical resources and offline page
|
|
8
|
+
urls: ["/"]
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
const cacheName = config.version + config.name;
|
|
12
|
+
const MAX_CACHE_SIZE = 50; // Max cache size
|
|
13
|
+
|
|
14
|
+
// Send messages to clients (controlled pages)
|
|
15
|
+
function sendMessageToClients(message) {
|
|
16
|
+
self.clients.matchAll().then((clients) => {
|
|
17
|
+
clients.forEach((client) => {
|
|
18
|
+
client.postMessage(message);
|
|
19
|
+
});
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// Limit the cache size by deleting the oldest entries
|
|
24
|
+
function limitCacheSize(name, size) {
|
|
25
|
+
caches.open(name).then((cache) => {
|
|
26
|
+
cache.keys().then((keys) => {
|
|
27
|
+
if (keys.length > size) {
|
|
28
|
+
cache.delete(keys[0]).then(() => {
|
|
29
|
+
limitCacheSize(name, size);
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
async function fetchRequest(event) {
|
|
37
|
+
Log("WORKER: fetch event for " + event.request.url);
|
|
38
|
+
try {
|
|
39
|
+
// Clone the request to store it in the cache
|
|
40
|
+
const fetchRequest = event.request.clone();
|
|
41
|
+
const response = await fetch(fetchRequest);
|
|
42
|
+
|
|
43
|
+
// Verify if the response is valid
|
|
44
|
+
if (response && response.status === 200 && response.type === "basic") {
|
|
45
|
+
// Clone the response to store it in the cache
|
|
46
|
+
const responseToCache = response.clone();
|
|
47
|
+
const cache = await caches.open(cacheName);
|
|
48
|
+
cache.put(event.request, responseToCache);
|
|
49
|
+
|
|
50
|
+
// Limit the cache size
|
|
51
|
+
limitCacheSize(cacheName, MAX_CACHE_SIZE);
|
|
52
|
+
|
|
53
|
+
Log("WORKER: fetch response stored in cache.", event.request.url);
|
|
54
|
+
}
|
|
55
|
+
return response;
|
|
56
|
+
} catch (error) {
|
|
57
|
+
Log("WORKER: fetch request failed.", error);
|
|
58
|
+
|
|
59
|
+
// Try to serve the cached response if available
|
|
60
|
+
const cachedResponse = await caches.match(event.request);
|
|
61
|
+
if (cachedResponse) {
|
|
62
|
+
Log("WORKER: fetch request failed, responding with cache.");
|
|
63
|
+
return cachedResponse;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// Send the offline page if no cache is available
|
|
67
|
+
const cache = await caches.open(cacheName);
|
|
68
|
+
const offlineResponse = await cache.match("/offline.html");
|
|
69
|
+
if (offlineResponse) {
|
|
70
|
+
return offlineResponse;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// Generic offline page
|
|
74
|
+
return new Response("<h1>Offline</h1>", {
|
|
75
|
+
status: 503,
|
|
76
|
+
statusText: "Service Unavailable",
|
|
77
|
+
headers: new Headers({
|
|
78
|
+
"Content-Type": "text/html"
|
|
79
|
+
})
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
self.addEventListener("fetch", (event) => {
|
|
85
|
+
// Ignore requests with the "only-if-cached" cache mode
|
|
86
|
+
if (event.request.cache === "only-if-cached" && event.request.mode !== "same-origin") {
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
Log("WORKER: fetch event in progress.", event.request.url);
|
|
91
|
+
|
|
92
|
+
// Ignore requests that are not GET
|
|
93
|
+
if (event.request.method !== "GET") {
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// If the request is for the API, use the network first
|
|
98
|
+
if (event.request.url.includes("/api/")) {
|
|
99
|
+
event.respondWith(fetchRequest(event));
|
|
100
|
+
} else {
|
|
101
|
+
// Use the cache first for other requests
|
|
102
|
+
event.respondWith(
|
|
103
|
+
caches.match(event.request).then((response) => {
|
|
104
|
+
if (response) {
|
|
105
|
+
Log("WORKER: returning from cache.", event.request.url);
|
|
106
|
+
return response;
|
|
107
|
+
}
|
|
108
|
+
return fetchRequest(event);
|
|
109
|
+
})
|
|
110
|
+
);
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
self.addEventListener("install", (event) => {
|
|
115
|
+
Log("WORKER: installing version", cacheName);
|
|
116
|
+
event.waitUntil(
|
|
117
|
+
caches
|
|
118
|
+
.open(cacheName)
|
|
119
|
+
.then((cache) => {
|
|
120
|
+
return cache.addAll(config.urls);
|
|
121
|
+
})
|
|
122
|
+
.then(() => {
|
|
123
|
+
Log("WORKER: install completed.");
|
|
124
|
+
})
|
|
125
|
+
);
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
self.addEventListener("activate", (event) => {
|
|
129
|
+
Log("WORKER: activating new version", cacheName);
|
|
130
|
+
|
|
131
|
+
event.waitUntil(
|
|
132
|
+
caches.keys().then((keys) =>
|
|
133
|
+
Promise.all(
|
|
134
|
+
keys
|
|
135
|
+
// Filter the caches that belong to this app version
|
|
136
|
+
.filter((key) => key !== cacheName)
|
|
137
|
+
.map((key) => caches.delete(key))
|
|
138
|
+
).then(() => {
|
|
139
|
+
Log("WORKER: old caches cleared.");
|
|
140
|
+
// Notify clients about the new version
|
|
141
|
+
sendMessageToClients({ type: "NEW_VERSION" });
|
|
142
|
+
})
|
|
143
|
+
)
|
|
144
|
+
);
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
// Listen for messages from clients
|
|
148
|
+
self.addEventListener("message", (event) => {
|
|
149
|
+
if (event.data && event.data.type === "SKIP_WAITING") {
|
|
150
|
+
self.skipWaiting();
|
|
151
|
+
}
|
|
152
|
+
});
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export declare class SessionStorage {
|
|
2
|
+
private storage;
|
|
3
|
+
private limit;
|
|
4
|
+
private persist;
|
|
5
|
+
private filePath;
|
|
6
|
+
private directory;
|
|
7
|
+
constructor({ persist, filePath }?: {
|
|
8
|
+
persist?: boolean;
|
|
9
|
+
filePath?: string;
|
|
10
|
+
});
|
|
11
|
+
private getStorageSize;
|
|
12
|
+
private checkSizeLimit;
|
|
13
|
+
setItem(key: string | null | undefined, value: string | null | undefined): void;
|
|
14
|
+
getItem(key: string | null | undefined): string | null;
|
|
15
|
+
removeItem(key: string | null | undefined): void;
|
|
16
|
+
clear(): void;
|
|
17
|
+
get length(): number;
|
|
18
|
+
key(index: number): string | null;
|
|
19
|
+
private saveToFile;
|
|
20
|
+
private loadFromFile;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=session-storage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-storage.d.ts","sourceRoot":"","sources":["../../../lib/node/utils/session-storage.ts"],"names":[],"mappings":"AAGA,qBAAa,cAAc;IACzB,OAAO,CAAC,OAAO,CAA4B;IAC3C,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,SAAS,CAA8B;gBAEnC,EAAE,OAAe,EAAE,QAA+B,EAAE,GAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAO;IAiB/G,OAAO,CAAC,cAAc;IAKtB,OAAO,CAAC,cAAc;IAQtB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI;IAmB/E,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI;IAQtD,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI;IAWhD,KAAK,IAAI,IAAI;IAQb,IAAI,MAAM,IAAI,MAAM,CAEnB;IAGD,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAMjC,OAAO,CAAC,UAAU;IASlB,OAAO,CAAC,YAAY;CAUrB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sw.d.ts","sourceRoot":"","sources":["../../../lib/node/utils/sw.ts"],"names":[],"mappings":"AAGA,wBAAgB,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"sw.d.ts","sourceRoot":"","sources":["../../../lib/node/utils/sw.ts"],"names":[],"mappings":"AAGA,wBAAgB,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,KAAK,QAoB5C"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
interface ChildNodes extends Array<Node | Element | Text | DocumentFragment> {
|
|
2
2
|
}
|
|
3
3
|
export declare class Node implements Node {
|
|
4
|
+
#private;
|
|
4
5
|
childNodes: ChildNodes;
|
|
5
6
|
baseURI: string;
|
|
6
7
|
tag_name: string;
|
|
@@ -20,6 +21,8 @@ export declare class Node implements Node {
|
|
|
20
21
|
parent_node: Node | null;
|
|
21
22
|
get parentNode(): Node | null;
|
|
22
23
|
set parentNode(node: Node | null);
|
|
24
|
+
get dataset(): Record<string | number, any>;
|
|
25
|
+
set dataset(value: Record<string | number, any>);
|
|
23
26
|
constructor();
|
|
24
27
|
appendChild<T extends Node>(node: T): T;
|
|
25
28
|
insertBefore<T extends Node>(node: T, child: Node | null): T;
|
|
@@ -62,12 +65,13 @@ export declare class DocumentFragment extends Element {
|
|
|
62
65
|
}
|
|
63
66
|
export declare class Document extends Element {
|
|
64
67
|
constructor();
|
|
68
|
+
body: Element;
|
|
65
69
|
createDocumentFragment(): DocumentFragment;
|
|
66
70
|
createElement(type: string): Element;
|
|
67
71
|
createElementNS(ns: string, type: string): Element;
|
|
68
72
|
createTextNode(text: any): Text;
|
|
69
73
|
}
|
|
70
|
-
export declare function domToHtml(dom: Element): string;
|
|
74
|
+
export declare function domToHtml(dom: Element | Text | DocumentFragment): string;
|
|
71
75
|
export declare function domToHyperscript(childNodes: ChildNodes, depth?: number): string;
|
|
72
76
|
export declare function htmlToDom(html: string): Element | Text | DocumentFragment;
|
|
73
77
|
export declare function htmlToHyperscript(html: string): string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tree-adapter.d.ts","sourceRoot":"","sources":["../../../lib/node/utils/tree-adapter.ts"],"names":[],"mappings":"AAEA,UAAU,UAAW,SAAQ,KAAK,CAAC,IAAI,GAAG,OAAO,GAAG,IAAI,GAAG,gBAAgB,CAAC;CAAG;AAE/E,qBAAa,IAAK,YAAW,IAAI
|
|
1
|
+
{"version":3,"file":"tree-adapter.d.ts","sourceRoot":"","sources":["../../../lib/node/utils/tree-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
type State = Record<string, any>;
|
|
2
|
+
export type Pulse<StateType> = (state: StateType, ...args: any[]) => void | Promise<void>;
|
|
3
|
+
export type Pulses<StateType> = {
|
|
4
|
+
[key: string]: Pulse<StateType>;
|
|
5
|
+
};
|
|
6
|
+
type ProxyState<StateType> = StateType & {
|
|
7
|
+
[key: string]: any;
|
|
8
|
+
};
|
|
9
|
+
type StorePulses<PulsesType> = {
|
|
10
|
+
[K in keyof PulsesType]: PulsesType[K] extends (state: any, ...args: infer Args) => infer R ? (...args: Args) => R : never;
|
|
11
|
+
};
|
|
12
|
+
export declare function createPulseStore<StateType extends State, PulsesType extends Pulses<StateType>>(initialState: StateType, pulses: PulsesType): () => [ProxyState<StateType>, StorePulses<PulsesType>];
|
|
13
|
+
export declare function createMutableStore<StateType extends State, PulsesType extends Pulses<StateType>>(initialState: StateType, pulses: PulsesType): () => [ProxyState<StateType>, StorePulses<PulsesType>];
|
|
14
|
+
export declare function createEffect(effect: Function): void;
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../lib/pulse-store/index.ts"],"names":[],"mappings":"AAIA,KAAK,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAIjC,MAAM,MAAM,KAAK,CAAC,SAAS,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAG1F,MAAM,MAAM,MAAM,CAAC,SAAS,IAAI;IAC9B,CAAC,GAAG,EAAE,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC;CACjC,CAAC;AAKF,KAAK,UAAU,CAAC,SAAS,IAAI,SAAS,GAAG;IACvC,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB,CAAC;AAKF,KAAK,WAAW,CAAC,UAAU,IAAI;KAC5B,CAAC,IAAI,MAAM,UAAU,GAAG,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,MAAM,IAAI,KAAK,MAAM,CAAC,GACvF,CAAC,GAAG,IAAI,EAAE,IAAI,KAAK,CAAC,GACpB,KAAK;CACV,CAAC;AAgIF,wBAAgB,gBAAgB,CAAC,SAAS,SAAS,KAAK,EAAE,UAAU,SAAS,MAAM,CAAC,SAAS,CAAC,EAC5F,YAAY,EAAE,SAAS,EACvB,MAAM,EAAE,UAAU,GACjB,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,WAAW,CAAC,UAAU,CAAC,CAAC,CAExD;AAGD,wBAAgB,kBAAkB,CAAC,SAAS,SAAS,KAAK,EAAE,UAAU,SAAS,MAAM,CAAC,SAAS,CAAC,EAC9F,YAAY,EAAE,SAAS,EACvB,MAAM,EAAE,UAAU,GACjB,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,WAAW,CAAC,UAAU,CAAC,CAAC,CAKxD;AAGD,wBAAgB,YAAY,CAAC,MAAM,EAAE,QAAQ,QAW5C"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// lib/pulse-store/index.ts
|
|
21
|
+
var pulse_store_exports = {};
|
|
22
|
+
__export(pulse_store_exports, {
|
|
23
|
+
createEffect: () => createEffect,
|
|
24
|
+
createMutableStore: () => createMutableStore,
|
|
25
|
+
createPulseStore: () => createPulseStore
|
|
26
|
+
});
|
|
27
|
+
module.exports = __toCommonJS(pulse_store_exports);
|
|
28
|
+
var import_valyrian = require("valyrian.js");
|
|
29
|
+
var import_utils = require("valyrian.js/utils");
|
|
30
|
+
var effectStack = [];
|
|
31
|
+
function createStore(initialState, pulses, immutable = false) {
|
|
32
|
+
const subscribers = /* @__PURE__ */ new Set();
|
|
33
|
+
const vnodesToUpdate = /* @__PURE__ */ new WeakSet();
|
|
34
|
+
const localState = (typeof initialState === "function" ? initialState() : initialState) || {};
|
|
35
|
+
function isMutable() {
|
|
36
|
+
if (immutable) {
|
|
37
|
+
throw new Error("You need to call a pulse to modify the state");
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
const proxyState = new Proxy(localState, {
|
|
41
|
+
get: (state, prop) => {
|
|
42
|
+
const currentEffect = effectStack[effectStack.length - 1];
|
|
43
|
+
if (currentEffect && !subscribers.has(currentEffect)) {
|
|
44
|
+
subscribers.add(currentEffect);
|
|
45
|
+
}
|
|
46
|
+
const currentVnode = import_valyrian.current.vnode;
|
|
47
|
+
if (currentVnode && !vnodesToUpdate.has(currentVnode)) {
|
|
48
|
+
const subscription = () => {
|
|
49
|
+
if (!currentVnode.dom) {
|
|
50
|
+
subscribers.delete(subscription);
|
|
51
|
+
vnodesToUpdate.delete(currentVnode);
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
(0, import_valyrian.updateVnode)(currentVnode);
|
|
55
|
+
};
|
|
56
|
+
subscribers.add(subscription);
|
|
57
|
+
vnodesToUpdate.add(currentVnode);
|
|
58
|
+
}
|
|
59
|
+
return state[prop];
|
|
60
|
+
},
|
|
61
|
+
// If the user tries to set directly it will throw an error
|
|
62
|
+
set: (state, prop, value) => {
|
|
63
|
+
isMutable();
|
|
64
|
+
Reflect.set(state, prop, value);
|
|
65
|
+
return true;
|
|
66
|
+
},
|
|
67
|
+
// If the user tries to delete directly it will throw an error
|
|
68
|
+
deleteProperty: (state, prop) => {
|
|
69
|
+
isMutable();
|
|
70
|
+
Reflect.deleteProperty(state, prop);
|
|
71
|
+
return true;
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
function syncState(newState) {
|
|
75
|
+
for (const key in newState) {
|
|
76
|
+
localState[key] = immutable ? (0, import_utils.deepFreeze)(newState[key]) : newState[key];
|
|
77
|
+
}
|
|
78
|
+
for (const key in localState) {
|
|
79
|
+
if (!(key in newState)) {
|
|
80
|
+
Reflect.deleteProperty(localState, key);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
function setState(newState) {
|
|
85
|
+
if (!(0, import_utils.hasChanged)(localState, newState)) {
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
syncState(newState);
|
|
89
|
+
subscribers.forEach((subscriber) => subscriber());
|
|
90
|
+
}
|
|
91
|
+
function getPulseMethod(key) {
|
|
92
|
+
return (...args) => {
|
|
93
|
+
const currentState = (0, import_utils.deepCloneUnfreeze)(localState);
|
|
94
|
+
const pulse = pulses[key](currentState, ...args);
|
|
95
|
+
if (pulse instanceof Promise) {
|
|
96
|
+
return pulse.then(() => setState(currentState)).catch((error) => {
|
|
97
|
+
console.error("Error in pulse:", error);
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
setState(currentState);
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
const boundPulses = {};
|
|
104
|
+
for (const key in pulses) {
|
|
105
|
+
if (typeof pulses[key] !== "function") {
|
|
106
|
+
throw new Error(`Pulse '${key}' must be a function`);
|
|
107
|
+
}
|
|
108
|
+
boundPulses[key] = getPulseMethod(key);
|
|
109
|
+
}
|
|
110
|
+
const pulsesProxy = new Proxy(boundPulses, {
|
|
111
|
+
get: (pulses2, prop) => {
|
|
112
|
+
if (!(prop in pulses2)) {
|
|
113
|
+
throw new Error(`Pulse '${prop}' does not exist`);
|
|
114
|
+
}
|
|
115
|
+
return pulses2[prop];
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
function usePulseStore() {
|
|
119
|
+
return [proxyState, pulsesProxy];
|
|
120
|
+
}
|
|
121
|
+
syncState(localState);
|
|
122
|
+
return usePulseStore;
|
|
123
|
+
}
|
|
124
|
+
function createPulseStore(initialState, pulses) {
|
|
125
|
+
return createStore(initialState, pulses, true);
|
|
126
|
+
}
|
|
127
|
+
function createMutableStore(initialState, pulses) {
|
|
128
|
+
console.warn(
|
|
129
|
+
"Warning: You are working with a mutable state. This can lead to unpredictable behavior. All state changes made outside of a pulse will not trigger a re-render."
|
|
130
|
+
);
|
|
131
|
+
return createStore(initialState, pulses, false);
|
|
132
|
+
}
|
|
133
|
+
function createEffect(effect) {
|
|
134
|
+
const runEffect = () => {
|
|
135
|
+
try {
|
|
136
|
+
effectStack.push(runEffect);
|
|
137
|
+
effect();
|
|
138
|
+
} finally {
|
|
139
|
+
effectStack.pop();
|
|
140
|
+
}
|
|
141
|
+
};
|
|
142
|
+
runEffect();
|
|
143
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../lib/pulse-store/index.ts"],
|
|
4
|
+
"sourcesContent": ["/* eslint-disable no-console */\nimport { updateVnode, Vnode, VnodeWithDom, current } from \"valyrian.js\";\nimport { deepCloneUnfreeze, deepFreeze, hasChanged } from \"valyrian.js/utils\";\n\ntype State = Record<string, any>;\n\n// An action or pulse type definition\n// eslint-disable-next-line no-unused-vars\nexport type Pulse<StateType> = (state: StateType, ...args: any[]) => void | Promise<void>;\n\n// A collection of pulses\nexport type Pulses<StateType> = {\n [key: string]: Pulse<StateType>;\n};\n\n// A proxy state\n// This is a state that is proxied to automatically subscribe to changes\n// And is used internally to update the vnode when the state changes\ntype ProxyState<StateType> = StateType & {\n [key: string]: any;\n};\n\n// The effect stack\nconst effectStack: Function[] = [];\n\ntype StorePulses<PulsesType> = {\n [K in keyof PulsesType]: PulsesType[K] extends (state: any, ...args: infer Args) => infer R\n ? (...args: Args) => R\n : never;\n};\n\n// Creates the store\n// eslint-disable-next-line sonarjs/cognitive-complexity\nfunction createStore<StateType extends State, PulsesType extends Pulses<StateType>>(\n initialState: StateType | (() => StateType) | null,\n pulses: PulsesType,\n immutable = false\n): () => [ProxyState<StateType>, StorePulses<PulsesType>] {\n const subscribers = new Set<Function>();\n const vnodesToUpdate = new WeakSet<Vnode>();\n\n // Initialize the localState for this store\n const localState: StateType =\n (typeof initialState === \"function\" ? initialState() : initialState) || ({} as StateType);\n\n function isMutable() {\n if (immutable) {\n throw new Error(\"You need to call a pulse to modify the state\");\n }\n }\n\n // We create a proxy for the state\n const proxyState = new Proxy(localState, {\n get: (state, prop: string) => {\n const currentEffect = effectStack[effectStack.length - 1];\n if (currentEffect && !subscribers.has(currentEffect)) {\n subscribers.add(currentEffect);\n }\n\n const currentVnode = current.vnode as VnodeWithDom;\n if (currentVnode && !vnodesToUpdate.has(currentVnode)) {\n const subscription = () => {\n if (!currentVnode.dom) {\n subscribers.delete(subscription);\n vnodesToUpdate.delete(currentVnode);\n return;\n }\n\n updateVnode(currentVnode);\n };\n\n subscribers.add(subscription);\n vnodesToUpdate.add(currentVnode);\n }\n\n return state[prop];\n },\n // If the user tries to set directly it will throw an error\n set: (state, prop: string, value: any) => {\n isMutable();\n Reflect.set(state, prop, value);\n return true;\n },\n // If the user tries to delete directly it will throw an error\n deleteProperty: (state, prop: string) => {\n isMutable();\n Reflect.deleteProperty(state, prop);\n return true;\n }\n });\n\n function syncState(newState: StateType) {\n for (const key in newState) {\n localState[key] = immutable ? deepFreeze(newState[key]) : newState[key];\n }\n\n for (const key in localState) {\n if (!(key in newState)) {\n Reflect.deleteProperty(localState, key);\n }\n }\n }\n\n function setState(newState: StateType) {\n if (!hasChanged(localState, newState)) {\n return;\n }\n\n syncState(newState);\n\n subscribers.forEach((subscriber) => subscriber());\n }\n\n function getPulseMethod(key: string) {\n return (...args: any[]) => {\n const currentState = deepCloneUnfreeze(localState);\n const pulse = pulses[key](currentState, ...args);\n\n if (pulse instanceof Promise) {\n return pulse\n .then(() => setState(currentState))\n .catch((error) => {\n console.error(\"Error in pulse:\", error);\n });\n }\n\n setState(currentState);\n };\n }\n\n const boundPulses: Record<string, Pulse<StateType>> = {};\n for (const key in pulses) {\n if (typeof pulses[key] !== \"function\") {\n throw new Error(`Pulse '${key}' must be a function`);\n }\n boundPulses[key] = getPulseMethod(key);\n }\n\n const pulsesProxy = new Proxy(boundPulses, {\n get: (pulses, prop: string) => {\n if (!(prop in pulses)) {\n throw new Error(`Pulse '${prop}' does not exist`);\n }\n return pulses[prop];\n }\n });\n\n function usePulseStore(): [ProxyState<StateType>, StorePulses<PulsesType>] {\n return [proxyState, pulsesProxy as StorePulses<PulsesType>];\n }\n\n syncState(localState);\n\n return usePulseStore;\n}\n\n// Creates a pulse store with an immutable state by default\nexport function createPulseStore<StateType extends State, PulsesType extends Pulses<StateType>>(\n initialState: StateType,\n pulses: PulsesType\n): () => [ProxyState<StateType>, StorePulses<PulsesType>] {\n return createStore(initialState, pulses, true);\n}\n\n// Creates a mutable store, useful for performance, but not recommended\nexport function createMutableStore<StateType extends State, PulsesType extends Pulses<StateType>>(\n initialState: StateType,\n pulses: PulsesType\n): () => [ProxyState<StateType>, StorePulses<PulsesType>] {\n console.warn(\n \"Warning: You are working with a mutable state. This can lead to unpredictable behavior. All state changes made outside of a pulse will not trigger a re-render.\"\n );\n return createStore(initialState, pulses, false);\n}\n\n// Creates an effect\nexport function createEffect(effect: Function) {\n const runEffect = () => {\n try {\n effectStack.push(runEffect);\n effect();\n } finally {\n effectStack.pop();\n }\n };\n\n runEffect();\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,sBAA0D;AAC1D,mBAA0D;AAqB1D,IAAM,cAA0B,CAAC;AAUjC,SAAS,YACP,cACA,QACA,YAAY,OAC4C;AACxD,QAAM,cAAc,oBAAI,IAAc;AACtC,QAAM,iBAAiB,oBAAI,QAAe;AAG1C,QAAM,cACH,OAAO,iBAAiB,aAAa,aAAa,IAAI,iBAAkB,CAAC;AAE5E,WAAS,YAAY;AACnB,QAAI,WAAW;AACb,YAAM,IAAI,MAAM,8CAA8C;AAAA,IAChE;AAAA,EACF;AAGA,QAAM,aAAa,IAAI,MAAM,YAAY;AAAA,IACvC,KAAK,CAAC,OAAO,SAAiB;AAC5B,YAAM,gBAAgB,YAAY,YAAY,SAAS,CAAC;AACxD,UAAI,iBAAiB,CAAC,YAAY,IAAI,aAAa,GAAG;AACpD,oBAAY,IAAI,aAAa;AAAA,MAC/B;AAEA,YAAM,eAAe,wBAAQ;AAC7B,UAAI,gBAAgB,CAAC,eAAe,IAAI,YAAY,GAAG;AACrD,cAAM,eAAe,MAAM;AACzB,cAAI,CAAC,aAAa,KAAK;AACrB,wBAAY,OAAO,YAAY;AAC/B,2BAAe,OAAO,YAAY;AAClC;AAAA,UACF;AAEA,2CAAY,YAAY;AAAA,QAC1B;AAEA,oBAAY,IAAI,YAAY;AAC5B,uBAAe,IAAI,YAAY;AAAA,MACjC;AAEA,aAAO,MAAM,IAAI;AAAA,IACnB;AAAA;AAAA,IAEA,KAAK,CAAC,OAAO,MAAc,UAAe;AACxC,gBAAU;AACV,cAAQ,IAAI,OAAO,MAAM,KAAK;AAC9B,aAAO;AAAA,IACT;AAAA;AAAA,IAEA,gBAAgB,CAAC,OAAO,SAAiB;AACvC,gBAAU;AACV,cAAQ,eAAe,OAAO,IAAI;AAClC,aAAO;AAAA,IACT;AAAA,EACF,CAAC;AAED,WAAS,UAAU,UAAqB;AACtC,eAAW,OAAO,UAAU;AAC1B,iBAAW,GAAG,IAAI,gBAAY,yBAAW,SAAS,GAAG,CAAC,IAAI,SAAS,GAAG;AAAA,IACxE;AAEA,eAAW,OAAO,YAAY;AAC5B,UAAI,EAAE,OAAO,WAAW;AACtB,gBAAQ,eAAe,YAAY,GAAG;AAAA,MACxC;AAAA,IACF;AAAA,EACF;AAEA,WAAS,SAAS,UAAqB;AACrC,QAAI,KAAC,yBAAW,YAAY,QAAQ,GAAG;AACrC;AAAA,IACF;AAEA,cAAU,QAAQ;AAElB,gBAAY,QAAQ,CAAC,eAAe,WAAW,CAAC;AAAA,EAClD;AAEA,WAAS,eAAe,KAAa;AACnC,WAAO,IAAI,SAAgB;AACzB,YAAM,mBAAe,gCAAkB,UAAU;AACjD,YAAM,QAAQ,OAAO,GAAG,EAAE,cAAc,GAAG,IAAI;AAE/C,UAAI,iBAAiB,SAAS;AAC5B,eAAO,MACJ,KAAK,MAAM,SAAS,YAAY,CAAC,EACjC,MAAM,CAAC,UAAU;AAChB,kBAAQ,MAAM,mBAAmB,KAAK;AAAA,QACxC,CAAC;AAAA,MACL;AAEA,eAAS,YAAY;AAAA,IACvB;AAAA,EACF;AAEA,QAAM,cAAgD,CAAC;AACvD,aAAW,OAAO,QAAQ;AACxB,QAAI,OAAO,OAAO,GAAG,MAAM,YAAY;AACrC,YAAM,IAAI,MAAM,UAAU,GAAG,sBAAsB;AAAA,IACrD;AACA,gBAAY,GAAG,IAAI,eAAe,GAAG;AAAA,EACvC;AAEA,QAAM,cAAc,IAAI,MAAM,aAAa;AAAA,IACzC,KAAK,CAACA,SAAQ,SAAiB;AAC7B,UAAI,EAAE,QAAQA,UAAS;AACrB,cAAM,IAAI,MAAM,UAAU,IAAI,kBAAkB;AAAA,MAClD;AACA,aAAOA,QAAO,IAAI;AAAA,IACpB;AAAA,EACF,CAAC;AAED,WAAS,gBAAkE;AACzE,WAAO,CAAC,YAAY,WAAsC;AAAA,EAC5D;AAEA,YAAU,UAAU;AAEpB,SAAO;AACT;AAGO,SAAS,iBACd,cACA,QACwD;AACxD,SAAO,YAAY,cAAc,QAAQ,IAAI;AAC/C;AAGO,SAAS,mBACd,cACA,QACwD;AACxD,UAAQ;AAAA,IACN;AAAA,EACF;AACA,SAAO,YAAY,cAAc,QAAQ,KAAK;AAChD;AAGO,SAAS,aAAa,QAAkB;AAC7C,QAAM,YAAY,MAAM;AACtB,QAAI;AACF,kBAAY,KAAK,SAAS;AAC1B,aAAO;AAAA,IACT,UAAE;AACA,kBAAY,IAAI;AAAA,IAClB;AAAA,EACF;AAEA,YAAU;AACZ;",
|
|
6
|
+
"names": ["pulses"]
|
|
7
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
(()=>{"use strict";var e=Object.defineProperty,t=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,n=Object.prototype.hasOwnProperty,o={};((t,r)=>{for(var n in r)e(t,n,{get:r[n],enumerable:!0})})(o,{createEffect:()=>p,createMutableStore:()=>d,createPulseStore:()=>f});var a,i=(a=o,((o,a,i,u)=>{if(a&&"object"==typeof a||"function"==typeof a)for(let c of r(a))n.call(o,c)||c===i||e(o,c,{get:()=>a[c],enumerable:!(u=t(a,c))||u.enumerable});return o})(e({},"__esModule",{value:!0}),a)),u=require("valyrian.js"),c=require("valyrian.js/utils"),s=[];function l(e,t,r=!1){const n=new Set,o=new WeakSet,a=("function"==typeof e?e():e)||{};function i(){if(r)throw new Error("You need to call a pulse to modify the state")}const l=new Proxy(a,{get:(e,t)=>{const r=s[s.length-1];r&&!n.has(r)&&n.add(r);const a=u.current.vnode;if(a&&!o.has(a)){const e=()=>{if(!a.dom)return n.delete(e),void o.delete(a);(0,u.updateVnode)(a)};n.add(e),o.add(a)}return e[t]},set:(e,t,r)=>(i(),Reflect.set(e,t,r),!0),deleteProperty:(e,t)=>(i(),Reflect.deleteProperty(e,t),!0)});function f(e){for(const t in e)a[t]=r?(0,c.deepFreeze)(e[t]):e[t];for(const t in a)t in e||Reflect.deleteProperty(a,t)}function d(e){(0,c.hasChanged)(a,e)&&(f(e),n.forEach(e=>e()))}function p(e){return(...r)=>{const n=(0,c.deepCloneUnfreeze)(a),o=t[e](n,...r);if(o instanceof Promise)return o.then(()=>d(n)).catch(e=>{console.error("Error in pulse:",e)});d(n)}}const y={};for(const e in t){if("function"!=typeof t[e])throw new Error(`Pulse '${e}' must be a function`);y[e]=p(e)}const h=new Proxy(y,{get:(e,t)=>{if(!(t in e))throw new Error(`Pulse '${t}' does not exist`);return e[t]}});return f(a),function(){return[l,h]}}function f(e,t){return l(e,t,!0)}function d(e,t){return console.warn("Warning: You are working with a mutable state. This can lead to unpredictable behavior. All state changes made outside of a pulse will not trigger a re-render."),l(e,t,!1)}function p(e){const t=()=>{try{s.push(t),e()}finally{s.pop()}};t()}"undefined"!=typeof module?module.exports=i:self.ValyrianPulseStore=i})();//# sourceMappingURL=index.min.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJwdWxzZV9zdG9yZV9leHBvcnRzIiwiX19leHBvcnQiLCJjcmVhdGVFZmZlY3QiLCJjcmVhdGVNdXRhYmxlU3RvcmUiLCJjcmVhdGVQdWxzZVN0b3JlIiwiX19FWFBPUlRTX18iLCJpbXBvcnRfdmFseXJpYW4iLCJyZXF1aXJlIiwiaW1wb3J0X3V0aWxzIiwiZWZmZWN0U3RhY2siLCJjcmVhdGVTdG9yZSIsImluaXRpYWxTdGF0ZSIsInB1bHNlcyIsImltbXV0YWJsZSIsInN1YnNjcmliZXJzIiwiU2V0Iiwidm5vZGVzVG9VcGRhdGUiLCJXZWFrU2V0IiwibG9jYWxTdGF0ZSIsImlzTXV0YWJsZSIsIkVycm9yIiwicHJveHlTdGF0ZSIsIlByb3h5IiwiZ2V0Iiwic3RhdGUiLCJwcm9wIiwiY3VycmVudEVmZmVjdCIsImxlbmd0aCIsImhhcyIsImFkZCIsImN1cnJlbnRWbm9kZSIsImN1cnJlbnQiLCJ2bm9kZSIsInN1YnNjcmlwdGlvbiIsImRvbSIsImRlbGV0ZSIsInVwZGF0ZVZub2RlIiwic2V0IiwidmFsdWUiLCJSZWZsZWN0IiwiZGVsZXRlUHJvcGVydHkiLCJzeW5jU3RhdGUiLCJuZXdTdGF0ZSIsImtleSIsImRlZXBGcmVlemUiLCJzZXRTdGF0ZSIsImhhc0NoYW5nZWQiLCJmb3JFYWNoIiwic3Vic2NyaWJlciIsImdldFB1bHNlTWV0aG9kIiwiYXJncyIsImN1cnJlbnRTdGF0ZSIsImRlZXBDbG9uZVVuZnJlZXplIiwicHVsc2UiLCJQcm9taXNlIiwidGhlbiIsImNhdGNoIiwiZXJyb3IiLCJjb25zb2xlIiwiYm91bmRQdWxzZXMiLCJwdWxzZXNQcm94eSIsIndhcm4iLCJlZmZlY3QiLCJydW5FZmZlY3QiLCJwdXNoIiwicG9wIl0sInNvdXJjZXMiOlsiLi4vLi4vbGliL3B1bHNlLXN0b3JlL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vLWNvbnNvbGUgKi9cbmltcG9ydCB7IHVwZGF0ZVZub2RlLCBWbm9kZSwgVm5vZGVXaXRoRG9tLCBjdXJyZW50IH0gZnJvbSBcInZhbHlyaWFuLmpzXCI7XG5pbXBvcnQgeyBkZWVwQ2xvbmVVbmZyZWV6ZSwgZGVlcEZyZWV6ZSwgaGFzQ2hhbmdlZCB9IGZyb20gXCJ2YWx5cmlhbi5qcy91dGlsc1wiO1xuXG50eXBlIFN0YXRlID0gUmVjb3JkPHN0cmluZywgYW55PjtcblxuLy8gQW4gYWN0aW9uIG9yIHB1bHNlIHR5cGUgZGVmaW5pdGlvblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG5leHBvcnQgdHlwZSBQdWxzZTxTdGF0ZVR5cGU+ID0gKHN0YXRlOiBTdGF0ZVR5cGUsIC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcblxuLy8gQSBjb2xsZWN0aW9uIG9mIHB1bHNlc1xuZXhwb3J0IHR5cGUgUHVsc2VzPFN0YXRlVHlwZT4gPSB7XG4gIFtrZXk6IHN0cmluZ106IFB1bHNlPFN0YXRlVHlwZT47XG59O1xuXG4vLyBBIHByb3h5IHN0YXRlXG4vLyBUaGlzIGlzIGEgc3RhdGUgdGhhdCBpcyBwcm94aWVkIHRvIGF1dG9tYXRpY2FsbHkgc3Vic2NyaWJlIHRvIGNoYW5nZXNcbi8vIEFuZCBpcyB1c2VkIGludGVybmFsbHkgdG8gdXBkYXRlIHRoZSB2bm9kZSB3aGVuIHRoZSBzdGF0ZSBjaGFuZ2VzXG50eXBlIFByb3h5U3RhdGU8U3RhdGVUeXBlPiA9IFN0YXRlVHlwZSAmIHtcbiAgW2tleTogc3RyaW5nXTogYW55O1xufTtcblxuLy8gVGhlIGVmZmVjdCBzdGFja1xuY29uc3QgZWZmZWN0U3RhY2s6IEZ1bmN0aW9uW10gPSBbXTtcblxudHlwZSBTdG9yZVB1bHNlczxQdWxzZXNUeXBlPiA9IHtcbiAgW0sgaW4ga2V5b2YgUHVsc2VzVHlwZV06IFB1bHNlc1R5cGVbS10gZXh0ZW5kcyAoc3RhdGU6IGFueSwgLi4uYXJnczogaW5mZXIgQXJncykgPT4gaW5mZXIgUlxuICAgID8gKC4uLmFyZ3M6IEFyZ3MpID0+IFJcbiAgICA6IG5ldmVyO1xufTtcblxuLy8gQ3JlYXRlcyB0aGUgc3RvcmVcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBzb25hcmpzL2NvZ25pdGl2ZS1jb21wbGV4aXR5XG5mdW5jdGlvbiBjcmVhdGVTdG9yZTxTdGF0ZVR5cGUgZXh0ZW5kcyBTdGF0ZSwgUHVsc2VzVHlwZSBleHRlbmRzIFB1bHNlczxTdGF0ZVR5cGU+PihcbiAgaW5pdGlhbFN0YXRlOiBTdGF0ZVR5cGUgfCAoKCkgPT4gU3RhdGVUeXBlKSB8IG51bGwsXG4gIHB1bHNlczogUHVsc2VzVHlwZSxcbiAgaW1tdXRhYmxlID0gZmFsc2Vcbik6ICgpID0+IFtQcm94eVN0YXRlPFN0YXRlVHlwZT4sIFN0b3JlUHVsc2VzPFB1bHNlc1R5cGU+XSB7XG4gIGNvbnN0IHN1YnNjcmliZXJzID0gbmV3IFNldDxGdW5jdGlvbj4oKTtcbiAgY29uc3Qgdm5vZGVzVG9VcGRhdGUgPSBuZXcgV2Vha1NldDxWbm9kZT4oKTtcblxuICAvLyBJbml0aWFsaXplIHRoZSBsb2NhbFN0YXRlIGZvciB0aGlzIHN0b3JlXG4gIGNvbnN0IGxvY2FsU3RhdGU6IFN0YXRlVHlwZSA9XG4gICAgKHR5cGVvZiBpbml0aWFsU3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IGluaXRpYWxTdGF0ZSgpIDogaW5pdGlhbFN0YXRlKSB8fCAoe30gYXMgU3RhdGVUeXBlKTtcblxuICBmdW5jdGlvbiBpc011dGFibGUoKSB7XG4gICAgaWYgKGltbXV0YWJsZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiWW91IG5lZWQgdG8gY2FsbCBhIHB1bHNlIHRvIG1vZGlmeSB0aGUgc3RhdGVcIik7XG4gICAgfVxuICB9XG5cbiAgLy8gV2UgY3JlYXRlIGEgcHJveHkgZm9yIHRoZSBzdGF0ZVxuICBjb25zdCBwcm94eVN0YXRlID0gbmV3IFByb3h5KGxvY2FsU3RhdGUsIHtcbiAgICBnZXQ6IChzdGF0ZSwgcHJvcDogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBjdXJyZW50RWZmZWN0ID0gZWZmZWN0U3RhY2tbZWZmZWN0U3RhY2subGVuZ3RoIC0gMV07XG4gICAgICBpZiAoY3VycmVudEVmZmVjdCAmJiAhc3Vic2NyaWJlcnMuaGFzKGN1cnJlbnRFZmZlY3QpKSB7XG4gICAgICAgIHN1YnNjcmliZXJzLmFkZChjdXJyZW50RWZmZWN0KTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY3VycmVudFZub2RlID0gY3VycmVudC52bm9kZSBhcyBWbm9kZVdpdGhEb207XG4gICAgICBpZiAoY3VycmVudFZub2RlICYmICF2bm9kZXNUb1VwZGF0ZS5oYXMoY3VycmVudFZub2RlKSkge1xuICAgICAgICBjb25zdCBzdWJzY3JpcHRpb24gPSAoKSA9PiB7XG4gICAgICAgICAgaWYgKCFjdXJyZW50Vm5vZGUuZG9tKSB7XG4gICAgICAgICAgICBzdWJzY3JpYmVycy5kZWxldGUoc3Vic2NyaXB0aW9uKTtcbiAgICAgICAgICAgIHZub2Rlc1RvVXBkYXRlLmRlbGV0ZShjdXJyZW50Vm5vZGUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHVwZGF0ZVZub2RlKGN1cnJlbnRWbm9kZSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgc3Vic2NyaWJlcnMuYWRkKHN1YnNjcmlwdGlvbik7XG4gICAgICAgIHZub2Rlc1RvVXBkYXRlLmFkZChjdXJyZW50Vm5vZGUpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc3RhdGVbcHJvcF07XG4gICAgfSxcbiAgICAvLyBJZiB0aGUgdXNlciB0cmllcyB0byBzZXQgZGlyZWN0bHkgaXQgd2lsbCB0aHJvdyBhbiBlcnJvclxuICAgIHNldDogKHN0YXRlLCBwcm9wOiBzdHJpbmcsIHZhbHVlOiBhbnkpID0+IHtcbiAgICAgIGlzTXV0YWJsZSgpO1xuICAgICAgUmVmbGVjdC5zZXQoc3RhdGUsIHByb3AsIHZhbHVlKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG4gICAgLy8gSWYgdGhlIHVzZXIgdHJpZXMgdG8gZGVsZXRlIGRpcmVjdGx5IGl0IHdpbGwgdGhyb3cgYW4gZXJyb3JcbiAgICBkZWxldGVQcm9wZXJ0eTogKHN0YXRlLCBwcm9wOiBzdHJpbmcpID0+IHtcbiAgICAgIGlzTXV0YWJsZSgpO1xuICAgICAgUmVmbGVjdC5kZWxldGVQcm9wZXJ0eShzdGF0ZSwgcHJvcCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0pO1xuXG4gIGZ1bmN0aW9uIHN5bmNTdGF0ZShuZXdTdGF0ZTogU3RhdGVUeXBlKSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gbmV3U3RhdGUpIHtcbiAgICAgIGxvY2FsU3RhdGVba2V5XSA9IGltbXV0YWJsZSA/IGRlZXBGcmVlemUobmV3U3RhdGVba2V5XSkgOiBuZXdTdGF0ZVtrZXldO1xuICAgIH1cblxuICAgIGZvciAoY29uc3Qga2V5IGluIGxvY2FsU3RhdGUpIHtcbiAgICAgIGlmICghKGtleSBpbiBuZXdTdGF0ZSkpIHtcbiAgICAgICAgUmVmbGVjdC5kZWxldGVQcm9wZXJ0eShsb2NhbFN0YXRlLCBrZXkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHNldFN0YXRlKG5ld1N0YXRlOiBTdGF0ZVR5cGUpIHtcbiAgICBpZiAoIWhhc0NoYW5nZWQobG9jYWxTdGF0ZSwgbmV3U3RhdGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3luY1N0YXRlKG5ld1N0YXRlKTtcblxuICAgIHN1YnNjcmliZXJzLmZvckVhY2goKHN1YnNjcmliZXIpID0+IHN1YnNjcmliZXIoKSk7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRQdWxzZU1ldGhvZChrZXk6IHN0cmluZykge1xuICAgIHJldHVybiAoLi4uYXJnczogYW55W10pID0+IHtcbiAgICAgIGNvbnN0IGN1cnJlbnRTdGF0ZSA9IGRlZXBDbG9uZVVuZnJlZXplKGxvY2FsU3RhdGUpO1xuICAgICAgY29uc3QgcHVsc2UgPSBwdWxzZXNba2V5XShjdXJyZW50U3RhdGUsIC4uLmFyZ3MpO1xuXG4gICAgICBpZiAocHVsc2UgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgIHJldHVybiBwdWxzZVxuICAgICAgICAgIC50aGVuKCgpID0+IHNldFN0YXRlKGN1cnJlbnRTdGF0ZSkpXG4gICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIGluIHB1bHNlOlwiLCBlcnJvcik7XG4gICAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHNldFN0YXRlKGN1cnJlbnRTdGF0ZSk7XG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IGJvdW5kUHVsc2VzOiBSZWNvcmQ8c3RyaW5nLCBQdWxzZTxTdGF0ZVR5cGU+PiA9IHt9O1xuICBmb3IgKGNvbnN0IGtleSBpbiBwdWxzZXMpIHtcbiAgICBpZiAodHlwZW9mIHB1bHNlc1trZXldICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUHVsc2UgJyR7a2V5fScgbXVzdCBiZSBhIGZ1bmN0aW9uYCk7XG4gICAgfVxuICAgIGJvdW5kUHVsc2VzW2tleV0gPSBnZXRQdWxzZU1ldGhvZChrZXkpO1xuICB9XG5cbiAgY29uc3QgcHVsc2VzUHJveHkgPSBuZXcgUHJveHkoYm91bmRQdWxzZXMsIHtcbiAgICBnZXQ6IChwdWxzZXMsIHByb3A6IHN0cmluZykgPT4ge1xuICAgICAgaWYgKCEocHJvcCBpbiBwdWxzZXMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgUHVsc2UgJyR7cHJvcH0nIGRvZXMgbm90IGV4aXN0YCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcHVsc2VzW3Byb3BdO1xuICAgIH1cbiAgfSk7XG5cbiAgZnVuY3Rpb24gdXNlUHVsc2VTdG9yZSgpOiBbUHJveHlTdGF0ZTxTdGF0ZVR5cGU+LCBTdG9yZVB1bHNlczxQdWxzZXNUeXBlPl0ge1xuICAgIHJldHVybiBbcHJveHlTdGF0ZSwgcHVsc2VzUHJveHkgYXMgU3RvcmVQdWxzZXM8UHVsc2VzVHlwZT5dO1xuICB9XG5cbiAgc3luY1N0YXRlKGxvY2FsU3RhdGUpO1xuXG4gIHJldHVybiB1c2VQdWxzZVN0b3JlO1xufVxuXG4vLyBDcmVhdGVzIGEgcHVsc2Ugc3RvcmUgd2l0aCBhbiBpbW11dGFibGUgc3RhdGUgYnkgZGVmYXVsdFxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVB1bHNlU3RvcmU8U3RhdGVUeXBlIGV4dGVuZHMgU3RhdGUsIFB1bHNlc1R5cGUgZXh0ZW5kcyBQdWxzZXM8U3RhdGVUeXBlPj4oXG4gIGluaXRpYWxTdGF0ZTogU3RhdGVUeXBlLFxuICBwdWxzZXM6IFB1bHNlc1R5cGVcbik6ICgpID0+IFtQcm94eVN0YXRlPFN0YXRlVHlwZT4sIFN0b3JlUHVsc2VzPFB1bHNlc1R5cGU+XSB7XG4gIHJldHVybiBjcmVhdGVTdG9yZShpbml0aWFsU3RhdGUsIHB1bHNlcywgdHJ1ZSk7XG59XG5cbi8vIENyZWF0ZXMgYSBtdXRhYmxlIHN0b3JlLCB1c2VmdWwgZm9yIHBlcmZvcm1hbmNlLCBidXQgbm90IHJlY29tbWVuZGVkXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTXV0YWJsZVN0b3JlPFN0YXRlVHlwZSBleHRlbmRzIFN0YXRlLCBQdWxzZXNUeXBlIGV4dGVuZHMgUHVsc2VzPFN0YXRlVHlwZT4+KFxuICBpbml0aWFsU3RhdGU6IFN0YXRlVHlwZSxcbiAgcHVsc2VzOiBQdWxzZXNUeXBlXG4pOiAoKSA9PiBbUHJveHlTdGF0ZTxTdGF0ZVR5cGU+LCBTdG9yZVB1bHNlczxQdWxzZXNUeXBlPl0ge1xuICBjb25zb2xlLndhcm4oXG4gICAgXCJXYXJuaW5nOiBZb3UgYXJlIHdvcmtpbmcgd2l0aCBhIG11dGFibGUgc3RhdGUuIFRoaXMgY2FuIGxlYWQgdG8gdW5wcmVkaWN0YWJsZSBiZWhhdmlvci4gQWxsIHN0YXRlIGNoYW5nZXMgbWFkZSBvdXRzaWRlIG9mIGEgcHVsc2Ugd2lsbCBub3QgdHJpZ2dlciBhIHJlLXJlbmRlci5cIlxuICApO1xuICByZXR1cm4gY3JlYXRlU3RvcmUoaW5pdGlhbFN0YXRlLCBwdWxzZXMsIGZhbHNlKTtcbn1cblxuLy8gQ3JlYXRlcyBhbiBlZmZlY3RcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFZmZlY3QoZWZmZWN0OiBGdW5jdGlvbikge1xuICBjb25zdCBydW5FZmZlY3QgPSAoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGVmZmVjdFN0YWNrLnB1c2gocnVuRWZmZWN0KTtcbiAgICAgIGVmZmVjdCgpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBlZmZlY3RTdGFjay5wb3AoKTtcbiAgICB9XG4gIH07XG5cbiAgcnVuRWZmZWN0KCk7XG59XG4iXSwibWFwcGluZ3MiOiJnSkFBQUEsRUFBQSxHLHlEQUFBQyxDQUFBRCxFQUFBLENBQUFFLGFBQUEsSUFBQUEsRUFBQUMsbUJBQUEsSUFBQUEsRUFBQUMsaUJBQUEsSUFBQUEsSUFBQSxJLEVBQUFDLEcsRUFBQUwsRSwwTUFDQU0sRUFBMERDLFFBQUEsZUFDMURDLEVBQTBERCxRQUFBLHFCQXFCcERFLEVBQTBCLEdBVWhDLFNBQVNDLEVBQ1BDLEVBQ0FDLEVBQ0FDLEdBQVksR0FFWixNQUFNQyxFQUFjLElBQUlDLElBQ2xCQyxFQUFpQixJQUFJQyxRQUdyQkMsR0FDcUIsbUJBQWpCUCxFQUE4QkEsSUFBaUJBLElBQWtCLENBQUMsRUFFNUUsU0FBU1EsSUFDUCxHQUFJTixFQUNGLE1BQU0sSUFBSU8sTUFBTSwrQ0FFcEIsQ0FHQSxNQUFNQyxFQUFhLElBQUlDLE1BQU1KLEVBQVksQ0FDdkNLLElBQUssQ0FBQ0MsRUFBT0MsS0FDWCxNQUFNQyxFQUFnQmpCLEVBQVlBLEVBQVlrQixPQUFTLEdBQ25ERCxJQUFrQlosRUFBWWMsSUFBSUYsSUFDcENaLEVBQVllLElBQUlILEdBR2xCLE1BQU1JLEVBQWV4QixFQUFBeUIsUUFBUUMsTUFDN0IsR0FBSUYsSUFBaUJkLEVBQWVZLElBQUlFLEdBQWUsQ0FDckQsTUFBTUcsRUFBZSxLQUNuQixJQUFLSCxFQUFhSSxJQUdoQixPQUZBcEIsRUFBWXFCLE9BQU9GLFFBQ25CakIsRUFBZW1CLE9BQU9MLElBSXhCLEVBQUF4QixFQUFBOEIsYUFBWU4sRUFBWSxFQUcxQmhCLEVBQVllLElBQUlJLEdBQ2hCakIsRUFBZWEsSUFBSUMsRUFDckIsQ0FFQSxPQUFPTixFQUFNQyxFQUFJLEVBR25CWSxJQUFLLENBQUNiLEVBQU9DLEVBQWNhLEtBQ3pCbkIsSUFDQW9CLFFBQVFGLElBQUliLEVBQU9DLEVBQU1hLElBQ2xCLEdBR1RFLGVBQWdCLENBQUNoQixFQUFPQyxLQUN0Qk4sSUFDQW9CLFFBQVFDLGVBQWVoQixFQUFPQyxJQUN2QixLQUlYLFNBQVNnQixFQUFVQyxHQUNqQixVQUFXQyxLQUFPRCxFQUNoQnhCLEVBQVd5QixHQUFPOUIsR0FBQSxFQUFZTCxFQUFBb0MsWUFBV0YsRUFBU0MsSUFBUUQsRUFBU0MsR0FHckUsVUFBV0EsS0FBT3pCLEVBQ1Z5QixLQUFPRCxHQUNYSCxRQUFRQyxlQUFldEIsRUFBWXlCLEVBR3pDLENBRUEsU0FBU0UsRUFBU0gsSUFDWixFQUFDbEMsRUFBQXNDLFlBQVc1QixFQUFZd0IsS0FJNUJELEVBQVVDLEdBRVY1QixFQUFZaUMsUUFBU0MsR0FBZUEsS0FDdEMsQ0FFQSxTQUFTQyxFQUFlTixHQUN0QixNQUFPLElBQUlPLEtBQ1QsTUFBTUMsR0FBQSxFQUFlM0MsRUFBQTRDLG1CQUFrQmxDLEdBQ2pDbUMsRUFBUXpDLEVBQU8rQixHQUFLUSxLQUFpQkQsR0FFM0MsR0FBSUcsYUFBaUJDLFFBQ25CLE9BQU9ELEVBQ0pFLEtBQUssSUFBTVYsRUFBU00sSUFDcEJLLE1BQU9DLElBQ05DLFFBQVFELE1BQU0sa0JBQW1CQSxFQUFLLEdBSTVDWixFQUFTTSxFQUFZLENBRXpCLENBRUEsTUFBTVEsRUFBZ0QsQ0FBQyxFQUN2RCxVQUFXaEIsS0FBTy9CLEVBQVEsQ0FDeEIsR0FBMkIsbUJBQWhCQSxFQUFPK0IsR0FDaEIsTUFBTSxJQUFJdkIsTUFBTSxVQUFVdUIseUJBRTVCZ0IsRUFBWWhCLEdBQU9NLEVBQWVOLEVBQ3BDLENBRUEsTUFBTWlCLEVBQWMsSUFBSXRDLE1BQU1xQyxFQUFhLENBQ3pDcEMsSUFBSyxDQUFDWCxFQUFRYSxLQUNaLEtBQU1BLEtBQVFiLEdBQ1osTUFBTSxJQUFJUSxNQUFNLFVBQVVLLHFCQUU1QixPQUFPYixFQUFPYSxFQUFJLElBVXRCLE9BRkFnQixFQUFVdkIsR0FKVixXQUNFLE1BQU8sQ0FBQ0csRUFBWXVDLEVBQ3RCLENBS0YsQ0FHTyxTQUFTeEQsRUFDZE8sRUFDQUMsR0FFQSxPQUFPRixFQUFZQyxFQUFjQyxHQUFRLEVBQzNDLENBR08sU0FBU1QsRUFDZFEsRUFDQUMsR0FLQSxPQUhBOEMsUUFBUUcsS0FDTixtS0FFS25ELEVBQVlDLEVBQWNDLEdBQVEsRUFDM0MsQ0FHTyxTQUFTVixFQUFhNEQsR0FDM0IsTUFBTUMsRUFBWSxLQUNoQixJQUNFdEQsRUFBWXVELEtBQUtELEdBQ2pCRCxHQUNGLFNBQ0VyRCxFQUFZd0QsS0FDZCxHQUdGRixHQUNGLEMifQ==
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
// lib/pulse-store/index.ts
|
|
2
|
+
import { updateVnode, current } from "valyrian.js";
|
|
3
|
+
import { deepCloneUnfreeze, deepFreeze, hasChanged } from "valyrian.js/utils";
|
|
4
|
+
var effectStack = [];
|
|
5
|
+
function createStore(initialState, pulses, immutable = false) {
|
|
6
|
+
const subscribers = /* @__PURE__ */ new Set();
|
|
7
|
+
const vnodesToUpdate = /* @__PURE__ */ new WeakSet();
|
|
8
|
+
const localState = (typeof initialState === "function" ? initialState() : initialState) || {};
|
|
9
|
+
function isMutable() {
|
|
10
|
+
if (immutable) {
|
|
11
|
+
throw new Error("You need to call a pulse to modify the state");
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
const proxyState = new Proxy(localState, {
|
|
15
|
+
get: (state, prop) => {
|
|
16
|
+
const currentEffect = effectStack[effectStack.length - 1];
|
|
17
|
+
if (currentEffect && !subscribers.has(currentEffect)) {
|
|
18
|
+
subscribers.add(currentEffect);
|
|
19
|
+
}
|
|
20
|
+
const currentVnode = current.vnode;
|
|
21
|
+
if (currentVnode && !vnodesToUpdate.has(currentVnode)) {
|
|
22
|
+
const subscription = () => {
|
|
23
|
+
if (!currentVnode.dom) {
|
|
24
|
+
subscribers.delete(subscription);
|
|
25
|
+
vnodesToUpdate.delete(currentVnode);
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
updateVnode(currentVnode);
|
|
29
|
+
};
|
|
30
|
+
subscribers.add(subscription);
|
|
31
|
+
vnodesToUpdate.add(currentVnode);
|
|
32
|
+
}
|
|
33
|
+
return state[prop];
|
|
34
|
+
},
|
|
35
|
+
// If the user tries to set directly it will throw an error
|
|
36
|
+
set: (state, prop, value) => {
|
|
37
|
+
isMutable();
|
|
38
|
+
Reflect.set(state, prop, value);
|
|
39
|
+
return true;
|
|
40
|
+
},
|
|
41
|
+
// If the user tries to delete directly it will throw an error
|
|
42
|
+
deleteProperty: (state, prop) => {
|
|
43
|
+
isMutable();
|
|
44
|
+
Reflect.deleteProperty(state, prop);
|
|
45
|
+
return true;
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
function syncState(newState) {
|
|
49
|
+
for (const key in newState) {
|
|
50
|
+
localState[key] = immutable ? deepFreeze(newState[key]) : newState[key];
|
|
51
|
+
}
|
|
52
|
+
for (const key in localState) {
|
|
53
|
+
if (!(key in newState)) {
|
|
54
|
+
Reflect.deleteProperty(localState, key);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
function setState(newState) {
|
|
59
|
+
if (!hasChanged(localState, newState)) {
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
syncState(newState);
|
|
63
|
+
subscribers.forEach((subscriber) => subscriber());
|
|
64
|
+
}
|
|
65
|
+
function getPulseMethod(key) {
|
|
66
|
+
return (...args) => {
|
|
67
|
+
const currentState = deepCloneUnfreeze(localState);
|
|
68
|
+
const pulse = pulses[key](currentState, ...args);
|
|
69
|
+
if (pulse instanceof Promise) {
|
|
70
|
+
return pulse.then(() => setState(currentState)).catch((error) => {
|
|
71
|
+
console.error("Error in pulse:", error);
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
setState(currentState);
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
const boundPulses = {};
|
|
78
|
+
for (const key in pulses) {
|
|
79
|
+
if (typeof pulses[key] !== "function") {
|
|
80
|
+
throw new Error(`Pulse '${key}' must be a function`);
|
|
81
|
+
}
|
|
82
|
+
boundPulses[key] = getPulseMethod(key);
|
|
83
|
+
}
|
|
84
|
+
const pulsesProxy = new Proxy(boundPulses, {
|
|
85
|
+
get: (pulses2, prop) => {
|
|
86
|
+
if (!(prop in pulses2)) {
|
|
87
|
+
throw new Error(`Pulse '${prop}' does not exist`);
|
|
88
|
+
}
|
|
89
|
+
return pulses2[prop];
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
function usePulseStore() {
|
|
93
|
+
return [proxyState, pulsesProxy];
|
|
94
|
+
}
|
|
95
|
+
syncState(localState);
|
|
96
|
+
return usePulseStore;
|
|
97
|
+
}
|
|
98
|
+
function createPulseStore(initialState, pulses) {
|
|
99
|
+
return createStore(initialState, pulses, true);
|
|
100
|
+
}
|
|
101
|
+
function createMutableStore(initialState, pulses) {
|
|
102
|
+
console.warn(
|
|
103
|
+
"Warning: You are working with a mutable state. This can lead to unpredictable behavior. All state changes made outside of a pulse will not trigger a re-render."
|
|
104
|
+
);
|
|
105
|
+
return createStore(initialState, pulses, false);
|
|
106
|
+
}
|
|
107
|
+
function createEffect(effect) {
|
|
108
|
+
const runEffect = () => {
|
|
109
|
+
try {
|
|
110
|
+
effectStack.push(runEffect);
|
|
111
|
+
effect();
|
|
112
|
+
} finally {
|
|
113
|
+
effectStack.pop();
|
|
114
|
+
}
|
|
115
|
+
};
|
|
116
|
+
runEffect();
|
|
117
|
+
}
|
|
118
|
+
export {
|
|
119
|
+
createEffect,
|
|
120
|
+
createMutableStore,
|
|
121
|
+
createPulseStore
|
|
122
|
+
};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../lib/pulse-store/index.ts"],
|
|
4
|
+
"sourcesContent": ["/* eslint-disable no-console */\nimport { updateVnode, Vnode, VnodeWithDom, current } from \"valyrian.js\";\nimport { deepCloneUnfreeze, deepFreeze, hasChanged } from \"valyrian.js/utils\";\n\ntype State = Record<string, any>;\n\n// An action or pulse type definition\n// eslint-disable-next-line no-unused-vars\nexport type Pulse<StateType> = (state: StateType, ...args: any[]) => void | Promise<void>;\n\n// A collection of pulses\nexport type Pulses<StateType> = {\n [key: string]: Pulse<StateType>;\n};\n\n// A proxy state\n// This is a state that is proxied to automatically subscribe to changes\n// And is used internally to update the vnode when the state changes\ntype ProxyState<StateType> = StateType & {\n [key: string]: any;\n};\n\n// The effect stack\nconst effectStack: Function[] = [];\n\ntype StorePulses<PulsesType> = {\n [K in keyof PulsesType]: PulsesType[K] extends (state: any, ...args: infer Args) => infer R\n ? (...args: Args) => R\n : never;\n};\n\n// Creates the store\n// eslint-disable-next-line sonarjs/cognitive-complexity\nfunction createStore<StateType extends State, PulsesType extends Pulses<StateType>>(\n initialState: StateType | (() => StateType) | null,\n pulses: PulsesType,\n immutable = false\n): () => [ProxyState<StateType>, StorePulses<PulsesType>] {\n const subscribers = new Set<Function>();\n const vnodesToUpdate = new WeakSet<Vnode>();\n\n // Initialize the localState for this store\n const localState: StateType =\n (typeof initialState === \"function\" ? initialState() : initialState) || ({} as StateType);\n\n function isMutable() {\n if (immutable) {\n throw new Error(\"You need to call a pulse to modify the state\");\n }\n }\n\n // We create a proxy for the state\n const proxyState = new Proxy(localState, {\n get: (state, prop: string) => {\n const currentEffect = effectStack[effectStack.length - 1];\n if (currentEffect && !subscribers.has(currentEffect)) {\n subscribers.add(currentEffect);\n }\n\n const currentVnode = current.vnode as VnodeWithDom;\n if (currentVnode && !vnodesToUpdate.has(currentVnode)) {\n const subscription = () => {\n if (!currentVnode.dom) {\n subscribers.delete(subscription);\n vnodesToUpdate.delete(currentVnode);\n return;\n }\n\n updateVnode(currentVnode);\n };\n\n subscribers.add(subscription);\n vnodesToUpdate.add(currentVnode);\n }\n\n return state[prop];\n },\n // If the user tries to set directly it will throw an error\n set: (state, prop: string, value: any) => {\n isMutable();\n Reflect.set(state, prop, value);\n return true;\n },\n // If the user tries to delete directly it will throw an error\n deleteProperty: (state, prop: string) => {\n isMutable();\n Reflect.deleteProperty(state, prop);\n return true;\n }\n });\n\n function syncState(newState: StateType) {\n for (const key in newState) {\n localState[key] = immutable ? deepFreeze(newState[key]) : newState[key];\n }\n\n for (const key in localState) {\n if (!(key in newState)) {\n Reflect.deleteProperty(localState, key);\n }\n }\n }\n\n function setState(newState: StateType) {\n if (!hasChanged(localState, newState)) {\n return;\n }\n\n syncState(newState);\n\n subscribers.forEach((subscriber) => subscriber());\n }\n\n function getPulseMethod(key: string) {\n return (...args: any[]) => {\n const currentState = deepCloneUnfreeze(localState);\n const pulse = pulses[key](currentState, ...args);\n\n if (pulse instanceof Promise) {\n return pulse\n .then(() => setState(currentState))\n .catch((error) => {\n console.error(\"Error in pulse:\", error);\n });\n }\n\n setState(currentState);\n };\n }\n\n const boundPulses: Record<string, Pulse<StateType>> = {};\n for (const key in pulses) {\n if (typeof pulses[key] !== \"function\") {\n throw new Error(`Pulse '${key}' must be a function`);\n }\n boundPulses[key] = getPulseMethod(key);\n }\n\n const pulsesProxy = new Proxy(boundPulses, {\n get: (pulses, prop: string) => {\n if (!(prop in pulses)) {\n throw new Error(`Pulse '${prop}' does not exist`);\n }\n return pulses[prop];\n }\n });\n\n function usePulseStore(): [ProxyState<StateType>, StorePulses<PulsesType>] {\n return [proxyState, pulsesProxy as StorePulses<PulsesType>];\n }\n\n syncState(localState);\n\n return usePulseStore;\n}\n\n// Creates a pulse store with an immutable state by default\nexport function createPulseStore<StateType extends State, PulsesType extends Pulses<StateType>>(\n initialState: StateType,\n pulses: PulsesType\n): () => [ProxyState<StateType>, StorePulses<PulsesType>] {\n return createStore(initialState, pulses, true);\n}\n\n// Creates a mutable store, useful for performance, but not recommended\nexport function createMutableStore<StateType extends State, PulsesType extends Pulses<StateType>>(\n initialState: StateType,\n pulses: PulsesType\n): () => [ProxyState<StateType>, StorePulses<PulsesType>] {\n console.warn(\n \"Warning: You are working with a mutable state. This can lead to unpredictable behavior. All state changes made outside of a pulse will not trigger a re-render.\"\n );\n return createStore(initialState, pulses, false);\n}\n\n// Creates an effect\nexport function createEffect(effect: Function) {\n const runEffect = () => {\n try {\n effectStack.push(runEffect);\n effect();\n } finally {\n effectStack.pop();\n }\n };\n\n runEffect();\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["pulses"]
|
|
7
|
+
}
|
package/dist/request/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
interface UrlOptions {
|
|
2
|
-
base
|
|
3
|
-
node
|
|
4
|
-
api
|
|
2
|
+
base?: string;
|
|
3
|
+
node?: string | null;
|
|
4
|
+
api?: string | null;
|
|
5
5
|
}
|
|
6
6
|
interface RequestOptions {
|
|
7
7
|
allowedMethods?: string[];
|
|
@@ -19,17 +19,17 @@ interface SendOptions extends RequestOptionsWithUrls, RequestInit {
|
|
|
19
19
|
resolveWithFullResponse?: boolean;
|
|
20
20
|
}
|
|
21
21
|
export interface RequestInterface {
|
|
22
|
-
(method: string, url: string, data?: Record<string, any
|
|
22
|
+
(method: string, url: string, data?: Record<string, any> | null, options?: Partial<SendOptions>): any | Response;
|
|
23
23
|
new: (baseUrl: string, options?: RequestOptions) => RequestInterface;
|
|
24
24
|
setOptions: (key: string, value: any) => void;
|
|
25
25
|
getOptions: (key?: string) => RequestOptions | void;
|
|
26
|
-
get: (url: string, data?: Record<string, any
|
|
27
|
-
post: (url: string, data?: Record<string, any
|
|
28
|
-
put: (url: string, data?: Record<string, any
|
|
29
|
-
patch: (url: string, data?: Record<string, any
|
|
30
|
-
delete: (url: string, data?: Record<string, any
|
|
31
|
-
head: (url: string, data?: Record<string, any
|
|
32
|
-
options: (url: string, data?: Record<string, any
|
|
26
|
+
get: (url: string, data?: Record<string, any> | null, options?: Record<string, any>) => any | Response;
|
|
27
|
+
post: (url: string, data?: Record<string, any> | null, options?: Record<string, any>) => any | Response;
|
|
28
|
+
put: (url: string, data?: Record<string, any> | null, options?: Record<string, any>) => any | Response;
|
|
29
|
+
patch: (url: string, data?: Record<string, any> | null, options?: Record<string, any>) => any | Response;
|
|
30
|
+
delete: (url: string, data?: Record<string, any> | null, options?: Record<string, any>) => any | Response;
|
|
31
|
+
head: (url: string, data?: Record<string, any> | null, options?: Record<string, any>) => any | Response;
|
|
32
|
+
options: (url: string, data?: Record<string, any> | null, options?: Record<string, any>) => any | Response;
|
|
33
33
|
[key: string | number | symbol]: any;
|
|
34
34
|
}
|
|
35
35
|
export declare const request: RequestInterface;
|