valyrian.js 8.1.8 → 8.1.9

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.
@@ -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,YAAY,GAAG;IACzB,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7B,CAAC;AAEF,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,KAAK,UAAU,CAAC,SAAS,IAAI,SAAS,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CAAE,CAAC;AAIhE,KAAK,WAAW,CAAC,UAAU,IAAI;KAC5B,CAAC,IAAI,MAAM,UAAU,GAAG,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,MAAM,IAAI,KAAK,MAAM,CAAC,GACvF,CAAC,GAAG,IAAI,EAAE,IAAI,KAAK,CAAC,GACpB,KAAK;CACV,CAAC;AAoOF,wBAAgB,gBAAgB,CAAC,SAAS,SAAS,KAAK,EAAE,UAAU,SAAS,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,EAChH,YAAY,EAAE,SAAS,EACvB,MAAM,EAAE,UAAU,GAAG,QAAQ,CAAC,UAAU,GAAG,YAAY,CAAC;;QAhMpD,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,KAAK,IAAI;SAC1C,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,KAAK,IAAI;EAkMjD;AAED,wBAAgB,kBAAkB,CAAC,SAAS,SAAS,KAAK,EAAE,UAAU,SAAS,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,EAClH,YAAY,EAAE,SAAS,EACvB,MAAM,EAAE,UAAU,GAAG,QAAQ,CAAC,UAAU,GAAG,YAAY,CAAC;;QAvMpD,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,KAAK,IAAI;SAC1C,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,KAAK,IAAI;EA4MjD;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":"AAKA,KAAK,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAEjC,MAAM,MAAM,YAAY,GAAG;IACzB,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7B,CAAC;AAEF,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,KAAK,UAAU,CAAC,SAAS,IAAI,SAAS,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CAAE,CAAC;AAIhE,KAAK,WAAW,CAAC,UAAU,IAAI;KAC5B,CAAC,IAAI,MAAM,UAAU,GAAG,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,MAAM,IAAI,KAAK,MAAM,CAAC,GACvF,CAAC,GAAG,IAAI,EAAE,IAAI,KAAK,CAAC,GACpB,KAAK;CACV,CAAC;AAiPF,wBAAgB,gBAAgB,CAAC,SAAS,SAAS,KAAK,EAAE,UAAU,SAAS,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,EAChH,YAAY,EAAE,SAAS,EACvB,MAAM,EAAE,UAAU,GAAG,QAAQ,CAAC,UAAU,GAAG,YAAY,CAAC;;QA7MpD,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,KAAK,IAAI;SAC1C,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,KAAK,IAAI;EA+MjD;AAED,wBAAgB,kBAAkB,CAAC,SAAS,SAAS,KAAK,EAAE,UAAU,SAAS,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,EAClH,YAAY,EAAE,SAAS,EACvB,MAAM,EAAE,UAAU,GAAG,QAAQ,CAAC,UAAU,GAAG,YAAY,CAAC;;QApNpD,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,KAAK,IAAI;SAC1C,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,KAAK,IAAI;EAyNjD;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"}
@@ -126,46 +126,55 @@ function createStore(initialState, pulses, immutable = false) {
126
126
  return;
127
127
  }
128
128
  syncState(newState);
129
- currentState = null;
129
+ if (!flush) {
130
+ currentState = null;
131
+ }
132
+ pulseCallCount = 0;
130
133
  debouncedUpdate();
131
134
  }
135
+ function unfreezeState() {
136
+ if (currentState === null) {
137
+ currentState = (0, import_utils.deepCloneUnfreeze)(localState);
138
+ }
139
+ return currentState;
140
+ }
132
141
  function getPulseMethod(key) {
133
142
  return function(...args) {
134
143
  pulseCallCount++;
135
- if (currentState === null) {
136
- currentState = (0, import_utils.deepCloneUnfreeze)(localState);
137
- }
144
+ const state = unfreezeState();
138
145
  const context = Object.create(pulses);
139
146
  context.$flush = async () => {
140
147
  if (currentState) {
141
148
  setState(currentState, true);
142
- currentState = (0, import_utils.deepCloneUnfreeze)(localState);
143
149
  }
144
- await new Promise((resolve) => setTimeout(resolve, 0));
145
150
  };
146
151
  const emptyFlush = async () => {
147
152
  };
153
+ const handleError = (error) => {
154
+ console.error(`Error in pulse '${key}':`, error);
155
+ context.$flush = emptyFlush;
156
+ pulseCallCount--;
157
+ if (pulseCallCount <= 0) {
158
+ currentState = null;
159
+ pulseCallCount = 0;
160
+ }
161
+ throw error;
162
+ };
148
163
  try {
149
- const pulseResult = pulses[key].apply(context, [currentState, ...args]);
164
+ const pulseResult = pulses[key].apply(context, [state, ...args]);
150
165
  if (pulseResult instanceof Promise) {
151
166
  return pulseResult.then((resolvedValue) => {
152
- setState(currentState);
167
+ setState(state);
153
168
  context.$flush = emptyFlush;
154
169
  return resolvedValue;
155
- }).catch((error) => {
156
- console.error(`Error in pulse '${key}':`, error);
157
- context.$flush = emptyFlush;
158
- throw error;
159
- });
170
+ }).catch(handleError);
160
171
  } else {
161
- setState(currentState);
172
+ setState(state);
162
173
  context.$flush = emptyFlush;
163
174
  return pulseResult;
164
175
  }
165
176
  } catch (error) {
166
- console.error(`Error in pulse '${key}':`, error);
167
- context.$flush = emptyFlush;
168
- throw error;
177
+ handleError(error);
169
178
  }
170
179
  };
171
180
  }
@@ -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 PulseContext = {\n $flush: () => Promise<void>;\n};\n\nexport type Pulse<StateType, TReturn = unknown> = (state: StateType, ...args: any[]) => TReturn | Promise<TReturn>;\n\ntype ProxyState<StateType> = StateType & { [key: string]: any };\n\nconst effectStack: Function[] = [];\n\ntype StorePulses<PulsesType> = {\n [K in keyof PulsesType]: PulsesType[K] extends (state: any, ...args: infer Args) => infer R\n ? (...args: Args) => R\n : never;\n};\n\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 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 Record<string, Pulse<StateType, any>>>(\n initialState: StateType | (() => StateType) | null,\n pulses: PulsesType & ThisType<PulsesType & PulseContext>,\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: Record<string, Function> = {};\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 (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 return function (this: any, ...args: any[]) {\n pulseCallCount++;\n if (currentState === null) {\n currentState = deepCloneUnfreeze(localState);\n }\n\n // Runtime: Creamos un objeto que hereda de 'pulses' para que 'this' tenga acceso a los hermanos\n const context = Object.create(pulses);\n\n context.$flush = async () => {\n if (currentState) {\n setState(currentState, true);\n currentState = deepCloneUnfreeze(localState);\n }\n await new Promise((resolve) => setTimeout(resolve, 0));\n };\n\n const emptyFlush = async () => {};\n\n try {\n const pulseResult = pulses[key].apply(context, [currentState, ...args]);\n if (pulseResult instanceof Promise) {\n return pulseResult\n .then((resolvedValue) => {\n setState(currentState as StateType);\n context.$flush = emptyFlush;\n return resolvedValue;\n })\n .catch((error) => {\n console.error(`Error in pulse '${key}':`, error);\n context.$flush = emptyFlush;\n throw error;\n });\n } else {\n setState(currentState);\n context.$flush = emptyFlush;\n return pulseResult;\n }\n } catch (error) {\n console.error(`Error in pulse '${key}':`, error);\n context.$flush = emptyFlush;\n throw error;\n }\n };\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 return (...args: any[]) => {\n const result = pulseMethod.apply(pulseMethod, args);\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\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 Record<string, Pulse<StateType, any>>>(\n initialState: StateType,\n pulses: PulsesType & ThisType<PulsesType & PulseContext>\n) {\n return createStore(initialState, pulses, true);\n}\n\nexport function createMutableStore<StateType extends State, PulsesType extends Record<string, Pulse<StateType, any>>>(\n initialState: StateType,\n pulses: PulsesType & ThisType<PulsesType & PulseContext>\n) {\n console.warn(\n \"Warning: You are working with a mutable state. 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 @typescript-eslint/no-unsafe-function-type */\n\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 PulseContext = {\n $flush: () => Promise<void>;\n};\n\nexport type Pulse<StateType, TReturn = unknown> = (state: StateType, ...args: any[]) => TReturn | Promise<TReturn>;\n\ntype ProxyState<StateType> = StateType & { [key: string]: any };\n\nconst effectStack: Function[] = [];\n\ntype StorePulses<PulsesType> = {\n [K in keyof PulsesType]: PulsesType[K] extends (state: any, ...args: infer Args) => infer R\n ? (...args: Args) => R\n : never;\n};\n\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 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 Record<string, Pulse<StateType, any>>>(\n initialState: StateType | (() => StateType) | null,\n pulses: PulsesType & ThisType<PulsesType & PulseContext>,\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: Record<string, Function> = {};\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 (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 if (!flush) {\n currentState = null;\n }\n pulseCallCount = 0;\n debouncedUpdate();\n }\n\n function unfreezeState() {\n if (currentState === null) {\n currentState = deepCloneUnfreeze(localState);\n }\n return currentState;\n }\n\n function getPulseMethod(key: string) {\n return function (this: any, ...args: any[]) {\n pulseCallCount++;\n\n const state = unfreezeState();\n\n const context = Object.create(pulses);\n\n context.$flush = async () => {\n if (currentState) {\n setState(currentState, true);\n }\n };\n\n const emptyFlush = async () => {};\n\n const handleError = (error: any) => {\n console.error(`Error in pulse '${key}':`, error);\n context.$flush = emptyFlush;\n\n pulseCallCount--;\n if (pulseCallCount <= 0) {\n currentState = null;\n pulseCallCount = 0;\n }\n\n throw error;\n };\n\n try {\n const pulseResult = pulses[key].apply(context, [state, ...args]);\n if (pulseResult instanceof Promise) {\n return pulseResult\n .then((resolvedValue) => {\n setState(state as StateType);\n context.$flush = emptyFlush;\n return resolvedValue;\n })\n .catch(handleError);\n } else {\n setState(state);\n context.$flush = emptyFlush;\n return pulseResult;\n }\n } catch (error) {\n handleError(error);\n }\n };\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 return (...args: any[]) => {\n const result = pulseMethod.apply(pulseMethod, args);\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\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 Record<string, Pulse<StateType, any>>>(\n initialState: StateType,\n pulses: PulsesType & ThisType<PulsesType & PulseContext>\n) {\n return createStore(initialState, pulses, true);\n}\n\nexport function createMutableStore<StateType extends State, PulsesType extends Record<string, Pulse<StateType, any>>>(\n initialState: StateType,\n pulses: PulsesType & ThisType<PulsesType & PulseContext>\n) {\n console.warn(\n \"Warning: You are working with a mutable state. 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:()=>h,createMutableStore:()=>d,createPulse:()=>y,createPulseStore:()=>p});var s,u=(s=o,((o,s,u,a)=>{if(s&&"object"==typeof s||"function"==typeof s)for(let l of n(s))r.call(o,l)||l===u||e(o,l,{get:()=>s[l],enumerable:!(a=t(s,l))||a.enumerable});return o})(e({},"__esModule",{value:!0}),s)),a=require("valyrian.js"),l=require("valyrian.js/utils"),c=[];function f(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 i(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 u=("function"==typeof e?e():e)||{};function a(){if(n)throw new Error("You need to call a pulse to modify the state")}let i=null,p=0;const d=new Proxy(u,{get:(e,t)=>{if(i)return i[t];const n=c[c.length-1];return n&&!r.has(n)&&r.add(n),f(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 h(e){for(const t in e)u[t]=n?(0,l.deepFreeze)(e[t]):e[t];for(const t in u)t in e||Reflect.deleteProperty(u,t)}let y=null;function w(e,t=!1){p--,(0,l.hasChanged)(u,e)&&(p>0&&!t||(h(e),i=null,y&&clearTimeout(y),y=setTimeout(()=>r.forEach(e=>e()),0)))}function m(e){return function(...n){p++,null===i&&(i=(0,l.deepCloneUnfreeze)(u));const r=Object.create(t);r.$flush=async()=>{i&&(w(i,!0),i=(0,l.deepCloneUnfreeze)(u)),await new Promise(e=>setTimeout(e,0))};const o=async()=>{};try{const s=t[e].apply(r,[i,...n]);return s instanceof Promise?s.then(e=>(w(i),r.$flush=o,e)).catch(t=>{throw console.error(`Error in pulse '${e}':`,t),r.$flush=o,t}):(w(i),r.$flush=o,s)}catch(t){throw console.error(`Error in pulse '${e}':`,t),r.$flush=o,t}}}h(u);const P={},g=(e,...t)=>{P[e]&&P[e].forEach(e=>e(...t))};return new Proxy(s,{get:(e,t)=>{if("state"===t)return d;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(...e)=>{const r=n.apply(n,e);return r instanceof Promise?r.then(n=>(g("pulse",t,e),n)):(g("pulse",t,e),r)}}})}function p(e,t){return i(e,t,!0)}function d(e,t){return console.warn("Warning: You are working with a mutable state. All state changes made outside of a pulse will not trigger a re-render."),i(e,t,!1)}function h(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),f(n,r),t},e=>{const n="function"==typeof e?e(t):e;(0,l.hasChanged)(t,n)&&(t=n,o())},o]}"undefined"!=typeof module?module.exports=u:self.ValyrianPulses=u})();//# 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:()=>h,createMutableStore:()=>p,createPulse:()=>y,createPulseStore:()=>d});var s,u=(s=o,((o,s,u,a)=>{if(s&&"object"==typeof s||"function"==typeof s)for(let l of n(s))r.call(o,l)||l===u||e(o,l,{get:()=>s[l],enumerable:!(a=t(s,l))||a.enumerable});return o})(e({},"__esModule",{value:!0}),s)),a=require("valyrian.js"),l=require("valyrian.js/utils"),c=[];function f(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 i(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 u=("function"==typeof e?e():e)||{};function a(){if(n)throw new Error("You need to call a pulse to modify the state")}let i=null,d=0;const p=new Proxy(u,{get:(e,t)=>{if(i)return i[t];const n=c[c.length-1];return n&&!r.has(n)&&r.add(n),f(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 h(e){for(const t in e)u[t]=n?(0,l.deepFreeze)(e[t]):e[t];for(const t in u)t in e||Reflect.deleteProperty(u,t)}let y=null;function w(e,t=!1){d--,(0,l.hasChanged)(u,e)&&(d>0&&!t||(h(e),t||(i=null),d=0,y&&clearTimeout(y),y=setTimeout(()=>r.forEach(e=>e()),0)))}function m(e){return function(...n){d++;const r=(null===i&&(i=(0,l.deepCloneUnfreeze)(u)),i),o=Object.create(t);o.$flush=async()=>{i&&w(i,!0)};const s=async()=>{},a=t=>{throw console.error(`Error in pulse '${e}':`,t),o.$flush=s,d--,d<=0&&(i=null,d=0),t};try{const u=t[e].apply(o,[r,...n]);return u instanceof Promise?u.then(e=>(w(r),o.$flush=s,e)).catch(a):(w(r),o.$flush=s,u)}catch(e){a(e)}}}h(u);const P={},g=(e,...t)=>{P[e]&&P[e].forEach(e=>e(...t))};return 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(...e)=>{const r=n.apply(n,e);return r instanceof Promise?r.then(n=>(g("pulse",t,e),n)):(g("pulse",t,e),r)}}})}function d(e,t){return i(e,t,!0)}function p(e,t){return console.warn("Warning: You are working with a mutable state. All state changes made outside of a pulse will not trigger a re-render."),i(e,t,!1)}function h(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),f(n,r),t},e=>{const n="function"==typeof e?e(t):e;(0,l.hasChanged)(t,n)&&(t=n,o())},o]}"undefined"!=typeof module?module.exports=u:self.ValyrianPulses=u})();//# sourceMappingURL=index.min.js.map
@@ -1 +1 @@
1
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJpbmRleF9leHBvcnRzIiwiX19leHBvcnQiLCJjcmVhdGVFZmZlY3QiLCJjcmVhdGVNdXRhYmxlU3RvcmUiLCJjcmVhdGVQdWxzZSIsImNyZWF0ZVB1bHNlU3RvcmUiLCJfX0VYUE9SVFNfXyIsImltcG9ydF92YWx5cmlhbiIsInJlcXVpcmUiLCJpbXBvcnRfdXRpbHMiLCJlZmZlY3RTdGFjayIsInJlZ2lzdGVyRG9tU3Vic2NyaXB0aW9uIiwic3Vic2NyaWJlcnMiLCJkb21XaXRoVm5vZGVzVG9VcGRhdGUiLCJjdXJyZW50Vm5vZGUiLCJjdXJyZW50Iiwidm5vZGUiLCJoYXMiLCJkb20iLCJoYXNQYXJlbnQiLCJwYXJlbnQiLCJwYXJlbnRFbGVtZW50Iiwic3Vic2NyaXB0aW9uIiwidXBkYXRlVm5vZGUiLCJkZWxldGUiLCJhZGQiLCJjcmVhdGVTdG9yZSIsImluaXRpYWxTdGF0ZSIsInB1bHNlcyIsImltbXV0YWJsZSIsIlNldCIsIldlYWtTZXQiLCJib3VuZFB1bHNlcyIsImtleSIsIkVycm9yIiwiZ2V0UHVsc2VNZXRob2QiLCJsb2NhbFN0YXRlIiwiaXNNdXRhYmxlIiwiY3VycmVudFN0YXRlIiwicHVsc2VDYWxsQ291bnQiLCJwcm94eVN0YXRlIiwiUHJveHkiLCJnZXQiLCJzdGF0ZSIsInByb3AiLCJjdXJyZW50RWZmZWN0IiwibGVuZ3RoIiwic2V0IiwidmFsdWUiLCJSZWZsZWN0IiwiZGVsZXRlUHJvcGVydHkiLCJzeW5jU3RhdGUiLCJuZXdTdGF0ZSIsImRlZXBGcmVlemUiLCJkZWJvdW5jZVRpbWVvdXQiLCJzZXRTdGF0ZSIsImZsdXNoIiwiaGFzQ2hhbmdlZCIsImNsZWFyVGltZW91dCIsInNldFRpbWVvdXQiLCJmb3JFYWNoIiwic3Vic2NyaWJlciIsImFyZ3MiLCJkZWVwQ2xvbmVVbmZyZWV6ZSIsImNvbnRleHQiLCJPYmplY3QiLCJjcmVhdGUiLCIkZmx1c2giLCJhc3luYyIsIlByb21pc2UiLCJyZXNvbHZlIiwiZW1wdHlGbHVzaCIsInB1bHNlUmVzdWx0IiwiYXBwbHkiLCJ0aGVuIiwicmVzb2x2ZWRWYWx1ZSIsImNhdGNoIiwiZXJyb3IiLCJjb25zb2xlIiwibGlzdGVuZXJzIiwidHJpZ2dlciIsImV2ZW50IiwiY2FsbGJhY2siLCJwdXNoIiwiZmlsdGVyIiwiY2IiLCJwdWxzZU1ldGhvZCIsInJlc3VsdCIsInIiLCJ3YXJuIiwiZWZmZWN0IiwicnVuRWZmZWN0IiwicG9wIiwiaW5pdGlhbFZhbHVlIiwicnVuU3Vic2NyaWJlcnMiLCJuZXdWYWx1ZSJdLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9wdWxzZXMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tY29uc29sZSAqL1xuaW1wb3J0IHsgdXBkYXRlVm5vZGUsIFZub2RlV2l0aERvbSwgY3VycmVudCwgRG9tRWxlbWVudCB9IGZyb20gXCJ2YWx5cmlhbi5qc1wiO1xuaW1wb3J0IHsgZGVlcENsb25lVW5mcmVlemUsIGRlZXBGcmVlemUsIGhhc0NoYW5nZWQgfSBmcm9tIFwidmFseXJpYW4uanMvdXRpbHNcIjtcblxudHlwZSBTdGF0ZSA9IFJlY29yZDxzdHJpbmcsIGFueT47XG5cbmV4cG9ydCB0eXBlIFB1bHNlQ29udGV4dCA9IHtcbiAgJGZsdXNoOiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xufTtcblxuZXhwb3J0IHR5cGUgUHVsc2U8U3RhdGVUeXBlLCBUUmV0dXJuID0gdW5rbm93bj4gPSAoc3RhdGU6IFN0YXRlVHlwZSwgLi4uYXJnczogYW55W10pID0+IFRSZXR1cm4gfCBQcm9taXNlPFRSZXR1cm4+O1xuXG50eXBlIFByb3h5U3RhdGU8U3RhdGVUeXBlPiA9IFN0YXRlVHlwZSAmIHsgW2tleTogc3RyaW5nXTogYW55IH07XG5cbmNvbnN0IGVmZmVjdFN0YWNrOiBGdW5jdGlvbltdID0gW107XG5cbnR5cGUgU3RvcmVQdWxzZXM8UHVsc2VzVHlwZT4gPSB7XG4gIFtLIGluIGtleW9mIFB1bHNlc1R5cGVdOiBQdWxzZXNUeXBlW0tdIGV4dGVuZHMgKHN0YXRlOiBhbnksIC4uLmFyZ3M6IGluZmVyIEFyZ3MpID0+IGluZmVyIFJcbiAgICA/ICguLi5hcmdzOiBBcmdzKSA9PiBSXG4gICAgOiBuZXZlcjtcbn07XG5cbmZ1bmN0aW9uIHJlZ2lzdGVyRG9tU3Vic2NyaXB0aW9uKHN1YnNjcmliZXJzOiBTZXQ8RnVuY3Rpb24+LCBkb21XaXRoVm5vZGVzVG9VcGRhdGU6IFdlYWtTZXQ8RG9tRWxlbWVudD4pOiB2b2lkIHtcbiAgY29uc3QgY3VycmVudFZub2RlID0gY3VycmVudC52bm9kZSBhcyBWbm9kZVdpdGhEb207XG4gIGlmICghY3VycmVudFZub2RlIHx8IGRvbVdpdGhWbm9kZXNUb1VwZGF0ZS5oYXMoY3VycmVudFZub2RlLmRvbSkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBsZXQgaGFzUGFyZW50ID0gZmFsc2U7XG4gIGxldCBwYXJlbnQgPSBjdXJyZW50Vm5vZGUuZG9tLnBhcmVudEVsZW1lbnQgYXMgRG9tRWxlbWVudDtcbiAgd2hpbGUgKHBhcmVudCkge1xuICAgIGlmIChkb21XaXRoVm5vZGVzVG9VcGRhdGUuaGFzKHBhcmVudCkpIHtcbiAgICAgIGhhc1BhcmVudCA9IHRydWU7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgcGFyZW50ID0gcGFyZW50LnBhcmVudEVsZW1lbnQgYXMgRG9tRWxlbWVudDtcbiAgfVxuXG4gIGlmICghaGFzUGFyZW50KSB7XG4gICAgY29uc3QgZG9tID0gY3VycmVudFZub2RlLmRvbTtcbiAgICBjb25zdCBzdWJzY3JpcHRpb24gPSAoKSA9PiB7XG4gICAgICB1cGRhdGVWbm9kZShkb20udm5vZGUpO1xuICAgICAgaWYgKCFkb20ucGFyZW50RWxlbWVudCkge1xuICAgICAgICBzdWJzY3JpYmVycy5kZWxldGUoc3Vic2NyaXB0aW9uKTtcbiAgICAgICAgZG9tV2l0aFZub2Rlc1RvVXBkYXRlLmRlbGV0ZShkb20pO1xuICAgICAgfVxuICAgIH07XG4gICAgc3Vic2NyaWJlcnMuYWRkKHN1YnNjcmlwdGlvbik7XG4gICAgZG9tV2l0aFZub2Rlc1RvVXBkYXRlLmFkZChkb20pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVN0b3JlPFN0YXRlVHlwZSBleHRlbmRzIFN0YXRlLCBQdWxzZXNUeXBlIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgUHVsc2U8U3RhdGVUeXBlLCBhbnk+Pj4oXG4gIGluaXRpYWxTdGF0ZTogU3RhdGVUeXBlIHwgKCgpID0+IFN0YXRlVHlwZSkgfCBudWxsLFxuICBwdWxzZXM6IFB1bHNlc1R5cGUgJiBUaGlzVHlwZTxQdWxzZXNUeXBlICYgUHVsc2VDb250ZXh0PixcbiAgaW1tdXRhYmxlID0gZmFsc2Vcbik6IFN0b3JlUHVsc2VzPFB1bHNlc1R5cGU+ICYge1xuICBzdGF0ZTogUHJveHlTdGF0ZTxTdGF0ZVR5cGU+O1xuICBvbjogKGV2ZW50OiBzdHJpbmcsIGNhbGxiYWNrOiBGdW5jdGlvbikgPT4gdm9pZDtcbiAgb2ZmOiAoZXZlbnQ6IHN0cmluZywgY2FsbGJhY2s6IEZ1bmN0aW9uKSA9PiB2b2lkO1xufSB7XG4gIGNvbnN0IHN1YnNjcmliZXJzID0gbmV3IFNldDxGdW5jdGlvbj4oKTtcbiAgY29uc3QgZG9tV2l0aFZub2Rlc1RvVXBkYXRlID0gbmV3IFdlYWtTZXQ8RG9tRWxlbWVudD4oKTtcblxuICBjb25zdCBib3VuZFB1bHNlczogUmVjb3JkPHN0cmluZywgRnVuY3Rpb24+ID0ge307XG4gIGZvciAoY29uc3Qga2V5IGluIHB1bHNlcykge1xuICAgIGlmICh0eXBlb2YgcHVsc2VzW2tleV0gIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBQdWxzZSAnJHtrZXl9JyBtdXN0IGJlIGEgZnVuY3Rpb25gKTtcbiAgICB9XG4gICAgaWYgKGtleSA9PT0gXCJzdGF0ZVwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEEgcHVsc2UgY2Fubm90IGJlIG5hbWVkICdzdGF0ZSdgKTtcbiAgICB9XG4gICAgYm91bmRQdWxzZXNba2V5XSA9IGdldFB1bHNlTWV0aG9kKGtleSk7XG4gIH1cblxuICBjb25zdCBsb2NhbFN0YXRlOiBTdGF0ZVR5cGUgPVxuICAgICh0eXBlb2YgaW5pdGlhbFN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyBpbml0aWFsU3RhdGUoKSA6IGluaXRpYWxTdGF0ZSkgfHwgKHt9IGFzIFN0YXRlVHlwZSk7XG5cbiAgZnVuY3Rpb24gaXNNdXRhYmxlKCkge1xuICAgIGlmIChpbW11dGFibGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIllvdSBuZWVkIHRvIGNhbGwgYSBwdWxzZSB0byBtb2RpZnkgdGhlIHN0YXRlXCIpO1xuICAgIH1cbiAgfVxuXG4gIGxldCBjdXJyZW50U3RhdGU6IFN0YXRlVHlwZSB8IG51bGwgPSBudWxsO1xuICBsZXQgcHVsc2VDYWxsQ291bnQgPSAwO1xuXG4gIGNvbnN0IHByb3h5U3RhdGUgPSBuZXcgUHJveHkobG9jYWxTdGF0ZSwge1xuICAgIGdldDogKHN0YXRlLCBwcm9wOiBzdHJpbmcpID0+IHtcbiAgICAgIGlmIChjdXJyZW50U3RhdGUpIHtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRTdGF0ZVtwcm9wXTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY3VycmVudEVmZmVjdCA9IGVmZmVjdFN0YWNrW2VmZmVjdFN0YWNrLmxlbmd0aCAtIDFdO1xuICAgICAgaWYgKGN1cnJlbnRFZmZlY3QgJiYgIXN1YnNjcmliZXJzLmhhcyhjdXJyZW50RWZmZWN0KSkge1xuICAgICAgICBzdWJzY3JpYmVycy5hZGQoY3VycmVudEVmZmVjdCk7XG4gICAgICB9XG5cbiAgICAgIHJlZ2lzdGVyRG9tU3Vic2NyaXB0aW9uKHN1YnNjcmliZXJzLCBkb21XaXRoVm5vZGVzVG9VcGRhdGUpO1xuXG4gICAgICByZXR1cm4gc3RhdGVbcHJvcF07XG4gICAgfSxcbiAgICBzZXQ6IChzdGF0ZSwgcHJvcDogc3RyaW5nLCB2YWx1ZTogYW55KSA9PiB7XG4gICAgICBpc011dGFibGUoKTtcbiAgICAgIFJlZmxlY3Quc2V0KHN0YXRlLCBwcm9wLCB2YWx1ZSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuICAgIGRlbGV0ZVByb3BlcnR5OiAoc3RhdGUsIHByb3A6IHN0cmluZykgPT4ge1xuICAgICAgaXNNdXRhYmxlKCk7XG4gICAgICBSZWZsZWN0LmRlbGV0ZVByb3BlcnR5KHN0YXRlLCBwcm9wKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSk7XG5cbiAgZnVuY3Rpb24gc3luY1N0YXRlKG5ld1N0YXRlOiBTdGF0ZVR5cGUpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBuZXdTdGF0ZSkge1xuICAgICAgbG9jYWxTdGF0ZVtrZXldID0gaW1tdXRhYmxlID8gZGVlcEZyZWV6ZShuZXdTdGF0ZVtrZXldKSA6IG5ld1N0YXRlW2tleV07XG4gICAgfVxuICAgIGZvciAoY29uc3Qga2V5IGluIGxvY2FsU3RhdGUpIHtcbiAgICAgIGlmICghKGtleSBpbiBuZXdTdGF0ZSkpIHtcbiAgICAgICAgUmVmbGVjdC5kZWxldGVQcm9wZXJ0eShsb2NhbFN0YXRlLCBrZXkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGxldCBkZWJvdW5jZVRpbWVvdXQ6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbCA9IG51bGw7XG4gIGZ1bmN0aW9uIGRlYm91bmNlZFVwZGF0ZSgpIHtcbiAgICBpZiAoZGVib3VuY2VUaW1lb3V0KSB7XG4gICAgICBjbGVhclRpbWVvdXQoZGVib3VuY2VUaW1lb3V0KTtcbiAgICB9XG4gICAgZGVib3VuY2VUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiBzdWJzY3JpYmVycy5mb3JFYWNoKChzdWJzY3JpYmVyKSA9PiBzdWJzY3JpYmVyKCkpLCAwKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNldFN0YXRlKG5ld1N0YXRlOiBTdGF0ZVR5cGUsIGZsdXNoID0gZmFsc2UpIHtcbiAgICBwdWxzZUNhbGxDb3VudC0tO1xuICAgIGlmICghaGFzQ2hhbmdlZChsb2NhbFN0YXRlLCBuZXdTdGF0ZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHB1bHNlQ2FsbENvdW50ID4gMCAmJiAhZmx1c2gpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc3luY1N0YXRlKG5ld1N0YXRlKTtcbiAgICBjdXJyZW50U3RhdGUgPSBudWxsO1xuICAgIGRlYm91bmNlZFVwZGF0ZSgpO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0UHVsc2VNZXRob2Qoa2V5OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRoaXM6IGFueSwgLi4uYXJnczogYW55W10pIHtcbiAgICAgIHB1bHNlQ2FsbENvdW50Kys7XG4gICAgICBpZiAoY3VycmVudFN0YXRlID09PSBudWxsKSB7XG4gICAgICAgIGN1cnJlbnRTdGF0ZSA9IGRlZXBDbG9uZVVuZnJlZXplKGxvY2FsU3RhdGUpO1xuICAgICAgfVxuXG4gICAgICAvLyBSdW50aW1lOiBDcmVhbW9zIHVuIG9iamV0byBxdWUgaGVyZWRhIGRlICdwdWxzZXMnIHBhcmEgcXVlICd0aGlzJyB0ZW5nYSBhY2Nlc28gYSBsb3MgaGVybWFub3NcbiAgICAgIGNvbnN0IGNvbnRleHQgPSBPYmplY3QuY3JlYXRlKHB1bHNlcyk7XG5cbiAgICAgIGNvbnRleHQuJGZsdXNoID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICBpZiAoY3VycmVudFN0YXRlKSB7XG4gICAgICAgICAgc2V0U3RhdGUoY3VycmVudFN0YXRlLCB0cnVlKTtcbiAgICAgICAgICBjdXJyZW50U3RhdGUgPSBkZWVwQ2xvbmVVbmZyZWV6ZShsb2NhbFN0YXRlKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCAwKSk7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBlbXB0eUZsdXNoID0gYXN5bmMgKCkgPT4ge307XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHB1bHNlUmVzdWx0ID0gcHVsc2VzW2tleV0uYXBwbHkoY29udGV4dCwgW2N1cnJlbnRTdGF0ZSwgLi4uYXJnc10pO1xuICAgICAgICBpZiAocHVsc2VSZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgcmV0dXJuIHB1bHNlUmVzdWx0XG4gICAgICAgICAgICAudGhlbigocmVzb2x2ZWRWYWx1ZSkgPT4ge1xuICAgICAgICAgICAgICBzZXRTdGF0ZShjdXJyZW50U3RhdGUgYXMgU3RhdGVUeXBlKTtcbiAgICAgICAgICAgICAgY29udGV4dC4kZmx1c2ggPSBlbXB0eUZsdXNoO1xuICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZWRWYWx1ZTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yIGluIHB1bHNlICcke2tleX0nOmAsIGVycm9yKTtcbiAgICAgICAgICAgICAgY29udGV4dC4kZmx1c2ggPSBlbXB0eUZsdXNoO1xuICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNldFN0YXRlKGN1cnJlbnRTdGF0ZSk7XG4gICAgICAgICAgY29udGV4dC4kZmx1c2ggPSBlbXB0eUZsdXNoO1xuICAgICAgICAgIHJldHVybiBwdWxzZVJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3IgaW4gcHVsc2UgJyR7a2V5fSc6YCwgZXJyb3IpO1xuICAgICAgICBjb250ZXh0LiRmbHVzaCA9IGVtcHR5Rmx1c2g7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBzeW5jU3RhdGUobG9jYWxTdGF0ZSk7XG5cbiAgY29uc3QgbGlzdGVuZXJzOiBSZWNvcmQ8c3RyaW5nLCBGdW5jdGlvbltdPiA9IHt9O1xuICBjb25zdCB0cmlnZ2VyID0gKGV2ZW50OiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKSA9PiB7XG4gICAgaWYgKGxpc3RlbmVyc1tldmVudF0pIHtcbiAgICAgIGxpc3RlbmVyc1tldmVudF0uZm9yRWFjaCgoY2FsbGJhY2spID0+IGNhbGxiYWNrKC4uLmFyZ3MpKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgcHVsc2VzUHJveHkgPSBuZXcgUHJveHkoYm91bmRQdWxzZXMsIHtcbiAgICBnZXQ6IChwdWxzZXMsIHByb3A6IHN0cmluZykgPT4ge1xuICAgICAgaWYgKHByb3AgPT09IFwic3RhdGVcIikge1xuICAgICAgICByZXR1cm4gcHJveHlTdGF0ZTtcbiAgICAgIH1cbiAgICAgIGlmIChwcm9wID09PSBcIm9uXCIpIHtcbiAgICAgICAgcmV0dXJuIChldmVudDogc3RyaW5nLCBjYWxsYmFjazogRnVuY3Rpb24pID0+IHtcbiAgICAgICAgICBpZiAoIWxpc3RlbmVyc1tldmVudF0pIHtcbiAgICAgICAgICAgIGxpc3RlbmVyc1tldmVudF0gPSBbXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbGlzdGVuZXJzW2V2ZW50XS5wdXNoKGNhbGxiYWNrKTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmIChwcm9wID09PSBcIm9mZlwiKSB7XG4gICAgICAgIHJldHVybiAoZXZlbnQ6IHN0cmluZywgY2FsbGJhY2s6IEZ1bmN0aW9uKSA9PiB7XG4gICAgICAgICAgaWYgKGxpc3RlbmVyc1tldmVudF0pIHtcbiAgICAgICAgICAgIGxpc3RlbmVyc1tldmVudF0gPSBsaXN0ZW5lcnNbZXZlbnRdLmZpbHRlcigoY2IpID0+IGNiICE9PSBjYWxsYmFjayk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKCEocHJvcCBpbiBwdWxzZXMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgUHVsc2UgJyR7cHJvcH0nIGRvZXMgbm90IGV4aXN0YCk7XG4gICAgICB9XG4gICAgICBjb25zdCBwdWxzZU1ldGhvZCA9IHB1bHNlc1twcm9wXTtcblxuICAgICAgcmV0dXJuICguLi5hcmdzOiBhbnlbXSkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBwdWxzZU1ldGhvZC5hcHBseShwdWxzZU1ldGhvZCwgYXJncyk7XG4gICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdC50aGVuKChyKSA9PiB7XG4gICAgICAgICAgICB0cmlnZ2VyKFwicHVsc2VcIiwgcHJvcCwgYXJncyk7XG4gICAgICAgICAgICByZXR1cm4gcjtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB0cmlnZ2VyKFwicHVsc2VcIiwgcHJvcCwgYXJncyk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9O1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIHB1bHNlc1Byb3h5IGFzIFN0b3JlUHVsc2VzPFB1bHNlc1R5cGU+ICYge1xuICAgIHN0YXRlOiBQcm94eVN0YXRlPFN0YXRlVHlwZT47XG4gICAgb246IChldmVudDogc3RyaW5nLCBjYWxsYmFjazogRnVuY3Rpb24pID0+IHZvaWQ7XG4gICAgb2ZmOiAoZXZlbnQ6IHN0cmluZywgY2FsbGJhY2s6IEZ1bmN0aW9uKSA9PiB2b2lkO1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUHVsc2VTdG9yZTxTdGF0ZVR5cGUgZXh0ZW5kcyBTdGF0ZSwgUHVsc2VzVHlwZSBleHRlbmRzIFJlY29yZDxzdHJpbmcsIFB1bHNlPFN0YXRlVHlwZSwgYW55Pj4+KFxuICBpbml0aWFsU3RhdGU6IFN0YXRlVHlwZSxcbiAgcHVsc2VzOiBQdWxzZXNUeXBlICYgVGhpc1R5cGU8UHVsc2VzVHlwZSAmIFB1bHNlQ29udGV4dD5cbikge1xuICByZXR1cm4gY3JlYXRlU3RvcmUoaW5pdGlhbFN0YXRlLCBwdWxzZXMsIHRydWUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTXV0YWJsZVN0b3JlPFN0YXRlVHlwZSBleHRlbmRzIFN0YXRlLCBQdWxzZXNUeXBlIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgUHVsc2U8U3RhdGVUeXBlLCBhbnk+Pj4oXG4gIGluaXRpYWxTdGF0ZTogU3RhdGVUeXBlLFxuICBwdWxzZXM6IFB1bHNlc1R5cGUgJiBUaGlzVHlwZTxQdWxzZXNUeXBlICYgUHVsc2VDb250ZXh0PlxuKSB7XG4gIGNvbnNvbGUud2FybihcbiAgICBcIldhcm5pbmc6IFlvdSBhcmUgd29ya2luZyB3aXRoIGEgbXV0YWJsZSBzdGF0ZS4gQWxsIHN0YXRlIGNoYW5nZXMgbWFkZSBvdXRzaWRlIG9mIGEgcHVsc2Ugd2lsbCBub3QgdHJpZ2dlciBhIHJlLXJlbmRlci5cIlxuICApO1xuICByZXR1cm4gY3JlYXRlU3RvcmUoaW5pdGlhbFN0YXRlLCBwdWxzZXMsIGZhbHNlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUVmZmVjdChlZmZlY3Q6IEZ1bmN0aW9uKSB7XG4gIGNvbnN0IHJ1bkVmZmVjdCA9ICgpID0+IHtcbiAgICB0cnkge1xuICAgICAgZWZmZWN0U3RhY2sucHVzaChydW5FZmZlY3QpO1xuICAgICAgZWZmZWN0KCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGVmZmVjdFN0YWNrLnBvcCgpO1xuICAgIH1cbiAgfTtcbiAgcnVuRWZmZWN0KCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQdWxzZTxUPihpbml0aWFsVmFsdWU6IFQpOiBbKCkgPT4gVCwgKG5ld1ZhbHVlOiBUIHwgKChjdXJyZW50OiBUKSA9PiBUKSkgPT4gdm9pZCwgKCkgPT4gdm9pZF0ge1xuICBsZXQgdmFsdWUgPSBpbml0aWFsVmFsdWU7XG4gIGNvbnN0IHN1YnNjcmliZXJzID0gbmV3IFNldDxGdW5jdGlvbj4oKTtcbiAgY29uc3QgZG9tV2l0aFZub2Rlc1RvVXBkYXRlID0gbmV3IFdlYWtTZXQ8RG9tRWxlbWVudD4oKTtcblxuICBjb25zdCBydW5TdWJzY3JpYmVycyA9ICgpID0+IHtcbiAgICBzdWJzY3JpYmVycy5mb3JFYWNoKChzdWJzY3JpYmVyKSA9PiBzdWJzY3JpYmVyKCkpO1xuICB9O1xuXG4gIGNvbnN0IHJlYWQgPSAoKTogVCA9PiB7XG4gICAgY29uc3QgY3VycmVudEVmZmVjdCA9IGVmZmVjdFN0YWNrW2VmZmVjdFN0YWNrLmxlbmd0aCAtIDFdO1xuICAgIGlmIChjdXJyZW50RWZmZWN0ICYmICFzdWJzY3JpYmVycy5oYXMoY3VycmVudEVmZmVjdCkpIHtcbiAgICAgIHN1YnNjcmliZXJzLmFkZChjdXJyZW50RWZmZWN0KTtcbiAgICB9XG4gICAgcmVnaXN0ZXJEb21TdWJzY3JpcHRpb24oc3Vic2NyaWJlcnMsIGRvbVdpdGhWbm9kZXNUb1VwZGF0ZSk7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9O1xuXG4gIGNvbnN0IHdyaXRlID0gKG5ld1ZhbHVlOiBUIHwgKChjdXJyZW50OiBUKSA9PiBUKSk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IHJlc29sdmVkVmFsdWUgPSB0eXBlb2YgbmV3VmFsdWUgPT09IFwiZnVuY3Rpb25cIiA/IChuZXdWYWx1ZSBhcyAoY3VycmVudDogVCkgPT4gVCkodmFsdWUpIDogbmV3VmFsdWU7XG4gICAgaWYgKCFoYXNDaGFuZ2VkKHZhbHVlLCByZXNvbHZlZFZhbHVlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YWx1ZSA9IHJlc29sdmVkVmFsdWU7XG4gICAgcnVuU3Vic2NyaWJlcnMoKTtcbiAgfTtcblxuICByZXR1cm4gW3JlYWQsIHdyaXRlLCBydW5TdWJzY3JpYmVyc107XG59XG4iXSwibWFwcGluZ3MiOiJnSkFBQUEsRUFBQSxHLHlEQUFBQyxDQUFBRCxFQUFBLENBQUFFLGFBQUEsSUFBQUEsRUFBQUMsbUJBQUEsSUFBQUEsRUFBQUMsWUFBQSxJQUFBQSxFQUFBQyxpQkFBQSxJQUFBQSxJQUFBLEksRUFBQUMsRyxFQUFBTixFLDBNQUNBTyxFQUErREMsUUFBQSxlQUMvREMsRUFBMERELFFBQUEscUJBWXBERSxFQUEwQixHQVFoQyxTQUFT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
1
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJpbmRleF9leHBvcnRzIiwiX19leHBvcnQiLCJjcmVhdGVFZmZlY3QiLCJjcmVhdGVNdXRhYmxlU3RvcmUiLCJjcmVhdGVQdWxzZSIsImNyZWF0ZVB1bHNlU3RvcmUiLCJfX0VYUE9SVFNfXyIsImltcG9ydF92YWx5cmlhbiIsInJlcXVpcmUiLCJpbXBvcnRfdXRpbHMiLCJlZmZlY3RTdGFjayIsInJlZ2lzdGVyRG9tU3Vic2NyaXB0aW9uIiwic3Vic2NyaWJlcnMiLCJkb21XaXRoVm5vZGVzVG9VcGRhdGUiLCJjdXJyZW50Vm5vZGUiLCJjdXJyZW50Iiwidm5vZGUiLCJoYXMiLCJkb20iLCJoYXNQYXJlbnQiLCJwYXJlbnQiLCJwYXJlbnRFbGVtZW50Iiwic3Vic2NyaXB0aW9uIiwidXBkYXRlVm5vZGUiLCJkZWxldGUiLCJhZGQiLCJjcmVhdGVTdG9yZSIsImluaXRpYWxTdGF0ZSIsInB1bHNlcyIsImltbXV0YWJsZSIsIlNldCIsIldlYWtTZXQiLCJib3VuZFB1bHNlcyIsImtleSIsIkVycm9yIiwiZ2V0UHVsc2VNZXRob2QiLCJsb2NhbFN0YXRlIiwiaXNNdXRhYmxlIiwiY3VycmVudFN0YXRlIiwicHVsc2VDYWxsQ291bnQiLCJwcm94eVN0YXRlIiwiUHJveHkiLCJnZXQiLCJzdGF0ZSIsInByb3AiLCJjdXJyZW50RWZmZWN0IiwibGVuZ3RoIiwic2V0IiwidmFsdWUiLCJSZWZsZWN0IiwiZGVsZXRlUHJvcGVydHkiLCJzeW5jU3RhdGUiLCJuZXdTdGF0ZSIsImRlZXBGcmVlemUiLCJkZWJvdW5jZVRpbWVvdXQiLCJzZXRTdGF0ZSIsImZsdXNoIiwiaGFzQ2hhbmdlZCIsImNsZWFyVGltZW91dCIsInNldFRpbWVvdXQiLCJmb3JFYWNoIiwic3Vic2NyaWJlciIsImFyZ3MiLCJkZWVwQ2xvbmVVbmZyZWV6ZSIsImNvbnRleHQiLCJPYmplY3QiLCJjcmVhdGUiLCIkZmx1c2giLCJhc3luYyIsImVtcHR5Rmx1c2giLCJoYW5kbGVFcnJvciIsImVycm9yIiwiY29uc29sZSIsInB1bHNlUmVzdWx0IiwiYXBwbHkiLCJQcm9taXNlIiwidGhlbiIsInJlc29sdmVkVmFsdWUiLCJjYXRjaCIsImxpc3RlbmVycyIsInRyaWdnZXIiLCJldmVudCIsImNhbGxiYWNrIiwicHVzaCIsImZpbHRlciIsImNiIiwicHVsc2VNZXRob2QiLCJyZXN1bHQiLCJyIiwid2FybiIsImVmZmVjdCIsInJ1bkVmZmVjdCIsInBvcCIsImluaXRpYWxWYWx1ZSIsInJ1blN1YnNjcmliZXJzIiwibmV3VmFsdWUiXSwic291cmNlcyI6WyIuLi8uLi9saWIvcHVsc2VzL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtZnVuY3Rpb24tdHlwZSAqL1xuXG5pbXBvcnQgeyB1cGRhdGVWbm9kZSwgVm5vZGVXaXRoRG9tLCBjdXJyZW50LCBEb21FbGVtZW50IH0gZnJvbSBcInZhbHlyaWFuLmpzXCI7XG5pbXBvcnQgeyBkZWVwQ2xvbmVVbmZyZWV6ZSwgZGVlcEZyZWV6ZSwgaGFzQ2hhbmdlZCB9IGZyb20gXCJ2YWx5cmlhbi5qcy91dGlsc1wiO1xuXG50eXBlIFN0YXRlID0gUmVjb3JkPHN0cmluZywgYW55PjtcblxuZXhwb3J0IHR5cGUgUHVsc2VDb250ZXh0ID0ge1xuICAkZmx1c2g6ICgpID0+IFByb21pc2U8dm9pZD47XG59O1xuXG5leHBvcnQgdHlwZSBQdWxzZTxTdGF0ZVR5cGUsIFRSZXR1cm4gPSB1bmtub3duPiA9IChzdGF0ZTogU3RhdGVUeXBlLCAuLi5hcmdzOiBhbnlbXSkgPT4gVFJldHVybiB8IFByb21pc2U8VFJldHVybj47XG5cbnR5cGUgUHJveHlTdGF0ZTxTdGF0ZVR5cGU+ID0gU3RhdGVUeXBlICYgeyBba2V5OiBzdHJpbmddOiBhbnkgfTtcblxuY29uc3QgZWZmZWN0U3RhY2s6IEZ1bmN0aW9uW10gPSBbXTtcblxudHlwZSBTdG9yZVB1bHNlczxQdWxzZXNUeXBlPiA9IHtcbiAgW0sgaW4ga2V5b2YgUHVsc2VzVHlwZV06IFB1bHNlc1R5cGVbS10gZXh0ZW5kcyAoc3RhdGU6IGFueSwgLi4uYXJnczogaW5mZXIgQXJncykgPT4gaW5mZXIgUlxuICAgID8gKC4uLmFyZ3M6IEFyZ3MpID0+IFJcbiAgICA6IG5ldmVyO1xufTtcblxuZnVuY3Rpb24gcmVnaXN0ZXJEb21TdWJzY3JpcHRpb24oc3Vic2NyaWJlcnM6IFNldDxGdW5jdGlvbj4sIGRvbVdpdGhWbm9kZXNUb1VwZGF0ZTogV2Vha1NldDxEb21FbGVtZW50Pik6IHZvaWQge1xuICBjb25zdCBjdXJyZW50Vm5vZGUgPSBjdXJyZW50LnZub2RlIGFzIFZub2RlV2l0aERvbTtcbiAgaWYgKCFjdXJyZW50Vm5vZGUgfHwgZG9tV2l0aFZub2Rlc1RvVXBkYXRlLmhhcyhjdXJyZW50Vm5vZGUuZG9tKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCBoYXNQYXJlbnQgPSBmYWxzZTtcbiAgbGV0IHBhcmVudCA9IGN1cnJlbnRWbm9kZS5kb20ucGFyZW50RWxlbWVudCBhcyBEb21FbGVtZW50O1xuICB3aGlsZSAocGFyZW50KSB7XG4gICAgaWYgKGRvbVdpdGhWbm9kZXNUb1VwZGF0ZS5oYXMocGFyZW50KSkge1xuICAgICAgaGFzUGFyZW50ID0gdHJ1ZTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBwYXJlbnQgPSBwYXJlbnQucGFyZW50RWxlbWVudCBhcyBEb21FbGVtZW50O1xuICB9XG5cbiAgaWYgKCFoYXNQYXJlbnQpIHtcbiAgICBjb25zdCBkb20gPSBjdXJyZW50Vm5vZGUuZG9tO1xuICAgIGNvbnN0IHN1YnNjcmlwdGlvbiA9ICgpID0+IHtcbiAgICAgIHVwZGF0ZVZub2RlKGRvbS52bm9kZSk7XG4gICAgICBpZiAoIWRvbS5wYXJlbnRFbGVtZW50KSB7XG4gICAgICAgIHN1YnNjcmliZXJzLmRlbGV0ZShzdWJzY3JpcHRpb24pO1xuICAgICAgICBkb21XaXRoVm5vZGVzVG9VcGRhdGUuZGVsZXRlKGRvbSk7XG4gICAgICB9XG4gICAgfTtcbiAgICBzdWJzY3JpYmVycy5hZGQoc3Vic2NyaXB0aW9uKTtcbiAgICBkb21XaXRoVm5vZGVzVG9VcGRhdGUuYWRkKGRvbSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlU3RvcmU8U3RhdGVUeXBlIGV4dGVuZHMgU3RhdGUsIFB1bHNlc1R5cGUgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBQdWxzZTxTdGF0ZVR5cGUsIGFueT4+PihcbiAgaW5pdGlhbFN0YXRlOiBTdGF0ZVR5cGUgfCAoKCkgPT4gU3RhdGVUeXBlKSB8IG51bGwsXG4gIHB1bHNlczogUHVsc2VzVHlwZSAmIFRoaXNUeXBlPFB1bHNlc1R5cGUgJiBQdWxzZUNvbnRleHQ+LFxuICBpbW11dGFibGUgPSBmYWxzZVxuKTogU3RvcmVQdWxzZXM8UHVsc2VzVHlwZT4gJiB7XG4gIHN0YXRlOiBQcm94eVN0YXRlPFN0YXRlVHlwZT47XG4gIG9uOiAoZXZlbnQ6IHN0cmluZywgY2FsbGJhY2s6IEZ1bmN0aW9uKSA9PiB2b2lkO1xuICBvZmY6IChldmVudDogc3RyaW5nLCBjYWxsYmFjazogRnVuY3Rpb24pID0+IHZvaWQ7XG59IHtcbiAgY29uc3Qgc3Vic2NyaWJlcnMgPSBuZXcgU2V0PEZ1bmN0aW9uPigpO1xuICBjb25zdCBkb21XaXRoVm5vZGVzVG9VcGRhdGUgPSBuZXcgV2Vha1NldDxEb21FbGVtZW50PigpO1xuXG4gIGNvbnN0IGJvdW5kUHVsc2VzOiBSZWNvcmQ8c3RyaW5nLCBGdW5jdGlvbj4gPSB7fTtcbiAgZm9yIChjb25zdCBrZXkgaW4gcHVsc2VzKSB7XG4gICAgaWYgKHR5cGVvZiBwdWxzZXNba2V5XSAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFB1bHNlICcke2tleX0nIG11c3QgYmUgYSBmdW5jdGlvbmApO1xuICAgIH1cbiAgICBpZiAoa2V5ID09PSBcInN0YXRlXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQSBwdWxzZSBjYW5ub3QgYmUgbmFtZWQgJ3N0YXRlJ2ApO1xuICAgIH1cbiAgICBib3VuZFB1bHNlc1trZXldID0gZ2V0UHVsc2VNZXRob2Qoa2V5KTtcbiAgfVxuXG4gIGNvbnN0IGxvY2FsU3RhdGU6IFN0YXRlVHlwZSA9XG4gICAgKHR5cGVvZiBpbml0aWFsU3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IGluaXRpYWxTdGF0ZSgpIDogaW5pdGlhbFN0YXRlKSB8fCAoe30gYXMgU3RhdGVUeXBlKTtcblxuICBmdW5jdGlvbiBpc011dGFibGUoKSB7XG4gICAgaWYgKGltbXV0YWJsZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiWW91IG5lZWQgdG8gY2FsbCBhIHB1bHNlIHRvIG1vZGlmeSB0aGUgc3RhdGVcIik7XG4gICAgfVxuICB9XG5cbiAgbGV0IGN1cnJlbnRTdGF0ZTogU3RhdGVUeXBlIHwgbnVsbCA9IG51bGw7XG4gIGxldCBwdWxzZUNhbGxDb3VudCA9IDA7XG5cbiAgY29uc3QgcHJveHlTdGF0ZSA9IG5ldyBQcm94eShsb2NhbFN0YXRlLCB7XG4gICAgZ2V0OiAoc3RhdGUsIHByb3A6IHN0cmluZykgPT4ge1xuICAgICAgaWYgKGN1cnJlbnRTdGF0ZSkge1xuICAgICAgICByZXR1cm4gY3VycmVudFN0YXRlW3Byb3BdO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjdXJyZW50RWZmZWN0ID0gZWZmZWN0U3RhY2tbZWZmZWN0U3RhY2subGVuZ3RoIC0gMV07XG4gICAgICBpZiAoY3VycmVudEVmZmVjdCAmJiAhc3Vic2NyaWJlcnMuaGFzKGN1cnJlbnRFZmZlY3QpKSB7XG4gICAgICAgIHN1YnNjcmliZXJzLmFkZChjdXJyZW50RWZmZWN0KTtcbiAgICAgIH1cblxuICAgICAgcmVnaXN0ZXJEb21TdWJzY3JpcHRpb24oc3Vic2NyaWJlcnMsIGRvbVdpdGhWbm9kZXNUb1VwZGF0ZSk7XG5cbiAgICAgIHJldHVybiBzdGF0ZVtwcm9wXTtcbiAgICB9LFxuICAgIHNldDogKHN0YXRlLCBwcm9wOiBzdHJpbmcsIHZhbHVlOiBhbnkpID0+IHtcbiAgICAgIGlzTXV0YWJsZSgpO1xuICAgICAgUmVmbGVjdC5zZXQoc3RhdGUsIHByb3AsIHZhbHVlKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG4gICAgZGVsZXRlUHJvcGVydHk6IChzdGF0ZSwgcHJvcDogc3RyaW5nKSA9PiB7XG4gICAgICBpc011dGFibGUoKTtcbiAgICAgIFJlZmxlY3QuZGVsZXRlUHJvcGVydHkoc3RhdGUsIHByb3ApO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9KTtcblxuICBmdW5jdGlvbiBzeW5jU3RhdGUobmV3U3RhdGU6IFN0YXRlVHlwZSkge1xuICAgIGZvciAoY29uc3Qga2V5IGluIG5ld1N0YXRlKSB7XG4gICAgICBsb2NhbFN0YXRlW2tleV0gPSBpbW11dGFibGUgPyBkZWVwRnJlZXplKG5ld1N0YXRlW2tleV0pIDogbmV3U3RhdGVba2V5XTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBrZXkgaW4gbG9jYWxTdGF0ZSkge1xuICAgICAgaWYgKCEoa2V5IGluIG5ld1N0YXRlKSkge1xuICAgICAgICBSZWZsZWN0LmRlbGV0ZVByb3BlcnR5KGxvY2FsU3RhdGUsIGtleSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbGV0IGRlYm91bmNlVGltZW91dDogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCBudWxsID0gbnVsbDtcbiAgZnVuY3Rpb24gZGVib3VuY2VkVXBkYXRlKCkge1xuICAgIGlmIChkZWJvdW5jZVRpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dChkZWJvdW5jZVRpbWVvdXQpO1xuICAgIH1cbiAgICBkZWJvdW5jZVRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHN1YnNjcmliZXJzLmZvckVhY2goKHN1YnNjcmliZXIpID0+IHN1YnNjcmliZXIoKSksIDApO1xuICB9XG5cbiAgZnVuY3Rpb24gc2V0U3RhdGUobmV3U3RhdGU6IFN0YXRlVHlwZSwgZmx1c2ggPSBmYWxzZSkge1xuICAgIHB1bHNlQ2FsbENvdW50LS07XG4gICAgaWYgKCFoYXNDaGFuZ2VkKGxvY2FsU3RhdGUsIG5ld1N0YXRlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAocHVsc2VDYWxsQ291bnQgPiAwICYmICFmbHVzaCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzeW5jU3RhdGUobmV3U3RhdGUpO1xuICAgIGlmICghZmx1c2gpIHtcbiAgICAgIGN1cnJlbnRTdGF0ZSA9IG51bGw7XG4gICAgfVxuICAgIHB1bHNlQ2FsbENvdW50ID0gMDtcbiAgICBkZWJvdW5jZWRVcGRhdGUoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHVuZnJlZXplU3RhdGUoKSB7XG4gICAgaWYgKGN1cnJlbnRTdGF0ZSA9PT0gbnVsbCkge1xuICAgICAgY3VycmVudFN0YXRlID0gZGVlcENsb25lVW5mcmVlemUobG9jYWxTdGF0ZSk7XG4gICAgfVxuICAgIHJldHVybiBjdXJyZW50U3RhdGU7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRQdWxzZU1ldGhvZChrZXk6IHN0cmluZykge1xuICAgIHJldHVybiBmdW5jdGlvbiAodGhpczogYW55LCAuLi5hcmdzOiBhbnlbXSkge1xuICAgICAgcHVsc2VDYWxsQ291bnQrKztcblxuICAgICAgY29uc3Qgc3RhdGUgPSB1bmZyZWV6ZVN0YXRlKCk7XG5cbiAgICAgIGNvbnN0IGNvbnRleHQgPSBPYmplY3QuY3JlYXRlKHB1bHNlcyk7XG5cbiAgICAgIGNvbnRleHQuJGZsdXNoID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICBpZiAoY3VycmVudFN0YXRlKSB7XG4gICAgICAgICAgc2V0U3RhdGUoY3VycmVudFN0YXRlLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgY29uc3QgZW1wdHlGbHVzaCA9IGFzeW5jICgpID0+IHt9O1xuXG4gICAgICBjb25zdCBoYW5kbGVFcnJvciA9IChlcnJvcjogYW55KSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yIGluIHB1bHNlICcke2tleX0nOmAsIGVycm9yKTtcbiAgICAgICAgY29udGV4dC4kZmx1c2ggPSBlbXB0eUZsdXNoO1xuXG4gICAgICAgIHB1bHNlQ2FsbENvdW50LS07XG4gICAgICAgIGlmIChwdWxzZUNhbGxDb3VudCA8PSAwKSB7XG4gICAgICAgICAgY3VycmVudFN0YXRlID0gbnVsbDtcbiAgICAgICAgICBwdWxzZUNhbGxDb3VudCA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH07XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHB1bHNlUmVzdWx0ID0gcHVsc2VzW2tleV0uYXBwbHkoY29udGV4dCwgW3N0YXRlLCAuLi5hcmdzXSk7XG4gICAgICAgIGlmIChwdWxzZVJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICByZXR1cm4gcHVsc2VSZXN1bHRcbiAgICAgICAgICAgIC50aGVuKChyZXNvbHZlZFZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgIHNldFN0YXRlKHN0YXRlIGFzIFN0YXRlVHlwZSk7XG4gICAgICAgICAgICAgIGNvbnRleHQuJGZsdXNoID0gZW1wdHlGbHVzaDtcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVkVmFsdWU7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKGhhbmRsZUVycm9yKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzZXRTdGF0ZShzdGF0ZSk7XG4gICAgICAgICAgY29udGV4dC4kZmx1c2ggPSBlbXB0eUZsdXNoO1xuICAgICAgICAgIHJldHVybiBwdWxzZVJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaGFuZGxlRXJyb3IoZXJyb3IpO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBzeW5jU3RhdGUobG9jYWxTdGF0ZSk7XG5cbiAgY29uc3QgbGlzdGVuZXJzOiBSZWNvcmQ8c3RyaW5nLCBGdW5jdGlvbltdPiA9IHt9O1xuICBjb25zdCB0cmlnZ2VyID0gKGV2ZW50OiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKSA9PiB7XG4gICAgaWYgKGxpc3RlbmVyc1tldmVudF0pIHtcbiAgICAgIGxpc3RlbmVyc1tldmVudF0uZm9yRWFjaCgoY2FsbGJhY2spID0+IGNhbGxiYWNrKC4uLmFyZ3MpKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgcHVsc2VzUHJveHkgPSBuZXcgUHJveHkoYm91bmRQdWxzZXMsIHtcbiAgICBnZXQ6IChwdWxzZXMsIHByb3A6IHN0cmluZykgPT4ge1xuICAgICAgaWYgKHByb3AgPT09IFwic3RhdGVcIikge1xuICAgICAgICByZXR1cm4gcHJveHlTdGF0ZTtcbiAgICAgIH1cbiAgICAgIGlmIChwcm9wID09PSBcIm9uXCIpIHtcbiAgICAgICAgcmV0dXJuIChldmVudDogc3RyaW5nLCBjYWxsYmFjazogRnVuY3Rpb24pID0+IHtcbiAgICAgICAgICBpZiAoIWxpc3RlbmVyc1tldmVudF0pIHtcbiAgICAgICAgICAgIGxpc3RlbmVyc1tldmVudF0gPSBbXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbGlzdGVuZXJzW2V2ZW50XS5wdXNoKGNhbGxiYWNrKTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmIChwcm9wID09PSBcIm9mZlwiKSB7XG4gICAgICAgIHJldHVybiAoZXZlbnQ6IHN0cmluZywgY2FsbGJhY2s6IEZ1bmN0aW9uKSA9PiB7XG4gICAgICAgICAgaWYgKGxpc3RlbmVyc1tldmVudF0pIHtcbiAgICAgICAgICAgIGxpc3RlbmVyc1tldmVudF0gPSBsaXN0ZW5lcnNbZXZlbnRdLmZpbHRlcigoY2IpID0+IGNiICE9PSBjYWxsYmFjayk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKCEocHJvcCBpbiBwdWxzZXMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgUHVsc2UgJyR7cHJvcH0nIGRvZXMgbm90IGV4aXN0YCk7XG4gICAgICB9XG4gICAgICBjb25zdCBwdWxzZU1ldGhvZCA9IHB1bHNlc1twcm9wXTtcblxuICAgICAgcmV0dXJuICguLi5hcmdzOiBhbnlbXSkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBwdWxzZU1ldGhvZC5hcHBseShwdWxzZU1ldGhvZCwgYXJncyk7XG4gICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdC50aGVuKChyKSA9PiB7XG4gICAgICAgICAgICB0cmlnZ2VyKFwicHVsc2VcIiwgcHJvcCwgYXJncyk7XG4gICAgICAgICAgICByZXR1cm4gcjtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB0cmlnZ2VyKFwicHVsc2VcIiwgcHJvcCwgYXJncyk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9O1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIHB1bHNlc1Byb3h5IGFzIFN0b3JlUHVsc2VzPFB1bHNlc1R5cGU+ICYge1xuICAgIHN0YXRlOiBQcm94eVN0YXRlPFN0YXRlVHlwZT47XG4gICAgb246IChldmVudDogc3RyaW5nLCBjYWxsYmFjazogRnVuY3Rpb24pID0+IHZvaWQ7XG4gICAgb2ZmOiAoZXZlbnQ6IHN0cmluZywgY2FsbGJhY2s6IEZ1bmN0aW9uKSA9PiB2b2lkO1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUHVsc2VTdG9yZTxTdGF0ZVR5cGUgZXh0ZW5kcyBTdGF0ZSwgUHVsc2VzVHlwZSBleHRlbmRzIFJlY29yZDxzdHJpbmcsIFB1bHNlPFN0YXRlVHlwZSwgYW55Pj4+KFxuICBpbml0aWFsU3RhdGU6IFN0YXRlVHlwZSxcbiAgcHVsc2VzOiBQdWxzZXNUeXBlICYgVGhpc1R5cGU8UHVsc2VzVHlwZSAmIFB1bHNlQ29udGV4dD5cbikge1xuICByZXR1cm4gY3JlYXRlU3RvcmUoaW5pdGlhbFN0YXRlLCBwdWxzZXMsIHRydWUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTXV0YWJsZVN0b3JlPFN0YXRlVHlwZSBleHRlbmRzIFN0YXRlLCBQdWxzZXNUeXBlIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgUHVsc2U8U3RhdGVUeXBlLCBhbnk+Pj4oXG4gIGluaXRpYWxTdGF0ZTogU3RhdGVUeXBlLFxuICBwdWxzZXM6IFB1bHNlc1R5cGUgJiBUaGlzVHlwZTxQdWxzZXNUeXBlICYgUHVsc2VDb250ZXh0PlxuKSB7XG4gIGNvbnNvbGUud2FybihcbiAgICBcIldhcm5pbmc6IFlvdSBhcmUgd29ya2luZyB3aXRoIGEgbXV0YWJsZSBzdGF0ZS4gQWxsIHN0YXRlIGNoYW5nZXMgbWFkZSBvdXRzaWRlIG9mIGEgcHVsc2Ugd2lsbCBub3QgdHJpZ2dlciBhIHJlLXJlbmRlci5cIlxuICApO1xuICByZXR1cm4gY3JlYXRlU3RvcmUoaW5pdGlhbFN0YXRlLCBwdWxzZXMsIGZhbHNlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUVmZmVjdChlZmZlY3Q6IEZ1bmN0aW9uKSB7XG4gIGNvbnN0IHJ1bkVmZmVjdCA9ICgpID0+IHtcbiAgICB0cnkge1xuICAgICAgZWZmZWN0U3RhY2sucHVzaChydW5FZmZlY3QpO1xuICAgICAgZWZmZWN0KCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGVmZmVjdFN0YWNrLnBvcCgpO1xuICAgIH1cbiAgfTtcbiAgcnVuRWZmZWN0KCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQdWxzZTxUPihpbml0aWFsVmFsdWU6IFQpOiBbKCkgPT4gVCwgKG5ld1ZhbHVlOiBUIHwgKChjdXJyZW50OiBUKSA9PiBUKSkgPT4gdm9pZCwgKCkgPT4gdm9pZF0ge1xuICBsZXQgdmFsdWUgPSBpbml0aWFsVmFsdWU7XG4gIGNvbnN0IHN1YnNjcmliZXJzID0gbmV3IFNldDxGdW5jdGlvbj4oKTtcbiAgY29uc3QgZG9tV2l0aFZub2Rlc1RvVXBkYXRlID0gbmV3IFdlYWtTZXQ8RG9tRWxlbWVudD4oKTtcblxuICBjb25zdCBydW5TdWJzY3JpYmVycyA9ICgpID0+IHtcbiAgICBzdWJzY3JpYmVycy5mb3JFYWNoKChzdWJzY3JpYmVyKSA9PiBzdWJzY3JpYmVyKCkpO1xuICB9O1xuXG4gIGNvbnN0IHJlYWQgPSAoKTogVCA9PiB7XG4gICAgY29uc3QgY3VycmVudEVmZmVjdCA9IGVmZmVjdFN0YWNrW2VmZmVjdFN0YWNrLmxlbmd0aCAtIDFdO1xuICAgIGlmIChjdXJyZW50RWZmZWN0ICYmICFzdWJzY3JpYmVycy5oYXMoY3VycmVudEVmZmVjdCkpIHtcbiAgICAgIHN1YnNjcmliZXJzLmFkZChjdXJyZW50RWZmZWN0KTtcbiAgICB9XG4gICAgcmVnaXN0ZXJEb21TdWJzY3JpcHRpb24oc3Vic2NyaWJlcnMsIGRvbVdpdGhWbm9kZXNUb1VwZGF0ZSk7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9O1xuXG4gIGNvbnN0IHdyaXRlID0gKG5ld1ZhbHVlOiBUIHwgKChjdXJyZW50OiBUKSA9PiBUKSk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IHJlc29sdmVkVmFsdWUgPSB0eXBlb2YgbmV3VmFsdWUgPT09IFwiZnVuY3Rpb25cIiA/IChuZXdWYWx1ZSBhcyAoY3VycmVudDogVCkgPT4gVCkodmFsdWUpIDogbmV3VmFsdWU7XG4gICAgaWYgKCFoYXNDaGFuZ2VkKHZhbHVlLCByZXNvbHZlZFZhbHVlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YWx1ZSA9IHJlc29sdmVkVmFsdWU7XG4gICAgcnVuU3Vic2NyaWJlcnMoKTtcbiAgfTtcblxuICByZXR1cm4gW3JlYWQsIHdyaXRlLCBydW5TdWJzY3JpYmVyc107XG59XG4iXSwibWFwcGluZ3MiOiJnSkFBQUEsRUFBQSxHLHlEQUFBQyxDQUFBRCxFQUFBLENBQUFFLGFBQUEsSUFBQUEsRUFBQUMsbUJBQUEsSUFBQUEsRUFBQUMsWUFBQSxJQUFBQSxFQUFBQyxpQkFBQSxJQUFBQSxJQUFBLEksRUFBQUMsRyxFQUFBTixFLDBNQUVBTyxFQUErREMsUUFBQSxlQUMvREMsRUFBMERELFFBQUEscUJBWXBERSxF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
@@ -99,46 +99,55 @@ function createStore(initialState, pulses, immutable = false) {
99
99
  return;
100
100
  }
101
101
  syncState(newState);
102
- currentState = null;
102
+ if (!flush) {
103
+ currentState = null;
104
+ }
105
+ pulseCallCount = 0;
103
106
  debouncedUpdate();
104
107
  }
108
+ function unfreezeState() {
109
+ if (currentState === null) {
110
+ currentState = deepCloneUnfreeze(localState);
111
+ }
112
+ return currentState;
113
+ }
105
114
  function getPulseMethod(key) {
106
115
  return function(...args) {
107
116
  pulseCallCount++;
108
- if (currentState === null) {
109
- currentState = deepCloneUnfreeze(localState);
110
- }
117
+ const state = unfreezeState();
111
118
  const context = Object.create(pulses);
112
119
  context.$flush = async () => {
113
120
  if (currentState) {
114
121
  setState(currentState, true);
115
- currentState = deepCloneUnfreeze(localState);
116
122
  }
117
- await new Promise((resolve) => setTimeout(resolve, 0));
118
123
  };
119
124
  const emptyFlush = async () => {
120
125
  };
126
+ const handleError = (error) => {
127
+ console.error(`Error in pulse '${key}':`, error);
128
+ context.$flush = emptyFlush;
129
+ pulseCallCount--;
130
+ if (pulseCallCount <= 0) {
131
+ currentState = null;
132
+ pulseCallCount = 0;
133
+ }
134
+ throw error;
135
+ };
121
136
  try {
122
- const pulseResult = pulses[key].apply(context, [currentState, ...args]);
137
+ const pulseResult = pulses[key].apply(context, [state, ...args]);
123
138
  if (pulseResult instanceof Promise) {
124
139
  return pulseResult.then((resolvedValue) => {
125
- setState(currentState);
140
+ setState(state);
126
141
  context.$flush = emptyFlush;
127
142
  return resolvedValue;
128
- }).catch((error) => {
129
- console.error(`Error in pulse '${key}':`, error);
130
- context.$flush = emptyFlush;
131
- throw error;
132
- });
143
+ }).catch(handleError);
133
144
  } else {
134
- setState(currentState);
145
+ setState(state);
135
146
  context.$flush = emptyFlush;
136
147
  return pulseResult;
137
148
  }
138
149
  } catch (error) {
139
- console.error(`Error in pulse '${key}':`, error);
140
- context.$flush = emptyFlush;
141
- throw error;
150
+ handleError(error);
142
151
  }
143
152
  };
144
153
  }
@@ -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 PulseContext = {\n $flush: () => Promise<void>;\n};\n\nexport type Pulse<StateType, TReturn = unknown> = (state: StateType, ...args: any[]) => TReturn | Promise<TReturn>;\n\ntype ProxyState<StateType> = StateType & { [key: string]: any };\n\nconst effectStack: Function[] = [];\n\ntype StorePulses<PulsesType> = {\n [K in keyof PulsesType]: PulsesType[K] extends (state: any, ...args: infer Args) => infer R\n ? (...args: Args) => R\n : never;\n};\n\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 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 Record<string, Pulse<StateType, any>>>(\n initialState: StateType | (() => StateType) | null,\n pulses: PulsesType & ThisType<PulsesType & PulseContext>,\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: Record<string, Function> = {};\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 (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 return function (this: any, ...args: any[]) {\n pulseCallCount++;\n if (currentState === null) {\n currentState = deepCloneUnfreeze(localState);\n }\n\n // Runtime: Creamos un objeto que hereda de 'pulses' para que 'this' tenga acceso a los hermanos\n const context = Object.create(pulses);\n\n context.$flush = async () => {\n if (currentState) {\n setState(currentState, true);\n currentState = deepCloneUnfreeze(localState);\n }\n await new Promise((resolve) => setTimeout(resolve, 0));\n };\n\n const emptyFlush = async () => {};\n\n try {\n const pulseResult = pulses[key].apply(context, [currentState, ...args]);\n if (pulseResult instanceof Promise) {\n return pulseResult\n .then((resolvedValue) => {\n setState(currentState as StateType);\n context.$flush = emptyFlush;\n return resolvedValue;\n })\n .catch((error) => {\n console.error(`Error in pulse '${key}':`, error);\n context.$flush = emptyFlush;\n throw error;\n });\n } else {\n setState(currentState);\n context.$flush = emptyFlush;\n return pulseResult;\n }\n } catch (error) {\n console.error(`Error in pulse '${key}':`, error);\n context.$flush = emptyFlush;\n throw error;\n }\n };\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 return (...args: any[]) => {\n const result = pulseMethod.apply(pulseMethod, args);\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\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 Record<string, Pulse<StateType, any>>>(\n initialState: StateType,\n pulses: PulsesType & ThisType<PulsesType & PulseContext>\n) {\n return createStore(initialState, pulses, true);\n}\n\nexport function createMutableStore<StateType extends State, PulsesType extends Record<string, Pulse<StateType, any>>>(\n initialState: StateType,\n pulses: PulsesType & ThisType<PulsesType & PulseContext>\n) {\n console.warn(\n \"Warning: You are working with a mutable state. All state changes made outside of a pulse will not trigger a re-render.\"\n );\n return createStore(initialState, pulses, false);\n}\n\nexport function createEffect(effect: Function) {\n const runEffect = () => {\n try {\n effectStack.push(runEffect);\n effect();\n } finally {\n effectStack.pop();\n }\n };\n runEffect();\n}\n\nexport function createPulse<T>(initialValue: T): [() => T, (newValue: T | ((current: T) => T)) => void, () => void] {\n let value = initialValue;\n const subscribers = new Set<Function>();\n const domWithVnodesToUpdate = new WeakSet<DomElement>();\n\n const runSubscribers = () => {\n subscribers.forEach((subscriber) => subscriber());\n };\n\n const read = (): T => {\n const currentEffect = effectStack[effectStack.length - 1];\n if (currentEffect && !subscribers.has(currentEffect)) {\n subscribers.add(currentEffect);\n }\n registerDomSubscription(subscribers, domWithVnodesToUpdate);\n return value;\n };\n\n const write = (newValue: T | ((current: T) => T)): void => {\n const resolvedValue = typeof newValue === \"function\" ? (newValue as (current: T) => T)(value) : newValue;\n if (!hasChanged(value, resolvedValue)) {\n return;\n }\n value = resolvedValue;\n runSubscribers();\n };\n\n return [read, write, runSubscribers];\n}\n"],
5
- "mappings": ";AACA,SAAS,aAA2B,eAA2B;AAC/D,SAAS,mBAAmB,YAAY,kBAAkB;AAY1D,IAAM,cAA0B,CAAC;AAQjC,SAAS,wBAAwB,aAA4B,uBAAkD;AAC7G,QAAM,eAAe,QAAQ;AAC7B,MAAI,CAAC,gBAAgB,sBAAsB,IAAI,aAAa,GAAG,GAAG;AAChE;AAAA,EACF;AAEA,MAAI,YAAY;AAChB,MAAI,SAAS,aAAa,IAAI;AAC9B,SAAO,QAAQ;AACb,QAAI,sBAAsB,IAAI,MAAM,GAAG;AACrC,kBAAY;AACZ;AAAA,IACF;AACA,aAAS,OAAO;AAAA,EAClB;AAEA,MAAI,CAAC,WAAW;AACd,UAAM,MAAM,aAAa;AACzB,UAAM,eAAe,MAAM;AACzB,kBAAY,IAAI,KAAK;AACrB,UAAI,CAAC,IAAI,eAAe;AACtB,oBAAY,OAAO,YAAY;AAC/B,8BAAsB,OAAO,GAAG;AAAA,MAClC;AAAA,IACF;AACA,gBAAY,IAAI,YAAY;AAC5B,0BAAsB,IAAI,GAAG;AAAA,EAC/B;AACF;AAEA,SAAS,YACP,cACA,QACA,YAAY,OAKZ;AACA,QAAM,cAAc,oBAAI,IAAc;AACtC,QAAM,wBAAwB,oBAAI,QAAoB;AAEtD,QAAM,cAAwC,CAAC;AAC/C,aAAW,OAAO,QAAQ;AACxB,QAAI,OAAO,OAAO,GAAG,MAAM,YAAY;AACrC,YAAM,IAAI,MAAM,UAAU,GAAG,sBAAsB;AAAA,IACrD;AACA,QAAI,QAAQ,SAAS;AACnB,YAAM,IAAI,MAAM,iCAAiC;AAAA,IACnD;AACA,gBAAY,GAAG,IAAI,eAAe,GAAG;AAAA,EACvC;AAEA,QAAM,cACH,OAAO,iBAAiB,aAAa,aAAa,IAAI,iBAAkB,CAAC;AAE5E,WAAS,YAAY;AACnB,QAAI,WAAW;AACb,YAAM,IAAI,MAAM,8CAA8C;AAAA,IAChE;AAAA,EACF;AAEA,MAAI,eAAiC;AACrC,MAAI,iBAAiB;AAErB,QAAM,aAAa,IAAI,MAAM,YAAY;AAAA,IACvC,KAAK,CAAC,OAAO,SAAiB;AAC5B,UAAI,cAAc;AAChB,eAAO,aAAa,IAAI;AAAA,MAC1B;AAEA,YAAM,gBAAgB,YAAY,YAAY,SAAS,CAAC;AACxD,UAAI,iBAAiB,CAAC,YAAY,IAAI,aAAa,GAAG;AACpD,oBAAY,IAAI,aAAa;AAAA,MAC/B;AAEA,8BAAwB,aAAa,qBAAqB;AAE1D,aAAO,MAAM,IAAI;AAAA,IACnB;AAAA,IACA,KAAK,CAAC,OAAO,MAAc,UAAe;AACxC,gBAAU;AACV,cAAQ,IAAI,OAAO,MAAM,KAAK;AAC9B,aAAO;AAAA,IACT;AAAA,IACA,gBAAgB,CAAC,OAAO,SAAiB;AACvC,gBAAU;AACV,cAAQ,eAAe,OAAO,IAAI;AAClC,aAAO;AAAA,IACT;AAAA,EACF,CAAC;AAED,WAAS,UAAU,UAAqB;AACtC,eAAW,OAAO,UAAU;AAC1B,iBAAW,GAAG,IAAI,YAAY,WAAW,SAAS,GAAG,CAAC,IAAI,SAAS,GAAG;AAAA,IACxE;AACA,eAAW,OAAO,YAAY;AAC5B,UAAI,EAAE,OAAO,WAAW;AACtB,gBAAQ,eAAe,YAAY,GAAG;AAAA,MACxC;AAAA,IACF;AAAA,EACF;AAEA,MAAI,kBAAwD;AAC5D,WAAS,kBAAkB;AACzB,QAAI,iBAAiB;AACnB,mBAAa,eAAe;AAAA,IAC9B;AACA,sBAAkB,WAAW,MAAM,YAAY,QAAQ,CAAC,eAAe,WAAW,CAAC,GAAG,CAAC;AAAA,EACzF;AAEA,WAAS,SAAS,UAAqB,QAAQ,OAAO;AACpD;AACA,QAAI,CAAC,WAAW,YAAY,QAAQ,GAAG;AACrC;AAAA,IACF;AACA,QAAI,iBAAiB,KAAK,CAAC,OAAO;AAChC;AAAA,IACF;AACA,cAAU,QAAQ;AAClB,mBAAe;AACf,oBAAgB;AAAA,EAClB;AAEA,WAAS,eAAe,KAAa;AACnC,WAAO,YAAwB,MAAa;AAC1C;AACA,UAAI,iBAAiB,MAAM;AACzB,uBAAe,kBAAkB,UAAU;AAAA,MAC7C;AAGA,YAAM,UAAU,OAAO,OAAO,MAAM;AAEpC,cAAQ,SAAS,YAAY;AAC3B,YAAI,cAAc;AAChB,mBAAS,cAAc,IAAI;AAC3B,yBAAe,kBAAkB,UAAU;AAAA,QAC7C;AACA,cAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,CAAC,CAAC;AAAA,MACvD;AAEA,YAAM,aAAa,YAAY;AAAA,MAAC;AAEhC,UAAI;AACF,cAAM,cAAc,OAAO,GAAG,EAAE,MAAM,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC;AACtE,YAAI,uBAAuB,SAAS;AAClC,iBAAO,YACJ,KAAK,CAAC,kBAAkB;AACvB,qBAAS,YAAyB;AAClC,oBAAQ,SAAS;AACjB,mBAAO;AAAA,UACT,CAAC,EACA,MAAM,CAAC,UAAU;AAChB,oBAAQ,MAAM,mBAAmB,GAAG,MAAM,KAAK;AAC/C,oBAAQ,SAAS;AACjB,kBAAM;AAAA,UACR,CAAC;AAAA,QACL,OAAO;AACL,mBAAS,YAAY;AACrB,kBAAQ,SAAS;AACjB,iBAAO;AAAA,QACT;AAAA,MACF,SAAS,OAAO;AACd,gBAAQ,MAAM,mBAAmB,GAAG,MAAM,KAAK;AAC/C,gBAAQ,SAAS;AACjB,cAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,YAAU,UAAU;AAEpB,QAAM,YAAwC,CAAC;AAC/C,QAAM,UAAU,CAAC,UAAkB,SAAgB;AACjD,QAAI,UAAU,KAAK,GAAG;AACpB,gBAAU,KAAK,EAAE,QAAQ,CAAC,aAAa,SAAS,GAAG,IAAI,CAAC;AAAA,IAC1D;AAAA,EACF;AAEA,QAAM,cAAc,IAAI,MAAM,aAAa;AAAA,IACzC,KAAK,CAACA,SAAQ,SAAiB;AAC7B,UAAI,SAAS,SAAS;AACpB,eAAO;AAAA,MACT;AACA,UAAI,SAAS,MAAM;AACjB,eAAO,CAAC,OAAe,aAAuB;AAC5C,cAAI,CAAC,UAAU,KAAK,GAAG;AACrB,sBAAU,KAAK,IAAI,CAAC;AAAA,UACtB;AACA,oBAAU,KAAK,EAAE,KAAK,QAAQ;AAAA,QAChC;AAAA,MACF;AACA,UAAI,SAAS,OAAO;AAClB,eAAO,CAAC,OAAe,aAAuB;AAC5C,cAAI,UAAU,KAAK,GAAG;AACpB,sBAAU,KAAK,IAAI,UAAU,KAAK,EAAE,OAAO,CAAC,OAAO,OAAO,QAAQ;AAAA,UACpE;AAAA,QACF;AAAA,MACF;AACA,UAAI,EAAE,QAAQA,UAAS;AACrB,cAAM,IAAI,MAAM,UAAU,IAAI,kBAAkB;AAAA,MAClD;AACA,YAAM,cAAcA,QAAO,IAAI;AAE/B,aAAO,IAAI,SAAgB;AACzB,cAAM,SAAS,YAAY,MAAM,aAAa,IAAI;AAClD,YAAI,kBAAkB,SAAS;AAC7B,iBAAO,OAAO,KAAK,CAAC,MAAM;AACxB,oBAAQ,SAAS,MAAM,IAAI;AAC3B,mBAAO;AAAA,UACT,CAAC;AAAA,QACH;AACA,gBAAQ,SAAS,MAAM,IAAI;AAC3B,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF,CAAC;AAED,SAAO;AAKT;AAEO,SAAS,iBACd,cACA,QACA;AACA,SAAO,YAAY,cAAc,QAAQ,IAAI;AAC/C;AAEO,SAAS,mBACd,cACA,QACA;AACA,UAAQ;AAAA,IACN;AAAA,EACF;AACA,SAAO,YAAY,cAAc,QAAQ,KAAK;AAChD;AAEO,SAAS,aAAa,QAAkB;AAC7C,QAAM,YAAY,MAAM;AACtB,QAAI;AACF,kBAAY,KAAK,SAAS;AAC1B,aAAO;AAAA,IACT,UAAE;AACA,kBAAY,IAAI;AAAA,IAClB;AAAA,EACF;AACA,YAAU;AACZ;AAEO,SAAS,YAAe,cAAqF;AAClH,MAAI,QAAQ;AACZ,QAAM,cAAc,oBAAI,IAAc;AACtC,QAAM,wBAAwB,oBAAI,QAAoB;AAEtD,QAAM,iBAAiB,MAAM;AAC3B,gBAAY,QAAQ,CAAC,eAAe,WAAW,CAAC;AAAA,EAClD;AAEA,QAAM,OAAO,MAAS;AACpB,UAAM,gBAAgB,YAAY,YAAY,SAAS,CAAC;AACxD,QAAI,iBAAiB,CAAC,YAAY,IAAI,aAAa,GAAG;AACpD,kBAAY,IAAI,aAAa;AAAA,IAC/B;AACA,4BAAwB,aAAa,qBAAqB;AAC1D,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,CAAC,aAA4C;AACzD,UAAM,gBAAgB,OAAO,aAAa,aAAc,SAA+B,KAAK,IAAI;AAChG,QAAI,CAAC,WAAW,OAAO,aAAa,GAAG;AACrC;AAAA,IACF;AACA,YAAQ;AACR,mBAAe;AAAA,EACjB;AAEA,SAAO,CAAC,MAAM,OAAO,cAAc;AACrC;",
4
+ "sourcesContent": ["/* eslint-disable @typescript-eslint/no-unsafe-function-type */\n\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 PulseContext = {\n $flush: () => Promise<void>;\n};\n\nexport type Pulse<StateType, TReturn = unknown> = (state: StateType, ...args: any[]) => TReturn | Promise<TReturn>;\n\ntype ProxyState<StateType> = StateType & { [key: string]: any };\n\nconst effectStack: Function[] = [];\n\ntype StorePulses<PulsesType> = {\n [K in keyof PulsesType]: PulsesType[K] extends (state: any, ...args: infer Args) => infer R\n ? (...args: Args) => R\n : never;\n};\n\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 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 Record<string, Pulse<StateType, any>>>(\n initialState: StateType | (() => StateType) | null,\n pulses: PulsesType & ThisType<PulsesType & PulseContext>,\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: Record<string, Function> = {};\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 (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 if (!flush) {\n currentState = null;\n }\n pulseCallCount = 0;\n debouncedUpdate();\n }\n\n function unfreezeState() {\n if (currentState === null) {\n currentState = deepCloneUnfreeze(localState);\n }\n return currentState;\n }\n\n function getPulseMethod(key: string) {\n return function (this: any, ...args: any[]) {\n pulseCallCount++;\n\n const state = unfreezeState();\n\n const context = Object.create(pulses);\n\n context.$flush = async () => {\n if (currentState) {\n setState(currentState, true);\n }\n };\n\n const emptyFlush = async () => {};\n\n const handleError = (error: any) => {\n console.error(`Error in pulse '${key}':`, error);\n context.$flush = emptyFlush;\n\n pulseCallCount--;\n if (pulseCallCount <= 0) {\n currentState = null;\n pulseCallCount = 0;\n }\n\n throw error;\n };\n\n try {\n const pulseResult = pulses[key].apply(context, [state, ...args]);\n if (pulseResult instanceof Promise) {\n return pulseResult\n .then((resolvedValue) => {\n setState(state as StateType);\n context.$flush = emptyFlush;\n return resolvedValue;\n })\n .catch(handleError);\n } else {\n setState(state);\n context.$flush = emptyFlush;\n return pulseResult;\n }\n } catch (error) {\n handleError(error);\n }\n };\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 return (...args: any[]) => {\n const result = pulseMethod.apply(pulseMethod, args);\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\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 Record<string, Pulse<StateType, any>>>(\n initialState: StateType,\n pulses: PulsesType & ThisType<PulsesType & PulseContext>\n) {\n return createStore(initialState, pulses, true);\n}\n\nexport function createMutableStore<StateType extends State, PulsesType extends Record<string, Pulse<StateType, any>>>(\n initialState: StateType,\n pulses: PulsesType & ThisType<PulsesType & PulseContext>\n) {\n console.warn(\n \"Warning: You are working with a mutable state. 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,4 +1,5 @@
1
- /* eslint-disable no-console */
1
+ /* eslint-disable @typescript-eslint/no-unsafe-function-type */
2
+
2
3
  import { updateVnode, VnodeWithDom, current, DomElement } from "valyrian.js";
3
4
  import { deepCloneUnfreeze, deepFreeze, hasChanged } from "valyrian.js/utils";
4
5
 
@@ -140,53 +141,66 @@ function createStore<StateType extends State, PulsesType extends Record<string,
140
141
  return;
141
142
  }
142
143
  syncState(newState);
143
- currentState = null;
144
+ if (!flush) {
145
+ currentState = null;
146
+ }
147
+ pulseCallCount = 0;
144
148
  debouncedUpdate();
145
149
  }
146
150
 
151
+ function unfreezeState() {
152
+ if (currentState === null) {
153
+ currentState = deepCloneUnfreeze(localState);
154
+ }
155
+ return currentState;
156
+ }
157
+
147
158
  function getPulseMethod(key: string) {
148
159
  return function (this: any, ...args: any[]) {
149
160
  pulseCallCount++;
150
- if (currentState === null) {
151
- currentState = deepCloneUnfreeze(localState);
152
- }
153
161
 
154
- // Runtime: Creamos un objeto que hereda de 'pulses' para que 'this' tenga acceso a los hermanos
162
+ const state = unfreezeState();
163
+
155
164
  const context = Object.create(pulses);
156
165
 
157
166
  context.$flush = async () => {
158
167
  if (currentState) {
159
168
  setState(currentState, true);
160
- currentState = deepCloneUnfreeze(localState);
161
169
  }
162
- await new Promise((resolve) => setTimeout(resolve, 0));
163
170
  };
164
171
 
165
172
  const emptyFlush = async () => {};
166
173
 
174
+ const handleError = (error: any) => {
175
+ console.error(`Error in pulse '${key}':`, error);
176
+ context.$flush = emptyFlush;
177
+
178
+ pulseCallCount--;
179
+ if (pulseCallCount <= 0) {
180
+ currentState = null;
181
+ pulseCallCount = 0;
182
+ }
183
+
184
+ throw error;
185
+ };
186
+
167
187
  try {
168
- const pulseResult = pulses[key].apply(context, [currentState, ...args]);
188
+ const pulseResult = pulses[key].apply(context, [state, ...args]);
169
189
  if (pulseResult instanceof Promise) {
170
190
  return pulseResult
171
191
  .then((resolvedValue) => {
172
- setState(currentState as StateType);
192
+ setState(state as StateType);
173
193
  context.$flush = emptyFlush;
174
194
  return resolvedValue;
175
195
  })
176
- .catch((error) => {
177
- console.error(`Error in pulse '${key}':`, error);
178
- context.$flush = emptyFlush;
179
- throw error;
180
- });
196
+ .catch(handleError);
181
197
  } else {
182
- setState(currentState);
198
+ setState(state);
183
199
  context.$flush = emptyFlush;
184
200
  return pulseResult;
185
201
  }
186
202
  } catch (error) {
187
- console.error(`Error in pulse '${key}':`, error);
188
- context.$flush = emptyFlush;
189
- throw error;
203
+ handleError(error);
190
204
  }
191
205
  };
192
206
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "valyrian.js",
3
- "version": "8.1.8",
3
+ "version": "8.1.9",
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>",