valyrian.js 7.2.11 → 8.0.0
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 +258 -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 +237 -0
- package/dist/flux-store/index.mjs.map +7 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +42 -75
- package/dist/hooks/index.js.map +2 -2
- package/dist/hooks/index.min.js +1 -0
- package/dist/hooks/index.min.js.map +1 -0
- package/dist/hooks/index.mjs +43 -76
- package/dist/hooks/index.mjs.map +2 -2
- package/dist/index.d.ts +52 -54
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +397 -328
- 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 +397 -328
- 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.map +1 -1
- package/dist/node/index.js +223 -86
- package/dist/node/index.js.map +4 -4
- package/dist/node/index.mjs +223 -86
- package/dist/node/index.mjs.map +4 -4
- package/dist/node/node.sw.js +152 -0
- 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 +9 -0
- package/dist/node/utils/tree-adapter.d.ts.map +1 -1
- package/dist/pulse-store/index.d.ts +13 -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.map +1 -1
- package/dist/request/index.js +68 -89
- 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 +68 -89
- package/dist/request/index.mjs.map +2 -2
- package/dist/router/index.d.ts +32 -31
- package/dist/router/index.d.ts.map +1 -1
- package/dist/router/index.js +256 -104
- 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 +256 -104
- 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 +301 -0
- package/lib/hooks/index.ts +52 -101
- package/lib/index.ts +479 -719
- package/lib/native-store/index.ts +106 -0
- package/lib/node/index.ts +5 -3
- package/lib/node/utils/icons.ts +5 -5
- package/lib/node/utils/inline.ts +17 -17
- package/lib/node/utils/node.sw.js +152 -0
- package/lib/node/utils/session-storage.ts +117 -0
- package/lib/node/utils/sw.ts +35 -11
- package/lib/node/utils/tree-adapter.ts +99 -52
- package/lib/pulse-store/index.ts +181 -0
- package/lib/request/index.ts +86 -116
- package/lib/router/index.ts +358 -170
- 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 +38 -50
- package/tsconfig.json +1 -1
- 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 -20
- package/dist/signal/index.d.ts.map +0 -1
- package/dist/signal/index.js +0 -95
- package/dist/signal/index.js.map +0 -7
- package/dist/signal/index.mjs +0 -74
- 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/index.d.ts +0 -0
- package/lib/interfaces.ts.bak +0 -141
- package/lib/node/utils/node.sw.tpl +0 -133
- package/lib/proxy-signal/index.ts +0 -187
- package/lib/signal/index.ts +0 -161
- package/lib/store/index.ts +0 -101
|
@@ -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,11 +21,14 @@ 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;
|
|
26
29
|
replaceChild<T extends Node>(node: Node, child: T): T;
|
|
27
30
|
removeChild<T extends Node>(child: T): T;
|
|
31
|
+
remove(): Node;
|
|
28
32
|
cloneNode(deep?: boolean | undefined): Node;
|
|
29
33
|
setAttribute(name: string, value: any): void;
|
|
30
34
|
getAttribute(name: string): string | null | undefined;
|
|
@@ -41,9 +45,13 @@ export declare class Element extends Node {
|
|
|
41
45
|
_style: Record<string, any>;
|
|
42
46
|
get style(): string;
|
|
43
47
|
set style(value: string);
|
|
48
|
+
get className(): string;
|
|
49
|
+
set className(value: string | boolean);
|
|
44
50
|
classList: {
|
|
45
51
|
toggle: (item: any, force: any) => void;
|
|
46
52
|
};
|
|
53
|
+
get id(): string;
|
|
54
|
+
set id(value: string | boolean);
|
|
47
55
|
set textContent(text: string);
|
|
48
56
|
get textContent(): string;
|
|
49
57
|
set innerText(text: string);
|
|
@@ -57,6 +65,7 @@ export declare class DocumentFragment extends Element {
|
|
|
57
65
|
}
|
|
58
66
|
export declare class Document extends Element {
|
|
59
67
|
constructor();
|
|
68
|
+
body: Element;
|
|
60
69
|
createDocumentFragment(): DocumentFragment;
|
|
61
70
|
createElement(type: string): Element;
|
|
62
71
|
createElementNS(ns: string, type: string): Element;
|
|
@@ -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,13 @@
|
|
|
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
|
+
export declare function createPulseStore<StateType extends State, PulsesType extends Pulses<StateType>>(initialState: StateType, pulses: PulsesType): () => [ProxyState<StateType>, PulsesType];
|
|
10
|
+
export declare function createMutableStore<StateType extends State, PulsesType extends Pulses<StateType>>(initialState: StateType, pulses: PulsesType): () => [ProxyState<StateType>, PulsesType];
|
|
11
|
+
export declare function createEffect(effect: Function): void;
|
|
12
|
+
export {};
|
|
13
|
+
//# 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;AAkIF,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,UAAU,CAAC,CAE3C;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,UAAU,CAAC,CAK3C;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\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),\n pulses: PulsesType,\n immutable = false\n): () => [ProxyState<StateType>, PulsesType] {\n const subscribers = new Set<Function>();\n const vnodesToUpdate = new WeakSet<Vnode>();\n\n // Initialize the localState for this store\n const localState = (typeof initialState === \"function\" ? initialState() : initialState) || {};\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>, PulsesType] {\n return [proxyState, pulsesProxy as 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>, 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>, 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
|
+
}
|
|
@@ -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+ID0gKHN0YXRlOiBTdGF0ZVR5cGUsIC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcblxuLy8gQSBjb2xsZWN0aW9uIG9mIHB1bHNlc1xuZXhwb3J0IHR5cGUgUHVsc2VzPFN0YXRlVHlwZT4gPSB7XG4gIFtrZXk6IHN0cmluZ106IFB1bHNlPFN0YXRlVHlwZT47XG59O1xuXG4vLyBBIHByb3h5IHN0YXRlXG4vLyBUaGlzIGlzIGEgc3RhdGUgdGhhdCBpcyBwcm94aWVkIHRvIGF1dG9tYXRpY2FsbHkgc3Vic2NyaWJlIHRvIGNoYW5nZXNcbi8vIEFuZCBpcyB1c2VkIGludGVybmFsbHkgdG8gdXBkYXRlIHRoZSB2bm9kZSB3aGVuIHRoZSBzdGF0ZSBjaGFuZ2VzXG50eXBlIFByb3h5U3RhdGU8U3RhdGVUeXBlPiA9IFN0YXRlVHlwZSAmIHtcbiAgW2tleTogc3RyaW5nXTogYW55O1xufTtcblxuLy8gVGhlIGVmZmVjdCBzdGFja1xuY29uc3QgZWZmZWN0U3RhY2s6IEZ1bmN0aW9uW10gPSBbXTtcblxuLy8gQ3JlYXRlcyB0aGUgc3RvcmVcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBzb25hcmpzL2NvZ25pdGl2ZS1jb21wbGV4aXR5XG5mdW5jdGlvbiBjcmVhdGVTdG9yZTxTdGF0ZVR5cGUgZXh0ZW5kcyBTdGF0ZSwgUHVsc2VzVHlwZSBleHRlbmRzIFB1bHNlczxTdGF0ZVR5cGU+PihcbiAgaW5pdGlhbFN0YXRlOiBTdGF0ZVR5cGUgfCAoKCkgPT4gU3RhdGVUeXBlKSxcbiAgcHVsc2VzOiBQdWxzZXNUeXBlLFxuICBpbW11dGFibGUgPSBmYWxzZVxuKTogKCkgPT4gW1Byb3h5U3RhdGU8U3RhdGVUeXBlPiwgUHVsc2VzVHlwZV0ge1xuICBjb25zdCBzdWJzY3JpYmVycyA9IG5ldyBTZXQ8RnVuY3Rpb24+KCk7XG4gIGNvbnN0IHZub2Rlc1RvVXBkYXRlID0gbmV3IFdlYWtTZXQ8Vm5vZGU+KCk7XG5cbiAgLy8gSW5pdGlhbGl6ZSB0aGUgbG9jYWxTdGF0ZSBmb3IgdGhpcyBzdG9yZVxuICBjb25zdCBsb2NhbFN0YXRlID0gKHR5cGVvZiBpbml0aWFsU3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IGluaXRpYWxTdGF0ZSgpIDogaW5pdGlhbFN0YXRlKSB8fCB7fTtcblxuICBmdW5jdGlvbiBpc011dGFibGUoKSB7XG4gICAgaWYgKGltbXV0YWJsZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiWW91IG5lZWQgdG8gY2FsbCBhIHB1bHNlIHRvIG1vZGlmeSB0aGUgc3RhdGVcIik7XG4gICAgfVxuICB9XG5cbiAgLy8gV2UgY3JlYXRlIGEgcHJveHkgZm9yIHRoZSBzdGF0ZVxuICBjb25zdCBwcm94eVN0YXRlID0gbmV3IFByb3h5KGxvY2FsU3RhdGUgfHwge30sIHtcbiAgICBnZXQ6IChzdGF0ZSwgcHJvcDogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBjdXJyZW50RWZmZWN0ID0gZWZmZWN0U3RhY2tbZWZmZWN0U3RhY2subGVuZ3RoIC0gMV07XG4gICAgICBpZiAoY3VycmVudEVmZmVjdCAmJiAhc3Vic2NyaWJlcnMuaGFzKGN1cnJlbnRFZmZlY3QpKSB7XG4gICAgICAgIHN1YnNjcmliZXJzLmFkZChjdXJyZW50RWZmZWN0KTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY3VycmVudFZub2RlID0gY3VycmVudC52bm9kZSBhcyBWbm9kZVdpdGhEb207XG4gICAgICBpZiAoY3VycmVudFZub2RlICYmICF2bm9kZXNUb1VwZGF0ZS5oYXMoY3VycmVudFZub2RlKSkge1xuICAgICAgICBjb25zdCBzdWJzY3JpcHRpb24gPSAoKSA9PiB7XG4gICAgICAgICAgaWYgKCFjdXJyZW50Vm5vZGUuZG9tKSB7XG4gICAgICAgICAgICBzdWJzY3JpYmVycy5kZWxldGUoc3Vic2NyaXB0aW9uKTtcbiAgICAgICAgICAgIHZub2Rlc1RvVXBkYXRlLmRlbGV0ZShjdXJyZW50Vm5vZGUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHVwZGF0ZVZub2RlKGN1cnJlbnRWbm9kZSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgc3Vic2NyaWJlcnMuYWRkKHN1YnNjcmlwdGlvbik7XG4gICAgICAgIHZub2Rlc1RvVXBkYXRlLmFkZChjdXJyZW50Vm5vZGUpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc3RhdGVbcHJvcF07XG4gICAgfSxcbiAgICAvLyBJZiB0aGUgdXNlciB0cmllcyB0byBzZXQgZGlyZWN0bHkgaXQgd2lsbCB0aHJvdyBhbiBlcnJvclxuICAgIHNldDogKHN0YXRlLCBwcm9wOiBzdHJpbmcsIHZhbHVlOiBhbnkpID0+IHtcbiAgICAgIGlzTXV0YWJsZSgpO1xuICAgICAgUmVmbGVjdC5zZXQoc3RhdGUsIHByb3AsIHZhbHVlKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG4gICAgLy8gSWYgdGhlIHVzZXIgdHJpZXMgdG8gZGVsZXRlIGRpcmVjdGx5IGl0IHdpbGwgdGhyb3cgYW4gZXJyb3JcbiAgICBkZWxldGVQcm9wZXJ0eTogKHN0YXRlLCBwcm9wOiBzdHJpbmcpID0+IHtcbiAgICAgIGlzTXV0YWJsZSgpO1xuICAgICAgUmVmbGVjdC5kZWxldGVQcm9wZXJ0eShzdGF0ZSwgcHJvcCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0pO1xuXG4gIGZ1bmN0aW9uIHN5bmNTdGF0ZShuZXdTdGF0ZTogU3RhdGVUeXBlKSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gbmV3U3RhdGUpIHtcbiAgICAgIGxvY2FsU3RhdGVba2V5XSA9IGltbXV0YWJsZSA/IGRlZXBGcmVlemUobmV3U3RhdGVba2V5XSkgOiBuZXdTdGF0ZVtrZXldO1xuICAgIH1cblxuICAgIGZvciAoY29uc3Qga2V5IGluIGxvY2FsU3RhdGUpIHtcbiAgICAgIGlmICghKGtleSBpbiBuZXdTdGF0ZSkpIHtcbiAgICAgICAgUmVmbGVjdC5kZWxldGVQcm9wZXJ0eShsb2NhbFN0YXRlLCBrZXkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHNldFN0YXRlKG5ld1N0YXRlOiBTdGF0ZVR5cGUpIHtcbiAgICBpZiAoIWhhc0NoYW5nZWQobG9jYWxTdGF0ZSwgbmV3U3RhdGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3luY1N0YXRlKG5ld1N0YXRlKTtcblxuICAgIHN1YnNjcmliZXJzLmZvckVhY2goKHN1YnNjcmliZXIpID0+IHN1YnNjcmliZXIoKSk7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRQdWxzZU1ldGhvZChrZXk6IHN0cmluZykge1xuICAgIHJldHVybiAoLi4uYXJnczogYW55W10pID0+IHtcbiAgICAgIGNvbnN0IGN1cnJlbnRTdGF0ZSA9IGRlZXBDbG9uZVVuZnJlZXplKGxvY2FsU3RhdGUpO1xuICAgICAgY29uc3QgcHVsc2UgPSBwdWxzZXNba2V5XShjdXJyZW50U3RhdGUsIC4uLmFyZ3MpO1xuXG4gICAgICBpZiAocHVsc2UgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgIHJldHVybiBwdWxzZVxuICAgICAgICAgIC50aGVuKCgpID0+IHNldFN0YXRlKGN1cnJlbnRTdGF0ZSkpXG4gICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIGluIHB1bHNlOlwiLCBlcnJvcik7XG4gICAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHNldFN0YXRlKGN1cnJlbnRTdGF0ZSk7XG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IGJvdW5kUHVsc2VzOiBSZWNvcmQ8c3RyaW5nLCBQdWxzZTxTdGF0ZVR5cGU+PiA9IHt9O1xuICBmb3IgKGNvbnN0IGtleSBpbiBwdWxzZXMpIHtcbiAgICBpZiAodHlwZW9mIHB1bHNlc1trZXldICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUHVsc2UgJyR7a2V5fScgbXVzdCBiZSBhIGZ1bmN0aW9uYCk7XG4gICAgfVxuICAgIGJvdW5kUHVsc2VzW2tleV0gPSBnZXRQdWxzZU1ldGhvZChrZXkpO1xuICB9XG5cbiAgY29uc3QgcHVsc2VzUHJveHkgPSBuZXcgUHJveHkoYm91bmRQdWxzZXMsIHtcbiAgICBnZXQ6IChwdWxzZXMsIHByb3A6IHN0cmluZykgPT4ge1xuICAgICAgaWYgKCEocHJvcCBpbiBwdWxzZXMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgUHVsc2UgJyR7cHJvcH0nIGRvZXMgbm90IGV4aXN0YCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcHVsc2VzW3Byb3BdO1xuICAgIH1cbiAgfSk7XG5cbiAgZnVuY3Rpb24gdXNlUHVsc2VTdG9yZSgpOiBbUHJveHlTdGF0ZTxTdGF0ZVR5cGU+LCBQdWxzZXNUeXBlXSB7XG4gICAgcmV0dXJuIFtwcm94eVN0YXRlLCBwdWxzZXNQcm94eSBhcyBQdWxzZXNUeXBlXTtcbiAgfVxuXG4gIHN5bmNTdGF0ZShsb2NhbFN0YXRlKTtcblxuICByZXR1cm4gdXNlUHVsc2VTdG9yZTtcbn1cblxuLy8gQ3JlYXRlcyBhIHB1bHNlIHN0b3JlIHdpdGggYW4gaW1tdXRhYmxlIHN0YXRlIGJ5IGRlZmF1bHRcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQdWxzZVN0b3JlPFN0YXRlVHlwZSBleHRlbmRzIFN0YXRlLCBQdWxzZXNUeXBlIGV4dGVuZHMgUHVsc2VzPFN0YXRlVHlwZT4+KFxuICBpbml0aWFsU3RhdGU6IFN0YXRlVHlwZSxcbiAgcHVsc2VzOiBQdWxzZXNUeXBlXG4pOiAoKSA9PiBbUHJveHlTdGF0ZTxTdGF0ZVR5cGU+LCBQdWxzZXNUeXBlXSB7XG4gIHJldHVybiBjcmVhdGVTdG9yZShpbml0aWFsU3RhdGUsIHB1bHNlcywgdHJ1ZSk7XG59XG5cbi8vIENyZWF0ZXMgYSBtdXRhYmxlIHN0b3JlLCB1c2VmdWwgZm9yIHBlcmZvcm1hbmNlLCBidXQgbm90IHJlY29tbWVuZGVkXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTXV0YWJsZVN0b3JlPFN0YXRlVHlwZSBleHRlbmRzIFN0YXRlLCBQdWxzZXNUeXBlIGV4dGVuZHMgUHVsc2VzPFN0YXRlVHlwZT4+KFxuICBpbml0aWFsU3RhdGU6IFN0YXRlVHlwZSxcbiAgcHVsc2VzOiBQdWxzZXNUeXBlXG4pOiAoKSA9PiBbUHJveHlTdGF0ZTxTdGF0ZVR5cGU+LCBQdWxzZXNUeXBlXSB7XG4gIGNvbnNvbGUud2FybihcbiAgICBcIldhcm5pbmc6IFlvdSBhcmUgd29ya2luZyB3aXRoIGEgbXV0YWJsZSBzdGF0ZS4gVGhpcyBjYW4gbGVhZCB0byB1bnByZWRpY3RhYmxlIGJlaGF2aW9yLiBBbGwgc3RhdGUgY2hhbmdlcyBtYWRlIG91dHNpZGUgb2YgYSBwdWxzZSB3aWxsIG5vdCB0cmlnZ2VyIGEgcmUtcmVuZGVyLlwiXG4gICk7XG4gIHJldHVybiBjcmVhdGVTdG9yZShpbml0aWFsU3RhdGUsIHB1bHNlcywgZmFsc2UpO1xufVxuXG4vLyBDcmVhdGVzIGFuIGVmZmVjdFxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUVmZmVjdChlZmZlY3Q6IEZ1bmN0aW9uKSB7XG4gIGNvbnN0IHJ1bkVmZmVjdCA9ICgpID0+IHtcbiAgICB0cnkge1xuICAgICAgZWZmZWN0U3RhY2sucHVzaChydW5FZmZlY3QpO1xuICAgICAgZWZmZWN0KCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGVmZmVjdFN0YWNrLnBvcCgpO1xuICAgIH1cbiAgfTtcblxuICBydW5FZmZlY3QoKTtcbn1cbiJd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
|
|
@@ -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\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),\n pulses: PulsesType,\n immutable = false\n): () => [ProxyState<StateType>, PulsesType] {\n const subscribers = new Set<Function>();\n const vnodesToUpdate = new WeakSet<Vnode>();\n\n // Initialize the localState for this store\n const localState = (typeof initialState === \"function\" ? initialState() : initialState) || {};\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>, PulsesType] {\n return [proxyState, pulsesProxy as 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>, 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>, 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
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../lib/request/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../lib/request/index.ts"],"names":[],"mappings":"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"}
|