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.
@@ -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;AAmMF,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;IAAE,KAAK,EAAE,UAAU,CAAC,SAAS,CAAC,CAAA;CAAE,CAE5D;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;IAAE,KAAK,EAAE,UAAU,CAAC,SAAS,CAAC,CAAA;CAAE,CAK5D;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"}
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"}
@@ -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 pulseMethod.bind(pulsesProxy);
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
  }
@@ -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": "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",
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
  }
@@ -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:()=>p,createMutableStore:()=>h,createPulse:()=>y,createPulseStore:()=>d});var s,l=(s=o,((o,s,l,a)=>{if(s&&"object"==typeof s||"function"==typeof s)for(let c of n(s))r.call(o,c)||c===l||e(o,c,{get:()=>s[c],enumerable:!(a=t(s,c))||a.enumerable});return o})(e({},"__esModule",{value:!0}),s)),a=require("valyrian.js"),c=require("valyrian.js/utils"),u=[];function i(e,t){const n=a.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,a.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 a(){if(n)throw new Error("You need to call a pulse to modify the state")}let f=null,d=0;const h=new Proxy(l,{get:(e,t)=>{if(f)return f[t];const n=u[u.length-1];return n&&!r.has(n)&&r.add(n),i(r,o),e[t]},set:(e,t,n)=>(a(),Reflect.set(e,t,n),!0),deleteProperty:(e,t)=>(a(),Reflect.deleteProperty(e,t),!0)});function p(e){for(const t in e)l[t]=n?(0,c.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){d--,(0,c.hasChanged)(l,e)&&(d>0&&!t||(p(e),f=null,y&&clearTimeout(y),y=setTimeout(()=>r.forEach(e=>e()),0)))}function m(e){return function(...n){d++,null===f&&(f=(0,c.deepCloneUnfreeze)(l)),Reflect.set(this,"$flush",async()=>{w(f,!0),f=(0,c.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}}}p(l);const b=new Proxy(s,{get:(e,t)=>{if("state"===t)return h;if(!(t in e))throw new Error(`Pulse '${t}' does not exist`);const n=e[t];return"function"==typeof n?n.bind(b):n}});return b}function d(e,t){return f(e,t,!0)}function h(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 p(e){const t=()=>{try{u.push(t),e()}finally{u.pop()}};t()}function y(e){let t=e;const n=new Set,r=new WeakSet,o=()=>{n.forEach(e=>e())};return[()=>{const e=u[u.length-1];return e&&!n.has(e)&&n.add(e),i(n,r),t},e=>{const n="function"==typeof e?e(t):e;(0,c.hasChanged)(t,n)&&(t=n,o())},o]}"undefined"!=typeof module?module.exports=l:self.ValyrianPulses=l})();//# sourceMappingURL=index.min.js.map
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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
@@ -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 pulseMethod.bind(pulsesProxy);
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": "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",
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
+ }
@@ -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> & { state: ProxyState<StateType> } {
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 pulseMethod.bind(pulsesProxy);
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> & { state: ProxyState<StateType> };
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> & { state: ProxyState<StateType> } {
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> & { state: ProxyState<StateType> } {
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.14",
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>",