valyrian.js 8.0.14 → 8.1.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/dist/lib/pulses/index.d.ts +4 -0
- package/dist/lib/pulses/index.d.ts.map +1 -1
- package/dist/lib/redux-devtools/index.d.ts +15 -0
- package/dist/lib/redux-devtools/index.d.ts.map +1 -0
- package/dist/pulses/index.js +32 -1
- package/dist/pulses/index.js.map +2 -2
- package/dist/pulses/index.min.js +1 -1
- package/dist/pulses/index.min.js.map +1 -1
- package/dist/pulses/index.mjs +32 -1
- package/dist/pulses/index.mjs.map +2 -2
- package/dist/redux-devtools/index.js +81 -0
- package/dist/redux-devtools/index.js.map +7 -0
- package/dist/redux-devtools/index.min.js +1 -0
- package/dist/redux-devtools/index.min.js.map +1 -0
- package/dist/redux-devtools/index.mjs +60 -0
- package/dist/redux-devtools/index.mjs.map +7 -0
- package/lib/pulses/index.ts +54 -6
- package/lib/redux-devtools/index.ts +86 -0
- package/package.json +1 -1
|
@@ -11,9 +11,13 @@ type StorePulses<PulsesType extends Pulses<any>> = {
|
|
|
11
11
|
};
|
|
12
12
|
export declare function createPulseStore<StateType extends State, PulsesType extends Pulses<StateType>>(initialState: StateType, pulses: PulsesType): StorePulses<PulsesType> & {
|
|
13
13
|
state: ProxyState<StateType>;
|
|
14
|
+
on: (event: string, callback: Function) => void;
|
|
15
|
+
off: (event: string, callback: Function) => void;
|
|
14
16
|
};
|
|
15
17
|
export declare function createMutableStore<StateType extends State, PulsesType extends Pulses<StateType>>(initialState: StateType, pulses: PulsesType): StorePulses<PulsesType> & {
|
|
16
18
|
state: ProxyState<StateType>;
|
|
19
|
+
on: (event: string, callback: Function) => void;
|
|
20
|
+
off: (event: string, callback: Function) => void;
|
|
17
21
|
};
|
|
18
22
|
export declare function createEffect(effect: Function): void;
|
|
19
23
|
export declare function createPulse<T>(initialValue: T): [() => T, (newValue: T | ((current: T) => T)) => void, () => void];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../lib/pulses/index.ts"],"names":[],"mappings":"AAIA,KAAK,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAEjC,MAAM,MAAM,KAAK,CAAC,SAAS,EAAE,OAAO,GAAG,OAAO,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;AAEnH,MAAM,MAAM,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,EAAE,GAAG,CAAC,GAAG;IAAE,MAAM,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,CAAC,CAAC;AAEzG,KAAK,UAAU,CAAC,SAAS,IAAI,SAAS,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CAAE,CAAC;AAIhE,KAAK,WAAW,CAAC,UAAU,SAAS,MAAM,CAAC,GAAG,CAAC,IAAI;KAChD,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;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../lib/pulses/index.ts"],"names":[],"mappings":"AAIA,KAAK,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAEjC,MAAM,MAAM,KAAK,CAAC,SAAS,EAAE,OAAO,GAAG,OAAO,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;AAEnH,MAAM,MAAM,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,EAAE,GAAG,CAAC,GAAG;IAAE,MAAM,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,CAAC,CAAC;AAEzG,KAAK,UAAU,CAAC,SAAS,IAAI,SAAS,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CAAE,CAAC;AAIhE,KAAK,WAAW,CAAC,UAAU,SAAS,MAAM,CAAC,GAAG,CAAC,IAAI;KAChD,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;AA2OF,wBAAgB,gBAAgB,CAAC,SAAS,SAAS,KAAK,EAAE,UAAU,SAAS,MAAM,CAAC,SAAS,CAAC,EAC5F,YAAY,EAAE,SAAS,EACvB,MAAM,EAAE,UAAU,GACjB,WAAW,CAAC,UAAU,CAAC,GAAG;IAC3B,KAAK,EAAE,UAAU,CAAC,SAAS,CAAC,CAAC;IAC7B,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,KAAK,IAAI,CAAC;IAChD,GAAG,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,KAAK,IAAI,CAAC;CAClD,CAEA;AAED,wBAAgB,kBAAkB,CAAC,SAAS,SAAS,KAAK,EAAE,UAAU,SAAS,MAAM,CAAC,SAAS,CAAC,EAC9F,YAAY,EAAE,SAAS,EACvB,MAAM,EAAE,UAAU,GACjB,WAAW,CAAC,UAAU,CAAC,GAAG;IAC3B,KAAK,EAAE,UAAU,CAAC,SAAS,CAAC,CAAC;IAC7B,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,KAAK,IAAI,CAAC;IAChD,GAAG,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,KAAK,IAAI,CAAC;CAClD,CAKA;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,QAAQ,QAU5C;AAED,wBAAgB,WAAW,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,IAAI,EAAE,MAAM,IAAI,CAAC,CA4BlH"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { FluxStore } from "valyrian.js/flux-store";
|
|
2
|
+
declare global {
|
|
3
|
+
interface Window {
|
|
4
|
+
__REDUX_DEVTOOLS_EXTENSION__: any;
|
|
5
|
+
}
|
|
6
|
+
}
|
|
7
|
+
interface DevToolsOptions {
|
|
8
|
+
name?: string;
|
|
9
|
+
[key: string]: any;
|
|
10
|
+
}
|
|
11
|
+
export declare function connectFluxStore(store: FluxStore, options?: DevToolsOptions): void;
|
|
12
|
+
export declare function connectPulseStore(store: any, options?: DevToolsOptions): void;
|
|
13
|
+
export declare function connectPulse(pulse: any, options?: DevToolsOptions): any;
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../lib/redux-devtools/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAEnD,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,4BAA4B,EAAE,GAAG,CAAC;KACnC;CACF;AAED,UAAU,eAAe;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAUD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,GAAE,eAAoB,QAqB/E;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,GAAG,EAAE,OAAO,GAAE,eAAoB,QAe1E;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,GAAG,EAAE,OAAO,GAAE,eAAoB,OAuBrE"}
|
package/dist/pulses/index.js
CHANGED
|
@@ -169,17 +169,48 @@ function createStore(initialState, pulses, immutable = false) {
|
|
|
169
169
|
return pulseMethod;
|
|
170
170
|
}
|
|
171
171
|
syncState(localState);
|
|
172
|
+
const listeners = {};
|
|
173
|
+
const trigger = (event, ...args) => {
|
|
174
|
+
if (listeners[event]) {
|
|
175
|
+
listeners[event].forEach((callback) => callback(...args));
|
|
176
|
+
}
|
|
177
|
+
};
|
|
172
178
|
const pulsesProxy = new Proxy(boundPulses, {
|
|
173
179
|
get: (pulses2, prop) => {
|
|
174
180
|
if (prop === "state") {
|
|
175
181
|
return proxyState;
|
|
176
182
|
}
|
|
183
|
+
if (prop === "on") {
|
|
184
|
+
return (event, callback) => {
|
|
185
|
+
if (!listeners[event]) {
|
|
186
|
+
listeners[event] = [];
|
|
187
|
+
}
|
|
188
|
+
listeners[event].push(callback);
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
if (prop === "off") {
|
|
192
|
+
return (event, callback) => {
|
|
193
|
+
if (listeners[event]) {
|
|
194
|
+
listeners[event] = listeners[event].filter((cb) => cb !== callback);
|
|
195
|
+
}
|
|
196
|
+
};
|
|
197
|
+
}
|
|
177
198
|
if (!(prop in pulses2)) {
|
|
178
199
|
throw new Error(`Pulse '${prop}' does not exist`);
|
|
179
200
|
}
|
|
180
201
|
const pulseMethod = pulses2[prop];
|
|
181
202
|
if (typeof pulseMethod === "function") {
|
|
182
|
-
return
|
|
203
|
+
return (...args) => {
|
|
204
|
+
const result = pulseMethod.apply(pulsesProxy, args);
|
|
205
|
+
if (result instanceof Promise) {
|
|
206
|
+
return result.then((r) => {
|
|
207
|
+
trigger("pulse", prop, args);
|
|
208
|
+
return r;
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
trigger("pulse", prop, args);
|
|
212
|
+
return result;
|
|
213
|
+
};
|
|
183
214
|
}
|
|
184
215
|
return pulseMethod;
|
|
185
216
|
}
|
package/dist/pulses/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../lib/pulses/index.ts"],
|
|
4
|
-
"sourcesContent": ["/* eslint-disable no-console */\nimport { updateVnode, VnodeWithDom, current, DomElement } from \"valyrian.js\";\nimport { deepCloneUnfreeze, deepFreeze, hasChanged } from \"valyrian.js/utils\";\n\ntype State = Record<string, any>;\n\nexport type Pulse<StateType, TReturn = unknown> = (state: StateType, ...args: any[]) => TReturn | Promise<TReturn>;\n\nexport type Pulses<StateType> = Record<string, Pulse<StateType, any> & { $flush?: () => Promise<void> }>;\n\ntype ProxyState<StateType> = StateType & { [key: string]: any };\n\nconst effectStack: Function[] = [];\n\ntype StorePulses<PulsesType extends Pulses<any>> = {\n [K in keyof PulsesType]: PulsesType[K] extends (state: any, ...args: infer Args) => infer R\n ? (...args: Args) => R\n : never;\n};\n\n/** Funci\u00F3n auxiliar para registrar la suscripci\u00F3n al nodo DOM.\n * Retorna true si se agreg\u00F3 la suscripci\u00F3n, o false si se encontr\u00F3 un nodo padre ya suscrito.\n */\nfunction registerDomSubscription(subscribers: Set<Function>, domWithVnodesToUpdate: WeakSet<DomElement>): void {\n const currentVnode = current.vnode as VnodeWithDom;\n if (!currentVnode || domWithVnodesToUpdate.has(currentVnode.dom)) {\n return;\n }\n\n let hasParent = false;\n let parent = currentVnode.dom.parentElement as DomElement;\n while (parent) {\n if (domWithVnodesToUpdate.has(parent)) {\n hasParent = true;\n break;\n }\n parent = parent.parentElement as DomElement;\n }\n\n // Si no hay nodo padre registrado, se crea la suscripci\u00F3n.\n if (!hasParent) {\n const dom = currentVnode.dom;\n const subscription = () => {\n updateVnode(dom.vnode);\n if (!dom.parentElement) {\n subscribers.delete(subscription);\n domWithVnodesToUpdate.delete(dom);\n }\n };\n subscribers.add(subscription);\n domWithVnodesToUpdate.add(dom);\n }\n}\n\nfunction createStore<StateType extends State, PulsesType extends Pulses<StateType>>(\n initialState: StateType | (() => StateType) | null,\n pulses: PulsesType,\n immutable = false\n): StorePulses<PulsesType> & { state: ProxyState<StateType> } {\n const subscribers = new Set<Function>();\n const domWithVnodesToUpdate = new WeakSet<DomElement>();\n\n const boundPulses: Pulses<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 if (key === \"state\") {\n throw new Error(`A pulse cannot be named 'state'`);\n }\n boundPulses[key] = getPulseMethod(key);\n }\n\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 let currentState: StateType | null = null;\n let pulseCallCount = 0;\n\n const proxyState = new Proxy(localState, {\n get: (state, prop: string) => {\n // If we are in a pulse, we return the value of the cloned state.\n if (currentState) {\n return currentState[prop];\n }\n\n const currentEffect = effectStack[effectStack.length - 1];\n if (currentEffect && !subscribers.has(currentEffect)) {\n subscribers.add(currentEffect);\n }\n\n registerDomSubscription(subscribers, domWithVnodesToUpdate);\n\n return state[prop];\n },\n set: (state, prop: string, value: any) => {\n isMutable();\n Reflect.set(state, prop, value);\n return true;\n },\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 for (const key in localState) {\n if (!(key in newState)) {\n Reflect.deleteProperty(localState, key);\n }\n }\n }\n\n let debounceTimeout: ReturnType<typeof setTimeout> | null = null;\n function debouncedUpdate() {\n if (debounceTimeout) {\n clearTimeout(debounceTimeout);\n }\n debounceTimeout = setTimeout(() => subscribers.forEach((subscriber) => subscriber()), 0);\n }\n\n function setState(newState: StateType, flush = false) {\n pulseCallCount--;\n if (!hasChanged(localState, newState)) {\n return;\n }\n if (pulseCallCount > 0 && !flush) {\n return;\n }\n syncState(newState);\n currentState = null;\n debouncedUpdate();\n }\n\n function getPulseMethod(key: string) {\n function pulseMethod(this: Pulse<StateType, any> & { $flush: () => Promise<void> }, ...args: any[]) {\n pulseCallCount++;\n if (currentState === null) {\n currentState = deepCloneUnfreeze(localState);\n }\n\n const $flush = async () => {\n setState(currentState as StateType, true);\n currentState = deepCloneUnfreeze(localState);\n await new Promise((resolve) => setTimeout(resolve, 0));\n };\n\n Reflect.set(this, \"$flush\", $flush);\n const emptyFlush = async () => {};\n\n try {\n const pulseResult = pulses[key].apply(this, [currentState, ...args]);\n if (pulseResult instanceof Promise) {\n return pulseResult\n .then((resolvedValue) => {\n setState(currentState as StateType);\n Reflect.set(this, \"$flush\", emptyFlush);\n return resolvedValue;\n })\n .catch((error) => {\n console.error(`Error in pulse '${key}':`, error);\n Reflect.set(this, \"$flush\", emptyFlush);\n throw error;\n });\n } else {\n setState(currentState);\n Reflect.set(this, \"$flush\", emptyFlush);\n return pulseResult;\n }\n } catch (error) {\n console.error(`Error in pulse '${key}':`, error);\n Reflect.set(this, \"$flush\", emptyFlush);\n throw error;\n }\n }\n\n return pulseMethod;\n }\n\n syncState(localState);\n\n const pulsesProxy = new Proxy(boundPulses, {\n get: (pulses, prop: string) => {\n if (prop === \"state\") {\n return proxyState;\n }\n if (!(prop in pulses)) {\n throw new Error(`Pulse '${prop}' does not exist`);\n }\n const pulseMethod = pulses[prop];\n\n if (typeof pulseMethod === \"function\") {\n return pulseMethod.bind(pulsesProxy);\n }\n\n return pulseMethod;\n }\n });\n\n return pulsesProxy as StorePulses<PulsesType> & { state: ProxyState<StateType> };\n}\n\nexport function createPulseStore<StateType extends State, PulsesType extends Pulses<StateType>>(\n initialState: StateType,\n pulses: PulsesType\n): StorePulses<PulsesType> & { state: ProxyState<StateType> } {\n return createStore(initialState, pulses, true);\n}\n\nexport function createMutableStore<StateType extends State, PulsesType extends Pulses<StateType>>(\n initialState: StateType,\n pulses: PulsesType\n): StorePulses<PulsesType> & { state: ProxyState<StateType> } {\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\nexport function createEffect(effect: Function) {\n const runEffect = () => {\n try {\n effectStack.push(runEffect);\n effect();\n } finally {\n effectStack.pop();\n }\n };\n runEffect();\n}\n\nexport function createPulse<T>(initialValue: T): [() => T, (newValue: T | ((current: T) => T)) => void, () => void] {\n let value = initialValue;\n const subscribers = new Set<Function>();\n const domWithVnodesToUpdate = new WeakSet<DomElement>();\n\n const runSubscribers = () => {\n subscribers.forEach((subscriber) => subscriber());\n };\n\n const read = (): T => {\n const currentEffect = effectStack[effectStack.length - 1];\n if (currentEffect && !subscribers.has(currentEffect)) {\n subscribers.add(currentEffect);\n }\n registerDomSubscription(subscribers, domWithVnodesToUpdate);\n return value;\n };\n\n const write = (newValue: T | ((current: T) => T)): void => {\n const resolvedValue = typeof newValue === \"function\" ? (newValue as (current: T) => T)(value) : newValue;\n if (!hasChanged(value, resolvedValue)) {\n return;\n }\n value = resolvedValue;\n runSubscribers();\n };\n\n return [read, write, runSubscribers];\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,sBAA+D;AAC/D,mBAA0D;AAU1D,IAAM,cAA0B,CAAC;AAWjC,SAAS,wBAAwB,aAA4B,uBAAkD;AAC7G,QAAM,eAAe,wBAAQ;AAC7B,MAAI,CAAC,gBAAgB,sBAAsB,IAAI,aAAa,GAAG,GAAG;AAChE;AAAA,EACF;AAEA,MAAI,YAAY;AAChB,MAAI,SAAS,aAAa,IAAI;AAC9B,SAAO,QAAQ;AACb,QAAI,sBAAsB,IAAI,MAAM,GAAG;AACrC,kBAAY;AACZ;AAAA,IACF;AACA,aAAS,OAAO;AAAA,EAClB;AAGA,MAAI,CAAC,WAAW;AACd,UAAM,MAAM,aAAa;AACzB,UAAM,eAAe,MAAM;AACzB,uCAAY,IAAI,KAAK;AACrB,UAAI,CAAC,IAAI,eAAe;AACtB,oBAAY,OAAO,YAAY;AAC/B,8BAAsB,OAAO,GAAG;AAAA,MAClC;AAAA,IACF;AACA,gBAAY,IAAI,YAAY;AAC5B,0BAAsB,IAAI,GAAG;AAAA,EAC/B;AACF;AAEA,SAAS,YACP,cACA,QACA,YAAY,
|
|
4
|
+
"sourcesContent": ["/* eslint-disable no-console */\nimport { updateVnode, VnodeWithDom, current, DomElement } from \"valyrian.js\";\nimport { deepCloneUnfreeze, deepFreeze, hasChanged } from \"valyrian.js/utils\";\n\ntype State = Record<string, any>;\n\nexport type Pulse<StateType, TReturn = unknown> = (state: StateType, ...args: any[]) => TReturn | Promise<TReturn>;\n\nexport type Pulses<StateType> = Record<string, Pulse<StateType, any> & { $flush?: () => Promise<void> }>;\n\ntype ProxyState<StateType> = StateType & { [key: string]: any };\n\nconst effectStack: Function[] = [];\n\ntype StorePulses<PulsesType extends Pulses<any>> = {\n [K in keyof PulsesType]: PulsesType[K] extends (state: any, ...args: infer Args) => infer R\n ? (...args: Args) => R\n : never;\n};\n\n/** Funci\u00F3n auxiliar para registrar la suscripci\u00F3n al nodo DOM.\n * Retorna true si se agreg\u00F3 la suscripci\u00F3n, o false si se encontr\u00F3 un nodo padre ya suscrito.\n */\nfunction registerDomSubscription(subscribers: Set<Function>, domWithVnodesToUpdate: WeakSet<DomElement>): void {\n const currentVnode = current.vnode as VnodeWithDom;\n if (!currentVnode || domWithVnodesToUpdate.has(currentVnode.dom)) {\n return;\n }\n\n let hasParent = false;\n let parent = currentVnode.dom.parentElement as DomElement;\n while (parent) {\n if (domWithVnodesToUpdate.has(parent)) {\n hasParent = true;\n break;\n }\n parent = parent.parentElement as DomElement;\n }\n\n // Si no hay nodo padre registrado, se crea la suscripci\u00F3n.\n if (!hasParent) {\n const dom = currentVnode.dom;\n const subscription = () => {\n updateVnode(dom.vnode);\n if (!dom.parentElement) {\n subscribers.delete(subscription);\n domWithVnodesToUpdate.delete(dom);\n }\n };\n subscribers.add(subscription);\n domWithVnodesToUpdate.add(dom);\n }\n}\n\nfunction createStore<StateType extends State, PulsesType extends Pulses<StateType>>(\n initialState: StateType | (() => StateType) | null,\n pulses: PulsesType,\n immutable = false\n): StorePulses<PulsesType> & {\n state: ProxyState<StateType>;\n on: (event: string, callback: Function) => void;\n off: (event: string, callback: Function) => void;\n} {\n const subscribers = new Set<Function>();\n const domWithVnodesToUpdate = new WeakSet<DomElement>();\n\n const boundPulses: Pulses<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 if (key === \"state\") {\n throw new Error(`A pulse cannot be named 'state'`);\n }\n boundPulses[key] = getPulseMethod(key);\n }\n\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 let currentState: StateType | null = null;\n let pulseCallCount = 0;\n\n const proxyState = new Proxy(localState, {\n get: (state, prop: string) => {\n // If we are in a pulse, we return the value of the cloned state.\n if (currentState) {\n return currentState[prop];\n }\n\n const currentEffect = effectStack[effectStack.length - 1];\n if (currentEffect && !subscribers.has(currentEffect)) {\n subscribers.add(currentEffect);\n }\n\n registerDomSubscription(subscribers, domWithVnodesToUpdate);\n\n return state[prop];\n },\n set: (state, prop: string, value: any) => {\n isMutable();\n Reflect.set(state, prop, value);\n return true;\n },\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 for (const key in localState) {\n if (!(key in newState)) {\n Reflect.deleteProperty(localState, key);\n }\n }\n }\n\n let debounceTimeout: ReturnType<typeof setTimeout> | null = null;\n function debouncedUpdate() {\n if (debounceTimeout) {\n clearTimeout(debounceTimeout);\n }\n debounceTimeout = setTimeout(() => subscribers.forEach((subscriber) => subscriber()), 0);\n }\n\n function setState(newState: StateType, flush = false) {\n pulseCallCount--;\n if (!hasChanged(localState, newState)) {\n return;\n }\n if (pulseCallCount > 0 && !flush) {\n return;\n }\n syncState(newState);\n currentState = null;\n debouncedUpdate();\n }\n\n function getPulseMethod(key: string) {\n function pulseMethod(this: Pulse<StateType, any> & { $flush: () => Promise<void> }, ...args: any[]) {\n pulseCallCount++;\n if (currentState === null) {\n currentState = deepCloneUnfreeze(localState);\n }\n\n const $flush = async () => {\n setState(currentState as StateType, true);\n currentState = deepCloneUnfreeze(localState);\n await new Promise((resolve) => setTimeout(resolve, 0));\n };\n\n Reflect.set(this, \"$flush\", $flush);\n const emptyFlush = async () => {};\n\n try {\n const pulseResult = pulses[key].apply(this, [currentState, ...args] as any);\n if (pulseResult instanceof Promise) {\n return pulseResult\n .then((resolvedValue) => {\n setState(currentState as StateType);\n Reflect.set(this, \"$flush\", emptyFlush);\n return resolvedValue;\n })\n .catch((error) => {\n console.error(`Error in pulse '${key}':`, error);\n Reflect.set(this, \"$flush\", emptyFlush);\n throw error;\n });\n } else {\n setState(currentState);\n Reflect.set(this, \"$flush\", emptyFlush);\n return pulseResult;\n }\n } catch (error) {\n console.error(`Error in pulse '${key}':`, error);\n Reflect.set(this, \"$flush\", emptyFlush);\n throw error;\n }\n }\n\n return pulseMethod;\n }\n\n syncState(localState);\n\n const listeners: Record<string, Function[]> = {};\n const trigger = (event: string, ...args: any[]) => {\n if (listeners[event]) {\n listeners[event].forEach((callback) => callback(...args));\n }\n };\n\n const pulsesProxy = new Proxy(boundPulses, {\n get: (pulses, prop: string) => {\n if (prop === \"state\") {\n return proxyState;\n }\n if (prop === \"on\") {\n return (event: string, callback: Function) => {\n if (!listeners[event]) {\n listeners[event] = [];\n }\n listeners[event].push(callback);\n };\n }\n if (prop === \"off\") {\n return (event: string, callback: Function) => {\n if (listeners[event]) {\n listeners[event] = listeners[event].filter((cb) => cb !== callback);\n }\n };\n }\n if (!(prop in pulses)) {\n throw new Error(`Pulse '${prop}' does not exist`);\n }\n const pulseMethod = pulses[prop];\n\n if (typeof pulseMethod === \"function\") {\n return (...args: any[]) => {\n const result = pulseMethod.apply(pulsesProxy, args as any);\n if (result instanceof Promise) {\n return result.then((r) => {\n trigger(\"pulse\", prop, args);\n return r;\n });\n }\n trigger(\"pulse\", prop, args);\n return result;\n };\n }\n\n return pulseMethod;\n }\n });\n\n return pulsesProxy as StorePulses<PulsesType> & {\n state: ProxyState<StateType>;\n on: (event: string, callback: Function) => void;\n off: (event: string, callback: Function) => void;\n };\n}\n\nexport function createPulseStore<StateType extends State, PulsesType extends Pulses<StateType>>(\n initialState: StateType,\n pulses: PulsesType\n): StorePulses<PulsesType> & {\n state: ProxyState<StateType>;\n on: (event: string, callback: Function) => void;\n off: (event: string, callback: Function) => void;\n} {\n return createStore(initialState, pulses, true);\n}\n\nexport function createMutableStore<StateType extends State, PulsesType extends Pulses<StateType>>(\n initialState: StateType,\n pulses: PulsesType\n): StorePulses<PulsesType> & {\n state: ProxyState<StateType>;\n on: (event: string, callback: Function) => void;\n off: (event: string, callback: Function) => void;\n} {\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\nexport function createEffect(effect: Function) {\n const runEffect = () => {\n try {\n effectStack.push(runEffect);\n effect();\n } finally {\n effectStack.pop();\n }\n };\n runEffect();\n}\n\nexport function createPulse<T>(initialValue: T): [() => T, (newValue: T | ((current: T) => T)) => void, () => void] {\n let value = initialValue;\n const subscribers = new Set<Function>();\n const domWithVnodesToUpdate = new WeakSet<DomElement>();\n\n const runSubscribers = () => {\n subscribers.forEach((subscriber) => subscriber());\n };\n\n const read = (): T => {\n const currentEffect = effectStack[effectStack.length - 1];\n if (currentEffect && !subscribers.has(currentEffect)) {\n subscribers.add(currentEffect);\n }\n registerDomSubscription(subscribers, domWithVnodesToUpdate);\n return value;\n };\n\n const write = (newValue: T | ((current: T) => T)): void => {\n const resolvedValue = typeof newValue === \"function\" ? (newValue as (current: T) => T)(value) : newValue;\n if (!hasChanged(value, resolvedValue)) {\n return;\n }\n value = resolvedValue;\n runSubscribers();\n };\n\n return [read, write, runSubscribers];\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,sBAA+D;AAC/D,mBAA0D;AAU1D,IAAM,cAA0B,CAAC;AAWjC,SAAS,wBAAwB,aAA4B,uBAAkD;AAC7G,QAAM,eAAe,wBAAQ;AAC7B,MAAI,CAAC,gBAAgB,sBAAsB,IAAI,aAAa,GAAG,GAAG;AAChE;AAAA,EACF;AAEA,MAAI,YAAY;AAChB,MAAI,SAAS,aAAa,IAAI;AAC9B,SAAO,QAAQ;AACb,QAAI,sBAAsB,IAAI,MAAM,GAAG;AACrC,kBAAY;AACZ;AAAA,IACF;AACA,aAAS,OAAO;AAAA,EAClB;AAGA,MAAI,CAAC,WAAW;AACd,UAAM,MAAM,aAAa;AACzB,UAAM,eAAe,MAAM;AACzB,uCAAY,IAAI,KAAK;AACrB,UAAI,CAAC,IAAI,eAAe;AACtB,oBAAY,OAAO,YAAY;AAC/B,8BAAsB,OAAO,GAAG;AAAA,MAClC;AAAA,IACF;AACA,gBAAY,IAAI,YAAY;AAC5B,0BAAsB,IAAI,GAAG;AAAA,EAC/B;AACF;AAEA,SAAS,YACP,cACA,QACA,YAAY,OAKZ;AACA,QAAM,cAAc,oBAAI,IAAc;AACtC,QAAM,wBAAwB,oBAAI,QAAoB;AAEtD,QAAM,cAAiC,CAAC;AACxC,aAAW,OAAO,QAAQ;AACxB,QAAI,OAAO,OAAO,GAAG,MAAM,YAAY;AACrC,YAAM,IAAI,MAAM,UAAU,GAAG,sBAAsB;AAAA,IACrD;AACA,QAAI,QAAQ,SAAS;AACnB,YAAM,IAAI,MAAM,iCAAiC;AAAA,IACnD;AACA,gBAAY,GAAG,IAAI,eAAe,GAAG;AAAA,EACvC;AAEA,QAAM,cACH,OAAO,iBAAiB,aAAa,aAAa,IAAI,iBAAkB,CAAC;AAE5E,WAAS,YAAY;AACnB,QAAI,WAAW;AACb,YAAM,IAAI,MAAM,8CAA8C;AAAA,IAChE;AAAA,EACF;AAEA,MAAI,eAAiC;AACrC,MAAI,iBAAiB;AAErB,QAAM,aAAa,IAAI,MAAM,YAAY;AAAA,IACvC,KAAK,CAAC,OAAO,SAAiB;AAE5B,UAAI,cAAc;AAChB,eAAO,aAAa,IAAI;AAAA,MAC1B;AAEA,YAAM,gBAAgB,YAAY,YAAY,SAAS,CAAC;AACxD,UAAI,iBAAiB,CAAC,YAAY,IAAI,aAAa,GAAG;AACpD,oBAAY,IAAI,aAAa;AAAA,MAC/B;AAEA,8BAAwB,aAAa,qBAAqB;AAE1D,aAAO,MAAM,IAAI;AAAA,IACnB;AAAA,IACA,KAAK,CAAC,OAAO,MAAc,UAAe;AACxC,gBAAU;AACV,cAAQ,IAAI,OAAO,MAAM,KAAK;AAC9B,aAAO;AAAA,IACT;AAAA,IACA,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;AACA,eAAW,OAAO,YAAY;AAC5B,UAAI,EAAE,OAAO,WAAW;AACtB,gBAAQ,eAAe,YAAY,GAAG;AAAA,MACxC;AAAA,IACF;AAAA,EACF;AAEA,MAAI,kBAAwD;AAC5D,WAAS,kBAAkB;AACzB,QAAI,iBAAiB;AACnB,mBAAa,eAAe;AAAA,IAC9B;AACA,sBAAkB,WAAW,MAAM,YAAY,QAAQ,CAAC,eAAe,WAAW,CAAC,GAAG,CAAC;AAAA,EACzF;AAEA,WAAS,SAAS,UAAqB,QAAQ,OAAO;AACpD;AACA,QAAI,KAAC,yBAAW,YAAY,QAAQ,GAAG;AACrC;AAAA,IACF;AACA,QAAI,iBAAiB,KAAK,CAAC,OAAO;AAChC;AAAA,IACF;AACA,cAAU,QAAQ;AAClB,mBAAe;AACf,oBAAgB;AAAA,EAClB;AAEA,WAAS,eAAe,KAAa;AACnC,aAAS,eAA8E,MAAa;AAClG;AACA,UAAI,iBAAiB,MAAM;AACzB,2BAAe,gCAAkB,UAAU;AAAA,MAC7C;AAEA,YAAM,SAAS,YAAY;AACzB,iBAAS,cAA2B,IAAI;AACxC,2BAAe,gCAAkB,UAAU;AAC3C,cAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,CAAC,CAAC;AAAA,MACvD;AAEA,cAAQ,IAAI,MAAM,UAAU,MAAM;AAClC,YAAM,aAAa,YAAY;AAAA,MAAC;AAEhC,UAAI;AACF,cAAM,cAAc,OAAO,GAAG,EAAE,MAAM,MAAM,CAAC,cAAc,GAAG,IAAI,CAAQ;AAC1E,YAAI,uBAAuB,SAAS;AAClC,iBAAO,YACJ,KAAK,CAAC,kBAAkB;AACvB,qBAAS,YAAyB;AAClC,oBAAQ,IAAI,MAAM,UAAU,UAAU;AACtC,mBAAO;AAAA,UACT,CAAC,EACA,MAAM,CAAC,UAAU;AAChB,oBAAQ,MAAM,mBAAmB,GAAG,MAAM,KAAK;AAC/C,oBAAQ,IAAI,MAAM,UAAU,UAAU;AACtC,kBAAM;AAAA,UACR,CAAC;AAAA,QACL,OAAO;AACL,mBAAS,YAAY;AACrB,kBAAQ,IAAI,MAAM,UAAU,UAAU;AACtC,iBAAO;AAAA,QACT;AAAA,MACF,SAAS,OAAO;AACd,gBAAQ,MAAM,mBAAmB,GAAG,MAAM,KAAK;AAC/C,gBAAQ,IAAI,MAAM,UAAU,UAAU;AACtC,cAAM;AAAA,MACR;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,YAAU,UAAU;AAEpB,QAAM,YAAwC,CAAC;AAC/C,QAAM,UAAU,CAAC,UAAkB,SAAgB;AACjD,QAAI,UAAU,KAAK,GAAG;AACpB,gBAAU,KAAK,EAAE,QAAQ,CAAC,aAAa,SAAS,GAAG,IAAI,CAAC;AAAA,IAC1D;AAAA,EACF;AAEA,QAAM,cAAc,IAAI,MAAM,aAAa;AAAA,IACzC,KAAK,CAACA,SAAQ,SAAiB;AAC7B,UAAI,SAAS,SAAS;AACpB,eAAO;AAAA,MACT;AACA,UAAI,SAAS,MAAM;AACjB,eAAO,CAAC,OAAe,aAAuB;AAC5C,cAAI,CAAC,UAAU,KAAK,GAAG;AACrB,sBAAU,KAAK,IAAI,CAAC;AAAA,UACtB;AACA,oBAAU,KAAK,EAAE,KAAK,QAAQ;AAAA,QAChC;AAAA,MACF;AACA,UAAI,SAAS,OAAO;AAClB,eAAO,CAAC,OAAe,aAAuB;AAC5C,cAAI,UAAU,KAAK,GAAG;AACpB,sBAAU,KAAK,IAAI,UAAU,KAAK,EAAE,OAAO,CAAC,OAAO,OAAO,QAAQ;AAAA,UACpE;AAAA,QACF;AAAA,MACF;AACA,UAAI,EAAE,QAAQA,UAAS;AACrB,cAAM,IAAI,MAAM,UAAU,IAAI,kBAAkB;AAAA,MAClD;AACA,YAAM,cAAcA,QAAO,IAAI;AAE/B,UAAI,OAAO,gBAAgB,YAAY;AACrC,eAAO,IAAI,SAAgB;AACzB,gBAAM,SAAS,YAAY,MAAM,aAAa,IAAW;AACzD,cAAI,kBAAkB,SAAS;AAC7B,mBAAO,OAAO,KAAK,CAAC,MAAM;AACxB,sBAAQ,SAAS,MAAM,IAAI;AAC3B,qBAAO;AAAA,YACT,CAAC;AAAA,UACH;AACA,kBAAQ,SAAS,MAAM,IAAI;AAC3B,iBAAO;AAAA,QACT;AAAA,MACF;AAEA,aAAO;AAAA,IACT;AAAA,EACF,CAAC;AAED,SAAO;AAKT;AAEO,SAAS,iBACd,cACA,QAKA;AACA,SAAO,YAAY,cAAc,QAAQ,IAAI;AAC/C;AAEO,SAAS,mBACd,cACA,QAKA;AACA,UAAQ;AAAA,IACN;AAAA,EACF;AACA,SAAO,YAAY,cAAc,QAAQ,KAAK;AAChD;AAEO,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;AACA,YAAU;AACZ;AAEO,SAAS,YAAe,cAAqF;AAClH,MAAI,QAAQ;AACZ,QAAM,cAAc,oBAAI,IAAc;AACtC,QAAM,wBAAwB,oBAAI,QAAoB;AAEtD,QAAM,iBAAiB,MAAM;AAC3B,gBAAY,QAAQ,CAAC,eAAe,WAAW,CAAC;AAAA,EAClD;AAEA,QAAM,OAAO,MAAS;AACpB,UAAM,gBAAgB,YAAY,YAAY,SAAS,CAAC;AACxD,QAAI,iBAAiB,CAAC,YAAY,IAAI,aAAa,GAAG;AACpD,kBAAY,IAAI,aAAa;AAAA,IAC/B;AACA,4BAAwB,aAAa,qBAAqB;AAC1D,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,CAAC,aAA4C;AACzD,UAAM,gBAAgB,OAAO,aAAa,aAAc,SAA+B,KAAK,IAAI;AAChG,QAAI,KAAC,yBAAW,OAAO,aAAa,GAAG;AACrC;AAAA,IACF;AACA,YAAQ;AACR,mBAAe;AAAA,EACjB;AAEA,SAAO,CAAC,MAAM,OAAO,cAAc;AACrC;",
|
|
6
6
|
"names": ["pulses"]
|
|
7
7
|
}
|
package/dist/pulses/index.min.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
(()=>{"use strict";var e=Object.defineProperty,t=Object.getOwnPropertyDescriptor,n=Object.getOwnPropertyNames,r=Object.prototype.hasOwnProperty,o={};((t,n)=>{for(var r in n)e(t,r,{get:n[r],enumerable:!0})})(o,{createEffect:()=>
|
|
1
|
+
(()=>{"use strict";var e=Object.defineProperty,t=Object.getOwnPropertyDescriptor,n=Object.getOwnPropertyNames,r=Object.prototype.hasOwnProperty,o={};((t,n)=>{for(var r in n)e(t,r,{get:n[r],enumerable:!0})})(o,{createEffect:()=>d,createMutableStore:()=>p,createPulse:()=>y,createPulseStore:()=>h});var s,l=(s=o,((o,s,l,u)=>{if(s&&"object"==typeof s||"function"==typeof s)for(let a of n(s))r.call(o,a)||a===l||e(o,a,{get:()=>s[a],enumerable:!(u=t(s,a))||u.enumerable});return o})(e({},"__esModule",{value:!0}),s)),u=require("valyrian.js"),a=require("valyrian.js/utils"),c=[];function i(e,t){const n=u.current.vnode;if(!n||t.has(n.dom))return;let r=!1,o=n.dom.parentElement;for(;o;){if(t.has(o)){r=!0;break}o=o.parentElement}if(!r){const r=n.dom,o=()=>{(0,u.updateVnode)(r.vnode),r.parentElement||(e.delete(o),t.delete(r))};e.add(o),t.add(r)}}function f(e,t,n=!1){const r=new Set,o=new WeakSet,s={};for(const e in t){if("function"!=typeof t[e])throw new Error(`Pulse '${e}' must be a function`);if("state"===e)throw new Error("A pulse cannot be named 'state'");s[e]=m(e)}const l=("function"==typeof e?e():e)||{};function u(){if(n)throw new Error("You need to call a pulse to modify the state")}let f=null,h=0;const p=new Proxy(l,{get:(e,t)=>{if(f)return f[t];const n=c[c.length-1];return n&&!r.has(n)&&r.add(n),i(r,o),e[t]},set:(e,t,n)=>(u(),Reflect.set(e,t,n),!0),deleteProperty:(e,t)=>(u(),Reflect.deleteProperty(e,t),!0)});function d(e){for(const t in e)l[t]=n?(0,a.deepFreeze)(e[t]):e[t];for(const t in l)t in e||Reflect.deleteProperty(l,t)}let y=null;function w(e,t=!1){h--,(0,a.hasChanged)(l,e)&&(h>0&&!t||(d(e),f=null,y&&clearTimeout(y),y=setTimeout(()=>r.forEach(e=>e()),0)))}function m(e){return function(...n){h++,null===f&&(f=(0,a.deepCloneUnfreeze)(l)),Reflect.set(this,"$flush",async()=>{w(f,!0),f=(0,a.deepCloneUnfreeze)(l),await new Promise(e=>setTimeout(e,0))});const r=async()=>{};try{const o=t[e].apply(this,[f,...n]);return o instanceof Promise?o.then(e=>(w(f),Reflect.set(this,"$flush",r),e)).catch(t=>{throw console.error(`Error in pulse '${e}':`,t),Reflect.set(this,"$flush",r),t}):(w(f),Reflect.set(this,"$flush",r),o)}catch(t){throw console.error(`Error in pulse '${e}':`,t),Reflect.set(this,"$flush",r),t}}}d(l);const P={},b=(e,...t)=>{P[e]&&P[e].forEach(e=>e(...t))},g=new Proxy(s,{get:(e,t)=>{if("state"===t)return p;if("on"===t)return(e,t)=>{P[e]||(P[e]=[]),P[e].push(t)};if("off"===t)return(e,t)=>{P[e]&&(P[e]=P[e].filter(e=>e!==t))};if(!(t in e))throw new Error(`Pulse '${t}' does not exist`);const n=e[t];return"function"==typeof n?(...e)=>{const r=n.apply(g,e);return r instanceof Promise?r.then(n=>(b("pulse",t,e),n)):(b("pulse",t,e),r)}:n}});return g}function h(e,t){return f(e,t,!0)}function p(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."),f(e,t,!1)}function d(e){const t=()=>{try{c.push(t),e()}finally{c.pop()}};t()}function y(e){let t=e;const n=new Set,r=new WeakSet,o=()=>{n.forEach(e=>e())};return[()=>{const e=c[c.length-1];return e&&!n.has(e)&&n.add(e),i(n,r),t},e=>{const n="function"==typeof e?e(t):e;(0,a.hasChanged)(t,n)&&(t=n,o())},o]}"undefined"!=typeof module?module.exports=l:self.ValyrianPulses=l})();//# sourceMappingURL=index.min.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJpbmRleF9leHBvcnRzIiwiX19leHBvcnQiLCJjcmVhdGVFZmZlY3QiLCJjcmVhdGVNdXRhYmxlU3RvcmUiLCJjcmVhdGVQdWxzZSIsImNyZWF0ZVB1bHNlU3RvcmUiLCJfX0VYUE9SVFNfXyIsImltcG9ydF92YWx5cmlhbiIsInJlcXVpcmUiLCJpbXBvcnRfdXRpbHMiLCJlZmZlY3RTdGFjayIsInJlZ2lzdGVyRG9tU3Vic2NyaXB0aW9uIiwic3Vic2NyaWJlcnMiLCJkb21XaXRoVm5vZGVzVG9VcGRhdGUiLCJjdXJyZW50Vm5vZGUiLCJjdXJyZW50Iiwidm5vZGUiLCJoYXMiLCJkb20iLCJoYXNQYXJlbnQiLCJwYXJlbnQiLCJwYXJlbnRFbGVtZW50Iiwic3Vic2NyaXB0aW9uIiwidXBkYXRlVm5vZGUiLCJkZWxldGUiLCJhZGQiLCJjcmVhdGVTdG9yZSIsImluaXRpYWxTdGF0ZSIsInB1bHNlcyIsImltbXV0YWJsZSIsIlNldCIsIldlYWtTZXQiLCJib3VuZFB1bHNlcyIsImtleSIsIkVycm9yIiwiZ2V0UHVsc2VNZXRob2QiLCJsb2NhbFN0YXRlIiwiaXNNdXRhYmxlIiwiY3VycmVudFN0YXRlIiwicHVsc2VDYWxsQ291bnQiLCJwcm94eVN0YXRlIiwiUHJveHkiLCJnZXQiLCJzdGF0ZSIsInByb3AiLCJjdXJyZW50RWZmZWN0IiwibGVuZ3RoIiwic2V0IiwidmFsdWUiLCJSZWZsZWN0IiwiZGVsZXRlUHJvcGVydHkiLCJzeW5jU3RhdGUiLCJuZXdTdGF0ZSIsImRlZXBGcmVlemUiLCJkZWJvdW5jZVRpbWVvdXQiLCJzZXRTdGF0ZSIsImZsdXNoIiwiaGFzQ2hhbmdlZCIsImNsZWFyVGltZW91dCIsInNldFRpbWVvdXQiLCJmb3JFYWNoIiwic3Vic2NyaWJlciIsImFyZ3MiLCJkZWVwQ2xvbmVVbmZyZWV6ZSIsInRoaXMiLCJhc3luYyIsIlByb21pc2UiLCJyZXNvbHZlIiwiZW1wdHlGbHVzaCIsInB1bHNlUmVzdWx0IiwiYXBwbHkiLCJ0aGVuIiwicmVzb2x2ZWRWYWx1ZSIsImNhdGNoIiwiZXJyb3IiLCJjb25zb2xlIiwicHVsc2VzUHJveHkiLCJwdWxzZU1ldGhvZCIsImJpbmQiLCJ3YXJuIiwiZWZmZWN0IiwicnVuRWZmZWN0IiwicHVzaCIsInBvcCIsImluaXRpYWxWYWx1ZSIsInJ1blN1YnNjcmliZXJzIiwibmV3VmFsdWUiXSwic291cmNlcyI6WyIuLi8uLi9saWIvcHVsc2VzL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vLWNvbnNvbGUgKi9cbmltcG9ydCB7IHVwZGF0ZVZub2RlLCBWbm9kZVdpdGhEb20sIGN1cnJlbnQsIERvbUVsZW1lbnQgfSBmcm9tIFwidmFseXJpYW4uanNcIjtcbmltcG9ydCB7IGRlZXBDbG9uZVVuZnJlZXplLCBkZWVwRnJlZXplLCBoYXNDaGFuZ2VkIH0gZnJvbSBcInZhbHlyaWFuLmpzL3V0aWxzXCI7XG5cbnR5cGUgU3RhdGUgPSBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuXG5leHBvcnQgdHlwZSBQdWxzZTxTdGF0ZVR5cGUsIFRSZXR1cm4gPSB1bmtub3duPiA9IChzdGF0ZTogU3RhdGVUeXBlLCAuLi5hcmdzOiBhbnlbXSkgPT4gVFJldHVybiB8IFByb21pc2U8VFJldHVybj47XG5cbmV4cG9ydCB0eXBlIFB1bHNlczxTdGF0ZVR5cGU+ID0gUmVjb3JkPHN0cmluZywgUHVsc2U8U3RhdGVUeXBlLCBhbnk+ICYgeyAkZmx1c2g/OiAoKSA9PiBQcm9taXNlPHZvaWQ+IH0+O1xuXG50eXBlIFByb3h5U3RhdGU8U3RhdGVUeXBlPiA9IFN0YXRlVHlwZSAmIHsgW2tleTogc3RyaW5nXTogYW55IH07XG5cbmNvbnN0IGVmZmVjdFN0YWNrOiBGdW5jdGlvbltdID0gW107XG5cbnR5cGUgU3RvcmVQdWxzZXM8UHVsc2VzVHlwZSBleHRlbmRzIFB1bHNlczxhbnk+PiA9IHtcbiAgW0sgaW4ga2V5b2YgUHVsc2VzVHlwZV06IFB1bHNlc1R5cGVbS10gZXh0ZW5kcyAoc3RhdGU6IGFueSwgLi4uYXJnczogaW5mZXIgQXJncykgPT4gaW5mZXIgUlxuICAgID8gKC4uLmFyZ3M6IEFyZ3MpID0+IFJcbiAgICA6IG5ldmVyO1xufTtcblxuLyoqIEZ1bmNpw7NuIGF1eGlsaWFyIHBhcmEgcmVnaXN0cmFyIGxhIHN1c2NyaXBjacOzbiBhbCBub2RvIERPTS5cbiAqICBSZXRvcm5hIHRydWUgc2kgc2UgYWdyZWfDsyBsYSBzdXNjcmlwY2nDs24sIG8gZmFsc2Ugc2kgc2UgZW5jb250csOzIHVuIG5vZG8gcGFkcmUgeWEgc3VzY3JpdG8uXG4gKi9cbmZ1bmN0aW9uIHJlZ2lzdGVyRG9tU3Vic2NyaXB0aW9uKHN1YnNjcmliZXJzOiBTZXQ8RnVuY3Rpb24+LCBkb21XaXRoVm5vZGVzVG9VcGRhdGU6IFdlYWtTZXQ8RG9tRWxlbWVudD4pOiB2b2lkIHtcbiAgY29uc3QgY3VycmVudFZub2RlID0gY3VycmVudC52bm9kZSBhcyBWbm9kZVdpdGhEb207XG4gIGlmICghY3VycmVudFZub2RlIHx8IGRvbVdpdGhWbm9kZXNUb1VwZGF0ZS5oYXMoY3VycmVudFZub2RlLmRvbSkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBsZXQgaGFzUGFyZW50ID0gZmFsc2U7XG4gIGxldCBwYXJlbnQgPSBjdXJyZW50Vm5vZGUuZG9tLnBhcmVudEVsZW1lbnQgYXMgRG9tRWxlbWVudDtcbiAgd2hpbGUgKHBhcmVudCkge1xuICAgIGlmIChkb21XaXRoVm5vZGVzVG9VcGRhdGUuaGFzKHBhcmVudCkpIHtcbiAgICAgIGhhc1BhcmVudCA9IHRydWU7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgcGFyZW50ID0gcGFyZW50LnBhcmVudEVsZW1lbnQgYXMgRG9tRWxlbWVudDtcbiAgfVxuXG4gIC8vIFNpIG5vIGhheSBub2RvIHBhZHJlIHJlZ2lzdHJhZG8sIHNlIGNyZWEgbGEgc3VzY3JpcGNpw7NuLlxuICBpZiAoIWhhc1BhcmVudCkge1xuICAgIGNvbnN0IGRvbSA9IGN1cnJlbnRWbm9kZS5kb207XG4gICAgY29uc3Qgc3Vic2NyaXB0aW9uID0gKCkgPT4ge1xuICAgICAgdXBkYXRlVm5vZGUoZG9tLnZub2RlKTtcbiAgICAgIGlmICghZG9tLnBhcmVudEVsZW1lbnQpIHtcbiAgICAgICAgc3Vic2NyaWJlcnMuZGVsZXRlKHN1YnNjcmlwdGlvbik7XG4gICAgICAgIGRvbVdpdGhWbm9kZXNUb1VwZGF0ZS5kZWxldGUoZG9tKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHN1YnNjcmliZXJzLmFkZChzdWJzY3JpcHRpb24pO1xuICAgIGRvbVdpdGhWbm9kZXNUb1VwZGF0ZS5hZGQoZG9tKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVTdG9yZTxTdGF0ZVR5cGUgZXh0ZW5kcyBTdGF0ZSwgUHVsc2VzVHlwZSBleHRlbmRzIFB1bHNlczxTdGF0ZVR5cGU+PihcbiAgaW5pdGlhbFN0YXRlOiBTdGF0ZVR5cGUgfCAoKCkgPT4gU3RhdGVUeXBlKSB8IG51bGwsXG4gIHB1bHNlczogUHVsc2VzVHlwZSxcbiAgaW1tdXRhYmxlID0gZmFsc2Vcbik6IFN0b3JlUHVsc2VzPFB1bHNlc1R5cGU+ICYgeyBzdGF0ZTogUHJveHlTdGF0ZTxTdGF0ZVR5cGU+IH0ge1xuICBjb25zdCBzdWJzY3JpYmVycyA9IG5ldyBTZXQ8RnVuY3Rpb24+KCk7XG4gIGNvbnN0IGRvbVdpdGhWbm9kZXNUb1VwZGF0ZSA9IG5ldyBXZWFrU2V0PERvbUVsZW1lbnQ+KCk7XG5cbiAgY29uc3QgYm91bmRQdWxzZXM6IFB1bHNlczxTdGF0ZVR5cGU+ID0ge307XG4gIGZvciAoY29uc3Qga2V5IGluIHB1bHNlcykge1xuICAgIGlmICh0eXBlb2YgcHVsc2VzW2tleV0gIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBQdWxzZSAnJHtrZXl9JyBtdXN0IGJlIGEgZnVuY3Rpb25gKTtcbiAgICB9XG4gICAgaWYgKGtleSA9PT0gXCJzdGF0ZVwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEEgcHVsc2UgY2Fubm90IGJlIG5hbWVkICdzdGF0ZSdgKTtcbiAgICB9XG4gICAgYm91bmRQdWxzZXNba2V5XSA9IGdldFB1bHNlTWV0aG9kKGtleSk7XG4gIH1cblxuICBjb25zdCBsb2NhbFN0YXRlOiBTdGF0ZVR5cGUgPVxuICAgICh0eXBlb2YgaW5pdGlhbFN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyBpbml0aWFsU3RhdGUoKSA6IGluaXRpYWxTdGF0ZSkgfHwgKHt9IGFzIFN0YXRlVHlwZSk7XG5cbiAgZnVuY3Rpb24gaXNNdXRhYmxlKCkge1xuICAgIGlmIChpbW11dGFibGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIllvdSBuZWVkIHRvIGNhbGwgYSBwdWxzZSB0byBtb2RpZnkgdGhlIHN0YXRlXCIpO1xuICAgIH1cbiAgfVxuXG4gIGxldCBjdXJyZW50U3RhdGU6IFN0YXRlVHlwZSB8IG51bGwgPSBudWxsO1xuICBsZXQgcHVsc2VDYWxsQ291bnQgPSAwO1xuXG4gIGNvbnN0IHByb3h5U3RhdGUgPSBuZXcgUHJveHkobG9jYWxTdGF0ZSwge1xuICAgIGdldDogKHN0YXRlLCBwcm9wOiBzdHJpbmcpID0+IHtcbiAgICAgIC8vIElmIHdlIGFyZSBpbiBhIHB1bHNlLCB3ZSByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBjbG9uZWQgc3RhdGUuXG4gICAgICBpZiAoY3VycmVudFN0YXRlKSB7XG4gICAgICAgIHJldHVybiBjdXJyZW50U3RhdGVbcHJvcF07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGN1cnJlbnRFZmZlY3QgPSBlZmZlY3RTdGFja1tlZmZlY3RTdGFjay5sZW5ndGggLSAxXTtcbiAgICAgIGlmIChjdXJyZW50RWZmZWN0ICYmICFzdWJzY3JpYmVycy5oYXMoY3VycmVudEVmZmVjdCkpIHtcbiAgICAgICAgc3Vic2NyaWJlcnMuYWRkKGN1cnJlbnRFZmZlY3QpO1xuICAgICAgfVxuXG4gICAgICByZWdpc3RlckRvbVN1YnNjcmlwdGlvbihzdWJzY3JpYmVycywgZG9tV2l0aFZub2Rlc1RvVXBkYXRlKTtcblxuICAgICAgcmV0dXJuIHN0YXRlW3Byb3BdO1xuICAgIH0sXG4gICAgc2V0OiAoc3RhdGUsIHByb3A6IHN0cmluZywgdmFsdWU6IGFueSkgPT4ge1xuICAgICAgaXNNdXRhYmxlKCk7XG4gICAgICBSZWZsZWN0LnNldChzdGF0ZSwgcHJvcCwgdmFsdWUpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbiAgICBkZWxldGVQcm9wZXJ0eTogKHN0YXRlLCBwcm9wOiBzdHJpbmcpID0+IHtcbiAgICAgIGlzTXV0YWJsZSgpO1xuICAgICAgUmVmbGVjdC5kZWxldGVQcm9wZXJ0eShzdGF0ZSwgcHJvcCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0pO1xuXG4gIGZ1bmN0aW9uIHN5bmNTdGF0ZShuZXdTdGF0ZTogU3RhdGVUeXBlKSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gbmV3U3RhdGUpIHtcbiAgICAgIGxvY2FsU3RhdGVba2V5XSA9IGltbXV0YWJsZSA/IGRlZXBGcmVlemUobmV3U3RhdGVba2V5XSkgOiBuZXdTdGF0ZVtrZXldO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBsb2NhbFN0YXRlKSB7XG4gICAgICBpZiAoIShrZXkgaW4gbmV3U3RhdGUpKSB7XG4gICAgICAgIFJlZmxlY3QuZGVsZXRlUHJvcGVydHkobG9jYWxTdGF0ZSwga2V5KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBsZXQgZGVib3VuY2VUaW1lb3V0OiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGwgPSBudWxsO1xuICBmdW5jdGlvbiBkZWJvdW5jZWRVcGRhdGUoKSB7XG4gICAgaWYgKGRlYm91bmNlVGltZW91dCkge1xuICAgICAgY2xlYXJUaW1lb3V0KGRlYm91bmNlVGltZW91dCk7XG4gICAgfVxuICAgIGRlYm91bmNlVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gc3Vic2NyaWJlcnMuZm9yRWFjaCgoc3Vic2NyaWJlcikgPT4gc3Vic2NyaWJlcigpKSwgMCk7XG4gIH1cblxuICBmdW5jdGlvbiBzZXRTdGF0ZShuZXdTdGF0ZTogU3RhdGVUeXBlLCBmbHVzaCA9IGZhbHNlKSB7XG4gICAgcHVsc2VDYWxsQ291bnQtLTtcbiAgICBpZiAoIWhhc0NoYW5nZWQobG9jYWxTdGF0ZSwgbmV3U3RhdGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChwdWxzZUNhbGxDb3VudCA+IDAgJiYgIWZsdXNoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHN5bmNTdGF0ZShuZXdTdGF0ZSk7XG4gICAgY3VycmVudFN0YXRlID0gbnVsbDtcbiAgICBkZWJvdW5jZWRVcGRhdGUoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFB1bHNlTWV0aG9kKGtleTogc3RyaW5nKSB7XG4gICAgZnVuY3Rpb24gcHVsc2VNZXRob2QodGhpczogUHVsc2U8U3RhdGVUeXBlLCBhbnk+ICYgeyAkZmx1c2g6ICgpID0+IFByb21pc2U8dm9pZD4gfSwgLi4uYXJnczogYW55W10pIHtcbiAgICAgIHB1bHNlQ2FsbENvdW50Kys7XG4gICAgICBpZiAoY3VycmVudFN0YXRlID09PSBudWxsKSB7XG4gICAgICAgIGN1cnJlbnRTdGF0ZSA9IGRlZXBDbG9uZVVuZnJlZXplKGxvY2FsU3RhdGUpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCAkZmx1c2ggPSBhc3luYyAoKSA9PiB7XG4gICAgICAgIHNldFN0YXRlKGN1cnJlbnRTdGF0ZSBhcyBTdGF0ZVR5cGUsIHRydWUpO1xuICAgICAgICBjdXJyZW50U3RhdGUgPSBkZWVwQ2xvbmVVbmZyZWV6ZShsb2NhbFN0YXRlKTtcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMCkpO1xuICAgICAgfTtcblxuICAgICAgUmVmbGVjdC5zZXQodGhpcywgXCIkZmx1c2hcIiwgJGZsdXNoKTtcbiAgICAgIGNvbnN0IGVtcHR5Rmx1c2ggPSBhc3luYyAoKSA9PiB7fTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcHVsc2VSZXN1bHQgPSBwdWxzZXNba2V5XS5hcHBseSh0aGlzLCBbY3VycmVudFN0YXRlLCAuLi5hcmdzXSk7XG4gICAgICAgIGlmIChwdWxzZVJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICByZXR1cm4gcHVsc2VSZXN1bHRcbiAgICAgICAgICAgIC50aGVuKChyZXNvbHZlZFZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgIHNldFN0YXRlKGN1cnJlbnRTdGF0ZSBhcyBTdGF0ZVR5cGUpO1xuICAgICAgICAgICAgICBSZWZsZWN0LnNldCh0aGlzLCBcIiRmbHVzaFwiLCBlbXB0eUZsdXNoKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVkVmFsdWU7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBFcnJvciBpbiBwdWxzZSAnJHtrZXl9JzpgLCBlcnJvcik7XG4gICAgICAgICAgICAgIFJlZmxlY3Quc2V0KHRoaXMsIFwiJGZsdXNoXCIsIGVtcHR5Rmx1c2gpO1xuICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNldFN0YXRlKGN1cnJlbnRTdGF0ZSk7XG4gICAgICAgICAgUmVmbGVjdC5zZXQodGhpcywgXCIkZmx1c2hcIiwgZW1wdHlGbHVzaCk7XG4gICAgICAgICAgcmV0dXJuIHB1bHNlUmVzdWx0O1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBFcnJvciBpbiBwdWxzZSAnJHtrZXl9JzpgLCBlcnJvcik7XG4gICAgICAgIFJlZmxlY3Quc2V0KHRoaXMsIFwiJGZsdXNoXCIsIGVtcHR5Rmx1c2gpO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcHVsc2VNZXRob2Q7XG4gIH1cblxuICBzeW5jU3RhdGUobG9jYWxTdGF0ZSk7XG5cbiAgY29uc3QgcHVsc2VzUHJveHkgPSBuZXcgUHJveHkoYm91bmRQdWxzZXMsIHtcbiAgICBnZXQ6IChwdWxzZXMsIHByb3A6IHN0cmluZykgPT4ge1xuICAgICAgaWYgKHByb3AgPT09IFwic3RhdGVcIikge1xuICAgICAgICByZXR1cm4gcHJveHlTdGF0ZTtcbiAgICAgIH1cbiAgICAgIGlmICghKHByb3AgaW4gcHVsc2VzKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFB1bHNlICcke3Byb3B9JyBkb2VzIG5vdCBleGlzdGApO1xuICAgICAgfVxuICAgICAgY29uc3QgcHVsc2VNZXRob2QgPSBwdWxzZXNbcHJvcF07XG5cbiAgICAgIGlmICh0eXBlb2YgcHVsc2VNZXRob2QgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICByZXR1cm4gcHVsc2VNZXRob2QuYmluZChwdWxzZXNQcm94eSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwdWxzZU1ldGhvZDtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBwdWxzZXNQcm94eSBhcyBTdG9yZVB1bHNlczxQdWxzZXNUeXBlPiAmIHsgc3RhdGU6IFByb3h5U3RhdGU8U3RhdGVUeXBlPiB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUHVsc2VTdG9yZTxTdGF0ZVR5cGUgZXh0ZW5kcyBTdGF0ZSwgUHVsc2VzVHlwZSBleHRlbmRzIFB1bHNlczxTdGF0ZVR5cGU+PihcbiAgaW5pdGlhbFN0YXRlOiBTdGF0ZVR5cGUsXG4gIHB1bHNlczogUHVsc2VzVHlwZVxuKTogU3RvcmVQdWxzZXM8UHVsc2VzVHlwZT4gJiB7IHN0YXRlOiBQcm94eVN0YXRlPFN0YXRlVHlwZT4gfSB7XG4gIHJldHVybiBjcmVhdGVTdG9yZShpbml0aWFsU3RhdGUsIHB1bHNlcywgdHJ1ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVNdXRhYmxlU3RvcmU8U3RhdGVUeXBlIGV4dGVuZHMgU3RhdGUsIFB1bHNlc1R5cGUgZXh0ZW5kcyBQdWxzZXM8U3RhdGVUeXBlPj4oXG4gIGluaXRpYWxTdGF0ZTogU3RhdGVUeXBlLFxuICBwdWxzZXM6IFB1bHNlc1R5cGVcbik6IFN0b3JlUHVsc2VzPFB1bHNlc1R5cGU+ICYgeyBzdGF0ZTogUHJveHlTdGF0ZTxTdGF0ZVR5cGU+IH0ge1xuICBjb25zb2xlLndhcm4oXG4gICAgXCJXYXJuaW5nOiBZb3UgYXJlIHdvcmtpbmcgd2l0aCBhIG11dGFibGUgc3RhdGUuIFRoaXMgY2FuIGxlYWQgdG8gdW5wcmVkaWN0YWJsZSBiZWhhdmlvci4gQWxsIHN0YXRlIGNoYW5nZXMgbWFkZSBvdXRzaWRlIG9mIGEgcHVsc2Ugd2lsbCBub3QgdHJpZ2dlciBhIHJlLXJlbmRlci5cIlxuICApO1xuICByZXR1cm4gY3JlYXRlU3RvcmUoaW5pdGlhbFN0YXRlLCBwdWxzZXMsIGZhbHNlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUVmZmVjdChlZmZlY3Q6IEZ1bmN0aW9uKSB7XG4gIGNvbnN0IHJ1bkVmZmVjdCA9ICgpID0+IHtcbiAgICB0cnkge1xuICAgICAgZWZmZWN0U3RhY2sucHVzaChydW5FZmZlY3QpO1xuICAgICAgZWZmZWN0KCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGVmZmVjdFN0YWNrLnBvcCgpO1xuICAgIH1cbiAgfTtcbiAgcnVuRWZmZWN0KCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQdWxzZTxUPihpbml0aWFsVmFsdWU6IFQpOiBbKCkgPT4gVCwgKG5ld1ZhbHVlOiBUIHwgKChjdXJyZW50OiBUKSA9PiBUKSkgPT4gdm9pZCwgKCkgPT4gdm9pZF0ge1xuICBsZXQgdmFsdWUgPSBpbml0aWFsVmFsdWU7XG4gIGNvbnN0IHN1YnNjcmliZXJzID0gbmV3IFNldDxGdW5jdGlvbj4oKTtcbiAgY29uc3QgZG9tV2l0aFZub2Rlc1RvVXBkYXRlID0gbmV3IFdlYWtTZXQ8RG9tRWxlbWVudD4oKTtcblxuICBjb25zdCBydW5TdWJzY3JpYmVycyA9ICgpID0+IHtcbiAgICBzdWJzY3JpYmVycy5mb3JFYWNoKChzdWJzY3JpYmVyKSA9PiBzdWJzY3JpYmVyKCkpO1xuICB9O1xuXG4gIGNvbnN0IHJlYWQgPSAoKTogVCA9PiB7XG4gICAgY29uc3QgY3VycmVudEVmZmVjdCA9IGVmZmVjdFN0YWNrW2VmZmVjdFN0YWNrLmxlbmd0aCAtIDFdO1xuICAgIGlmIChjdXJyZW50RWZmZWN0ICYmICFzdWJzY3JpYmVycy5oYXMoY3VycmVudEVmZmVjdCkpIHtcbiAgICAgIHN1YnNjcmliZXJzLmFkZChjdXJyZW50RWZmZWN0KTtcbiAgICB9XG4gICAgcmVnaXN0ZXJEb21TdWJzY3JpcHRpb24oc3Vic2NyaWJlcnMsIGRvbVdpdGhWbm9kZXNUb1VwZGF0ZSk7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9O1xuXG4gIGNvbnN0IHdyaXRlID0gKG5ld1ZhbHVlOiBUIHwgKChjdXJyZW50OiBUKSA9PiBUKSk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IHJlc29sdmVkVmFsdWUgPSB0eXBlb2YgbmV3VmFsdWUgPT09IFwiZnVuY3Rpb25cIiA/IChuZXdWYWx1ZSBhcyAoY3VycmVudDogVCkgPT4gVCkodmFsdWUpIDogbmV3VmFsdWU7XG4gICAgaWYgKCFoYXNDaGFuZ2VkKHZhbHVlLCByZXNvbHZlZFZhbHVlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YWx1ZSA9IHJlc29sdmVkVmFsdWU7XG4gICAgcnVuU3Vic2NyaWJlcnMoKTtcbiAgfTtcblxuICByZXR1cm4gW3JlYWQsIHdyaXRlLCBydW5TdWJzY3JpYmVyc107XG59XG4iXSwibWFwcGluZ3MiOiJnSkFBQUEsRUFBQSxHLHlEQUFBQyxDQUFBRCxFQUFBLENBQUFFLGFBQUEsSUFBQUEsRUFBQUMsbUJBQUEsSUFBQUEsRUFBQUMsWUFBQSxJQUFBQSxFQUFBQyxpQkFBQSxJQUFBQSxJQUFBLEksRUFBQUMsRyxFQUFBTixFLDBNQUNBTyxFQUErREMsUUFBQSxlQUMvREMsRUFB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
|
|
1
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJpbmRleF9leHBvcnRzIiwiX19leHBvcnQiLCJjcmVhdGVFZmZlY3QiLCJjcmVhdGVNdXRhYmxlU3RvcmUiLCJjcmVhdGVQdWxzZSIsImNyZWF0ZVB1bHNlU3RvcmUiLCJfX0VYUE9SVFNfXyIsImltcG9ydF92YWx5cmlhbiIsInJlcXVpcmUiLCJpbXBvcnRfdXRpbHMiLCJlZmZlY3RTdGFjayIsInJlZ2lzdGVyRG9tU3Vic2NyaXB0aW9uIiwic3Vic2NyaWJlcnMiLCJkb21XaXRoVm5vZGVzVG9VcGRhdGUiLCJjdXJyZW50Vm5vZGUiLCJjdXJyZW50Iiwidm5vZGUiLCJoYXMiLCJkb20iLCJoYXNQYXJlbnQiLCJwYXJlbnQiLCJwYXJlbnRFbGVtZW50Iiwic3Vic2NyaXB0aW9uIiwidXBkYXRlVm5vZGUiLCJkZWxldGUiLCJhZGQiLCJjcmVhdGVTdG9yZSIsImluaXRpYWxTdGF0ZSIsInB1bHNlcyIsImltbXV0YWJsZSIsIlNldCIsIldlYWtTZXQiLCJib3VuZFB1bHNlcyIsImtleSIsIkVycm9yIiwiZ2V0UHVsc2VNZXRob2QiLCJsb2NhbFN0YXRlIiwiaXNNdXRhYmxlIiwiY3VycmVudFN0YXRlIiwicHVsc2VDYWxsQ291bnQiLCJwcm94eVN0YXRlIiwiUHJveHkiLCJnZXQiLCJzdGF0ZSIsInByb3AiLCJjdXJyZW50RWZmZWN0IiwibGVuZ3RoIiwic2V0IiwidmFsdWUiLCJSZWZsZWN0IiwiZGVsZXRlUHJvcGVydHkiLCJzeW5jU3RhdGUiLCJuZXdTdGF0ZSIsImRlZXBGcmVlemUiLCJkZWJvdW5jZVRpbWVvdXQiLCJzZXRTdGF0ZSIsImZsdXNoIiwiaGFzQ2hhbmdlZCIsImNsZWFyVGltZW91dCIsInNldFRpbWVvdXQiLCJmb3JFYWNoIiwic3Vic2NyaWJlciIsImFyZ3MiLCJkZWVwQ2xvbmVVbmZyZWV6ZSIsInRoaXMiLCJhc3luYyIsIlByb21pc2UiLCJyZXNvbHZlIiwiZW1wdHlGbHVzaCIsInB1bHNlUmVzdWx0IiwiYXBwbHkiLCJ0aGVuIiwicmVzb2x2ZWRWYWx1ZSIsImNhdGNoIiwiZXJyb3IiLCJjb25zb2xlIiwibGlzdGVuZXJzIiwidHJpZ2dlciIsImV2ZW50IiwiY2FsbGJhY2siLCJwdWxzZXNQcm94eSIsInB1c2giLCJmaWx0ZXIiLCJjYiIsInB1bHNlTWV0aG9kIiwicmVzdWx0IiwiciIsIndhcm4iLCJlZmZlY3QiLCJydW5FZmZlY3QiLCJwb3AiLCJpbml0aWFsVmFsdWUiLCJydW5TdWJzY3JpYmVycyIsIm5ld1ZhbHVlIl0sInNvdXJjZXMiOlsiLi4vLi4vbGliL3B1bHNlcy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBuby1jb25zb2xlICovXG5pbXBvcnQgeyB1cGRhdGVWbm9kZSwgVm5vZGVXaXRoRG9tLCBjdXJyZW50LCBEb21FbGVtZW50IH0gZnJvbSBcInZhbHlyaWFuLmpzXCI7XG5pbXBvcnQgeyBkZWVwQ2xvbmVVbmZyZWV6ZSwgZGVlcEZyZWV6ZSwgaGFzQ2hhbmdlZCB9IGZyb20gXCJ2YWx5cmlhbi5qcy91dGlsc1wiO1xuXG50eXBlIFN0YXRlID0gUmVjb3JkPHN0cmluZywgYW55PjtcblxuZXhwb3J0IHR5cGUgUHVsc2U8U3RhdGVUeXBlLCBUUmV0dXJuID0gdW5rbm93bj4gPSAoc3RhdGU6IFN0YXRlVHlwZSwgLi4uYXJnczogYW55W10pID0+IFRSZXR1cm4gfCBQcm9taXNlPFRSZXR1cm4+O1xuXG5leHBvcnQgdHlwZSBQdWxzZXM8U3RhdGVUeXBlPiA9IFJlY29yZDxzdHJpbmcsIFB1bHNlPFN0YXRlVHlwZSwgYW55PiAmIHsgJGZsdXNoPzogKCkgPT4gUHJvbWlzZTx2b2lkPiB9PjtcblxudHlwZSBQcm94eVN0YXRlPFN0YXRlVHlwZT4gPSBTdGF0ZVR5cGUgJiB7IFtrZXk6IHN0cmluZ106IGFueSB9O1xuXG5jb25zdCBlZmZlY3RTdGFjazogRnVuY3Rpb25bXSA9IFtdO1xuXG50eXBlIFN0b3JlUHVsc2VzPFB1bHNlc1R5cGUgZXh0ZW5kcyBQdWxzZXM8YW55Pj4gPSB7XG4gIFtLIGluIGtleW9mIFB1bHNlc1R5cGVdOiBQdWxzZXNUeXBlW0tdIGV4dGVuZHMgKHN0YXRlOiBhbnksIC4uLmFyZ3M6IGluZmVyIEFyZ3MpID0+IGluZmVyIFJcbiAgICA/ICguLi5hcmdzOiBBcmdzKSA9PiBSXG4gICAgOiBuZXZlcjtcbn07XG5cbi8qKiBGdW5jacOzbiBhdXhpbGlhciBwYXJhIHJlZ2lzdHJhciBsYSBzdXNjcmlwY2nDs24gYWwgbm9kbyBET00uXG4gKiAgUmV0b3JuYSB0cnVlIHNpIHNlIGFncmVnw7MgbGEgc3VzY3JpcGNpw7NuLCBvIGZhbHNlIHNpIHNlIGVuY29udHLDsyB1biBub2RvIHBhZHJlIHlhIHN1c2NyaXRvLlxuICovXG5mdW5jdGlvbiByZWdpc3RlckRvbVN1YnNjcmlwdGlvbihzdWJzY3JpYmVyczogU2V0PEZ1bmN0aW9uPiwgZG9tV2l0aFZub2Rlc1RvVXBkYXRlOiBXZWFrU2V0PERvbUVsZW1lbnQ+KTogdm9pZCB7XG4gIGNvbnN0IGN1cnJlbnRWbm9kZSA9IGN1cnJlbnQudm5vZGUgYXMgVm5vZGVXaXRoRG9tO1xuICBpZiAoIWN1cnJlbnRWbm9kZSB8fCBkb21XaXRoVm5vZGVzVG9VcGRhdGUuaGFzKGN1cnJlbnRWbm9kZS5kb20pKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbGV0IGhhc1BhcmVudCA9IGZhbHNlO1xuICBsZXQgcGFyZW50ID0gY3VycmVudFZub2RlLmRvbS5wYXJlbnRFbGVtZW50IGFzIERvbUVsZW1lbnQ7XG4gIHdoaWxlIChwYXJlbnQpIHtcbiAgICBpZiAoZG9tV2l0aFZub2Rlc1RvVXBkYXRlLmhhcyhwYXJlbnQpKSB7XG4gICAgICBoYXNQYXJlbnQgPSB0cnVlO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnRFbGVtZW50IGFzIERvbUVsZW1lbnQ7XG4gIH1cblxuICAvLyBTaSBubyBoYXkgbm9kbyBwYWRyZSByZWdpc3RyYWRvLCBzZSBjcmVhIGxhIHN1c2NyaXBjacOzbi5cbiAgaWYgKCFoYXNQYXJlbnQpIHtcbiAgICBjb25zdCBkb20gPSBjdXJyZW50Vm5vZGUuZG9tO1xuICAgIGNvbnN0IHN1YnNjcmlwdGlvbiA9ICgpID0+IHtcbiAgICAgIHVwZGF0ZVZub2RlKGRvbS52bm9kZSk7XG4gICAgICBpZiAoIWRvbS5wYXJlbnRFbGVtZW50KSB7XG4gICAgICAgIHN1YnNjcmliZXJzLmRlbGV0ZShzdWJzY3JpcHRpb24pO1xuICAgICAgICBkb21XaXRoVm5vZGVzVG9VcGRhdGUuZGVsZXRlKGRvbSk7XG4gICAgICB9XG4gICAgfTtcbiAgICBzdWJzY3JpYmVycy5hZGQoc3Vic2NyaXB0aW9uKTtcbiAgICBkb21XaXRoVm5vZGVzVG9VcGRhdGUuYWRkKGRvbSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlU3RvcmU8U3RhdGVUeXBlIGV4dGVuZHMgU3RhdGUsIFB1bHNlc1R5cGUgZXh0ZW5kcyBQdWxzZXM8U3RhdGVUeXBlPj4oXG4gIGluaXRpYWxTdGF0ZTogU3RhdGVUeXBlIHwgKCgpID0+IFN0YXRlVHlwZSkgfCBudWxsLFxuICBwdWxzZXM6IFB1bHNlc1R5cGUsXG4gIGltbXV0YWJsZSA9IGZhbHNlXG4pOiBTdG9yZVB1bHNlczxQdWxzZXNUeXBlPiAmIHtcbiAgc3RhdGU6IFByb3h5U3RhdGU8U3RhdGVUeXBlPjtcbiAgb246IChldmVudDogc3RyaW5nLCBjYWxsYmFjazogRnVuY3Rpb24pID0+IHZvaWQ7XG4gIG9mZjogKGV2ZW50OiBzdHJpbmcsIGNhbGxiYWNrOiBGdW5jdGlvbikgPT4gdm9pZDtcbn0ge1xuICBjb25zdCBzdWJzY3JpYmVycyA9IG5ldyBTZXQ8RnVuY3Rpb24+KCk7XG4gIGNvbnN0IGRvbVdpdGhWbm9kZXNUb1VwZGF0ZSA9IG5ldyBXZWFrU2V0PERvbUVsZW1lbnQ+KCk7XG5cbiAgY29uc3QgYm91bmRQdWxzZXM6IFB1bHNlczxTdGF0ZVR5cGU+ID0ge307XG4gIGZvciAoY29uc3Qga2V5IGluIHB1bHNlcykge1xuICAgIGlmICh0eXBlb2YgcHVsc2VzW2tleV0gIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBQdWxzZSAnJHtrZXl9JyBtdXN0IGJlIGEgZnVuY3Rpb25gKTtcbiAgICB9XG4gICAgaWYgKGtleSA9PT0gXCJzdGF0ZVwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEEgcHVsc2UgY2Fubm90IGJlIG5hbWVkICdzdGF0ZSdgKTtcbiAgICB9XG4gICAgYm91bmRQdWxzZXNba2V5XSA9IGdldFB1bHNlTWV0aG9kKGtleSk7XG4gIH1cblxuICBjb25zdCBsb2NhbFN0YXRlOiBTdGF0ZVR5cGUgPVxuICAgICh0eXBlb2YgaW5pdGlhbFN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyBpbml0aWFsU3RhdGUoKSA6IGluaXRpYWxTdGF0ZSkgfHwgKHt9IGFzIFN0YXRlVHlwZSk7XG5cbiAgZnVuY3Rpb24gaXNNdXRhYmxlKCkge1xuICAgIGlmIChpbW11dGFibGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIllvdSBuZWVkIHRvIGNhbGwgYSBwdWxzZSB0byBtb2RpZnkgdGhlIHN0YXRlXCIpO1xuICAgIH1cbiAgfVxuXG4gIGxldCBjdXJyZW50U3RhdGU6IFN0YXRlVHlwZSB8IG51bGwgPSBudWxsO1xuICBsZXQgcHVsc2VDYWxsQ291bnQgPSAwO1xuXG4gIGNvbnN0IHByb3h5U3RhdGUgPSBuZXcgUHJveHkobG9jYWxTdGF0ZSwge1xuICAgIGdldDogKHN0YXRlLCBwcm9wOiBzdHJpbmcpID0+IHtcbiAgICAgIC8vIElmIHdlIGFyZSBpbiBhIHB1bHNlLCB3ZSByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBjbG9uZWQgc3RhdGUuXG4gICAgICBpZiAoY3VycmVudFN0YXRlKSB7XG4gICAgICAgIHJldHVybiBjdXJyZW50U3RhdGVbcHJvcF07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGN1cnJlbnRFZmZlY3QgPSBlZmZlY3RTdGFja1tlZmZlY3RTdGFjay5sZW5ndGggLSAxXTtcbiAgICAgIGlmIChjdXJyZW50RWZmZWN0ICYmICFzdWJzY3JpYmVycy5oYXMoY3VycmVudEVmZmVjdCkpIHtcbiAgICAgICAgc3Vic2NyaWJlcnMuYWRkKGN1cnJlbnRFZmZlY3QpO1xuICAgICAgfVxuXG4gICAgICByZWdpc3RlckRvbVN1YnNjcmlwdGlvbihzdWJzY3JpYmVycywgZG9tV2l0aFZub2Rlc1RvVXBkYXRlKTtcblxuICAgICAgcmV0dXJuIHN0YXRlW3Byb3BdO1xuICAgIH0sXG4gICAgc2V0OiAoc3RhdGUsIHByb3A6IHN0cmluZywgdmFsdWU6IGFueSkgPT4ge1xuICAgICAgaXNNdXRhYmxlKCk7XG4gICAgICBSZWZsZWN0LnNldChzdGF0ZSwgcHJvcCwgdmFsdWUpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbiAgICBkZWxldGVQcm9wZXJ0eTogKHN0YXRlLCBwcm9wOiBzdHJpbmcpID0+IHtcbiAgICAgIGlzTXV0YWJsZSgpO1xuICAgICAgUmVmbGVjdC5kZWxldGVQcm9wZXJ0eShzdGF0ZSwgcHJvcCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0pO1xuXG4gIGZ1bmN0aW9uIHN5bmNTdGF0ZShuZXdTdGF0ZTogU3RhdGVUeXBlKSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gbmV3U3RhdGUpIHtcbiAgICAgIGxvY2FsU3RhdGVba2V5XSA9IGltbXV0YWJsZSA/IGRlZXBGcmVlemUobmV3U3RhdGVba2V5XSkgOiBuZXdTdGF0ZVtrZXldO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBsb2NhbFN0YXRlKSB7XG4gICAgICBpZiAoIShrZXkgaW4gbmV3U3RhdGUpKSB7XG4gICAgICAgIFJlZmxlY3QuZGVsZXRlUHJvcGVydHkobG9jYWxTdGF0ZSwga2V5KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBsZXQgZGVib3VuY2VUaW1lb3V0OiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGwgPSBudWxsO1xuICBmdW5jdGlvbiBkZWJvdW5jZWRVcGRhdGUoKSB7XG4gICAgaWYgKGRlYm91bmNlVGltZW91dCkge1xuICAgICAgY2xlYXJUaW1lb3V0KGRlYm91bmNlVGltZW91dCk7XG4gICAgfVxuICAgIGRlYm91bmNlVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gc3Vic2NyaWJlcnMuZm9yRWFjaCgoc3Vic2NyaWJlcikgPT4gc3Vic2NyaWJlcigpKSwgMCk7XG4gIH1cblxuICBmdW5jdGlvbiBzZXRTdGF0ZShuZXdTdGF0ZTogU3RhdGVUeXBlLCBmbHVzaCA9IGZhbHNlKSB7XG4gICAgcHVsc2VDYWxsQ291bnQtLTtcbiAgICBpZiAoIWhhc0NoYW5nZWQobG9jYWxTdGF0ZSwgbmV3U3RhdGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChwdWxzZUNhbGxDb3VudCA+IDAgJiYgIWZsdXNoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHN5bmNTdGF0ZShuZXdTdGF0ZSk7XG4gICAgY3VycmVudFN0YXRlID0gbnVsbDtcbiAgICBkZWJvdW5jZWRVcGRhdGUoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFB1bHNlTWV0aG9kKGtleTogc3RyaW5nKSB7XG4gICAgZnVuY3Rpb24gcHVsc2VNZXRob2QodGhpczogUHVsc2U8U3RhdGVUeXBlLCBhbnk+ICYgeyAkZmx1c2g6ICgpID0+IFByb21pc2U8dm9pZD4gfSwgLi4uYXJnczogYW55W10pIHtcbiAgICAgIHB1bHNlQ2FsbENvdW50Kys7XG4gICAgICBpZiAoY3VycmVudFN0YXRlID09PSBudWxsKSB7XG4gICAgICAgIGN1cnJlbnRTdGF0ZSA9IGRlZXBDbG9uZVVuZnJlZXplKGxvY2FsU3RhdGUpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCAkZmx1c2ggPSBhc3luYyAoKSA9PiB7XG4gICAgICAgIHNldFN0YXRlKGN1cnJlbnRTdGF0ZSBhcyBTdGF0ZVR5cGUsIHRydWUpO1xuICAgICAgICBjdXJyZW50U3RhdGUgPSBkZWVwQ2xvbmVVbmZyZWV6ZShsb2NhbFN0YXRlKTtcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMCkpO1xuICAgICAgfTtcblxuICAgICAgUmVmbGVjdC5zZXQodGhpcywgXCIkZmx1c2hcIiwgJGZsdXNoKTtcbiAgICAgIGNvbnN0IGVtcHR5Rmx1c2ggPSBhc3luYyAoKSA9PiB7fTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcHVsc2VSZXN1bHQgPSBwdWxzZXNba2V5XS5hcHBseSh0aGlzLCBbY3VycmVudFN0YXRlLCAuLi5hcmdzXSBhcyBhbnkpO1xuICAgICAgICBpZiAocHVsc2VSZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgcmV0dXJuIHB1bHNlUmVzdWx0XG4gICAgICAgICAgICAudGhlbigocmVzb2x2ZWRWYWx1ZSkgPT4ge1xuICAgICAgICAgICAgICBzZXRTdGF0ZShjdXJyZW50U3RhdGUgYXMgU3RhdGVUeXBlKTtcbiAgICAgICAgICAgICAgUmVmbGVjdC5zZXQodGhpcywgXCIkZmx1c2hcIiwgZW1wdHlGbHVzaCk7XG4gICAgICAgICAgICAgIHJldHVybiByZXNvbHZlZFZhbHVlO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3IgaW4gcHVsc2UgJyR7a2V5fSc6YCwgZXJyb3IpO1xuICAgICAgICAgICAgICBSZWZsZWN0LnNldCh0aGlzLCBcIiRmbHVzaFwiLCBlbXB0eUZsdXNoKTtcbiAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzZXRTdGF0ZShjdXJyZW50U3RhdGUpO1xuICAgICAgICAgIFJlZmxlY3Quc2V0KHRoaXMsIFwiJGZsdXNoXCIsIGVtcHR5Rmx1c2gpO1xuICAgICAgICAgIHJldHVybiBwdWxzZVJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3IgaW4gcHVsc2UgJyR7a2V5fSc6YCwgZXJyb3IpO1xuICAgICAgICBSZWZsZWN0LnNldCh0aGlzLCBcIiRmbHVzaFwiLCBlbXB0eUZsdXNoKTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHB1bHNlTWV0aG9kO1xuICB9XG5cbiAgc3luY1N0YXRlKGxvY2FsU3RhdGUpO1xuXG4gIGNvbnN0IGxpc3RlbmVyczogUmVjb3JkPHN0cmluZywgRnVuY3Rpb25bXT4gPSB7fTtcbiAgY29uc3QgdHJpZ2dlciA9IChldmVudDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSkgPT4ge1xuICAgIGlmIChsaXN0ZW5lcnNbZXZlbnRdKSB7XG4gICAgICBsaXN0ZW5lcnNbZXZlbnRdLmZvckVhY2goKGNhbGxiYWNrKSA9PiBjYWxsYmFjayguLi5hcmdzKSk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IHB1bHNlc1Byb3h5ID0gbmV3IFByb3h5KGJvdW5kUHVsc2VzLCB7XG4gICAgZ2V0OiAocHVsc2VzLCBwcm9wOiBzdHJpbmcpID0+IHtcbiAgICAgIGlmIChwcm9wID09PSBcInN0YXRlXCIpIHtcbiAgICAgICAgcmV0dXJuIHByb3h5U3RhdGU7XG4gICAgICB9XG4gICAgICBpZiAocHJvcCA9PT0gXCJvblwiKSB7XG4gICAgICAgIHJldHVybiAoZXZlbnQ6IHN0cmluZywgY2FsbGJhY2s6IEZ1bmN0aW9uKSA9PiB7XG4gICAgICAgICAgaWYgKCFsaXN0ZW5lcnNbZXZlbnRdKSB7XG4gICAgICAgICAgICBsaXN0ZW5lcnNbZXZlbnRdID0gW107XG4gICAgICAgICAgfVxuICAgICAgICAgIGxpc3RlbmVyc1tldmVudF0ucHVzaChjYWxsYmFjayk7XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAocHJvcCA9PT0gXCJvZmZcIikge1xuICAgICAgICByZXR1cm4gKGV2ZW50OiBzdHJpbmcsIGNhbGxiYWNrOiBGdW5jdGlvbikgPT4ge1xuICAgICAgICAgIGlmIChsaXN0ZW5lcnNbZXZlbnRdKSB7XG4gICAgICAgICAgICBsaXN0ZW5lcnNbZXZlbnRdID0gbGlzdGVuZXJzW2V2ZW50XS5maWx0ZXIoKGNiKSA9PiBjYiAhPT0gY2FsbGJhY2spO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmICghKHByb3AgaW4gcHVsc2VzKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFB1bHNlICcke3Byb3B9JyBkb2VzIG5vdCBleGlzdGApO1xuICAgICAgfVxuICAgICAgY29uc3QgcHVsc2VNZXRob2QgPSBwdWxzZXNbcHJvcF07XG5cbiAgICAgIGlmICh0eXBlb2YgcHVsc2VNZXRob2QgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICByZXR1cm4gKC4uLmFyZ3M6IGFueVtdKSA9PiB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gcHVsc2VNZXRob2QuYXBwbHkocHVsc2VzUHJveHksIGFyZ3MgYXMgYW55KTtcbiAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC50aGVuKChyKSA9PiB7XG4gICAgICAgICAgICAgIHRyaWdnZXIoXCJwdWxzZVwiLCBwcm9wLCBhcmdzKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHI7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdHJpZ2dlcihcInB1bHNlXCIsIHByb3AsIGFyZ3MpO1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwdWxzZU1ldGhvZDtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBwdWxzZXNQcm94eSBhcyBTdG9yZVB1bHNlczxQdWxzZXNUeXBlPiAmIHtcbiAgICBzdGF0ZTogUHJveHlTdGF0ZTxTdGF0ZVR5cGU+O1xuICAgIG9uOiAoZXZlbnQ6IHN0cmluZywgY2FsbGJhY2s6IEZ1bmN0aW9uKSA9PiB2b2lkO1xuICAgIG9mZjogKGV2ZW50OiBzdHJpbmcsIGNhbGxiYWNrOiBGdW5jdGlvbikgPT4gdm9pZDtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVB1bHNlU3RvcmU8U3RhdGVUeXBlIGV4dGVuZHMgU3RhdGUsIFB1bHNlc1R5cGUgZXh0ZW5kcyBQdWxzZXM8U3RhdGVUeXBlPj4oXG4gIGluaXRpYWxTdGF0ZTogU3RhdGVUeXBlLFxuICBwdWxzZXM6IFB1bHNlc1R5cGVcbik6IFN0b3JlUHVsc2VzPFB1bHNlc1R5cGU+ICYge1xuICBzdGF0ZTogUHJveHlTdGF0ZTxTdGF0ZVR5cGU+O1xuICBvbjogKGV2ZW50OiBzdHJpbmcsIGNhbGxiYWNrOiBGdW5jdGlvbikgPT4gdm9pZDtcbiAgb2ZmOiAoZXZlbnQ6IHN0cmluZywgY2FsbGJhY2s6IEZ1bmN0aW9uKSA9PiB2b2lkO1xufSB7XG4gIHJldHVybiBjcmVhdGVTdG9yZShpbml0aWFsU3RhdGUsIHB1bHNlcywgdHJ1ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVNdXRhYmxlU3RvcmU8U3RhdGVUeXBlIGV4dGVuZHMgU3RhdGUsIFB1bHNlc1R5cGUgZXh0ZW5kcyBQdWxzZXM8U3RhdGVUeXBlPj4oXG4gIGluaXRpYWxTdGF0ZTogU3RhdGVUeXBlLFxuICBwdWxzZXM6IFB1bHNlc1R5cGVcbik6IFN0b3JlUHVsc2VzPFB1bHNlc1R5cGU+ICYge1xuICBzdGF0ZTogUHJveHlTdGF0ZTxTdGF0ZVR5cGU+O1xuICBvbjogKGV2ZW50OiBzdHJpbmcsIGNhbGxiYWNrOiBGdW5jdGlvbikgPT4gdm9pZDtcbiAgb2ZmOiAoZXZlbnQ6IHN0cmluZywgY2FsbGJhY2s6IEZ1bmN0aW9uKSA9PiB2b2lkO1xufSB7XG4gIGNvbnNvbGUud2FybihcbiAgICBcIldhcm5pbmc6IFlvdSBhcmUgd29ya2luZyB3aXRoIGEgbXV0YWJsZSBzdGF0ZS4gVGhpcyBjYW4gbGVhZCB0byB1bnByZWRpY3RhYmxlIGJlaGF2aW9yLiBBbGwgc3RhdGUgY2hhbmdlcyBtYWRlIG91dHNpZGUgb2YgYSBwdWxzZSB3aWxsIG5vdCB0cmlnZ2VyIGEgcmUtcmVuZGVyLlwiXG4gICk7XG4gIHJldHVybiBjcmVhdGVTdG9yZShpbml0aWFsU3RhdGUsIHB1bHNlcywgZmFsc2UpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRWZmZWN0KGVmZmVjdDogRnVuY3Rpb24pIHtcbiAgY29uc3QgcnVuRWZmZWN0ID0gKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBlZmZlY3RTdGFjay5wdXNoKHJ1bkVmZmVjdCk7XG4gICAgICBlZmZlY3QoKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgZWZmZWN0U3RhY2sucG9wKCk7XG4gICAgfVxuICB9O1xuICBydW5FZmZlY3QoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVB1bHNlPFQ+KGluaXRpYWxWYWx1ZTogVCk6IFsoKSA9PiBULCAobmV3VmFsdWU6IFQgfCAoKGN1cnJlbnQ6IFQpID0+IFQpKSA9PiB2b2lkLCAoKSA9PiB2b2lkXSB7XG4gIGxldCB2YWx1ZSA9IGluaXRpYWxWYWx1ZTtcbiAgY29uc3Qgc3Vic2NyaWJlcnMgPSBuZXcgU2V0PEZ1bmN0aW9uPigpO1xuICBjb25zdCBkb21XaXRoVm5vZGVzVG9VcGRhdGUgPSBuZXcgV2Vha1NldDxEb21FbGVtZW50PigpO1xuXG4gIGNvbnN0IHJ1blN1YnNjcmliZXJzID0gKCkgPT4ge1xuICAgIHN1YnNjcmliZXJzLmZvckVhY2goKHN1YnNjcmliZXIpID0+IHN1YnNjcmliZXIoKSk7XG4gIH07XG5cbiAgY29uc3QgcmVhZCA9ICgpOiBUID0+IHtcbiAgICBjb25zdCBjdXJyZW50RWZmZWN0ID0gZWZmZWN0U3RhY2tbZWZmZWN0U3RhY2subGVuZ3RoIC0gMV07XG4gICAgaWYgKGN1cnJlbnRFZmZlY3QgJiYgIXN1YnNjcmliZXJzLmhhcyhjdXJyZW50RWZmZWN0KSkge1xuICAgICAgc3Vic2NyaWJlcnMuYWRkKGN1cnJlbnRFZmZlY3QpO1xuICAgIH1cbiAgICByZWdpc3RlckRvbVN1YnNjcmlwdGlvbihzdWJzY3JpYmVycywgZG9tV2l0aFZub2Rlc1RvVXBkYXRlKTtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH07XG5cbiAgY29uc3Qgd3JpdGUgPSAobmV3VmFsdWU6IFQgfCAoKGN1cnJlbnQ6IFQpID0+IFQpKTogdm9pZCA9PiB7XG4gICAgY29uc3QgcmVzb2x2ZWRWYWx1ZSA9IHR5cGVvZiBuZXdWYWx1ZSA9PT0gXCJmdW5jdGlvblwiID8gKG5ld1ZhbHVlIGFzIChjdXJyZW50OiBUKSA9PiBUKSh2YWx1ZSkgOiBuZXdWYWx1ZTtcbiAgICBpZiAoIWhhc0NoYW5nZWQodmFsdWUsIHJlc29sdmVkVmFsdWUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhbHVlID0gcmVzb2x2ZWRWYWx1ZTtcbiAgICBydW5TdWJzY3JpYmVycygpO1xuICB9O1xuXG4gIHJldHVybiBbcmVhZCwgd3JpdGUsIHJ1blN1YnNjcmliZXJzXTtcbn1cbiJdLCJtYXBwaW5ncyI6ImdKQUFBQSxFQUFBLEcseURBQUFDLENBQUFELEVBQUEsQ0FBQUUsYUFBQSxJQUFBQSxFQUFBQyxtQkFBQSxJQUFBQSxFQUFBQyxZQUFBLElBQUFBLEVBQUFDLGlCQUFBLElBQUFBLElBQUEsSSxFQUFBQyxHLEVBQUFOLEUsME1BQ0FPLEVBQStEQyxRQUFBLGVBQy9EQyxFQUEwREQsUUFBQSxxQkFVcERFLEVBQTBCLEdBV2hDLFNBQVNDLEVBQXdCQyxFQUE0QkMsR0FDM0QsTUFBTUMsRUFBZVAsRUFBQVEsUUFBUUMsTUFDN0IsSUFBS0YsR0FBZ0JELEVBQXNCSSxJQUFJSCxFQUFhSSxLQUMxRCxPQUdGLElBQUlDLEdBQVksRUFDWkMsRUFBU04sRUFBYUksSUFBSUcsY0FDOUIsS0FBT0QsR0FBUSxDQUNiLEdBQUlQLEVBQXNCSSxJQUFJRyxHQUFTLENBQ3JDRCxHQUFZLEVBQ1osS0FDRixDQUNBQyxFQUFTQSxFQUFPQyxhQUNsQixDQUdB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
|
package/dist/pulses/index.mjs
CHANGED
|
@@ -142,17 +142,48 @@ function createStore(initialState, pulses, immutable = false) {
|
|
|
142
142
|
return pulseMethod;
|
|
143
143
|
}
|
|
144
144
|
syncState(localState);
|
|
145
|
+
const listeners = {};
|
|
146
|
+
const trigger = (event, ...args) => {
|
|
147
|
+
if (listeners[event]) {
|
|
148
|
+
listeners[event].forEach((callback) => callback(...args));
|
|
149
|
+
}
|
|
150
|
+
};
|
|
145
151
|
const pulsesProxy = new Proxy(boundPulses, {
|
|
146
152
|
get: (pulses2, prop) => {
|
|
147
153
|
if (prop === "state") {
|
|
148
154
|
return proxyState;
|
|
149
155
|
}
|
|
156
|
+
if (prop === "on") {
|
|
157
|
+
return (event, callback) => {
|
|
158
|
+
if (!listeners[event]) {
|
|
159
|
+
listeners[event] = [];
|
|
160
|
+
}
|
|
161
|
+
listeners[event].push(callback);
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
if (prop === "off") {
|
|
165
|
+
return (event, callback) => {
|
|
166
|
+
if (listeners[event]) {
|
|
167
|
+
listeners[event] = listeners[event].filter((cb) => cb !== callback);
|
|
168
|
+
}
|
|
169
|
+
};
|
|
170
|
+
}
|
|
150
171
|
if (!(prop in pulses2)) {
|
|
151
172
|
throw new Error(`Pulse '${prop}' does not exist`);
|
|
152
173
|
}
|
|
153
174
|
const pulseMethod = pulses2[prop];
|
|
154
175
|
if (typeof pulseMethod === "function") {
|
|
155
|
-
return
|
|
176
|
+
return (...args) => {
|
|
177
|
+
const result = pulseMethod.apply(pulsesProxy, args);
|
|
178
|
+
if (result instanceof Promise) {
|
|
179
|
+
return result.then((r) => {
|
|
180
|
+
trigger("pulse", prop, args);
|
|
181
|
+
return r;
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
trigger("pulse", prop, args);
|
|
185
|
+
return result;
|
|
186
|
+
};
|
|
156
187
|
}
|
|
157
188
|
return pulseMethod;
|
|
158
189
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../lib/pulses/index.ts"],
|
|
4
|
-
"sourcesContent": ["/* eslint-disable no-console */\nimport { updateVnode, VnodeWithDom, current, DomElement } from \"valyrian.js\";\nimport { deepCloneUnfreeze, deepFreeze, hasChanged } from \"valyrian.js/utils\";\n\ntype State = Record<string, any>;\n\nexport type Pulse<StateType, TReturn = unknown> = (state: StateType, ...args: any[]) => TReturn | Promise<TReturn>;\n\nexport type Pulses<StateType> = Record<string, Pulse<StateType, any> & { $flush?: () => Promise<void> }>;\n\ntype ProxyState<StateType> = StateType & { [key: string]: any };\n\nconst effectStack: Function[] = [];\n\ntype StorePulses<PulsesType extends Pulses<any>> = {\n [K in keyof PulsesType]: PulsesType[K] extends (state: any, ...args: infer Args) => infer R\n ? (...args: Args) => R\n : never;\n};\n\n/** Funci\u00F3n auxiliar para registrar la suscripci\u00F3n al nodo DOM.\n * Retorna true si se agreg\u00F3 la suscripci\u00F3n, o false si se encontr\u00F3 un nodo padre ya suscrito.\n */\nfunction registerDomSubscription(subscribers: Set<Function>, domWithVnodesToUpdate: WeakSet<DomElement>): void {\n const currentVnode = current.vnode as VnodeWithDom;\n if (!currentVnode || domWithVnodesToUpdate.has(currentVnode.dom)) {\n return;\n }\n\n let hasParent = false;\n let parent = currentVnode.dom.parentElement as DomElement;\n while (parent) {\n if (domWithVnodesToUpdate.has(parent)) {\n hasParent = true;\n break;\n }\n parent = parent.parentElement as DomElement;\n }\n\n // Si no hay nodo padre registrado, se crea la suscripci\u00F3n.\n if (!hasParent) {\n const dom = currentVnode.dom;\n const subscription = () => {\n updateVnode(dom.vnode);\n if (!dom.parentElement) {\n subscribers.delete(subscription);\n domWithVnodesToUpdate.delete(dom);\n }\n };\n subscribers.add(subscription);\n domWithVnodesToUpdate.add(dom);\n }\n}\n\nfunction createStore<StateType extends State, PulsesType extends Pulses<StateType>>(\n initialState: StateType | (() => StateType) | null,\n pulses: PulsesType,\n immutable = false\n): StorePulses<PulsesType> & { state: ProxyState<StateType> } {\n const subscribers = new Set<Function>();\n const domWithVnodesToUpdate = new WeakSet<DomElement>();\n\n const boundPulses: Pulses<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 if (key === \"state\") {\n throw new Error(`A pulse cannot be named 'state'`);\n }\n boundPulses[key] = getPulseMethod(key);\n }\n\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 let currentState: StateType | null = null;\n let pulseCallCount = 0;\n\n const proxyState = new Proxy(localState, {\n get: (state, prop: string) => {\n // If we are in a pulse, we return the value of the cloned state.\n if (currentState) {\n return currentState[prop];\n }\n\n const currentEffect = effectStack[effectStack.length - 1];\n if (currentEffect && !subscribers.has(currentEffect)) {\n subscribers.add(currentEffect);\n }\n\n registerDomSubscription(subscribers, domWithVnodesToUpdate);\n\n return state[prop];\n },\n set: (state, prop: string, value: any) => {\n isMutable();\n Reflect.set(state, prop, value);\n return true;\n },\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 for (const key in localState) {\n if (!(key in newState)) {\n Reflect.deleteProperty(localState, key);\n }\n }\n }\n\n let debounceTimeout: ReturnType<typeof setTimeout> | null = null;\n function debouncedUpdate() {\n if (debounceTimeout) {\n clearTimeout(debounceTimeout);\n }\n debounceTimeout = setTimeout(() => subscribers.forEach((subscriber) => subscriber()), 0);\n }\n\n function setState(newState: StateType, flush = false) {\n pulseCallCount--;\n if (!hasChanged(localState, newState)) {\n return;\n }\n if (pulseCallCount > 0 && !flush) {\n return;\n }\n syncState(newState);\n currentState = null;\n debouncedUpdate();\n }\n\n function getPulseMethod(key: string) {\n function pulseMethod(this: Pulse<StateType, any> & { $flush: () => Promise<void> }, ...args: any[]) {\n pulseCallCount++;\n if (currentState === null) {\n currentState = deepCloneUnfreeze(localState);\n }\n\n const $flush = async () => {\n setState(currentState as StateType, true);\n currentState = deepCloneUnfreeze(localState);\n await new Promise((resolve) => setTimeout(resolve, 0));\n };\n\n Reflect.set(this, \"$flush\", $flush);\n const emptyFlush = async () => {};\n\n try {\n const pulseResult = pulses[key].apply(this, [currentState, ...args]);\n if (pulseResult instanceof Promise) {\n return pulseResult\n .then((resolvedValue) => {\n setState(currentState as StateType);\n Reflect.set(this, \"$flush\", emptyFlush);\n return resolvedValue;\n })\n .catch((error) => {\n console.error(`Error in pulse '${key}':`, error);\n Reflect.set(this, \"$flush\", emptyFlush);\n throw error;\n });\n } else {\n setState(currentState);\n Reflect.set(this, \"$flush\", emptyFlush);\n return pulseResult;\n }\n } catch (error) {\n console.error(`Error in pulse '${key}':`, error);\n Reflect.set(this, \"$flush\", emptyFlush);\n throw error;\n }\n }\n\n return pulseMethod;\n }\n\n syncState(localState);\n\n const pulsesProxy = new Proxy(boundPulses, {\n get: (pulses, prop: string) => {\n if (prop === \"state\") {\n return proxyState;\n }\n if (!(prop in pulses)) {\n throw new Error(`Pulse '${prop}' does not exist`);\n }\n const pulseMethod = pulses[prop];\n\n if (typeof pulseMethod === \"function\") {\n return pulseMethod.bind(pulsesProxy);\n }\n\n return pulseMethod;\n }\n });\n\n return pulsesProxy as StorePulses<PulsesType> & { state: ProxyState<StateType> };\n}\n\nexport function createPulseStore<StateType extends State, PulsesType extends Pulses<StateType>>(\n initialState: StateType,\n pulses: PulsesType\n): StorePulses<PulsesType> & { state: ProxyState<StateType> } {\n return createStore(initialState, pulses, true);\n}\n\nexport function createMutableStore<StateType extends State, PulsesType extends Pulses<StateType>>(\n initialState: StateType,\n pulses: PulsesType\n): StorePulses<PulsesType> & { state: ProxyState<StateType> } {\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\nexport function createEffect(effect: Function) {\n const runEffect = () => {\n try {\n effectStack.push(runEffect);\n effect();\n } finally {\n effectStack.pop();\n }\n };\n runEffect();\n}\n\nexport function createPulse<T>(initialValue: T): [() => T, (newValue: T | ((current: T) => T)) => void, () => void] {\n let value = initialValue;\n const subscribers = new Set<Function>();\n const domWithVnodesToUpdate = new WeakSet<DomElement>();\n\n const runSubscribers = () => {\n subscribers.forEach((subscriber) => subscriber());\n };\n\n const read = (): T => {\n const currentEffect = effectStack[effectStack.length - 1];\n if (currentEffect && !subscribers.has(currentEffect)) {\n subscribers.add(currentEffect);\n }\n registerDomSubscription(subscribers, domWithVnodesToUpdate);\n return value;\n };\n\n const write = (newValue: T | ((current: T) => T)): void => {\n const resolvedValue = typeof newValue === \"function\" ? (newValue as (current: T) => T)(value) : newValue;\n if (!hasChanged(value, resolvedValue)) {\n return;\n }\n value = resolvedValue;\n runSubscribers();\n };\n\n return [read, write, runSubscribers];\n}\n"],
|
|
5
|
-
"mappings": ";AACA,SAAS,aAA2B,eAA2B;AAC/D,SAAS,mBAAmB,YAAY,kBAAkB;AAU1D,IAAM,cAA0B,CAAC;AAWjC,SAAS,wBAAwB,aAA4B,uBAAkD;AAC7G,QAAM,eAAe,QAAQ;AAC7B,MAAI,CAAC,gBAAgB,sBAAsB,IAAI,aAAa,GAAG,GAAG;AAChE;AAAA,EACF;AAEA,MAAI,YAAY;AAChB,MAAI,SAAS,aAAa,IAAI;AAC9B,SAAO,QAAQ;AACb,QAAI,sBAAsB,IAAI,MAAM,GAAG;AACrC,kBAAY;AACZ;AAAA,IACF;AACA,aAAS,OAAO;AAAA,EAClB;AAGA,MAAI,CAAC,WAAW;AACd,UAAM,MAAM,aAAa;AACzB,UAAM,eAAe,MAAM;AACzB,kBAAY,IAAI,KAAK;AACrB,UAAI,CAAC,IAAI,eAAe;AACtB,oBAAY,OAAO,YAAY;AAC/B,8BAAsB,OAAO,GAAG;AAAA,MAClC;AAAA,IACF;AACA,gBAAY,IAAI,YAAY;AAC5B,0BAAsB,IAAI,GAAG;AAAA,EAC/B;AACF;AAEA,SAAS,YACP,cACA,QACA,YAAY,
|
|
4
|
+
"sourcesContent": ["/* eslint-disable no-console */\nimport { updateVnode, VnodeWithDom, current, DomElement } from \"valyrian.js\";\nimport { deepCloneUnfreeze, deepFreeze, hasChanged } from \"valyrian.js/utils\";\n\ntype State = Record<string, any>;\n\nexport type Pulse<StateType, TReturn = unknown> = (state: StateType, ...args: any[]) => TReturn | Promise<TReturn>;\n\nexport type Pulses<StateType> = Record<string, Pulse<StateType, any> & { $flush?: () => Promise<void> }>;\n\ntype ProxyState<StateType> = StateType & { [key: string]: any };\n\nconst effectStack: Function[] = [];\n\ntype StorePulses<PulsesType extends Pulses<any>> = {\n [K in keyof PulsesType]: PulsesType[K] extends (state: any, ...args: infer Args) => infer R\n ? (...args: Args) => R\n : never;\n};\n\n/** Funci\u00F3n auxiliar para registrar la suscripci\u00F3n al nodo DOM.\n * Retorna true si se agreg\u00F3 la suscripci\u00F3n, o false si se encontr\u00F3 un nodo padre ya suscrito.\n */\nfunction registerDomSubscription(subscribers: Set<Function>, domWithVnodesToUpdate: WeakSet<DomElement>): void {\n const currentVnode = current.vnode as VnodeWithDom;\n if (!currentVnode || domWithVnodesToUpdate.has(currentVnode.dom)) {\n return;\n }\n\n let hasParent = false;\n let parent = currentVnode.dom.parentElement as DomElement;\n while (parent) {\n if (domWithVnodesToUpdate.has(parent)) {\n hasParent = true;\n break;\n }\n parent = parent.parentElement as DomElement;\n }\n\n // Si no hay nodo padre registrado, se crea la suscripci\u00F3n.\n if (!hasParent) {\n const dom = currentVnode.dom;\n const subscription = () => {\n updateVnode(dom.vnode);\n if (!dom.parentElement) {\n subscribers.delete(subscription);\n domWithVnodesToUpdate.delete(dom);\n }\n };\n subscribers.add(subscription);\n domWithVnodesToUpdate.add(dom);\n }\n}\n\nfunction createStore<StateType extends State, PulsesType extends Pulses<StateType>>(\n initialState: StateType | (() => StateType) | null,\n pulses: PulsesType,\n immutable = false\n): StorePulses<PulsesType> & {\n state: ProxyState<StateType>;\n on: (event: string, callback: Function) => void;\n off: (event: string, callback: Function) => void;\n} {\n const subscribers = new Set<Function>();\n const domWithVnodesToUpdate = new WeakSet<DomElement>();\n\n const boundPulses: Pulses<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 if (key === \"state\") {\n throw new Error(`A pulse cannot be named 'state'`);\n }\n boundPulses[key] = getPulseMethod(key);\n }\n\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 let currentState: StateType | null = null;\n let pulseCallCount = 0;\n\n const proxyState = new Proxy(localState, {\n get: (state, prop: string) => {\n // If we are in a pulse, we return the value of the cloned state.\n if (currentState) {\n return currentState[prop];\n }\n\n const currentEffect = effectStack[effectStack.length - 1];\n if (currentEffect && !subscribers.has(currentEffect)) {\n subscribers.add(currentEffect);\n }\n\n registerDomSubscription(subscribers, domWithVnodesToUpdate);\n\n return state[prop];\n },\n set: (state, prop: string, value: any) => {\n isMutable();\n Reflect.set(state, prop, value);\n return true;\n },\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 for (const key in localState) {\n if (!(key in newState)) {\n Reflect.deleteProperty(localState, key);\n }\n }\n }\n\n let debounceTimeout: ReturnType<typeof setTimeout> | null = null;\n function debouncedUpdate() {\n if (debounceTimeout) {\n clearTimeout(debounceTimeout);\n }\n debounceTimeout = setTimeout(() => subscribers.forEach((subscriber) => subscriber()), 0);\n }\n\n function setState(newState: StateType, flush = false) {\n pulseCallCount--;\n if (!hasChanged(localState, newState)) {\n return;\n }\n if (pulseCallCount > 0 && !flush) {\n return;\n }\n syncState(newState);\n currentState = null;\n debouncedUpdate();\n }\n\n function getPulseMethod(key: string) {\n function pulseMethod(this: Pulse<StateType, any> & { $flush: () => Promise<void> }, ...args: any[]) {\n pulseCallCount++;\n if (currentState === null) {\n currentState = deepCloneUnfreeze(localState);\n }\n\n const $flush = async () => {\n setState(currentState as StateType, true);\n currentState = deepCloneUnfreeze(localState);\n await new Promise((resolve) => setTimeout(resolve, 0));\n };\n\n Reflect.set(this, \"$flush\", $flush);\n const emptyFlush = async () => {};\n\n try {\n const pulseResult = pulses[key].apply(this, [currentState, ...args] as any);\n if (pulseResult instanceof Promise) {\n return pulseResult\n .then((resolvedValue) => {\n setState(currentState as StateType);\n Reflect.set(this, \"$flush\", emptyFlush);\n return resolvedValue;\n })\n .catch((error) => {\n console.error(`Error in pulse '${key}':`, error);\n Reflect.set(this, \"$flush\", emptyFlush);\n throw error;\n });\n } else {\n setState(currentState);\n Reflect.set(this, \"$flush\", emptyFlush);\n return pulseResult;\n }\n } catch (error) {\n console.error(`Error in pulse '${key}':`, error);\n Reflect.set(this, \"$flush\", emptyFlush);\n throw error;\n }\n }\n\n return pulseMethod;\n }\n\n syncState(localState);\n\n const listeners: Record<string, Function[]> = {};\n const trigger = (event: string, ...args: any[]) => {\n if (listeners[event]) {\n listeners[event].forEach((callback) => callback(...args));\n }\n };\n\n const pulsesProxy = new Proxy(boundPulses, {\n get: (pulses, prop: string) => {\n if (prop === \"state\") {\n return proxyState;\n }\n if (prop === \"on\") {\n return (event: string, callback: Function) => {\n if (!listeners[event]) {\n listeners[event] = [];\n }\n listeners[event].push(callback);\n };\n }\n if (prop === \"off\") {\n return (event: string, callback: Function) => {\n if (listeners[event]) {\n listeners[event] = listeners[event].filter((cb) => cb !== callback);\n }\n };\n }\n if (!(prop in pulses)) {\n throw new Error(`Pulse '${prop}' does not exist`);\n }\n const pulseMethod = pulses[prop];\n\n if (typeof pulseMethod === \"function\") {\n return (...args: any[]) => {\n const result = pulseMethod.apply(pulsesProxy, args as any);\n if (result instanceof Promise) {\n return result.then((r) => {\n trigger(\"pulse\", prop, args);\n return r;\n });\n }\n trigger(\"pulse\", prop, args);\n return result;\n };\n }\n\n return pulseMethod;\n }\n });\n\n return pulsesProxy as StorePulses<PulsesType> & {\n state: ProxyState<StateType>;\n on: (event: string, callback: Function) => void;\n off: (event: string, callback: Function) => void;\n };\n}\n\nexport function createPulseStore<StateType extends State, PulsesType extends Pulses<StateType>>(\n initialState: StateType,\n pulses: PulsesType\n): StorePulses<PulsesType> & {\n state: ProxyState<StateType>;\n on: (event: string, callback: Function) => void;\n off: (event: string, callback: Function) => void;\n} {\n return createStore(initialState, pulses, true);\n}\n\nexport function createMutableStore<StateType extends State, PulsesType extends Pulses<StateType>>(\n initialState: StateType,\n pulses: PulsesType\n): StorePulses<PulsesType> & {\n state: ProxyState<StateType>;\n on: (event: string, callback: Function) => void;\n off: (event: string, callback: Function) => void;\n} {\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\nexport function createEffect(effect: Function) {\n const runEffect = () => {\n try {\n effectStack.push(runEffect);\n effect();\n } finally {\n effectStack.pop();\n }\n };\n runEffect();\n}\n\nexport function createPulse<T>(initialValue: T): [() => T, (newValue: T | ((current: T) => T)) => void, () => void] {\n let value = initialValue;\n const subscribers = new Set<Function>();\n const domWithVnodesToUpdate = new WeakSet<DomElement>();\n\n const runSubscribers = () => {\n subscribers.forEach((subscriber) => subscriber());\n };\n\n const read = (): T => {\n const currentEffect = effectStack[effectStack.length - 1];\n if (currentEffect && !subscribers.has(currentEffect)) {\n subscribers.add(currentEffect);\n }\n registerDomSubscription(subscribers, domWithVnodesToUpdate);\n return value;\n };\n\n const write = (newValue: T | ((current: T) => T)): void => {\n const resolvedValue = typeof newValue === \"function\" ? (newValue as (current: T) => T)(value) : newValue;\n if (!hasChanged(value, resolvedValue)) {\n return;\n }\n value = resolvedValue;\n runSubscribers();\n };\n\n return [read, write, runSubscribers];\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["pulses"]
|
|
7
7
|
}
|
|
@@ -0,0 +1,81 @@
|
|
|
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/redux-devtools/index.ts
|
|
21
|
+
var index_exports = {};
|
|
22
|
+
__export(index_exports, {
|
|
23
|
+
connectFluxStore: () => connectFluxStore,
|
|
24
|
+
connectPulse: () => connectPulse,
|
|
25
|
+
connectPulseStore: () => connectPulseStore
|
|
26
|
+
});
|
|
27
|
+
module.exports = __toCommonJS(index_exports);
|
|
28
|
+
function getDevTools() {
|
|
29
|
+
const isBrowser = typeof window !== "undefined";
|
|
30
|
+
if (isBrowser && window.__REDUX_DEVTOOLS_EXTENSION__) {
|
|
31
|
+
return window.__REDUX_DEVTOOLS_EXTENSION__;
|
|
32
|
+
}
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
function connectFluxStore(store, options = {}) {
|
|
36
|
+
const devTools = getDevTools();
|
|
37
|
+
if (!devTools) {
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
const name = options.name || "FluxStore";
|
|
41
|
+
const dt = devTools.connect({ name, ...options });
|
|
42
|
+
dt.init(store.state);
|
|
43
|
+
store.on("commit", (_, mutation, ...args) => {
|
|
44
|
+
dt.send({ type: mutation, payload: args }, store.state);
|
|
45
|
+
});
|
|
46
|
+
store.on("registerModule", (_, namespace) => {
|
|
47
|
+
dt.send({ type: `[Module] Register: ${namespace}` }, store.state);
|
|
48
|
+
});
|
|
49
|
+
store.on("unregisterModule", (_, namespace) => {
|
|
50
|
+
dt.send({ type: `[Module] Unregister: ${namespace}` }, store.state);
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
function connectPulseStore(store, options = {}) {
|
|
54
|
+
const devTools = getDevTools();
|
|
55
|
+
if (!devTools) {
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
const name = options.name || "PulseStore";
|
|
59
|
+
const dt = devTools.connect({ name, ...options });
|
|
60
|
+
dt.init(store.state);
|
|
61
|
+
if (store.on) {
|
|
62
|
+
store.on("pulse", (pulse, args) => {
|
|
63
|
+
dt.send({ type: pulse, payload: args }, store.state);
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
function connectPulse(pulse, options = {}) {
|
|
68
|
+
const devTools = getDevTools();
|
|
69
|
+
if (!devTools) {
|
|
70
|
+
return pulse;
|
|
71
|
+
}
|
|
72
|
+
const name = options.name || "Pulse";
|
|
73
|
+
const dt = devTools.connect({ name, ...options });
|
|
74
|
+
const [read, write, run] = pulse;
|
|
75
|
+
dt.init(read());
|
|
76
|
+
const newWrite = (newValue) => {
|
|
77
|
+
write(newValue);
|
|
78
|
+
dt.send({ type: "update", payload: newValue }, read());
|
|
79
|
+
};
|
|
80
|
+
return [read, newWrite, run];
|
|
81
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../lib/redux-devtools/index.ts"],
|
|
4
|
+
"sourcesContent": ["/* eslint-disable no-console */\nimport { FluxStore } from \"valyrian.js/flux-store\";\n\ndeclare global {\n interface Window {\n __REDUX_DEVTOOLS_EXTENSION__: any;\n }\n}\n\ninterface DevToolsOptions {\n name?: string;\n [key: string]: any;\n}\n\nfunction getDevTools() {\n const isBrowser = typeof window !== \"undefined\";\n if (isBrowser && window.__REDUX_DEVTOOLS_EXTENSION__) {\n return window.__REDUX_DEVTOOLS_EXTENSION__;\n }\n return null;\n}\n\nexport function connectFluxStore(store: FluxStore, options: DevToolsOptions = {}) {\n const devTools = getDevTools();\n if (!devTools) {\n return;\n }\n\n const name = options.name || \"FluxStore\";\n const dt = devTools.connect({ name, ...options });\n dt.init(store.state);\n\n store.on(\"commit\", (_: any, mutation: string, ...args: any[]) => {\n dt.send({ type: mutation, payload: args }, store.state);\n });\n\n store.on(\"registerModule\", (_: any, namespace: string) => {\n dt.send({ type: `[Module] Register: ${namespace}` }, store.state);\n });\n\n store.on(\"unregisterModule\", (_: any, namespace: string) => {\n dt.send({ type: `[Module] Unregister: ${namespace}` }, store.state);\n });\n}\n\nexport function connectPulseStore(store: any, options: DevToolsOptions = {}) {\n const devTools = getDevTools();\n if (!devTools) {\n return;\n }\n\n const name = options.name || \"PulseStore\";\n const dt = devTools.connect({ name, ...options });\n dt.init(store.state);\n\n if (store.on) {\n store.on(\"pulse\", (pulse: string, args: any[]) => {\n dt.send({ type: pulse, payload: args }, store.state);\n });\n }\n}\n\nexport function connectPulse(pulse: any, options: DevToolsOptions = {}) {\n // Pulse is [read, write, runSubscribers]\n // We can't easily hook into the write function without wrapping it.\n // But the user asked for \"simple\" and \"using existing apis\".\n // If we want to debug individual pulses, we might need to wrap them.\n\n const devTools = getDevTools();\n if (!devTools) {\n return pulse;\n }\n\n const name = options.name || \"Pulse\";\n const dt = devTools.connect({ name, ...options });\n const [read, write, run] = pulse;\n \n dt.init(read());\n\n const newWrite = (newValue: any) => {\n write(newValue);\n dt.send({ type: \"update\", payload: newValue }, read());\n };\n\n return [read, newWrite, run];\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAcA,SAAS,cAAc;AACrB,QAAM,YAAY,OAAO,WAAW;AACpC,MAAI,aAAa,OAAO,8BAA8B;AACpD,WAAO,OAAO;AAAA,EAChB;AACA,SAAO;AACT;AAEO,SAAS,iBAAiB,OAAkB,UAA2B,CAAC,GAAG;AAChF,QAAM,WAAW,YAAY;AAC7B,MAAI,CAAC,UAAU;AACb;AAAA,EACF;AAEA,QAAM,OAAO,QAAQ,QAAQ;AAC7B,QAAM,KAAK,SAAS,QAAQ,EAAE,MAAM,GAAG,QAAQ,CAAC;AAChD,KAAG,KAAK,MAAM,KAAK;AAEnB,QAAM,GAAG,UAAU,CAAC,GAAQ,aAAqB,SAAgB;AAC/D,OAAG,KAAK,EAAE,MAAM,UAAU,SAAS,KAAK,GAAG,MAAM,KAAK;AAAA,EACxD,CAAC;AAED,QAAM,GAAG,kBAAkB,CAAC,GAAQ,cAAsB;AACxD,OAAG,KAAK,EAAE,MAAM,sBAAsB,SAAS,GAAG,GAAG,MAAM,KAAK;AAAA,EAClE,CAAC;AAED,QAAM,GAAG,oBAAoB,CAAC,GAAQ,cAAsB;AAC1D,OAAG,KAAK,EAAE,MAAM,wBAAwB,SAAS,GAAG,GAAG,MAAM,KAAK;AAAA,EACpE,CAAC;AACH;AAEO,SAAS,kBAAkB,OAAY,UAA2B,CAAC,GAAG;AAC3E,QAAM,WAAW,YAAY;AAC7B,MAAI,CAAC,UAAU;AACb;AAAA,EACF;AAEA,QAAM,OAAO,QAAQ,QAAQ;AAC7B,QAAM,KAAK,SAAS,QAAQ,EAAE,MAAM,GAAG,QAAQ,CAAC;AAChD,KAAG,KAAK,MAAM,KAAK;AAEnB,MAAI,MAAM,IAAI;AACZ,UAAM,GAAG,SAAS,CAAC,OAAe,SAAgB;AAChD,SAAG,KAAK,EAAE,MAAM,OAAO,SAAS,KAAK,GAAG,MAAM,KAAK;AAAA,IACrD,CAAC;AAAA,EACH;AACF;AAEO,SAAS,aAAa,OAAY,UAA2B,CAAC,GAAG;AAMtE,QAAM,WAAW,YAAY;AAC7B,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AAEA,QAAM,OAAO,QAAQ,QAAQ;AAC7B,QAAM,KAAK,SAAS,QAAQ,EAAE,MAAM,GAAG,QAAQ,CAAC;AAChD,QAAM,CAAC,MAAM,OAAO,GAAG,IAAI;AAE3B,KAAG,KAAK,KAAK,CAAC;AAEd,QAAM,WAAW,CAAC,aAAkB;AAClC,UAAM,QAAQ;AACd,OAAG,KAAK,EAAE,MAAM,UAAU,SAAS,SAAS,GAAG,KAAK,CAAC;AAAA,EACvD;AAEA,SAAO,CAAC,MAAM,UAAU,GAAG;AAC7B;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
(()=>{"use strict";var e=Object.defineProperty,t=Object.getOwnPropertyDescriptor,n=Object.getOwnPropertyNames,o=Object.prototype.hasOwnProperty,r={};((t,n)=>{for(var o in n)e(t,o,{get:n[o],enumerable:!0})})(r,{connectFluxStore:()=>a,connectPulse:()=>l,connectPulseStore:()=>i});var u,s=(u=r,((r,u,s,c)=>{if(u&&"object"==typeof u||"function"==typeof u)for(let a of n(u))o.call(r,a)||a===s||e(r,a,{get:()=>u[a],enumerable:!(c=t(u,a))||c.enumerable});return r})(e({},"__esModule",{value:!0}),u));function c(){return"undefined"!=typeof window&&window.__REDUX_DEVTOOLS_EXTENSION__?window.__REDUX_DEVTOOLS_EXTENSION__:null}function a(e,t={}){const n=c();if(!n)return;const o=t.name||"FluxStore",r=n.connect({name:o,...t});r.init(e.state),e.on("commit",(t,n,...o)=>{r.send({type:n,payload:o},e.state)}),e.on("registerModule",(t,n)=>{r.send({type:`[Module] Register: ${n}`},e.state)}),e.on("unregisterModule",(t,n)=>{r.send({type:`[Module] Unregister: ${n}`},e.state)})}function i(e,t={}){const n=c();if(!n)return;const o=t.name||"PulseStore",r=n.connect({name:o,...t});r.init(e.state),e.on&&e.on("pulse",(t,n)=>{r.send({type:t,payload:n},e.state)})}function l(e,t={}){const n=c();if(!n)return e;const o=t.name||"Pulse",r=n.connect({name:o,...t}),[u,s,a]=e;r.init(u());return[u,e=>{s(e),r.send({type:"update",payload:e},u())},a]}"undefined"!=typeof module?module.exports=s:self.ValyrianReduxDevtools=s})();//# sourceMappingURL=index.min.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJpbmRleF9leHBvcnRzIiwiX19leHBvcnQiLCJjb25uZWN0Rmx1eFN0b3JlIiwiY29ubmVjdFB1bHNlIiwiY29ubmVjdFB1bHNlU3RvcmUiLCJfX0VYUE9SVFNfXyIsImdldERldlRvb2xzIiwid2luZG93IiwiX19SRURVWF9ERVZUT09MU19FWFRFTlNJT05fXyIsInN0b3JlIiwib3B0aW9ucyIsImRldlRvb2xzIiwibmFtZSIsImR0IiwiY29ubmVjdCIsImluaXQiLCJzdGF0ZSIsIm9uIiwiXyIsIm11dGF0aW9uIiwiYXJncyIsInNlbmQiLCJ0eXBlIiwicGF5bG9hZCIsIm5hbWVzcGFjZSIsInB1bHNlIiwicmVhZCIsIndyaXRlIiwicnVuIiwibmV3VmFsdWUiXSwic291cmNlcyI6WyIuLi8uLi9saWIvcmVkdXgtZGV2dG9vbHMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tY29uc29sZSAqL1xuaW1wb3J0IHsgRmx1eFN0b3JlIH0gZnJvbSBcInZhbHlyaWFuLmpzL2ZsdXgtc3RvcmVcIjtcblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgV2luZG93IHtcbiAgICBfX1JFRFVYX0RFVlRPT0xTX0VYVEVOU0lPTl9fOiBhbnk7XG4gIH1cbn1cblxuaW50ZXJmYWNlIERldlRvb2xzT3B0aW9ucyB7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIFtrZXk6IHN0cmluZ106IGFueTtcbn1cblxuZnVuY3Rpb24gZ2V0RGV2VG9vbHMoKSB7XG4gIGNvbnN0IGlzQnJvd3NlciA9IHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCI7XG4gIGlmIChpc0Jyb3dzZXIgJiYgd2luZG93Ll9fUkVEVVhfREVWVE9PTFNfRVhURU5TSU9OX18pIHtcbiAgICByZXR1cm4gd2luZG93Ll9fUkVEVVhfREVWVE9PTFNfRVhURU5TSU9OX187XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb25uZWN0Rmx1eFN0b3JlKHN0b3JlOiBGbHV4U3RvcmUsIG9wdGlvbnM6IERldlRvb2xzT3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IGRldlRvb2xzID0gZ2V0RGV2VG9vbHMoKTtcbiAgaWYgKCFkZXZUb29scykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IG5hbWUgPSBvcHRpb25zLm5hbWUgfHwgXCJGbHV4U3RvcmVcIjtcbiAgY29uc3QgZHQgPSBkZXZUb29scy5jb25uZWN0KHsgbmFtZSwgLi4ub3B0aW9ucyB9KTtcbiAgZHQuaW5pdChzdG9yZS5zdGF0ZSk7XG5cbiAgc3RvcmUub24oXCJjb21taXRcIiwgKF86IGFueSwgbXV0YXRpb246IHN0cmluZywgLi4uYXJnczogYW55W10pID0+IHtcbiAgICBkdC5zZW5kKHsgdHlwZTogbXV0YXRpb24sIHBheWxvYWQ6IGFyZ3MgfSwgc3RvcmUuc3RhdGUpO1xuICB9KTtcblxuICBzdG9yZS5vbihcInJlZ2lzdGVyTW9kdWxlXCIsIChfOiBhbnksIG5hbWVzcGFjZTogc3RyaW5nKSA9PiB7XG4gICAgZHQuc2VuZCh7IHR5cGU6IGBbTW9kdWxlXSBSZWdpc3RlcjogJHtuYW1lc3BhY2V9YCB9LCBzdG9yZS5zdGF0ZSk7XG4gIH0pO1xuXG4gIHN0b3JlLm9uKFwidW5yZWdpc3Rlck1vZHVsZVwiLCAoXzogYW55LCBuYW1lc3BhY2U6IHN0cmluZykgPT4ge1xuICAgIGR0LnNlbmQoeyB0eXBlOiBgW01vZHVsZV0gVW5yZWdpc3RlcjogJHtuYW1lc3BhY2V9YCB9LCBzdG9yZS5zdGF0ZSk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29ubmVjdFB1bHNlU3RvcmUoc3RvcmU6IGFueSwgb3B0aW9uczogRGV2VG9vbHNPcHRpb25zID0ge30pIHtcbiAgY29uc3QgZGV2VG9vbHMgPSBnZXREZXZUb29scygpO1xuICBpZiAoIWRldlRvb2xzKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgbmFtZSA9IG9wdGlvbnMubmFtZSB8fCBcIlB1bHNlU3RvcmVcIjtcbiAgY29uc3QgZHQgPSBkZXZUb29scy5jb25uZWN0KHsgbmFtZSwgLi4ub3B0aW9ucyB9KTtcbiAgZHQuaW5pdChzdG9yZS5zdGF0ZSk7XG5cbiAgaWYgKHN0b3JlLm9uKSB7XG4gICAgc3RvcmUub24oXCJwdWxzZVwiLCAocHVsc2U6IHN0cmluZywgYXJnczogYW55W10pID0+IHtcbiAgICAgIGR0LnNlbmQoeyB0eXBlOiBwdWxzZSwgcGF5bG9hZDogYXJncyB9LCBzdG9yZS5zdGF0ZSk7XG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbm5lY3RQdWxzZShwdWxzZTogYW55LCBvcHRpb25zOiBEZXZUb29sc09wdGlvbnMgPSB7fSkge1xuICAvLyBQdWxzZSBpcyBbcmVhZCwgd3JpdGUsIHJ1blN1YnNjcmliZXJzXVxuICAvLyBXZSBjYW4ndCBlYXNpbHkgaG9vayBpbnRvIHRoZSB3cml0ZSBmdW5jdGlvbiB3aXRob3V0IHdyYXBwaW5nIGl0LlxuICAvLyBCdXQgdGhlIHVzZXIgYXNrZWQgZm9yIFwic2ltcGxlXCIgYW5kIFwidXNpbmcgZXhpc3RpbmcgYXBpc1wiLlxuICAvLyBJZiB3ZSB3YW50IHRvIGRlYnVnIGluZGl2aWR1YWwgcHVsc2VzLCB3ZSBtaWdodCBuZWVkIHRvIHdyYXAgdGhlbS5cblxuICBjb25zdCBkZXZUb29scyA9IGdldERldlRvb2xzKCk7XG4gIGlmICghZGV2VG9vbHMpIHtcbiAgICByZXR1cm4gcHVsc2U7XG4gIH1cblxuICBjb25zdCBuYW1lID0gb3B0aW9ucy5uYW1lIHx8IFwiUHVsc2VcIjtcbiAgY29uc3QgZHQgPSBkZXZUb29scy5jb25uZWN0KHsgbmFtZSwgLi4ub3B0aW9ucyB9KTtcbiAgY29uc3QgW3JlYWQsIHdyaXRlLCBydW5dID0gcHVsc2U7XG4gIFxuICBkdC5pbml0KHJlYWQoKSk7XG5cbiAgY29uc3QgbmV3V3JpdGUgPSAobmV3VmFsdWU6IGFueSkgPT4ge1xuICAgIHdyaXRlKG5ld1ZhbHVlKTtcbiAgICBkdC5zZW5kKHsgdHlwZTogXCJ1cGRhdGVcIiwgcGF5bG9hZDogbmV3VmFsdWUgfSwgcmVhZCgpKTtcbiAgfTtcblxuICByZXR1cm4gW3JlYWQsIG5ld1dyaXRlLCBydW5dO1xufVxuIl0sIm1hcHBpbmdzIjoiZ0pBQUFBLEVBQUEsRyx5REFBQUMsQ0FBQUQsRUFBQSxDQUFBRSxpQkFBQSxJQUFBQSxFQUFBQyxhQUFBLElBQUFBLEVBQUFDLGtCQUFBLElBQUFBLElBQUEsSSxFQUFBQyxHLEVBQUFMLEUsME1BY0EsU0FBU00sSUFFUCxNQURvQyxvQkFBWEMsUUFDUkEsT0FBT0MsNkJBQ2ZELE9BQU9DLDZCQUVULElBQ1QsQ0FFTyxTQUFTTixFQUFpQk8sRUFBa0JDLEVBQTJCLENBQUMsR0FDN0UsTUFBTUMsRUFBV0wsSUFDakIsSUFBS0ssRUFDSCxPQUdGLE1BQU1DLEVBQU9GLEVBQVFFLE1BQVEsWUFDdkJDLEVBQUtGLEVBQVNHLFFBQVEsQ0FBRUYsVUFBU0YsSUFDdkNHLEVBQUdFLEtBQUtOLEVBQU1PLE9BRWRQLEVBQU1RLEdBQUcsU0FBVSxDQUFDQyxFQUFRQyxLQUFxQkMsS0FDL0NQLEVBQUdRLEtBQUssQ0FBRUMsS0FBTUgsRUFBVUksUUFBU0gsR0FBUVgsRUFBTU8sU0FHbkRQLEVBQU1RLEdBQUcsaUJBQWtCLENBQUNDLEVBQVFNLEtBQ2xDWCxFQUFHUSxLQUFLLENBQUVDLEtBQU0sc0JBQXNCRSxLQUFlZixFQUFNTyxTQUc3RFAsRUFBTVEsR0FBRyxtQkFBb0IsQ0FBQ0MsRUFBUU0sS0FDcENYLEVBQUdRLEtBQUssQ0FBRUMsS0FBTSx3QkFBd0JFLEtBQWVmLEVBQU1PLFFBRWpFLENBRU8sU0FBU1osRUFBa0JLLEVBQVlDLEVBQTJCLENBQUMsR0FDeEUsTUFBTUMsRUFBV0wsSUFDakIsSUFBS0ssRUFDSCxPQUdGLE1BQU1DLEVBQU9GLEVBQVFFLE1BQVEsYUFDdkJDLEVBQUtGLEVBQVNHLFFBQVEsQ0FBRUYsVUFBU0YsSUFDdkNHLEVBQUdFLEtBQUtOLEVBQU1PLE9BRVZQLEVBQU1RLElBQ1JSLEVBQU1RLEdBQUcsUUFBUyxDQUFDUSxFQUFlTCxLQUNoQ1AsRUFBR1EsS0FBSyxDQUFFQyxLQUFNRyxFQUFPRixRQUFTSCxHQUFRWCxFQUFNTyxRQUdwRCxDQUVPLFNBQVNiLEVBQWFzQixFQUFZZixFQUEyQixDQUFDLEdBTW5FLE1BQU1DLEVBQVdMLElBQ2pCLElBQUtLLEVBQ0gsT0FBT2MsRUFHVCxNQUFNYixFQUFPRixFQUFRRSxNQUFRLFFBQ3ZCQyxFQUFLRixFQUFTRyxRQUFRLENBQUVGLFVBQVNGLEtBQ2hDZ0IsRUFBTUMsRUFBT0MsR0FBT0gsRUFFM0JaLEVBQUdFLEtBQUtXLEtBT1IsTUFBTyxDQUFDQSxFQUxVRyxJQUNoQkYsRUFBTUUsR0FDTmhCLEVBQUdRLEtBQUssQ0FBRUMsS0FBTSxTQUFVQyxRQUFTTSxHQUFZSCxNQUd6QkUsRUFDMUIsQyJ9
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
// lib/redux-devtools/index.ts
|
|
2
|
+
function getDevTools() {
|
|
3
|
+
const isBrowser = typeof window !== "undefined";
|
|
4
|
+
if (isBrowser && window.__REDUX_DEVTOOLS_EXTENSION__) {
|
|
5
|
+
return window.__REDUX_DEVTOOLS_EXTENSION__;
|
|
6
|
+
}
|
|
7
|
+
return null;
|
|
8
|
+
}
|
|
9
|
+
function connectFluxStore(store, options = {}) {
|
|
10
|
+
const devTools = getDevTools();
|
|
11
|
+
if (!devTools) {
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
const name = options.name || "FluxStore";
|
|
15
|
+
const dt = devTools.connect({ name, ...options });
|
|
16
|
+
dt.init(store.state);
|
|
17
|
+
store.on("commit", (_, mutation, ...args) => {
|
|
18
|
+
dt.send({ type: mutation, payload: args }, store.state);
|
|
19
|
+
});
|
|
20
|
+
store.on("registerModule", (_, namespace) => {
|
|
21
|
+
dt.send({ type: `[Module] Register: ${namespace}` }, store.state);
|
|
22
|
+
});
|
|
23
|
+
store.on("unregisterModule", (_, namespace) => {
|
|
24
|
+
dt.send({ type: `[Module] Unregister: ${namespace}` }, store.state);
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
function connectPulseStore(store, options = {}) {
|
|
28
|
+
const devTools = getDevTools();
|
|
29
|
+
if (!devTools) {
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
const name = options.name || "PulseStore";
|
|
33
|
+
const dt = devTools.connect({ name, ...options });
|
|
34
|
+
dt.init(store.state);
|
|
35
|
+
if (store.on) {
|
|
36
|
+
store.on("pulse", (pulse, args) => {
|
|
37
|
+
dt.send({ type: pulse, payload: args }, store.state);
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
function connectPulse(pulse, options = {}) {
|
|
42
|
+
const devTools = getDevTools();
|
|
43
|
+
if (!devTools) {
|
|
44
|
+
return pulse;
|
|
45
|
+
}
|
|
46
|
+
const name = options.name || "Pulse";
|
|
47
|
+
const dt = devTools.connect({ name, ...options });
|
|
48
|
+
const [read, write, run] = pulse;
|
|
49
|
+
dt.init(read());
|
|
50
|
+
const newWrite = (newValue) => {
|
|
51
|
+
write(newValue);
|
|
52
|
+
dt.send({ type: "update", payload: newValue }, read());
|
|
53
|
+
};
|
|
54
|
+
return [read, newWrite, run];
|
|
55
|
+
}
|
|
56
|
+
export {
|
|
57
|
+
connectFluxStore,
|
|
58
|
+
connectPulse,
|
|
59
|
+
connectPulseStore
|
|
60
|
+
};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../lib/redux-devtools/index.ts"],
|
|
4
|
+
"sourcesContent": ["/* eslint-disable no-console */\nimport { FluxStore } from \"valyrian.js/flux-store\";\n\ndeclare global {\n interface Window {\n __REDUX_DEVTOOLS_EXTENSION__: any;\n }\n}\n\ninterface DevToolsOptions {\n name?: string;\n [key: string]: any;\n}\n\nfunction getDevTools() {\n const isBrowser = typeof window !== \"undefined\";\n if (isBrowser && window.__REDUX_DEVTOOLS_EXTENSION__) {\n return window.__REDUX_DEVTOOLS_EXTENSION__;\n }\n return null;\n}\n\nexport function connectFluxStore(store: FluxStore, options: DevToolsOptions = {}) {\n const devTools = getDevTools();\n if (!devTools) {\n return;\n }\n\n const name = options.name || \"FluxStore\";\n const dt = devTools.connect({ name, ...options });\n dt.init(store.state);\n\n store.on(\"commit\", (_: any, mutation: string, ...args: any[]) => {\n dt.send({ type: mutation, payload: args }, store.state);\n });\n\n store.on(\"registerModule\", (_: any, namespace: string) => {\n dt.send({ type: `[Module] Register: ${namespace}` }, store.state);\n });\n\n store.on(\"unregisterModule\", (_: any, namespace: string) => {\n dt.send({ type: `[Module] Unregister: ${namespace}` }, store.state);\n });\n}\n\nexport function connectPulseStore(store: any, options: DevToolsOptions = {}) {\n const devTools = getDevTools();\n if (!devTools) {\n return;\n }\n\n const name = options.name || \"PulseStore\";\n const dt = devTools.connect({ name, ...options });\n dt.init(store.state);\n\n if (store.on) {\n store.on(\"pulse\", (pulse: string, args: any[]) => {\n dt.send({ type: pulse, payload: args }, store.state);\n });\n }\n}\n\nexport function connectPulse(pulse: any, options: DevToolsOptions = {}) {\n // Pulse is [read, write, runSubscribers]\n // We can't easily hook into the write function without wrapping it.\n // But the user asked for \"simple\" and \"using existing apis\".\n // If we want to debug individual pulses, we might need to wrap them.\n\n const devTools = getDevTools();\n if (!devTools) {\n return pulse;\n }\n\n const name = options.name || \"Pulse\";\n const dt = devTools.connect({ name, ...options });\n const [read, write, run] = pulse;\n \n dt.init(read());\n\n const newWrite = (newValue: any) => {\n write(newValue);\n dt.send({ type: \"update\", payload: newValue }, read());\n };\n\n return [read, newWrite, run];\n}\n"],
|
|
5
|
+
"mappings": ";AAcA,SAAS,cAAc;AACrB,QAAM,YAAY,OAAO,WAAW;AACpC,MAAI,aAAa,OAAO,8BAA8B;AACpD,WAAO,OAAO;AAAA,EAChB;AACA,SAAO;AACT;AAEO,SAAS,iBAAiB,OAAkB,UAA2B,CAAC,GAAG;AAChF,QAAM,WAAW,YAAY;AAC7B,MAAI,CAAC,UAAU;AACb;AAAA,EACF;AAEA,QAAM,OAAO,QAAQ,QAAQ;AAC7B,QAAM,KAAK,SAAS,QAAQ,EAAE,MAAM,GAAG,QAAQ,CAAC;AAChD,KAAG,KAAK,MAAM,KAAK;AAEnB,QAAM,GAAG,UAAU,CAAC,GAAQ,aAAqB,SAAgB;AAC/D,OAAG,KAAK,EAAE,MAAM,UAAU,SAAS,KAAK,GAAG,MAAM,KAAK;AAAA,EACxD,CAAC;AAED,QAAM,GAAG,kBAAkB,CAAC,GAAQ,cAAsB;AACxD,OAAG,KAAK,EAAE,MAAM,sBAAsB,SAAS,GAAG,GAAG,MAAM,KAAK;AAAA,EAClE,CAAC;AAED,QAAM,GAAG,oBAAoB,CAAC,GAAQ,cAAsB;AAC1D,OAAG,KAAK,EAAE,MAAM,wBAAwB,SAAS,GAAG,GAAG,MAAM,KAAK;AAAA,EACpE,CAAC;AACH;AAEO,SAAS,kBAAkB,OAAY,UAA2B,CAAC,GAAG;AAC3E,QAAM,WAAW,YAAY;AAC7B,MAAI,CAAC,UAAU;AACb;AAAA,EACF;AAEA,QAAM,OAAO,QAAQ,QAAQ;AAC7B,QAAM,KAAK,SAAS,QAAQ,EAAE,MAAM,GAAG,QAAQ,CAAC;AAChD,KAAG,KAAK,MAAM,KAAK;AAEnB,MAAI,MAAM,IAAI;AACZ,UAAM,GAAG,SAAS,CAAC,OAAe,SAAgB;AAChD,SAAG,KAAK,EAAE,MAAM,OAAO,SAAS,KAAK,GAAG,MAAM,KAAK;AAAA,IACrD,CAAC;AAAA,EACH;AACF;AAEO,SAAS,aAAa,OAAY,UAA2B,CAAC,GAAG;AAMtE,QAAM,WAAW,YAAY;AAC7B,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AAEA,QAAM,OAAO,QAAQ,QAAQ;AAC7B,QAAM,KAAK,SAAS,QAAQ,EAAE,MAAM,GAAG,QAAQ,CAAC;AAChD,QAAM,CAAC,MAAM,OAAO,GAAG,IAAI;AAE3B,KAAG,KAAK,KAAK,CAAC;AAEd,QAAM,WAAW,CAAC,aAAkB;AAClC,UAAM,QAAQ;AACd,OAAG,KAAK,EAAE,MAAM,UAAU,SAAS,SAAS,GAAG,KAAK,CAAC;AAAA,EACvD;AAEA,SAAO,CAAC,MAAM,UAAU,GAAG;AAC7B;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
package/lib/pulses/index.ts
CHANGED
|
@@ -56,7 +56,11 @@ function createStore<StateType extends State, PulsesType extends Pulses<StateTyp
|
|
|
56
56
|
initialState: StateType | (() => StateType) | null,
|
|
57
57
|
pulses: PulsesType,
|
|
58
58
|
immutable = false
|
|
59
|
-
): StorePulses<PulsesType> & {
|
|
59
|
+
): StorePulses<PulsesType> & {
|
|
60
|
+
state: ProxyState<StateType>;
|
|
61
|
+
on: (event: string, callback: Function) => void;
|
|
62
|
+
off: (event: string, callback: Function) => void;
|
|
63
|
+
} {
|
|
60
64
|
const subscribers = new Set<Function>();
|
|
61
65
|
const domWithVnodesToUpdate = new WeakSet<DomElement>();
|
|
62
66
|
|
|
@@ -160,7 +164,7 @@ function createStore<StateType extends State, PulsesType extends Pulses<StateTyp
|
|
|
160
164
|
const emptyFlush = async () => {};
|
|
161
165
|
|
|
162
166
|
try {
|
|
163
|
-
const pulseResult = pulses[key].apply(this, [currentState, ...args]);
|
|
167
|
+
const pulseResult = pulses[key].apply(this, [currentState, ...args] as any);
|
|
164
168
|
if (pulseResult instanceof Promise) {
|
|
165
169
|
return pulseResult
|
|
166
170
|
.then((resolvedValue) => {
|
|
@@ -190,38 +194,82 @@ function createStore<StateType extends State, PulsesType extends Pulses<StateTyp
|
|
|
190
194
|
|
|
191
195
|
syncState(localState);
|
|
192
196
|
|
|
197
|
+
const listeners: Record<string, Function[]> = {};
|
|
198
|
+
const trigger = (event: string, ...args: any[]) => {
|
|
199
|
+
if (listeners[event]) {
|
|
200
|
+
listeners[event].forEach((callback) => callback(...args));
|
|
201
|
+
}
|
|
202
|
+
};
|
|
203
|
+
|
|
193
204
|
const pulsesProxy = new Proxy(boundPulses, {
|
|
194
205
|
get: (pulses, prop: string) => {
|
|
195
206
|
if (prop === "state") {
|
|
196
207
|
return proxyState;
|
|
197
208
|
}
|
|
209
|
+
if (prop === "on") {
|
|
210
|
+
return (event: string, callback: Function) => {
|
|
211
|
+
if (!listeners[event]) {
|
|
212
|
+
listeners[event] = [];
|
|
213
|
+
}
|
|
214
|
+
listeners[event].push(callback);
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
if (prop === "off") {
|
|
218
|
+
return (event: string, callback: Function) => {
|
|
219
|
+
if (listeners[event]) {
|
|
220
|
+
listeners[event] = listeners[event].filter((cb) => cb !== callback);
|
|
221
|
+
}
|
|
222
|
+
};
|
|
223
|
+
}
|
|
198
224
|
if (!(prop in pulses)) {
|
|
199
225
|
throw new Error(`Pulse '${prop}' does not exist`);
|
|
200
226
|
}
|
|
201
227
|
const pulseMethod = pulses[prop];
|
|
202
228
|
|
|
203
229
|
if (typeof pulseMethod === "function") {
|
|
204
|
-
return
|
|
230
|
+
return (...args: any[]) => {
|
|
231
|
+
const result = pulseMethod.apply(pulsesProxy, args as any);
|
|
232
|
+
if (result instanceof Promise) {
|
|
233
|
+
return result.then((r) => {
|
|
234
|
+
trigger("pulse", prop, args);
|
|
235
|
+
return r;
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
trigger("pulse", prop, args);
|
|
239
|
+
return result;
|
|
240
|
+
};
|
|
205
241
|
}
|
|
206
242
|
|
|
207
243
|
return pulseMethod;
|
|
208
244
|
}
|
|
209
245
|
});
|
|
210
246
|
|
|
211
|
-
return pulsesProxy as StorePulses<PulsesType> & {
|
|
247
|
+
return pulsesProxy as StorePulses<PulsesType> & {
|
|
248
|
+
state: ProxyState<StateType>;
|
|
249
|
+
on: (event: string, callback: Function) => void;
|
|
250
|
+
off: (event: string, callback: Function) => void;
|
|
251
|
+
};
|
|
212
252
|
}
|
|
213
253
|
|
|
214
254
|
export function createPulseStore<StateType extends State, PulsesType extends Pulses<StateType>>(
|
|
215
255
|
initialState: StateType,
|
|
216
256
|
pulses: PulsesType
|
|
217
|
-
): StorePulses<PulsesType> & {
|
|
257
|
+
): StorePulses<PulsesType> & {
|
|
258
|
+
state: ProxyState<StateType>;
|
|
259
|
+
on: (event: string, callback: Function) => void;
|
|
260
|
+
off: (event: string, callback: Function) => void;
|
|
261
|
+
} {
|
|
218
262
|
return createStore(initialState, pulses, true);
|
|
219
263
|
}
|
|
220
264
|
|
|
221
265
|
export function createMutableStore<StateType extends State, PulsesType extends Pulses<StateType>>(
|
|
222
266
|
initialState: StateType,
|
|
223
267
|
pulses: PulsesType
|
|
224
|
-
): StorePulses<PulsesType> & {
|
|
268
|
+
): StorePulses<PulsesType> & {
|
|
269
|
+
state: ProxyState<StateType>;
|
|
270
|
+
on: (event: string, callback: Function) => void;
|
|
271
|
+
off: (event: string, callback: Function) => void;
|
|
272
|
+
} {
|
|
225
273
|
console.warn(
|
|
226
274
|
"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."
|
|
227
275
|
);
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/* eslint-disable no-console */
|
|
2
|
+
import { FluxStore } from "valyrian.js/flux-store";
|
|
3
|
+
|
|
4
|
+
declare global {
|
|
5
|
+
interface Window {
|
|
6
|
+
__REDUX_DEVTOOLS_EXTENSION__: any;
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
interface DevToolsOptions {
|
|
11
|
+
name?: string;
|
|
12
|
+
[key: string]: any;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
function getDevTools() {
|
|
16
|
+
const isBrowser = typeof window !== "undefined";
|
|
17
|
+
if (isBrowser && window.__REDUX_DEVTOOLS_EXTENSION__) {
|
|
18
|
+
return window.__REDUX_DEVTOOLS_EXTENSION__;
|
|
19
|
+
}
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export function connectFluxStore(store: FluxStore, options: DevToolsOptions = {}) {
|
|
24
|
+
const devTools = getDevTools();
|
|
25
|
+
if (!devTools) {
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const name = options.name || "FluxStore";
|
|
30
|
+
const dt = devTools.connect({ name, ...options });
|
|
31
|
+
dt.init(store.state);
|
|
32
|
+
|
|
33
|
+
store.on("commit", (_: any, mutation: string, ...args: any[]) => {
|
|
34
|
+
dt.send({ type: mutation, payload: args }, store.state);
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
store.on("registerModule", (_: any, namespace: string) => {
|
|
38
|
+
dt.send({ type: `[Module] Register: ${namespace}` }, store.state);
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
store.on("unregisterModule", (_: any, namespace: string) => {
|
|
42
|
+
dt.send({ type: `[Module] Unregister: ${namespace}` }, store.state);
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export function connectPulseStore(store: any, options: DevToolsOptions = {}) {
|
|
47
|
+
const devTools = getDevTools();
|
|
48
|
+
if (!devTools) {
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const name = options.name || "PulseStore";
|
|
53
|
+
const dt = devTools.connect({ name, ...options });
|
|
54
|
+
dt.init(store.state);
|
|
55
|
+
|
|
56
|
+
if (store.on) {
|
|
57
|
+
store.on("pulse", (pulse: string, args: any[]) => {
|
|
58
|
+
dt.send({ type: pulse, payload: args }, store.state);
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export function connectPulse(pulse: any, options: DevToolsOptions = {}) {
|
|
64
|
+
// Pulse is [read, write, runSubscribers]
|
|
65
|
+
// We can't easily hook into the write function without wrapping it.
|
|
66
|
+
// But the user asked for "simple" and "using existing apis".
|
|
67
|
+
// If we want to debug individual pulses, we might need to wrap them.
|
|
68
|
+
|
|
69
|
+
const devTools = getDevTools();
|
|
70
|
+
if (!devTools) {
|
|
71
|
+
return pulse;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
const name = options.name || "Pulse";
|
|
75
|
+
const dt = devTools.connect({ name, ...options });
|
|
76
|
+
const [read, write, run] = pulse;
|
|
77
|
+
|
|
78
|
+
dt.init(read());
|
|
79
|
+
|
|
80
|
+
const newWrite = (newValue: any) => {
|
|
81
|
+
write(newValue);
|
|
82
|
+
dt.send({ type: "update", payload: newValue }, read());
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
return [read, newWrite, run];
|
|
86
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "valyrian.js",
|
|
3
|
-
"version": "8.0
|
|
3
|
+
"version": "8.1.0",
|
|
4
4
|
"description": "Lightweight steel to forge PWAs. (Minimal Frontend Framework with server side rendering and other capabilities)",
|
|
5
5
|
"repository": "git@github.com:Masquerade-Circus/valyrian.js.git",
|
|
6
6
|
"author": "Masquerade <christian@masquerade-circus.net>",
|