@apia/util 2.0.7 → 2.0.8

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.
Files changed (68) hide show
  1. package/dist/animate/index.js.map +1 -1
  2. package/dist/array/arrayOrArray.js.map +1 -1
  3. package/dist/array/getIndex.js.map +1 -1
  4. package/dist/crypto/decrypt.js.map +1 -1
  5. package/dist/crypto/encrypt.js.map +1 -1
  6. package/dist/crypto/generateKey.js.map +1 -1
  7. package/dist/date/apiaDateToStandarFormat.js.map +1 -1
  8. package/dist/date/dateToApiaFormat.js.map +1 -1
  9. package/dist/date/getDateFormat.js.map +1 -1
  10. package/dist/debug/debugDispatcher.js.map +1 -1
  11. package/dist/debug/shortcutController.js.map +1 -1
  12. package/dist/documents/downloadStringAsDoc.js.map +1 -1
  13. package/dist/documents/downloadUrl.js.map +1 -1
  14. package/dist/documents/openAndReadFile.js.map +1 -1
  15. package/dist/dom/autoDisconnectMutationObserver.js.map +1 -1
  16. package/dist/dom/customEvents.js.map +1 -1
  17. package/dist/dom/enableChildrenFocus.js.map +1 -1
  18. package/dist/dom/findOffsetRelativeToScrollParent.js.map +1 -1
  19. package/dist/dom/findScrollContainer.js.map +1 -1
  20. package/dist/dom/getFocusSelector.js.map +1 -1
  21. package/dist/dom/getSpecificParent.js.map +1 -1
  22. package/dist/dom/isChild.js.map +1 -1
  23. package/dist/dom/scrollParentIntoElement.js.map +1 -1
  24. package/dist/dom/url.js.map +1 -1
  25. package/dist/dom/usePanAndZoom.js.map +1 -1
  26. package/dist/encoding/index.js.map +1 -1
  27. package/dist/events/EventEmitter.js.map +1 -1
  28. package/dist/events/StatefulEmitter.js.map +1 -1
  29. package/dist/focus/focusController.js +2 -2
  30. package/dist/focus/focusController.js.map +1 -1
  31. package/dist/focus/globalFocus.js +1 -1
  32. package/dist/focus/globalFocus.js.map +1 -1
  33. package/dist/history/History.js.map +1 -1
  34. package/dist/hooks/useCombinedRefs.js.map +1 -1
  35. package/dist/hooks/useDebouncedCallback.js.map +1 -1
  36. package/dist/hooks/useLatest.js.map +1 -1
  37. package/dist/hooks/useMount.js.map +1 -1
  38. package/dist/hooks/usePrevious.js.map +1 -1
  39. package/dist/hooks/useShallowMemo.js.map +1 -1
  40. package/dist/hooks/useStateRef.js.map +1 -1
  41. package/dist/hooks/useSubscription.js.map +1 -1
  42. package/dist/hooks/useUnmount.js.map +1 -1
  43. package/dist/hooks/useUpdateEffect.js.map +1 -1
  44. package/dist/imperative/makeImperativeComponent.js.map +1 -1
  45. package/dist/imperative/makeSingleImperativeComponent.js.map +1 -1
  46. package/dist/imperative/types.js.map +1 -1
  47. package/dist/imperative/useImperativeComponentEvents.js.map +1 -1
  48. package/dist/imperative/useImperativeIdentifierContext.js.map +1 -1
  49. package/dist/labels/formatMessage.js.map +1 -1
  50. package/dist/labels/getLabel.js.map +1 -1
  51. package/dist/number/index.js.map +1 -1
  52. package/dist/objects/getValueByPath.js.map +1 -1
  53. package/dist/objects/setValueByPath.js.map +1 -1
  54. package/dist/propsStore/propsStore.js.map +1 -1
  55. package/dist/propsStore/usePropsSelector.js.map +1 -1
  56. package/dist/screenLock/screenLocker.js +1 -1
  57. package/dist/screenLock/screenLocker.js.map +1 -1
  58. package/dist/states/useDebouncedState.js.map +1 -1
  59. package/dist/states/useDomState.js.map +1 -1
  60. package/dist/storage/StatefulStore.js +1 -1
  61. package/dist/storage/StatefulStore.js.map +1 -1
  62. package/dist/storage/persistentStorage.js.map +1 -1
  63. package/dist/storage/useLocalStorage.js.map +1 -1
  64. package/dist/string/alignment.js.map +1 -1
  65. package/dist/string/ucfirst.js.map +1 -1
  66. package/dist/typeGuards/toBoolean.js.map +1 -1
  67. package/dist/xml/parseXmlAsync.js.map +1 -1
  68. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"focusController.js","sources":["../../src/focus/focusController.ts"],"sourcesContent":["import isFunction from 'lodash-es/isFunction';\nimport { TRequireOnlyOne } from '../types';\nimport { globalFocus } from './globalFocus';\nimport { screenLocker } from '../screenLock';\nimport { customEvents, focusSelector } from '../dom';\nimport { persistentStorage } from '../storage';\nimport { noNaN } from '../number';\n\ninterface IFocusProps {\n modalsContainerRetriever?: () => HTMLElement;\n notificationsContainerRetriever?: () => HTMLElement;\n}\n\nexport interface IOnFocusConfiguration {\n /**\n * El controlador emite un evento custom cuando se realiza foco, con la\n * intención de que los elementos colapsables se abran automáticamente. Si\n * este parámetro es pasado con false, se evita ese comportamiento.\n */\n dispatchCustomEvent?: boolean;\n /**\n * Cuando la pantalla está bloqueada con el spinner, el controlador no\n * intentará hacer foco, a menos que este parámetro se pase en true.\n */\n focusEvenWhenScreenLocked?: boolean;\n scrollIntoViewOptions?: ScrollIntoViewOptions;\n}\n\nexport const notificationsSelector = '.notification';\n\n/**\n * Al método focus.on se le puede pasar o bien un HTMLElement o bien una\n * función que implemente esta interfaz. Cuando se pasa una función, la misma\n * será invocada cada vez que se vaya a intentar una acción de foco.\n *\n * Si la función devuelve un elemento HTML, se intentará hacer foco sobre éste.\n *\n * Si la función devuelve null, ese intento será tomado como nulo y se volverá\n * a intentar luego del tiempo determinado.\n *\n * Si la función devuelve false, será eliminada de la cola de foco, lo que\n * significa que ya no se intentará hacer foco sobre este elemento. En cambio,\n * se continuará con los demás elementos de la cola o en caso de no haber\n * ninguno, con el último elemento que tuvo foco y aún esté presente en el\n * documento.\n */\nexport type TFocusRetriever = (\n isLastTry: boolean,\n) => HTMLElement | null | false;\n\ninterface IFocusQueryElement {\n element: HTMLElement | TFocusRetriever;\n configuration?: IOnFocusConfiguration;\n}\n\ndeclare global {\n interface Window {\n focusStatus: Record<string, unknown>;\n }\n}\n\ninterface IFocusCheck {\n currentInstruction: number;\n}\n\nexport const focus = new (class FocusController {\n #root: HTMLElement;\n\n #props: IFocusProps | undefined;\n\n constructor(root: HTMLElement, props?: IFocusProps) {\n this.#root = root;\n this.#props = props;\n\n window.focusStatus = {};\n globalFocus.onFocus(() => {\n this.#resetInterval();\n });\n }\n\n afterNotificationFocus: IFocusQueryElement | undefined = undefined;\n\n #actualFocusQuery: IFocusQueryElement[] = [];\n\n #currentInstruction = 0;\n\n #focusDelay = 300;\n\n #focusRetries = 3;\n\n #focusTimeout = -1;\n\n #isIntervalRunning = false;\n\n set #focusQuery(value: IFocusQueryElement[]) {\n this.#actualFocusQuery = value;\n }\n\n get #focusQuery() {\n return new Proxy(this.#actualFocusQuery, {\n get: (target, key) => {\n if (key in target) {\n const prop = target[key as keyof typeof target];\n if (isFunction(prop))\n return (...props: unknown[]) => {\n const result = (\n target[key as keyof typeof target] as unknown as (\n ...methodProps: unknown[]\n ) => void\n ).bind(target, ...props)();\n return result;\n };\n return prop;\n }\n return undefined;\n },\n });\n }\n\n #checkInstruction(focusCheck: IFocusCheck) {\n return focusCheck.currentInstruction === this.#currentInstruction;\n }\n\n async #doFocus(\n HTMLElement: HTMLElement | TFocusRetriever,\n focusCheck: IFocusCheck,\n isLastTry: boolean,\n configuration?: IOnFocusConfiguration,\n ) {\n if (\n screenLocker.isLocked('common') &&\n !configuration?.focusEvenWhenScreenLocked\n ) {\n return null;\n }\n const actualHTMLElement = isFunction(HTMLElement)\n ? HTMLElement(isLastTry)\n : HTMLElement;\n\n if (actualHTMLElement) {\n if ((actualHTMLElement as HTMLInputElement).disabled) return false;\n actualHTMLElement.focus();\n return new Promise<false | null | HTMLElement>((resolve) => {\n if (configuration?.dispatchCustomEvent !== false) {\n const customFocusEvent = new CustomEvent(customEvents.focus, {\n bubbles: true,\n });\n actualHTMLElement.dispatchEvent(customFocusEvent);\n }\n\n /**\n * Este setTimeout está colocado aquí para asegurarme de que se\n * propague correctamente el customEvent y los procesos de renderizado\n * asociados puedan ser ejecutados antes de proseguir con el proces de\n * foco.\n */\n setTimeout(() => {\n if (!this.#checkInstruction(focusCheck)) {\n resolve(false);\n return;\n }\n try {\n if (configuration?.scrollIntoViewOptions)\n actualHTMLElement?.scrollIntoView(\n configuration.scrollIntoViewOptions,\n );\n } catch (e) {\n console.error(e);\n }\n setTimeout(() => {\n if (!this.#checkInstruction(focusCheck)) {\n resolve(false);\n } else if (document.activeElement?.tagName === 'IFRAME') {\n resolve(\n (\n document.activeElement as HTMLIFrameElement\n ).contentDocument?.contains(actualHTMLElement)\n ? actualHTMLElement\n : null,\n );\n } else\n resolve(\n document.activeElement === actualHTMLElement\n ? actualHTMLElement\n : null,\n );\n }, 0);\n }, 0);\n });\n }\n return actualHTMLElement;\n }\n\n #resetInterval() {\n clearTimeout(this.#focusTimeout);\n this.#focusTimeout = -1;\n this.#isIntervalRunning = false;\n this.#currentInstruction++;\n }\n\n async #runFocusInterval(\n focusElement?: IFocusQueryElement,\n internalCall?: boolean,\n ): Promise<false | HTMLElement> {\n if (!internalCall && (this.#focusTimeout !== -1 || this.#isIntervalRunning))\n return false;\n const currentInstruction: IFocusCheck = {\n currentInstruction: this.#currentInstruction,\n };\n this.#isIntervalRunning = true;\n return new Promise<false | HTMLElement>((resolve) => {\n const resolvePromise = async () => {\n const element = focusElement ?? this.#focusQuery.shift();\n\n if (element) {\n const hasFocused = await this.#doFocus(\n element.element,\n currentInstruction,\n element !== this.#focusQuery[0],\n element.configuration,\n );\n if (!this.#checkInstruction(currentInstruction)) {\n resolve(false);\n return;\n }\n if (hasFocused !== null && hasFocused !== false) {\n this.#actualFocusQuery = [];\n resolve(hasFocused);\n this.#isIntervalRunning = false;\n return;\n }\n if (hasFocused === false) {\n this.#actualFocusQuery = this.#actualFocusQuery.filter(\n (current) => current !== element,\n );\n }\n }\n\n if (!this.#checkInstruction(currentInstruction)) {\n resolve(false);\n return;\n }\n\n if (this.#actualFocusQuery.length > 0) {\n this.#focusTimeout = setTimeout(() => {\n const runInterval = async () => {\n const result = await this.#runFocusInterval(undefined, true);\n resolve(result);\n this.#isIntervalRunning = true;\n };\n void runInterval();\n }, this.#focusDelay) as unknown as number;\n } else {\n const lastFocused = globalFocus.last(':not(body)');\n if (lastFocused) {\n const result = await this.#doFocus(\n lastFocused,\n currentInstruction,\n element !== this.#focusQuery[0],\n element?.configuration,\n );\n if (!this.#checkInstruction(currentInstruction)) {\n resolve(false);\n return;\n }\n if (result) resolve(result);\n else resolve(false);\n this.#isIntervalRunning = true;\n }\n resolve(false);\n this.#isIntervalRunning = true;\n }\n };\n void resolvePromise();\n });\n }\n\n /**\n * Da la instrucción de colocar el foco en el elemento provisto como\n * parámetro una vez que todas las notificaciones se hayan cerrado. En caso\n * de no existir notificaciones abiertas, hace foco en el elemento\n * directamente.\n */\n afterNotifications(\n element: HTMLElement | TFocusRetriever,\n configuration?: IOnFocusConfiguration,\n ) {\n if (!element) return;\n void this.on(element, configuration);\n }\n\n /**\n * Da la instrucción de colocar el foco en el elemento provisto como\n * parámetro luego de recargar la página.\n *\n * Los parámetros pasados serán ordenados en orden de importancia priorizando\n * en el siguiente orden:\n * - id\n * - name\n * - className\n * - selector\n */\n afterReload({\n className,\n id,\n name,\n selector,\n }: TRequireOnlyOne<{\n className: string;\n id: string;\n name: string;\n selector: string;\n }>) {\n persistentStorage.focusOnReload = [\n id ? `#${id}` : undefined,\n name ? `[name=\"${name}\"]` : undefined,\n className ? `.${className}` : undefined,\n selector,\n ]\n .filter((el) => el !== undefined)\n .join(',');\n }\n\n /**\n * Da la instrucción de colocar el foco el elemento pasado como parámetro.\n * Se puede pasar también una función que devuelva HTMLElement | false |\n * null.\n *\n * El segundo parámetro del método on es un objeto de tipo\n * ScrollIntoViewOptions, que permite modificar el comportamiento del scroll\n * a en el elemento.\n *\n * @see TFocusRetriever para más detalles sobre la función como parámetro.\n */\n async on(\n element: HTMLElement | TFocusRetriever,\n configuration?: IOnFocusConfiguration,\n ) {\n if (element) {\n const focusElement = {\n element,\n configuration,\n };\n for (let i = 0; i < this.#focusRetries; i++)\n this.#focusQuery.unshift(focusElement);\n\n this.#resetInterval();\n return this.#runFocusInterval(focusElement);\n }\n return false;\n }\n\n focusOnReload: string | null = null;\n\n restore() {\n void this.on(\n (globalFocus.last(':not(body), body#tinymce') as HTMLElement) ||\n (document.querySelector(focusSelector) as HTMLElement),\n );\n }\n\n init() {\n const modalsObserver = new MutationObserver((mutation) => {\n if (mutation[0].removedNodes.length === 0) return;\n this.afterNotifications(\n globalFocus.last(\n ':not(body):not(.notificationsView *), body#tinymce',\n ) as HTMLElement,\n );\n });\n const appModalsBox = (\n this.#props?.modalsContainerRetriever ??\n (() => this.#root.querySelector('#AppModals'))\n )();\n if (appModalsBox) modalsObserver.observe(appModalsBox, { childList: true });\n\n screenLocker.on('releaseForFirstTime', () => {\n if (persistentStorage.focusOnReload)\n this.focusOnReload = persistentStorage.focusOnReload as string;\n persistentStorage.focusOnReload = null;\n this.afterNotifications(() => {\n if (this.focusOnReload) {\n const initialFocusElement = document.querySelector(\n this.focusOnReload,\n );\n const scrollTop = noNaN(\n (window as unknown as Record<string, string>).CURRENT_TAB?.split(\n '~',\n )[1],\n );\n if (document.scrollingElement)\n document.scrollingElement.scrollTop = scrollTop;\n return initialFocusElement as HTMLElement | null;\n }\n return false;\n });\n });\n }\n})(document.getElementById('root') as HTMLElement);\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"focusController.js","sources":["../../src/focus/focusController.ts"],"sourcesContent":["import isFunction from 'lodash-es/isFunction';\r\nimport { TRequireOnlyOne } from '../types';\r\nimport { globalFocus } from './globalFocus';\r\nimport { screenLocker } from '../screenLock';\r\nimport { customEvents, focusSelector } from '../dom';\r\nimport { persistentStorage } from '../storage';\r\nimport { noNaN } from '../number';\r\n\r\ninterface IFocusProps {\r\n modalsContainerRetriever?: () => HTMLElement;\r\n notificationsContainerRetriever?: () => HTMLElement;\r\n}\r\n\r\nexport interface IOnFocusConfiguration {\r\n /**\r\n * El controlador emite un evento custom cuando se realiza foco, con la\r\n * intención de que los elementos colapsables se abran automáticamente. Si\r\n * este parámetro es pasado con false, se evita ese comportamiento.\r\n */\r\n dispatchCustomEvent?: boolean;\r\n /**\r\n * Cuando la pantalla está bloqueada con el spinner, el controlador no\r\n * intentará hacer foco, a menos que este parámetro se pase en true.\r\n */\r\n focusEvenWhenScreenLocked?: boolean;\r\n scrollIntoViewOptions?: ScrollIntoViewOptions;\r\n}\r\n\r\nexport const notificationsSelector = '.notification';\r\n\r\n/**\r\n * Al método focus.on se le puede pasar o bien un HTMLElement o bien una\r\n * función que implemente esta interfaz. Cuando se pasa una función, la misma\r\n * será invocada cada vez que se vaya a intentar una acción de foco.\r\n *\r\n * Si la función devuelve un elemento HTML, se intentará hacer foco sobre éste.\r\n *\r\n * Si la función devuelve null, ese intento será tomado como nulo y se volverá\r\n * a intentar luego del tiempo determinado.\r\n *\r\n * Si la función devuelve false, será eliminada de la cola de foco, lo que\r\n * significa que ya no se intentará hacer foco sobre este elemento. En cambio,\r\n * se continuará con los demás elementos de la cola o en caso de no haber\r\n * ninguno, con el último elemento que tuvo foco y aún esté presente en el\r\n * documento.\r\n */\r\nexport type TFocusRetriever = (\r\n isLastTry: boolean,\r\n) => HTMLElement | null | false;\r\n\r\ninterface IFocusQueryElement {\r\n element: HTMLElement | TFocusRetriever;\r\n configuration?: IOnFocusConfiguration;\r\n}\r\n\r\ndeclare global {\r\n interface Window {\r\n focusStatus: Record<string, unknown>;\r\n }\r\n}\r\n\r\ninterface IFocusCheck {\r\n currentInstruction: number;\r\n}\r\n\r\nexport const focus = new (class FocusController {\r\n #root: HTMLElement;\r\n\r\n #props: IFocusProps | undefined;\r\n\r\n constructor(root: HTMLElement, props?: IFocusProps) {\r\n this.#root = root;\r\n this.#props = props;\r\n\r\n window.focusStatus = {};\r\n globalFocus.onFocus(() => {\r\n this.#resetInterval();\r\n });\r\n }\r\n\r\n afterNotificationFocus: IFocusQueryElement | undefined = undefined;\r\n\r\n #actualFocusQuery: IFocusQueryElement[] = [];\r\n\r\n #currentInstruction = 0;\r\n\r\n #focusDelay = 300;\r\n\r\n #focusRetries = 3;\r\n\r\n #focusTimeout = -1;\r\n\r\n #isIntervalRunning = false;\r\n\r\n set #focusQuery(value: IFocusQueryElement[]) {\r\n this.#actualFocusQuery = value;\r\n }\r\n\r\n get #focusQuery() {\r\n return new Proxy(this.#actualFocusQuery, {\r\n get: (target, key) => {\r\n if (key in target) {\r\n const prop = target[key as keyof typeof target];\r\n if (isFunction(prop))\r\n return (...props: unknown[]) => {\r\n const result = (\r\n target[key as keyof typeof target] as unknown as (\r\n ...methodProps: unknown[]\r\n ) => void\r\n ).bind(target, ...props)();\r\n return result;\r\n };\r\n return prop;\r\n }\r\n return undefined;\r\n },\r\n });\r\n }\r\n\r\n #checkInstruction(focusCheck: IFocusCheck) {\r\n return focusCheck.currentInstruction === this.#currentInstruction;\r\n }\r\n\r\n async #doFocus(\r\n HTMLElement: HTMLElement | TFocusRetriever,\r\n focusCheck: IFocusCheck,\r\n isLastTry: boolean,\r\n configuration?: IOnFocusConfiguration,\r\n ) {\r\n if (\r\n screenLocker.isLocked('common') &&\r\n !configuration?.focusEvenWhenScreenLocked\r\n ) {\r\n return null;\r\n }\r\n const actualHTMLElement = isFunction(HTMLElement)\r\n ? HTMLElement(isLastTry)\r\n : HTMLElement;\r\n\r\n if (actualHTMLElement) {\r\n if ((actualHTMLElement as HTMLInputElement).disabled) return false;\r\n actualHTMLElement.focus();\r\n return new Promise<false | null | HTMLElement>((resolve) => {\r\n if (configuration?.dispatchCustomEvent !== false) {\r\n const customFocusEvent = new CustomEvent(customEvents.focus, {\r\n bubbles: true,\r\n });\r\n actualHTMLElement.dispatchEvent(customFocusEvent);\r\n }\r\n\r\n /**\r\n * Este setTimeout está colocado aquí para asegurarme de que se\r\n * propague correctamente el customEvent y los procesos de renderizado\r\n * asociados puedan ser ejecutados antes de proseguir con el proces de\r\n * foco.\r\n */\r\n setTimeout(() => {\r\n if (!this.#checkInstruction(focusCheck)) {\r\n resolve(false);\r\n return;\r\n }\r\n try {\r\n if (configuration?.scrollIntoViewOptions)\r\n actualHTMLElement?.scrollIntoView(\r\n configuration.scrollIntoViewOptions,\r\n );\r\n } catch (e) {\r\n console.error(e);\r\n }\r\n setTimeout(() => {\r\n if (!this.#checkInstruction(focusCheck)) {\r\n resolve(false);\r\n } else if (document.activeElement?.tagName === 'IFRAME') {\r\n resolve(\r\n (\r\n document.activeElement as HTMLIFrameElement\r\n ).contentDocument?.contains(actualHTMLElement)\r\n ? actualHTMLElement\r\n : null,\r\n );\r\n } else\r\n resolve(\r\n document.activeElement === actualHTMLElement\r\n ? actualHTMLElement\r\n : null,\r\n );\r\n }, 0);\r\n }, 0);\r\n });\r\n }\r\n return actualHTMLElement;\r\n }\r\n\r\n #resetInterval() {\r\n clearTimeout(this.#focusTimeout);\r\n this.#focusTimeout = -1;\r\n this.#isIntervalRunning = false;\r\n this.#currentInstruction++;\r\n }\r\n\r\n async #runFocusInterval(\r\n focusElement?: IFocusQueryElement,\r\n internalCall?: boolean,\r\n ): Promise<false | HTMLElement> {\r\n if (!internalCall && (this.#focusTimeout !== -1 || this.#isIntervalRunning))\r\n return false;\r\n const currentInstruction: IFocusCheck = {\r\n currentInstruction: this.#currentInstruction,\r\n };\r\n this.#isIntervalRunning = true;\r\n return new Promise<false | HTMLElement>((resolve) => {\r\n const resolvePromise = async () => {\r\n const element = focusElement ?? this.#focusQuery.shift();\r\n\r\n if (element) {\r\n const hasFocused = await this.#doFocus(\r\n element.element,\r\n currentInstruction,\r\n element !== this.#focusQuery[0],\r\n element.configuration,\r\n );\r\n if (!this.#checkInstruction(currentInstruction)) {\r\n resolve(false);\r\n return;\r\n }\r\n if (hasFocused !== null && hasFocused !== false) {\r\n this.#actualFocusQuery = [];\r\n resolve(hasFocused);\r\n this.#isIntervalRunning = false;\r\n return;\r\n }\r\n if (hasFocused === false) {\r\n this.#actualFocusQuery = this.#actualFocusQuery.filter(\r\n (current) => current !== element,\r\n );\r\n }\r\n }\r\n\r\n if (!this.#checkInstruction(currentInstruction)) {\r\n resolve(false);\r\n return;\r\n }\r\n\r\n if (this.#actualFocusQuery.length > 0) {\r\n this.#focusTimeout = setTimeout(() => {\r\n const runInterval = async () => {\r\n const result = await this.#runFocusInterval(undefined, true);\r\n resolve(result);\r\n this.#isIntervalRunning = true;\r\n };\r\n void runInterval();\r\n }, this.#focusDelay) as unknown as number;\r\n } else {\r\n const lastFocused = globalFocus.last(':not(body)');\r\n if (lastFocused) {\r\n const result = await this.#doFocus(\r\n lastFocused,\r\n currentInstruction,\r\n element !== this.#focusQuery[0],\r\n element?.configuration,\r\n );\r\n if (!this.#checkInstruction(currentInstruction)) {\r\n resolve(false);\r\n return;\r\n }\r\n if (result) resolve(result);\r\n else resolve(false);\r\n this.#isIntervalRunning = true;\r\n }\r\n resolve(false);\r\n this.#isIntervalRunning = true;\r\n }\r\n };\r\n void resolvePromise();\r\n });\r\n }\r\n\r\n /**\r\n * Da la instrucción de colocar el foco en el elemento provisto como\r\n * parámetro una vez que todas las notificaciones se hayan cerrado. En caso\r\n * de no existir notificaciones abiertas, hace foco en el elemento\r\n * directamente.\r\n */\r\n afterNotifications(\r\n element: HTMLElement | TFocusRetriever,\r\n configuration?: IOnFocusConfiguration,\r\n ) {\r\n if (!element) return;\r\n void this.on(element, configuration);\r\n }\r\n\r\n /**\r\n * Da la instrucción de colocar el foco en el elemento provisto como\r\n * parámetro luego de recargar la página.\r\n *\r\n * Los parámetros pasados serán ordenados en orden de importancia priorizando\r\n * en el siguiente orden:\r\n * - id\r\n * - name\r\n * - className\r\n * - selector\r\n */\r\n afterReload({\r\n className,\r\n id,\r\n name,\r\n selector,\r\n }: TRequireOnlyOne<{\r\n className: string;\r\n id: string;\r\n name: string;\r\n selector: string;\r\n }>) {\r\n persistentStorage.focusOnReload = [\r\n id ? `#${id}` : undefined,\r\n name ? `[name=\"${name}\"]` : undefined,\r\n className ? `.${className}` : undefined,\r\n selector,\r\n ]\r\n .filter((el) => el !== undefined)\r\n .join(',');\r\n }\r\n\r\n /**\r\n * Da la instrucción de colocar el foco el elemento pasado como parámetro.\r\n * Se puede pasar también una función que devuelva HTMLElement | false |\r\n * null.\r\n *\r\n * El segundo parámetro del método on es un objeto de tipo\r\n * ScrollIntoViewOptions, que permite modificar el comportamiento del scroll\r\n * a en el elemento.\r\n *\r\n * @see TFocusRetriever para más detalles sobre la función como parámetro.\r\n */\r\n async on(\r\n element: HTMLElement | TFocusRetriever,\r\n configuration?: IOnFocusConfiguration,\r\n ) {\r\n if (element) {\r\n const focusElement = {\r\n element,\r\n configuration,\r\n };\r\n for (let i = 0; i < this.#focusRetries; i++)\r\n this.#focusQuery.unshift(focusElement);\r\n\r\n this.#resetInterval();\r\n return this.#runFocusInterval(focusElement);\r\n }\r\n return false;\r\n }\r\n\r\n focusOnReload: string | null = null;\r\n\r\n restore() {\r\n void this.on(\r\n (globalFocus.last(':not(body), body#tinymce') as HTMLElement) ||\r\n (document.querySelector(focusSelector) as HTMLElement),\r\n );\r\n }\r\n\r\n init() {\r\n const modalsObserver = new MutationObserver((mutation) => {\r\n if (mutation[0].removedNodes.length === 0) return;\r\n this.afterNotifications(\r\n globalFocus.last(\r\n ':not(body):not(.notificationsView *), body#tinymce',\r\n ) as HTMLElement,\r\n );\r\n });\r\n const appModalsBox = (\r\n this.#props?.modalsContainerRetriever ??\r\n (() => this.#root.querySelector('#AppModals'))\r\n )();\r\n if (appModalsBox) modalsObserver.observe(appModalsBox, { childList: true });\r\n\r\n screenLocker.on('releaseForFirstTime', () => {\r\n if (persistentStorage.focusOnReload)\r\n this.focusOnReload = persistentStorage.focusOnReload as string;\r\n persistentStorage.focusOnReload = null;\r\n this.afterNotifications(() => {\r\n if (this.focusOnReload) {\r\n const initialFocusElement = document.querySelector(\r\n this.focusOnReload,\r\n );\r\n const scrollTop = noNaN(\r\n (window as unknown as Record<string, string>).CURRENT_TAB?.split(\r\n '~',\r\n )[1],\r\n );\r\n if (document.scrollingElement)\r\n document.scrollingElement.scrollTop = scrollTop;\r\n return initialFocusElement as HTMLElement | null;\r\n }\r\n return false;\r\n });\r\n });\r\n }\r\n})(document.getElementById('root') as HTMLElement);\r\n"],"names":[],"mappings":"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"}
@@ -16,7 +16,7 @@ var __privateAdd = (obj, member, value) => {
16
16
  };
17
17
  var __privateSet = (obj, member, value, setter) => {
18
18
  __accessCheck(obj, member, "write to private field");
19
- setter ? setter.call(obj, value) : member.set(obj, value);
19
+ member.set(obj, value);
20
20
  return value;
21
21
  };
22
22
  var _onFocusCallbacks, _a;
@@ -1 +1 @@
1
- {"version":3,"file":"globalFocus.js","sources":["../../src/focus/globalFocus.ts"],"sourcesContent":["import isFunction from 'lodash-es/isFunction';\nimport { TFocusRetriever } from './focusController';\nimport { debugDispatcher } from '../debug';\n\nconst historySize = 50;\n\n/**\n * The GlobalFocus helper keeps a list of the last focused elements and allows\n * to retrieve the last focused element which matches against a query selector.\n */\nexport const globalFocus = new (class {\n focused: (HTMLElement | TFocusRetriever)[] = [];\n\n #onFocusCallbacks: (() => unknown)[] = [];\n\n offFocus(cb: () => unknown) {\n this.#onFocusCallbacks = this.#onFocusCallbacks.filter(\n (current) => current !== cb,\n );\n }\n\n onFocus(cb: () => unknown) {\n this.#onFocusCallbacks.push(cb);\n\n return () => {\n this.offFocus(cb);\n };\n }\n\n constructor() {\n debugDispatcher.on(\n 'focusHistory',\n () => {\n console.info(this.focused);\n },\n 'Muestra el historial de elementos que recibieron foco.',\n );\n }\n\n inDocument(el: HTMLElement | TFocusRetriever) {\n return (\n el instanceof Function ||\n (el instanceof HTMLElement && el.offsetParent !== null)\n );\n }\n\n set focus(element: HTMLElement | TFocusRetriever) {\n this.focused = this.focused.filter((el) => {\n const existsInDocument = this.inDocument(el) && element !== el;\n\n return existsInDocument;\n });\n this.focused.unshift(element);\n if (this.focused.length > historySize) {\n this.focused = this.focused.splice(0, historySize);\n }\n\n this.#onFocusCallbacks.forEach((cb) => cb());\n }\n\n get list() {\n return [...this.focused];\n }\n\n /**\n * @param querySelector A query selector against which the element should match\n * @returns The last HTMLElement if no querySelector argument provided or else, the last which matches\n * against that query selector.\n * */\n last(querySelector?: string, omit = 0) {\n if (querySelector)\n for (let i = omit; i <= this.focused.length; i++) {\n const storedElement = this.focused[i];\n const element =\n // eslint-disable-next-line no-nested-ternary\n (storedElement as HTMLElement)?.id !== undefined\n ? (storedElement as HTMLElement)\n : isFunction(storedElement)\n ? storedElement(false)\n : null;\n\n if (\n element &&\n this.inDocument(element) &&\n element.matches &&\n element.matches(querySelector)\n )\n return element;\n }\n else return this.focused[this.focused.length - 1];\n return null;\n }\n})();\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"globalFocus.js","sources":["../../src/focus/globalFocus.ts"],"sourcesContent":["import isFunction from 'lodash-es/isFunction';\r\nimport { TFocusRetriever } from './focusController';\r\nimport { debugDispatcher } from '../debug';\r\n\r\nconst historySize = 50;\r\n\r\n/**\r\n * The GlobalFocus helper keeps a list of the last focused elements and allows\r\n * to retrieve the last focused element which matches against a query selector.\r\n */\r\nexport const globalFocus = new (class {\r\n focused: (HTMLElement | TFocusRetriever)[] = [];\r\n\r\n #onFocusCallbacks: (() => unknown)[] = [];\r\n\r\n offFocus(cb: () => unknown) {\r\n this.#onFocusCallbacks = this.#onFocusCallbacks.filter(\r\n (current) => current !== cb,\r\n );\r\n }\r\n\r\n onFocus(cb: () => unknown) {\r\n this.#onFocusCallbacks.push(cb);\r\n\r\n return () => {\r\n this.offFocus(cb);\r\n };\r\n }\r\n\r\n constructor() {\r\n debugDispatcher.on(\r\n 'focusHistory',\r\n () => {\r\n console.info(this.focused);\r\n },\r\n 'Muestra el historial de elementos que recibieron foco.',\r\n );\r\n }\r\n\r\n inDocument(el: HTMLElement | TFocusRetriever) {\r\n return (\r\n el instanceof Function ||\r\n (el instanceof HTMLElement && el.offsetParent !== null)\r\n );\r\n }\r\n\r\n set focus(element: HTMLElement | TFocusRetriever) {\r\n this.focused = this.focused.filter((el) => {\r\n const existsInDocument = this.inDocument(el) && element !== el;\r\n\r\n return existsInDocument;\r\n });\r\n this.focused.unshift(element);\r\n if (this.focused.length > historySize) {\r\n this.focused = this.focused.splice(0, historySize);\r\n }\r\n\r\n this.#onFocusCallbacks.forEach((cb) => cb());\r\n }\r\n\r\n get list() {\r\n return [...this.focused];\r\n }\r\n\r\n /**\r\n * @param querySelector A query selector against which the element should match\r\n * @returns The last HTMLElement if no querySelector argument provided or else, the last which matches\r\n * against that query selector.\r\n * */\r\n last(querySelector?: string, omit = 0) {\r\n if (querySelector)\r\n for (let i = omit; i <= this.focused.length; i++) {\r\n const storedElement = this.focused[i];\r\n const element =\r\n // eslint-disable-next-line no-nested-ternary\r\n (storedElement as HTMLElement)?.id !== undefined\r\n ? (storedElement as HTMLElement)\r\n : isFunction(storedElement)\r\n ? storedElement(false)\r\n : null;\r\n\r\n if (\r\n element &&\r\n this.inDocument(element) &&\r\n element.matches &&\r\n element.matches(querySelector)\r\n )\r\n return element;\r\n }\r\n else return this.focused[this.focused.length - 1];\r\n return null;\r\n }\r\n})();\r\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"History.js","sources":["../../src/history/History.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { EventEmitter } from '../events/EventEmitter';\nimport { useMount } from '../hooks';\n\nexport type THistoryCount = {\n currentStep: number;\n stepCount: number;\n};\n\nexport type THistoryStep<T> = {\n content: T;\n} & THistoryCount;\n\nexport type THistoryStepChange<T> = THistoryCount &\n THistoryStep<T> & {\n fromPush?: boolean;\n hasPrevious: boolean;\n hasNext: boolean;\n };\n\nexport type THistoryConfiguration = {\n maxLength: number;\n};\n\n/**\n * # Cómo usar el historial\n *\n * Es muy sencillo: se instancia con un callback que recibirá un método push\n * cada vez que una ventana se cierre. En esos momentos, el usuario del History\n * puede hacer push al estado.\n *\n * ## La mecánica\n *\n * - Instancio la clase y recibo el método push\n * - Cuando se realizan cambios significativos, llamo al método openWindow\n * - El método openWindow da una ventana de 350ms antes de llamar al callback\n * - Si durante esa ventana se vuelve a llamar a openWindow, la ventana se\n * resetea\n * - Si al llamar al callback, se hace push al estado, ese estado es propagado\n * mediante el hook y mediante el evento on('stepChange')\n * \n * ## Cómo escuchar cambios\n * \n * ```ts\n * this.history.on('stepChange', (data) => {\n if (!data.fromPush) this.update(data.content);\n });\n ```\n *\n * ## Back y forward\n *\n * El back y forward son dos métodos del history que hacen un stepChange y\n * emiten a través de on('stepChange') y el hook\n */\nexport class History<T> extends EventEmitter<{\n stepChange: THistoryStepChange<T>;\n}> {\n private autocloseTimeout = -1;\n private currentStep = 0;\n private content: T[] = [];\n private emitting = 0;\n protected enabled = true;\n private _isOpen = false;\n private timeoutMs = 350;\n\n constructor(\n onCloseWindow: (push: (newState: T) => void) => unknown,\n private configuration: THistoryConfiguration = { maxLength: 100 },\n ) {\n super();\n\n this.onCloseWindow = onCloseWindow;\n }\n\n private closeWindow = () => {\n if (this._isOpen) {\n this.onCloseWindow(this.push.bind(this));\n this._isOpen = false;\n }\n };\n\n private getEvent = () => {\n const stepCount = this.content.length - 1;\n const event = {\n content: this.content[this.currentStep],\n currentStep: this.currentStep,\n stepCount,\n hasNext: this.currentStep < stepCount,\n hasPrevious: this.currentStep >= 0,\n };\n\n return event;\n };\n\n private onCloseWindow: (push: (newState: T) => void) => unknown;\n\n private push = (el: T) => {\n this.content = [...this.content.slice(0, this.currentStep + 1), el];\n this.content = this.content.slice(\n Math.max(0, this.content.length - this.configuration.maxLength),\n );\n this.currentStep = this.content.length - 1;\n this.shoutStepChange(true);\n };\n\n private shoutStepChange = (fromPush?: boolean) => {\n try {\n this.emit('stepChange', { ...this.getEvent(), fromPush });\n } catch (e) {\n console.error(e);\n }\n };\n\n hooks = {\n useCountChange: (onChange: (ev: THistoryStepChange<T>) => unknown) => {\n useMount(() => {\n onChange(this.getEvent());\n\n this.on('stepChange', () => {\n onChange(this.getEvent());\n });\n });\n },\n };\n\n back = () => {\n clearTimeout(this.autocloseTimeout);\n if (this.currentStep >= 0) {\n this.currentStep -= 1;\n this.shoutStepChange();\n }\n };\n\n disable = () => {\n this.enabled = false;\n };\n\n emit<K extends 'stepChange'>(\n eventName: K,\n params?: THistoryStepChange<T>,\n ): void {\n this.emitting++;\n\n super.emit(eventName, params as THistoryStepChange<T>);\n\n this.emitting--;\n }\n\n enable = () => {\n this.enabled = true;\n };\n\n forward = () => {\n clearTimeout(this.autocloseTimeout);\n if (this.currentStep < this.content.length - 1) {\n this.currentStep += 1;\n this.shoutStepChange();\n }\n };\n\n get isOpen() {\n return this._isOpen;\n }\n\n openWindow = () => {\n if (!this.enabled || this.emitting !== 0) return;\n\n this._isOpen = true;\n\n clearTimeout(this.autocloseTimeout);\n this.autocloseTimeout = setTimeout(() => {\n this.closeWindow();\n }, this.timeoutMs) as unknown as number;\n };\n\n reset = () => {\n clearTimeout(this.autocloseTimeout);\n this.content = [];\n this.currentStep = -1;\n this.openWindow();\n };\n\n updateConfig = (newConfiguration: Partial<THistoryConfiguration>) => {\n this.configuration = { ...this.configuration, ...newConfiguration };\n };\n\n useStep = () => {\n const [hasPrevious, setHasPrevious] = useState<\n Pick<THistoryStepChange<T>, 'hasNext' | 'hasPrevious' | 'currentStep'>\n >({ hasNext: false, hasPrevious: false, currentStep: 0 });\n\n useMount(() => {\n return this.on('stepChange', (ev) => {\n setHasPrevious({\n currentStep: ev.currentStep,\n hasNext: ev.hasNext,\n hasPrevious: ev.hasPrevious,\n });\n });\n });\n\n return hasPrevious;\n };\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"History.js","sources":["../../src/history/History.tsx"],"sourcesContent":["import { useState } from 'react';\r\nimport { EventEmitter } from '../events/EventEmitter';\r\nimport { useMount } from '../hooks';\r\n\r\nexport type THistoryCount = {\r\n currentStep: number;\r\n stepCount: number;\r\n};\r\n\r\nexport type THistoryStep<T> = {\r\n content: T;\r\n} & THistoryCount;\r\n\r\nexport type THistoryStepChange<T> = THistoryCount &\r\n THistoryStep<T> & {\r\n fromPush?: boolean;\r\n hasPrevious: boolean;\r\n hasNext: boolean;\r\n };\r\n\r\nexport type THistoryConfiguration = {\r\n maxLength: number;\r\n};\r\n\r\n/**\r\n * # Cómo usar el historial\r\n *\r\n * Es muy sencillo: se instancia con un callback que recibirá un método push\r\n * cada vez que una ventana se cierre. En esos momentos, el usuario del History\r\n * puede hacer push al estado.\r\n *\r\n * ## La mecánica\r\n *\r\n * - Instancio la clase y recibo el método push\r\n * - Cuando se realizan cambios significativos, llamo al método openWindow\r\n * - El método openWindow da una ventana de 350ms antes de llamar al callback\r\n * - Si durante esa ventana se vuelve a llamar a openWindow, la ventana se\r\n * resetea\r\n * - Si al llamar al callback, se hace push al estado, ese estado es propagado\r\n * mediante el hook y mediante el evento on('stepChange')\r\n * \r\n * ## Cómo escuchar cambios\r\n * \r\n * ```ts\r\n * this.history.on('stepChange', (data) => {\r\n if (!data.fromPush) this.update(data.content);\r\n });\r\n ```\r\n *\r\n * ## Back y forward\r\n *\r\n * El back y forward son dos métodos del history que hacen un stepChange y\r\n * emiten a través de on('stepChange') y el hook\r\n */\r\nexport class History<T> extends EventEmitter<{\r\n stepChange: THistoryStepChange<T>;\r\n}> {\r\n private autocloseTimeout = -1;\r\n private currentStep = 0;\r\n private content: T[] = [];\r\n private emitting = 0;\r\n protected enabled = true;\r\n private _isOpen = false;\r\n private timeoutMs = 350;\r\n\r\n constructor(\r\n onCloseWindow: (push: (newState: T) => void) => unknown,\r\n private configuration: THistoryConfiguration = { maxLength: 100 },\r\n ) {\r\n super();\r\n\r\n this.onCloseWindow = onCloseWindow;\r\n }\r\n\r\n private closeWindow = () => {\r\n if (this._isOpen) {\r\n this.onCloseWindow(this.push.bind(this));\r\n this._isOpen = false;\r\n }\r\n };\r\n\r\n private getEvent = () => {\r\n const stepCount = this.content.length - 1;\r\n const event = {\r\n content: this.content[this.currentStep],\r\n currentStep: this.currentStep,\r\n stepCount,\r\n hasNext: this.currentStep < stepCount,\r\n hasPrevious: this.currentStep >= 0,\r\n };\r\n\r\n return event;\r\n };\r\n\r\n private onCloseWindow: (push: (newState: T) => void) => unknown;\r\n\r\n private push = (el: T) => {\r\n this.content = [...this.content.slice(0, this.currentStep + 1), el];\r\n this.content = this.content.slice(\r\n Math.max(0, this.content.length - this.configuration.maxLength),\r\n );\r\n this.currentStep = this.content.length - 1;\r\n this.shoutStepChange(true);\r\n };\r\n\r\n private shoutStepChange = (fromPush?: boolean) => {\r\n try {\r\n this.emit('stepChange', { ...this.getEvent(), fromPush });\r\n } catch (e) {\r\n console.error(e);\r\n }\r\n };\r\n\r\n hooks = {\r\n useCountChange: (onChange: (ev: THistoryStepChange<T>) => unknown) => {\r\n useMount(() => {\r\n onChange(this.getEvent());\r\n\r\n this.on('stepChange', () => {\r\n onChange(this.getEvent());\r\n });\r\n });\r\n },\r\n };\r\n\r\n back = () => {\r\n clearTimeout(this.autocloseTimeout);\r\n if (this.currentStep >= 0) {\r\n this.currentStep -= 1;\r\n this.shoutStepChange();\r\n }\r\n };\r\n\r\n disable = () => {\r\n this.enabled = false;\r\n };\r\n\r\n emit<K extends 'stepChange'>(\r\n eventName: K,\r\n params?: THistoryStepChange<T>,\r\n ): void {\r\n this.emitting++;\r\n\r\n super.emit(eventName, params as THistoryStepChange<T>);\r\n\r\n this.emitting--;\r\n }\r\n\r\n enable = () => {\r\n this.enabled = true;\r\n };\r\n\r\n forward = () => {\r\n clearTimeout(this.autocloseTimeout);\r\n if (this.currentStep < this.content.length - 1) {\r\n this.currentStep += 1;\r\n this.shoutStepChange();\r\n }\r\n };\r\n\r\n get isOpen() {\r\n return this._isOpen;\r\n }\r\n\r\n openWindow = () => {\r\n if (!this.enabled || this.emitting !== 0) return;\r\n\r\n this._isOpen = true;\r\n\r\n clearTimeout(this.autocloseTimeout);\r\n this.autocloseTimeout = setTimeout(() => {\r\n this.closeWindow();\r\n }, this.timeoutMs) as unknown as number;\r\n };\r\n\r\n reset = () => {\r\n clearTimeout(this.autocloseTimeout);\r\n this.content = [];\r\n this.currentStep = -1;\r\n this.openWindow();\r\n };\r\n\r\n updateConfig = (newConfiguration: Partial<THistoryConfiguration>) => {\r\n this.configuration = { ...this.configuration, ...newConfiguration };\r\n };\r\n\r\n useStep = () => {\r\n const [hasPrevious, setHasPrevious] = useState<\r\n Pick<THistoryStepChange<T>, 'hasNext' | 'hasPrevious' | 'currentStep'>\r\n >({ hasNext: false, hasPrevious: false, currentStep: 0 });\r\n\r\n useMount(() => {\r\n return this.on('stepChange', (ev) => {\r\n setHasPrevious({\r\n currentStep: ev.currentStep,\r\n hasNext: ev.hasNext,\r\n hasPrevious: ev.hasPrevious,\r\n });\r\n });\r\n });\r\n\r\n return hasPrevious;\r\n };\r\n}\r\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"useCombinedRefs.js","sources":["../../src/hooks/useCombinedRefs.ts"],"sourcesContent":["import * as React from 'react';\n\n/**\n * Permite reasignar múltiples referencias desde un mismo componente.\n *\n * @example\n *\n * const ref1 = useRef(null)\n * const ref2 = useRef(null)\n *\n * const assignRefs = useMultipleRefs(ref1, ref2);\n *\n * return <Box ref={assignRefs} ...\n */\nexport function useCombinedRefs<RefType = HTMLInputElement>(\n ...refs: (React.ForwardedRef<unknown> | undefined)[]\n) {\n const [targetRef, setTargetRef] = React.useState<RefType>();\n\n React.useEffect(() => {\n refs.forEach((ref) => {\n if (!ref) return;\n\n if (typeof ref === 'function') {\n ref(targetRef);\n } else {\n // eslint-disable-next-line no-param-reassign\n ref.current = targetRef;\n }\n });\n }, [refs, targetRef]);\n\n return setTargetRef;\n}\n"],"names":[],"mappings":";;AAcO,SAAS,mBACX,IACH,EAAA;AACA,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,MAAM,QAAkB,EAAA,CAAA;AAE1D,EAAA,KAAA,CAAM,UAAU,MAAM;AACpB,IAAK,IAAA,CAAA,OAAA,CAAQ,CAAC,GAAQ,KAAA;AACpB,MAAA,IAAI,CAAC,GAAA;AAAK,QAAA,OAAA;AAEV,MAAI,IAAA,OAAO,QAAQ,UAAY,EAAA;AAC7B,QAAA,GAAA,CAAI,SAAS,CAAA,CAAA;AAAA,OACR,MAAA;AAEL,QAAA,GAAA,CAAI,OAAU,GAAA,SAAA,CAAA;AAAA,OAChB;AAAA,KACD,CAAA,CAAA;AAAA,GACA,EAAA,CAAC,IAAM,EAAA,SAAS,CAAC,CAAA,CAAA;AAEpB,EAAO,OAAA,YAAA,CAAA;AACT;;;;"}
1
+ {"version":3,"file":"useCombinedRefs.js","sources":["../../src/hooks/useCombinedRefs.ts"],"sourcesContent":["import * as React from 'react';\r\n\r\n/**\r\n * Permite reasignar múltiples referencias desde un mismo componente.\r\n *\r\n * @example\r\n *\r\n * const ref1 = useRef(null)\r\n * const ref2 = useRef(null)\r\n *\r\n * const assignRefs = useMultipleRefs(ref1, ref2);\r\n *\r\n * return <Box ref={assignRefs} ...\r\n */\r\nexport function useCombinedRefs<RefType = HTMLInputElement>(\r\n ...refs: (React.ForwardedRef<unknown> | undefined)[]\r\n) {\r\n const [targetRef, setTargetRef] = React.useState<RefType>();\r\n\r\n React.useEffect(() => {\r\n refs.forEach((ref) => {\r\n if (!ref) return;\r\n\r\n if (typeof ref === 'function') {\r\n ref(targetRef);\r\n } else {\r\n // eslint-disable-next-line no-param-reassign\r\n ref.current = targetRef;\r\n }\r\n });\r\n }, [refs, targetRef]);\r\n\r\n return setTargetRef;\r\n}\r\n"],"names":[],"mappings":";;AAcO,SAAS,mBACX,IACH,EAAA;AACA,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,MAAM,QAAkB,EAAA,CAAA;AAE1D,EAAA,KAAA,CAAM,UAAU,MAAM;AACpB,IAAK,IAAA,CAAA,OAAA,CAAQ,CAAC,GAAQ,KAAA;AACpB,MAAA,IAAI,CAAC,GAAA;AAAK,QAAA,OAAA;AAEV,MAAI,IAAA,OAAO,QAAQ,UAAY,EAAA;AAC7B,QAAA,GAAA,CAAI,SAAS,CAAA,CAAA;AAAA,OACR,MAAA;AAEL,QAAA,GAAA,CAAI,OAAU,GAAA,SAAA,CAAA;AAAA,OAChB;AAAA,KACD,CAAA,CAAA;AAAA,GACA,EAAA,CAAC,IAAM,EAAA,SAAS,CAAC,CAAA,CAAA;AAEpB,EAAO,OAAA,YAAA,CAAA;AACT;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"useDebouncedCallback.js","sources":["../../src/hooks/useDebouncedCallback.ts"],"sourcesContent":["import { useCallback, useRef } from 'react';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport const useDebouncedCallback = <Params extends any[]>(\n callback: (...params: Params) => unknown,\n { runWhenTriggered, timeout } = { runWhenTriggered: false, timeout: 200 },\n) => {\n const timeoutRef = useRef<number>(-1);\n\n return useCallback(\n (...params: Params) => {\n if (runWhenTriggered) callback(...params);\n\n clearTimeout(timeoutRef.current);\n timeoutRef.current = setTimeout(\n () => callback(...params),\n timeout,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ) as any;\n },\n [callback, runWhenTriggered, timeout],\n );\n};\n"],"names":[],"mappings":";;AAGO,MAAM,oBAAuB,GAAA,CAClC,QACA,EAAA,EAAE,gBAAkB,EAAA,OAAA,EAAY,GAAA,EAAE,gBAAkB,EAAA,KAAA,EAAO,OAAS,EAAA,GAAA,EACjE,KAAA;AACH,EAAM,MAAA,UAAA,GAAa,OAAe,CAAE,CAAA,CAAA,CAAA;AAEpC,EAAO,OAAA,WAAA;AAAA,IACL,IAAI,MAAmB,KAAA;AACrB,MAAI,IAAA,gBAAA;AAAkB,QAAA,QAAA,CAAS,GAAG,MAAM,CAAA,CAAA;AAExC,MAAA,YAAA,CAAa,WAAW,OAAO,CAAA,CAAA;AAC/B,MAAA,UAAA,CAAW,OAAU,GAAA,UAAA;AAAA,QACnB,MAAM,QAAS,CAAA,GAAG,MAAM,CAAA;AAAA,QACxB,OAAA;AAAA;AAAA,OAEF,CAAA;AAAA,KACF;AAAA,IACA,CAAC,QAAU,EAAA,gBAAA,EAAkB,OAAO,CAAA;AAAA,GACtC,CAAA;AACF;;;;"}
1
+ {"version":3,"file":"useDebouncedCallback.js","sources":["../../src/hooks/useDebouncedCallback.ts"],"sourcesContent":["import { useCallback, useRef } from 'react';\r\n\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\nexport const useDebouncedCallback = <Params extends any[]>(\r\n callback: (...params: Params) => unknown,\r\n { runWhenTriggered, timeout } = { runWhenTriggered: false, timeout: 200 },\r\n) => {\r\n const timeoutRef = useRef<number>(-1);\r\n\r\n return useCallback(\r\n (...params: Params) => {\r\n if (runWhenTriggered) callback(...params);\r\n\r\n clearTimeout(timeoutRef.current);\r\n timeoutRef.current = setTimeout(\r\n () => callback(...params),\r\n timeout,\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n ) as any;\r\n },\r\n [callback, runWhenTriggered, timeout],\r\n );\r\n};\r\n"],"names":[],"mappings":";;AAGO,MAAM,oBAAuB,GAAA,CAClC,QACA,EAAA,EAAE,gBAAkB,EAAA,OAAA,EAAY,GAAA,EAAE,gBAAkB,EAAA,KAAA,EAAO,OAAS,EAAA,GAAA,EACjE,KAAA;AACH,EAAM,MAAA,UAAA,GAAa,OAAe,CAAE,CAAA,CAAA,CAAA;AAEpC,EAAO,OAAA,WAAA;AAAA,IACL,IAAI,MAAmB,KAAA;AACrB,MAAI,IAAA,gBAAA;AAAkB,QAAA,QAAA,CAAS,GAAG,MAAM,CAAA,CAAA;AAExC,MAAA,YAAA,CAAa,WAAW,OAAO,CAAA,CAAA;AAC/B,MAAA,UAAA,CAAW,OAAU,GAAA,UAAA;AAAA,QACnB,MAAM,QAAS,CAAA,GAAG,MAAM,CAAA;AAAA,QACxB,OAAA;AAAA;AAAA,OAEF,CAAA;AAAA,KACF;AAAA,IACA,CAAC,QAAU,EAAA,gBAAA,EAAkB,OAAO,CAAA;AAAA,GACtC,CAAA;AACF;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"useLatest.js","sources":["../../src/hooks/useLatest.ts"],"sourcesContent":["import { useRef } from 'react';\n\n/**\n * Devuelve una referencia que mantiene siempre el último valor del elemento\n * pasado, es especialmente útil para acceder a valores del componente desde\n * dentro de efectos.\n *\n * *Investigar qué es 'react stale state'*\n */\nexport function useLatest<T>(value: T) {\n const ref = useRef(value);\n ref.current = value;\n return ref;\n}\n"],"names":[],"mappings":";;AASO,SAAS,UAAa,KAAU,EAAA;AACrC,EAAM,MAAA,GAAA,GAAM,OAAO,KAAK,CAAA,CAAA;AACxB,EAAA,GAAA,CAAI,OAAU,GAAA,KAAA,CAAA;AACd,EAAO,OAAA,GAAA,CAAA;AACT;;;;"}
1
+ {"version":3,"file":"useLatest.js","sources":["../../src/hooks/useLatest.ts"],"sourcesContent":["import { useRef } from 'react';\r\n\r\n/**\r\n * Devuelve una referencia que mantiene siempre el último valor del elemento\r\n * pasado, es especialmente útil para acceder a valores del componente desde\r\n * dentro de efectos.\r\n *\r\n * *Investigar qué es 'react stale state'*\r\n */\r\nexport function useLatest<T>(value: T) {\r\n const ref = useRef(value);\r\n ref.current = value;\r\n return ref;\r\n}\r\n"],"names":[],"mappings":";;AASO,SAAS,UAAa,KAAU,EAAA;AACrC,EAAM,MAAA,GAAA,GAAM,OAAO,KAAK,CAAA,CAAA;AACxB,EAAA,GAAA,CAAI,OAAU,GAAA,KAAA,CAAA;AACd,EAAO,OAAA,GAAA,CAAA;AACT;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"useMount.js","sources":["../../src/hooks/useMount.ts"],"sourcesContent":["import { EffectCallback, useEffect, useRef } from 'react';\n\nexport function useMount(effect: EffectCallback) {\n const hasRun = useRef(false);\n\n useEffect(() => {\n if (!hasRun.current) {\n hasRun.current = true;\n return effect();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n}\n"],"names":[],"mappings":";;AAEO,SAAS,SAAS,MAAwB,EAAA;AAC/C,EAAM,MAAA,MAAA,GAAS,OAAO,KAAK,CAAA,CAAA;AAE3B,EAAA,SAAA,CAAU,MAAM;AACd,IAAI,IAAA,CAAC,OAAO,OAAS,EAAA;AACnB,MAAA,MAAA,CAAO,OAAU,GAAA,IAAA,CAAA;AACjB,MAAA,OAAO,MAAO,EAAA,CAAA;AAAA,KAChB;AAAA,GAEF,EAAG,EAAE,CAAA,CAAA;AACP;;;;"}
1
+ {"version":3,"file":"useMount.js","sources":["../../src/hooks/useMount.ts"],"sourcesContent":["import { EffectCallback, useEffect, useRef } from 'react';\r\n\r\nexport function useMount(effect: EffectCallback) {\r\n const hasRun = useRef(false);\r\n\r\n useEffect(() => {\r\n if (!hasRun.current) {\r\n hasRun.current = true;\r\n return effect();\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n}\r\n"],"names":[],"mappings":";;AAEO,SAAS,SAAS,MAAwB,EAAA;AAC/C,EAAM,MAAA,MAAA,GAAS,OAAO,KAAK,CAAA,CAAA;AAE3B,EAAA,SAAA,CAAU,MAAM;AACd,IAAI,IAAA,CAAC,OAAO,OAAS,EAAA;AACnB,MAAA,MAAA,CAAO,OAAU,GAAA,IAAA,CAAA;AACjB,MAAA,OAAO,MAAO,EAAA,CAAA;AAAA,KAChB;AAAA,GAEF,EAAG,EAAE,CAAA,CAAA;AACP;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"usePrevious.js","sources":["../../src/hooks/usePrevious.ts"],"sourcesContent":["import { useRef } from 'react';\n\nexport function usePrevious<T>(value: T) {\n const previousValue = useRef<T | undefined>(undefined);\n const currentValue = useRef<T>(undefined as unknown as T);\n\n previousValue.current = currentValue.current;\n currentValue.current = value;\n\n return previousValue;\n}\n"],"names":[],"mappings":";;AAEO,SAAS,YAAe,KAAU,EAAA;AACvC,EAAM,MAAA,aAAA,GAAgB,OAAsB,KAAS,CAAA,CAAA,CAAA;AACrD,EAAM,MAAA,YAAA,GAAe,OAAU,KAAyB,CAAA,CAAA,CAAA;AAExD,EAAA,aAAA,CAAc,UAAU,YAAa,CAAA,OAAA,CAAA;AACrC,EAAA,YAAA,CAAa,OAAU,GAAA,KAAA,CAAA;AAEvB,EAAO,OAAA,aAAA,CAAA;AACT;;;;"}
1
+ {"version":3,"file":"usePrevious.js","sources":["../../src/hooks/usePrevious.ts"],"sourcesContent":["import { useRef } from 'react';\r\n\r\nexport function usePrevious<T>(value: T) {\r\n const previousValue = useRef<T | undefined>(undefined);\r\n const currentValue = useRef<T>(undefined as unknown as T);\r\n\r\n previousValue.current = currentValue.current;\r\n currentValue.current = value;\r\n\r\n return previousValue;\r\n}\r\n"],"names":[],"mappings":";;AAEO,SAAS,YAAe,KAAU,EAAA;AACvC,EAAM,MAAA,aAAA,GAAgB,OAAsB,KAAS,CAAA,CAAA,CAAA;AACrD,EAAM,MAAA,YAAA,GAAe,OAAU,KAAyB,CAAA,CAAA,CAAA;AAExD,EAAA,aAAA,CAAc,UAAU,YAAa,CAAA,OAAA,CAAA;AACrC,EAAA,YAAA,CAAa,OAAU,GAAA,KAAA,CAAA;AAEvB,EAAO,OAAA,aAAA,CAAA;AACT;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"useShallowMemo.js","sources":["../../src/hooks/useShallowMemo.ts"],"sourcesContent":["import { useRef } from 'react';\nimport { usePrevious } from './usePrevious';\n\nexport function shallowEqual(a: unknown, b: unknown) {\n if (typeof a !== typeof b) return false;\n\n if (typeof a === 'object' && a && typeof b === 'object' && b) {\n const aKeys = Object.keys(a);\n const bKeys = Object.keys(b);\n\n if (aKeys.length !== bKeys.length) return false;\n\n for (let i = 0; i < aKeys.length; i++) {\n if (a[aKeys[i] as keyof typeof a] !== b[bKeys[i] as keyof typeof b])\n return false;\n }\n } else {\n if (a !== b) return false;\n }\n\n return true;\n}\n\n/**\n * Compara con shallowEqual todos los ítems de dos arrays\n */\nexport function shallowCompareArrays(a: unknown[], b: unknown[]): boolean {\n if (a.length !== b.length) return false;\n\n for (let i = 0; i < a.length; i++) {\n const differ = shallowEqual(a, b);\n\n if (!differ) return false;\n }\n\n return true;\n}\n\nexport function useShallowMemo<T>(creator: () => T, deps: unknown[]): T {\n const value = useRef(creator());\n\n const previousDeps = usePrevious(deps);\n if (!shallowEqual(previousDeps.current ?? [], deps)) {\n value.current = creator();\n }\n\n return value.current;\n}\n"],"names":[],"mappings":";;;AAGgB,SAAA,YAAA,CAAa,GAAY,CAAY,EAAA;AACnD,EAAI,IAAA,OAAO,MAAM,OAAO,CAAA;AAAG,IAAO,OAAA,KAAA,CAAA;AAElC,EAAA,IAAI,OAAO,CAAM,KAAA,QAAA,IAAY,KAAK,OAAO,CAAA,KAAM,YAAY,CAAG,EAAA;AAC5D,IAAM,MAAA,KAAA,GAAQ,MAAO,CAAA,IAAA,CAAK,CAAC,CAAA,CAAA;AAC3B,IAAM,MAAA,KAAA,GAAQ,MAAO,CAAA,IAAA,CAAK,CAAC,CAAA,CAAA;AAE3B,IAAI,IAAA,KAAA,CAAM,WAAW,KAAM,CAAA,MAAA;AAAQ,MAAO,OAAA,KAAA,CAAA;AAE1C,IAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,KAAA,CAAM,QAAQ,CAAK,EAAA,EAAA;AACrC,MAAI,IAAA,CAAA,CAAE,MAAM,CAAC,CAAmB,MAAM,CAAE,CAAA,KAAA,CAAM,CAAC,CAAmB,CAAA;AAChE,QAAO,OAAA,KAAA,CAAA;AAAA,KACX;AAAA,GACK,MAAA;AACL,IAAA,IAAI,CAAM,KAAA,CAAA;AAAG,MAAO,OAAA,KAAA,CAAA;AAAA,GACtB;AAEA,EAAO,OAAA,IAAA,CAAA;AACT,CAAA;AAKgB,SAAA,oBAAA,CAAqB,GAAc,CAAuB,EAAA;AACxE,EAAI,IAAA,CAAA,CAAE,WAAW,CAAE,CAAA,MAAA;AAAQ,IAAO,OAAA,KAAA,CAAA;AAElC,EAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,CAAA,CAAE,QAAQ,CAAK,EAAA,EAAA;AACjC,IAAM,MAAA,MAAA,GAAS,YAAa,CAAA,CAAA,EAAG,CAAC,CAAA,CAAA;AAEhC,IAAA,IAAI,CAAC,MAAA;AAAQ,MAAO,OAAA,KAAA,CAAA;AAAA,GACtB;AAEA,EAAO,OAAA,IAAA,CAAA;AACT,CAAA;AAEgB,SAAA,cAAA,CAAkB,SAAkB,IAAoB,EAAA;AACtE,EAAM,MAAA,KAAA,GAAQ,MAAO,CAAA,OAAA,EAAS,CAAA,CAAA;AAE9B,EAAM,MAAA,YAAA,GAAe,YAAY,IAAI,CAAA,CAAA;AACrC,EAAA,IAAI,CAAC,YAAa,CAAA,YAAA,CAAa,WAAW,EAAC,EAAG,IAAI,CAAG,EAAA;AACnD,IAAA,KAAA,CAAM,UAAU,OAAQ,EAAA,CAAA;AAAA,GAC1B;AAEA,EAAA,OAAO,KAAM,CAAA,OAAA,CAAA;AACf;;;;"}
1
+ {"version":3,"file":"useShallowMemo.js","sources":["../../src/hooks/useShallowMemo.ts"],"sourcesContent":["import { useRef } from 'react';\r\nimport { usePrevious } from './usePrevious';\r\n\r\nexport function shallowEqual(a: unknown, b: unknown) {\r\n if (typeof a !== typeof b) return false;\r\n\r\n if (typeof a === 'object' && a && typeof b === 'object' && b) {\r\n const aKeys = Object.keys(a);\r\n const bKeys = Object.keys(b);\r\n\r\n if (aKeys.length !== bKeys.length) return false;\r\n\r\n for (let i = 0; i < aKeys.length; i++) {\r\n if (a[aKeys[i] as keyof typeof a] !== b[bKeys[i] as keyof typeof b])\r\n return false;\r\n }\r\n } else {\r\n if (a !== b) return false;\r\n }\r\n\r\n return true;\r\n}\r\n\r\n/**\r\n * Compara con shallowEqual todos los ítems de dos arrays\r\n */\r\nexport function shallowCompareArrays(a: unknown[], b: unknown[]): boolean {\r\n if (a.length !== b.length) return false;\r\n\r\n for (let i = 0; i < a.length; i++) {\r\n const differ = shallowEqual(a, b);\r\n\r\n if (!differ) return false;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport function useShallowMemo<T>(creator: () => T, deps: unknown[]): T {\r\n const value = useRef(creator());\r\n\r\n const previousDeps = usePrevious(deps);\r\n if (!shallowEqual(previousDeps.current ?? [], deps)) {\r\n value.current = creator();\r\n }\r\n\r\n return value.current;\r\n}\r\n"],"names":[],"mappings":";;;AAGgB,SAAA,YAAA,CAAa,GAAY,CAAY,EAAA;AACnD,EAAI,IAAA,OAAO,MAAM,OAAO,CAAA;AAAG,IAAO,OAAA,KAAA,CAAA;AAElC,EAAA,IAAI,OAAO,CAAM,KAAA,QAAA,IAAY,KAAK,OAAO,CAAA,KAAM,YAAY,CAAG,EAAA;AAC5D,IAAM,MAAA,KAAA,GAAQ,MAAO,CAAA,IAAA,CAAK,CAAC,CAAA,CAAA;AAC3B,IAAM,MAAA,KAAA,GAAQ,MAAO,CAAA,IAAA,CAAK,CAAC,CAAA,CAAA;AAE3B,IAAI,IAAA,KAAA,CAAM,WAAW,KAAM,CAAA,MAAA;AAAQ,MAAO,OAAA,KAAA,CAAA;AAE1C,IAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,KAAA,CAAM,QAAQ,CAAK,EAAA,EAAA;AACrC,MAAI,IAAA,CAAA,CAAE,MAAM,CAAC,CAAmB,MAAM,CAAE,CAAA,KAAA,CAAM,CAAC,CAAmB,CAAA;AAChE,QAAO,OAAA,KAAA,CAAA;AAAA,KACX;AAAA,GACK,MAAA;AACL,IAAA,IAAI,CAAM,KAAA,CAAA;AAAG,MAAO,OAAA,KAAA,CAAA;AAAA,GACtB;AAEA,EAAO,OAAA,IAAA,CAAA;AACT,CAAA;AAKgB,SAAA,oBAAA,CAAqB,GAAc,CAAuB,EAAA;AACxE,EAAI,IAAA,CAAA,CAAE,WAAW,CAAE,CAAA,MAAA;AAAQ,IAAO,OAAA,KAAA,CAAA;AAElC,EAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,CAAA,CAAE,QAAQ,CAAK,EAAA,EAAA;AACjC,IAAM,MAAA,MAAA,GAAS,YAAa,CAAA,CAAA,EAAG,CAAC,CAAA,CAAA;AAEhC,IAAA,IAAI,CAAC,MAAA;AAAQ,MAAO,OAAA,KAAA,CAAA;AAAA,GACtB;AAEA,EAAO,OAAA,IAAA,CAAA;AACT,CAAA;AAEgB,SAAA,cAAA,CAAkB,SAAkB,IAAoB,EAAA;AACtE,EAAM,MAAA,KAAA,GAAQ,MAAO,CAAA,OAAA,EAAS,CAAA,CAAA;AAE9B,EAAM,MAAA,YAAA,GAAe,YAAY,IAAI,CAAA,CAAA;AACrC,EAAA,IAAI,CAAC,YAAa,CAAA,YAAA,CAAa,WAAW,EAAC,EAAG,IAAI,CAAG,EAAA;AACnD,IAAA,KAAA,CAAM,UAAU,OAAQ,EAAA,CAAA;AAAA,GAC1B;AAEA,EAAA,OAAO,KAAM,CAAA,OAAA,CAAA;AACf;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"useStateRef.js","sources":["../../src/hooks/useStateRef.ts"],"sourcesContent":["import {\n Dispatch,\n MutableRefObject,\n SetStateAction,\n useRef,\n useState,\n} from 'react';\n\nexport function useStateRef<T>(\n initialState?: T,\n): [\n typeof initialState extends undefined ? T | undefined : T,\n Dispatch<\n SetStateAction<typeof initialState extends undefined ? T | undefined : T>\n >,\n MutableRefObject<typeof initialState extends undefined ? T | undefined : T>,\n] {\n const [state, setState] = useState<\n typeof initialState extends undefined ? T | undefined : T\n >(initialState as typeof initialState extends undefined ? T | undefined : T);\n\n const stateRef = useRef(state);\n stateRef.current = state;\n\n return [state, setState, stateRef];\n}\n"],"names":[],"mappings":";;AAQO,SAAS,YACd,YAOA,EAAA;AACA,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAExB,YAAyE,CAAA,CAAA;AAE3E,EAAM,MAAA,QAAA,GAAW,OAAO,KAAK,CAAA,CAAA;AAC7B,EAAA,QAAA,CAAS,OAAU,GAAA,KAAA,CAAA;AAEnB,EAAO,OAAA,CAAC,KAAO,EAAA,QAAA,EAAU,QAAQ,CAAA,CAAA;AACnC;;;;"}
1
+ {"version":3,"file":"useStateRef.js","sources":["../../src/hooks/useStateRef.ts"],"sourcesContent":["import {\r\n Dispatch,\r\n MutableRefObject,\r\n SetStateAction,\r\n useRef,\r\n useState,\r\n} from 'react';\r\n\r\nexport function useStateRef<T>(\r\n initialState?: T,\r\n): [\r\n typeof initialState extends undefined ? T | undefined : T,\r\n Dispatch<\r\n SetStateAction<typeof initialState extends undefined ? T | undefined : T>\r\n >,\r\n MutableRefObject<typeof initialState extends undefined ? T | undefined : T>,\r\n] {\r\n const [state, setState] = useState<\r\n typeof initialState extends undefined ? T | undefined : T\r\n >(initialState as typeof initialState extends undefined ? T | undefined : T);\r\n\r\n const stateRef = useRef(state);\r\n stateRef.current = state;\r\n\r\n return [state, setState, stateRef];\r\n}\r\n"],"names":[],"mappings":";;AAQO,SAAS,YACd,YAOA,EAAA;AACA,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAExB,YAAyE,CAAA,CAAA;AAE3E,EAAM,MAAA,QAAA,GAAW,OAAO,KAAK,CAAA,CAAA;AAC7B,EAAA,QAAA,CAAS,OAAU,GAAA,KAAA,CAAA;AAEnB,EAAO,OAAA,CAAC,KAAO,EAAA,QAAA,EAAU,QAAQ,CAAA,CAAA;AACnC;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"useSubscription.js","sources":["../../src/hooks/useSubscription.ts"],"sourcesContent":["import { Dispatch, SetStateAction, useState } from 'react';\nimport { useMount } from './useMount';\n\n/**\n * Este hook es una simplificación de la dinámica de suscripción con cambio de\n * estado ante eventos.\n * \n * @example\n * \n * useIsAfter = (id: string) => {\n return useSubscription({\n getInitialState: () => {\n return { isAfter: this.#isAfter(id), isBefore: this.#isBefore(id) };\n },\n makeSubscription: (setState) => {\n return this.#emitter.on('hover', () => {\n setState({\n isAfter: this.#isAfter(id),\n isBefore: this.#isBefore(id),\n });\n });\n },\n });\n };\n */\nexport function useSubscription<T>({\n getInitialState,\n makeSubscription,\n}: {\n getInitialState?: (() => T) | (() => () => T);\n makeSubscription: (setState: Dispatch<SetStateAction<T>>) => () => void;\n}) {\n const [state, setState] = useState<T>(getInitialState?.() as T);\n\n useMount(() => {\n let newState = getInitialState?.();\n if (typeof newState === 'function') newState = (newState as () => T)();\n\n if (newState !== undefined) setState(newState);\n\n return makeSubscription(setState);\n });\n\n return state;\n}\n"],"names":[],"mappings":";;;AAyBO,SAAS,eAAmB,CAAA;AAAA,EACjC,eAAA;AAAA,EACA,gBAAA;AACF,CAGG,EAAA;AACD,EAAA,MAAM,CAAC,KAAO,EAAA,QAAQ,CAAI,GAAA,QAAA,CAAY,mBAAwB,CAAA,CAAA;AAE9D,EAAA,QAAA,CAAS,MAAM;AACb,IAAA,IAAI,WAAW,eAAkB,IAAA,CAAA;AACjC,IAAA,IAAI,OAAO,QAAa,KAAA,UAAA;AAAY,MAAA,QAAA,GAAY,QAAqB,EAAA,CAAA;AAErE,IAAA,IAAI,QAAa,KAAA,KAAA,CAAA;AAAW,MAAA,QAAA,CAAS,QAAQ,CAAA,CAAA;AAE7C,IAAA,OAAO,iBAAiB,QAAQ,CAAA,CAAA;AAAA,GACjC,CAAA,CAAA;AAED,EAAO,OAAA,KAAA,CAAA;AACT;;;;"}
1
+ {"version":3,"file":"useSubscription.js","sources":["../../src/hooks/useSubscription.ts"],"sourcesContent":["import { Dispatch, SetStateAction, useState } from 'react';\r\nimport { useMount } from './useMount';\r\n\r\n/**\r\n * Este hook es una simplificación de la dinámica de suscripción con cambio de\r\n * estado ante eventos.\r\n * \r\n * @example\r\n * \r\n * useIsAfter = (id: string) => {\r\n return useSubscription({\r\n getInitialState: () => {\r\n return { isAfter: this.#isAfter(id), isBefore: this.#isBefore(id) };\r\n },\r\n makeSubscription: (setState) => {\r\n return this.#emitter.on('hover', () => {\r\n setState({\r\n isAfter: this.#isAfter(id),\r\n isBefore: this.#isBefore(id),\r\n });\r\n });\r\n },\r\n });\r\n };\r\n */\r\nexport function useSubscription<T>({\r\n getInitialState,\r\n makeSubscription,\r\n}: {\r\n getInitialState?: (() => T) | (() => () => T);\r\n makeSubscription: (setState: Dispatch<SetStateAction<T>>) => () => void;\r\n}) {\r\n const [state, setState] = useState<T>(getInitialState?.() as T);\r\n\r\n useMount(() => {\r\n let newState = getInitialState?.();\r\n if (typeof newState === 'function') newState = (newState as () => T)();\r\n\r\n if (newState !== undefined) setState(newState);\r\n\r\n return makeSubscription(setState);\r\n });\r\n\r\n return state;\r\n}\r\n"],"names":[],"mappings":";;;AAyBO,SAAS,eAAmB,CAAA;AAAA,EACjC,eAAA;AAAA,EACA,gBAAA;AACF,CAGG,EAAA;AACD,EAAA,MAAM,CAAC,KAAO,EAAA,QAAQ,CAAI,GAAA,QAAA,CAAY,mBAAwB,CAAA,CAAA;AAE9D,EAAA,QAAA,CAAS,MAAM;AACb,IAAA,IAAI,WAAW,eAAkB,IAAA,CAAA;AACjC,IAAA,IAAI,OAAO,QAAa,KAAA,UAAA;AAAY,MAAA,QAAA,GAAY,QAAqB,EAAA,CAAA;AAErE,IAAA,IAAI,QAAa,KAAA,KAAA,CAAA;AAAW,MAAA,QAAA,CAAS,QAAQ,CAAA,CAAA;AAE7C,IAAA,OAAO,iBAAiB,QAAQ,CAAA,CAAA;AAAA,GACjC,CAAA,CAAA;AAED,EAAO,OAAA,KAAA,CAAA;AACT;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"useUnmount.js","sources":["../../src/hooks/useUnmount.ts"],"sourcesContent":["import { useEffect } from 'react';\n\nexport function useUnmount(unmountCallback: () => void) {\n useEffect(() => {\n return unmountCallback;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n}\n"],"names":[],"mappings":";;AAEO,SAAS,WAAW,eAA6B,EAAA;AACtD,EAAA,SAAA,CAAU,MAAM;AACd,IAAO,OAAA,eAAA,CAAA;AAAA,GAET,EAAG,EAAE,CAAA,CAAA;AACP;;;;"}
1
+ {"version":3,"file":"useUnmount.js","sources":["../../src/hooks/useUnmount.ts"],"sourcesContent":["import { useEffect } from 'react';\r\n\r\nexport function useUnmount(unmountCallback: () => void) {\r\n useEffect(() => {\r\n return unmountCallback;\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n}\r\n"],"names":[],"mappings":";;AAEO,SAAS,WAAW,eAA6B,EAAA;AACtD,EAAA,SAAA,CAAU,MAAM;AACd,IAAO,OAAA,eAAA,CAAA;AAAA,GAET,EAAG,EAAE,CAAA,CAAA;AACP;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"useUpdateEffect.js","sources":["../../src/hooks/useUpdateEffect.ts"],"sourcesContent":["/* eslint-disable react-hooks/exhaustive-deps */\nimport { DependencyList, EffectCallback, useEffect, useRef } from 'react';\n\n/**\n * Este hook se comporta igual que useEffect, con la diferencia de que en el\n * primer renderizado no se va a ejecutar.\n */\nexport function useUpdateEffect(effect: EffectCallback, deps?: DependencyList) {\n const hasRunnedForFirstTime = useRef(false);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n useEffect(() => {\n if (hasRunnedForFirstTime.current) {\n return effect();\n }\n hasRunnedForFirstTime.current = true;\n return () => {};\n }, deps);\n}\n"],"names":[],"mappings":";;AAOgB,SAAA,eAAA,CAAgB,QAAwB,IAAuB,EAAA;AAC7E,EAAM,MAAA,qBAAA,GAAwB,OAAO,KAAK,CAAA,CAAA;AAE1C,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,sBAAsB,OAAS,EAAA;AACjC,MAAA,OAAO,MAAO,EAAA,CAAA;AAAA,KAChB;AACA,IAAA,qBAAA,CAAsB,OAAU,GAAA,IAAA,CAAA;AAChC,IAAA,OAAO,MAAM;AAAA,KAAC,CAAA;AAAA,KACb,IAAI,CAAA,CAAA;AACT;;;;"}
1
+ {"version":3,"file":"useUpdateEffect.js","sources":["../../src/hooks/useUpdateEffect.ts"],"sourcesContent":["/* eslint-disable react-hooks/exhaustive-deps */\r\nimport { DependencyList, EffectCallback, useEffect, useRef } from 'react';\r\n\r\n/**\r\n * Este hook se comporta igual que useEffect, con la diferencia de que en el\r\n * primer renderizado no se va a ejecutar.\r\n */\r\nexport function useUpdateEffect(effect: EffectCallback, deps?: DependencyList) {\r\n const hasRunnedForFirstTime = useRef(false);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n useEffect(() => {\r\n if (hasRunnedForFirstTime.current) {\r\n return effect();\r\n }\r\n hasRunnedForFirstTime.current = true;\r\n return () => {};\r\n }, deps);\r\n}\r\n"],"names":[],"mappings":";;AAOgB,SAAA,eAAA,CAAgB,QAAwB,IAAuB,EAAA;AAC7E,EAAM,MAAA,qBAAA,GAAwB,OAAO,KAAK,CAAA,CAAA;AAE1C,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,sBAAsB,OAAS,EAAA;AACjC,MAAA,OAAO,MAAO,EAAA,CAAA;AAAA,KAChB;AACA,IAAA,qBAAA,CAAsB,OAAU,GAAA,IAAA,CAAA;AAChC,IAAA,OAAO,MAAM;AAAA,KAAC,CAAA;AAAA,KACb,IAAI,CAAA,CAAA;AACT;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"makeImperativeComponent.js","sources":["../../src/imperative/makeImperativeComponent.tsx"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/no-unsafe-argument */\nimport { FC, useMemo, useState } from 'react';\nimport {\n TMap,\n TMethods,\n TMethodsMap,\n TFireEvent,\n TStateManager,\n TMethod,\n TEventsHandlers,\n ImperativeComponentContext,\n} from './types';\nimport { TId } from '../types';\n\n/**\n * Permite la creación de componentes multi-instancia que ofrecen métodos para\n * trabajar sobre su estado o su comportamiento interno.\n * \n * @example\n * const [methods, events, Imperative] = makeImperativeComponent<\n {\n age: number;\n },\n { blink: number }\n >()(\n {} as {\n name: string;\n },\n {\n setName(setState, name: string) {\n setState({ name });\n },\n },\n ({ age, name, useEvents }) => {\n const [isBlinking, setIsBlinking] = useState(false);\n\n useEvents({\n blink() {\n setInterval(() => setIsBlinking((current) => !current), 300);\n },\n });\n\n return (\n <Box sx={{ background: isBlinking ? 'red' : undefined }}>\n {age} {name}\n </Box>\n );\n },\n );\n\n methods\n */\nexport default function makeImperativeComponent<\n ComponentProps extends TMap,\n Events extends TMap = TMap,\n>() {\n return function ImperativeComponent<\n State extends TMap,\n Methods extends TMethods<State>,\n >({\n Component,\n initialState,\n methods,\n }: {\n initialState?: State;\n methods?: Methods;\n Component: FC<Omit<ComponentProps, 'id'> & State>;\n }): [\n TMethodsMap<Methods>,\n TFireEvent<Events>,\n FC<ComponentProps & { id: TId }>,\n ] {\n /**\n * State methods\n */\n\n const setStates: Record<string, TStateManager<State>> = {};\n const actualMethods: TMethodsMap<Methods> = {} as TMethodsMap<Methods>;\n Object.entries(methods ?? {}).forEach(([key, method]) => {\n actualMethods[key as keyof Methods] = ((id, ...args: any) => {\n if (setStates[id]) method(setStates[id], ...args);\n else {\n console.warn(`The requested id does not exist: ${id}`);\n }\n }) as TMethod<Methods[keyof Methods]>;\n });\n\n /**\n * Events\n */\n const eventsHandlers: TEventsHandlers<Events> = {};\n\n const fireEvent: TFireEvent<Events> = <K extends keyof Events>(\n id: TId,\n ev: K,\n args?: Events[K],\n ) => {\n if (eventsHandlers[id])\n eventsHandlers[id]?.[ev]?.forEach((current) => current.cb(args));\n else console.warn(`The requested id does not exist: ${id}`);\n };\n\n /**\n * Component\n */\n\n const ActualComponent: FC<ComponentProps & { id: TId }> = ({\n id,\n ...props\n }) => {\n const [state, innerSetState] = useState(initialState as State);\n\n setStates[id] = (newState) =>\n innerSetState((current) => ({ ...current, ...newState }));\n\n return (\n <ImperativeComponentContext.Provider\n value={useMemo(() => ({ id, eventsStore: eventsHandlers }), [id])}\n >\n <Component {...props} {...state} />\n </ImperativeComponentContext.Provider>\n );\n };\n\n return [actualMethods, fireEvent, ActualComponent];\n };\n}\n"],"names":[],"mappings":";;;;AAqDA,SAAwB,uBAGpB,GAAA;AACF,EAAA,OAAO,SAAS,mBAGd,CAAA;AAAA,IACA,SAAA;AAAA,IACA,YAAA;AAAA,IACA,OAAA;AAAA,GASA,EAAA;AAKA,IAAA,MAAM,YAAkD,EAAC,CAAA;AACzD,IAAA,MAAM,gBAAsC,EAAC,CAAA;AAC7C,IAAO,MAAA,CAAA,OAAA,CAAQ,OAAW,IAAA,EAAE,CAAA,CAAE,QAAQ,CAAC,CAAC,GAAK,EAAA,MAAM,CAAM,KAAA;AACvD,MAAA,aAAA,CAAc,GAAoB,CAAA,GAAK,CAAC,EAAA,EAAA,GAAO,IAAc,KAAA;AAC3D,QAAA,IAAI,UAAU,EAAE,CAAA;AAAG,UAAA,MAAA,CAAO,SAAU,CAAA,EAAE,CAAG,EAAA,GAAG,IAAI,CAAA,CAAA;AAAA,aAC3C;AACH,UAAQ,OAAA,CAAA,IAAA,CAAK,CAAoC,iCAAA,EAAA,EAAE,CAAE,CAAA,CAAA,CAAA;AAAA,SACvD;AAAA,OACF,CAAA;AAAA,KACD,CAAA,CAAA;AAKD,IAAA,MAAM,iBAA0C,EAAC,CAAA;AAEjD,IAAA,MAAM,SAAgC,GAAA,CACpC,EACA,EAAA,EAAA,EACA,IACG,KAAA;AACH,MAAA,IAAI,eAAe,EAAE,CAAA;AACnB,QAAe,cAAA,CAAA,EAAE,CAAI,GAAA,EAAE,CAAG,EAAA,OAAA,CAAQ,CAAC,OAAY,KAAA,OAAA,CAAQ,EAAG,CAAA,IAAI,CAAC,CAAA,CAAA;AAAA;AAC5D,QAAQ,OAAA,CAAA,IAAA,CAAK,CAAoC,iCAAA,EAAA,EAAE,CAAE,CAAA,CAAA,CAAA;AAAA,KAC5D,CAAA;AAMA,IAAA,MAAM,kBAAoD,CAAC;AAAA,MACzD,EAAA;AAAA,MACA,GAAG,KAAA;AAAA,KACC,KAAA;AACJ,MAAA,MAAM,CAAC,KAAA,EAAO,aAAa,CAAA,GAAI,SAAS,YAAqB,CAAA,CAAA;AAE7D,MAAA,SAAA,CAAU,EAAE,CAAA,GAAI,CAAC,QAAA,KACf,aAAc,CAAA,CAAC,OAAa,MAAA,EAAE,GAAG,OAAA,EAAS,GAAG,QAAA,EAAW,CAAA,CAAA,CAAA;AAE1D,MACE,uBAAA,GAAA;AAAA,QAAC,0BAA2B,CAAA,QAAA;AAAA,QAA3B;AAAA,UACC,KAAA,EAAO,OAAQ,CAAA,OAAO,EAAE,EAAA,EAAI,aAAa,cAAe,EAAA,CAAA,EAAI,CAAC,EAAE,CAAC,CAAA;AAAA,UAEhE,QAAC,kBAAA,GAAA,CAAA,SAAA,EAAA,EAAW,GAAG,KAAA,EAAQ,GAAG,KAAO,EAAA,CAAA;AAAA,SAAA;AAAA,OACnC,CAAA;AAAA,KAEJ,CAAA;AAEA,IAAO,OAAA,CAAC,aAAe,EAAA,SAAA,EAAW,eAAe,CAAA,CAAA;AAAA,GACnD,CAAA;AACF;;;;"}
1
+ {"version":3,"file":"makeImperativeComponent.js","sources":["../../src/imperative/makeImperativeComponent.tsx"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\r\n/* eslint-disable @typescript-eslint/no-unsafe-argument */\r\nimport { FC, useMemo, useState } from 'react';\r\nimport {\r\n TMap,\r\n TMethods,\r\n TMethodsMap,\r\n TFireEvent,\r\n TStateManager,\r\n TMethod,\r\n TEventsHandlers,\r\n ImperativeComponentContext,\r\n} from './types';\r\nimport { TId } from '../types';\r\n\r\n/**\r\n * Permite la creación de componentes multi-instancia que ofrecen métodos para\r\n * trabajar sobre su estado o su comportamiento interno.\r\n * \r\n * @example\r\n * const [methods, events, Imperative] = makeImperativeComponent<\r\n {\r\n age: number;\r\n },\r\n { blink: number }\r\n >()(\r\n {} as {\r\n name: string;\r\n },\r\n {\r\n setName(setState, name: string) {\r\n setState({ name });\r\n },\r\n },\r\n ({ age, name, useEvents }) => {\r\n const [isBlinking, setIsBlinking] = useState(false);\r\n\r\n useEvents({\r\n blink() {\r\n setInterval(() => setIsBlinking((current) => !current), 300);\r\n },\r\n });\r\n\r\n return (\r\n <Box sx={{ background: isBlinking ? 'red' : undefined }}>\r\n {age} {name}\r\n </Box>\r\n );\r\n },\r\n );\r\n\r\n methods\r\n */\r\nexport default function makeImperativeComponent<\r\n ComponentProps extends TMap,\r\n Events extends TMap = TMap,\r\n>() {\r\n return function ImperativeComponent<\r\n State extends TMap,\r\n Methods extends TMethods<State>,\r\n >({\r\n Component,\r\n initialState,\r\n methods,\r\n }: {\r\n initialState?: State;\r\n methods?: Methods;\r\n Component: FC<Omit<ComponentProps, 'id'> & State>;\r\n }): [\r\n TMethodsMap<Methods>,\r\n TFireEvent<Events>,\r\n FC<ComponentProps & { id: TId }>,\r\n ] {\r\n /**\r\n * State methods\r\n */\r\n\r\n const setStates: Record<string, TStateManager<State>> = {};\r\n const actualMethods: TMethodsMap<Methods> = {} as TMethodsMap<Methods>;\r\n Object.entries(methods ?? {}).forEach(([key, method]) => {\r\n actualMethods[key as keyof Methods] = ((id, ...args: any) => {\r\n if (setStates[id]) method(setStates[id], ...args);\r\n else {\r\n console.warn(`The requested id does not exist: ${id}`);\r\n }\r\n }) as TMethod<Methods[keyof Methods]>;\r\n });\r\n\r\n /**\r\n * Events\r\n */\r\n const eventsHandlers: TEventsHandlers<Events> = {};\r\n\r\n const fireEvent: TFireEvent<Events> = <K extends keyof Events>(\r\n id: TId,\r\n ev: K,\r\n args?: Events[K],\r\n ) => {\r\n if (eventsHandlers[id])\r\n eventsHandlers[id]?.[ev]?.forEach((current) => current.cb(args));\r\n else console.warn(`The requested id does not exist: ${id}`);\r\n };\r\n\r\n /**\r\n * Component\r\n */\r\n\r\n const ActualComponent: FC<ComponentProps & { id: TId }> = ({\r\n id,\r\n ...props\r\n }) => {\r\n const [state, innerSetState] = useState(initialState as State);\r\n\r\n setStates[id] = (newState) =>\r\n innerSetState((current) => ({ ...current, ...newState }));\r\n\r\n return (\r\n <ImperativeComponentContext.Provider\r\n value={useMemo(() => ({ id, eventsStore: eventsHandlers }), [id])}\r\n >\r\n <Component {...props} {...state} />\r\n </ImperativeComponentContext.Provider>\r\n );\r\n };\r\n\r\n return [actualMethods, fireEvent, ActualComponent];\r\n };\r\n}\r\n"],"names":[],"mappings":";;;;AAqDA,SAAwB,uBAGpB,GAAA;AACF,EAAA,OAAO,SAAS,mBAGd,CAAA;AAAA,IACA,SAAA;AAAA,IACA,YAAA;AAAA,IACA,OAAA;AAAA,GASA,EAAA;AAKA,IAAA,MAAM,YAAkD,EAAC,CAAA;AACzD,IAAA,MAAM,gBAAsC,EAAC,CAAA;AAC7C,IAAO,MAAA,CAAA,OAAA,CAAQ,OAAW,IAAA,EAAE,CAAA,CAAE,QAAQ,CAAC,CAAC,GAAK,EAAA,MAAM,CAAM,KAAA;AACvD,MAAA,aAAA,CAAc,GAAoB,CAAA,GAAK,CAAC,EAAA,EAAA,GAAO,IAAc,KAAA;AAC3D,QAAA,IAAI,UAAU,EAAE,CAAA;AAAG,UAAA,MAAA,CAAO,SAAU,CAAA,EAAE,CAAG,EAAA,GAAG,IAAI,CAAA,CAAA;AAAA,aAC3C;AACH,UAAQ,OAAA,CAAA,IAAA,CAAK,CAAoC,iCAAA,EAAA,EAAE,CAAE,CAAA,CAAA,CAAA;AAAA,SACvD;AAAA,OACF,CAAA;AAAA,KACD,CAAA,CAAA;AAKD,IAAA,MAAM,iBAA0C,EAAC,CAAA;AAEjD,IAAA,MAAM,SAAgC,GAAA,CACpC,EACA,EAAA,EAAA,EACA,IACG,KAAA;AACH,MAAA,IAAI,eAAe,EAAE,CAAA;AACnB,QAAe,cAAA,CAAA,EAAE,CAAI,GAAA,EAAE,CAAG,EAAA,OAAA,CAAQ,CAAC,OAAY,KAAA,OAAA,CAAQ,EAAG,CAAA,IAAI,CAAC,CAAA,CAAA;AAAA;AAC5D,QAAQ,OAAA,CAAA,IAAA,CAAK,CAAoC,iCAAA,EAAA,EAAE,CAAE,CAAA,CAAA,CAAA;AAAA,KAC5D,CAAA;AAMA,IAAA,MAAM,kBAAoD,CAAC;AAAA,MACzD,EAAA;AAAA,MACA,GAAG,KAAA;AAAA,KACC,KAAA;AACJ,MAAA,MAAM,CAAC,KAAA,EAAO,aAAa,CAAA,GAAI,SAAS,YAAqB,CAAA,CAAA;AAE7D,MAAA,SAAA,CAAU,EAAE,CAAA,GAAI,CAAC,QAAA,KACf,aAAc,CAAA,CAAC,OAAa,MAAA,EAAE,GAAG,OAAA,EAAS,GAAG,QAAA,EAAW,CAAA,CAAA,CAAA;AAE1D,MACE,uBAAA,GAAA;AAAA,QAAC,0BAA2B,CAAA,QAAA;AAAA,QAA3B;AAAA,UACC,KAAA,EAAO,OAAQ,CAAA,OAAO,EAAE,EAAA,EAAI,aAAa,cAAe,EAAA,CAAA,EAAI,CAAC,EAAE,CAAC,CAAA;AAAA,UAEhE,QAAC,kBAAA,GAAA,CAAA,SAAA,EAAA,EAAW,GAAG,KAAA,EAAQ,GAAG,KAAO,EAAA,CAAA;AAAA,SAAA;AAAA,OACnC,CAAA;AAAA,KAEJ,CAAA;AAEA,IAAO,OAAA,CAAC,aAAe,EAAA,SAAA,EAAW,eAAe,CAAA,CAAA;AAAA,GACnD,CAAA;AACF;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"makeSingleImperativeComponent.js","sources":["../../src/imperative/makeSingleImperativeComponent.tsx"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-unsafe-argument */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { FC } from 'react';\nimport uniqueId from 'lodash-es/uniqueId';\nimport { TMap, TMethods, TMethodsMap } from './types';\nimport makeImperativeComponent from './makeImperativeComponent';\nimport { TId } from '../types';\n\ntype TSingleMethodsMap<\n Methods extends TMethods<any>,\n MethodsMap extends TMethodsMap<Methods>,\n> = {\n [Name in keyof MethodsMap]: MethodsMap[Name] extends (\n id: TId,\n ...args: infer Action\n ) => unknown\n ? (...args: Action) => unknown\n : never;\n};\n\nexport default function makeSingleImperativeComponent<\n ComponentProps extends TMap,\n Events extends TMap = TMap,\n>() {\n return function SingleImperativeComponent<\n State extends TMap,\n Methods extends TMethods<State>,\n >({\n initialState,\n methods,\n Component,\n }: {\n initialState?: State;\n methods?: Methods;\n Component: FC<Omit<ComponentProps, 'id'> & State>;\n }): [\n TSingleMethodsMap<Methods, TMethodsMap<Methods>>,\n <K extends keyof Events>(ev: K, args: Events[K]) => void,\n FC<ComponentProps>,\n ] {\n const id = uniqueId();\n\n const [actualMethods, originalFireEvent, ImperativeComponent] =\n makeImperativeComponent<ComponentProps, Events>()({\n initialState,\n methods,\n Component,\n });\n\n const fireEvent: <K extends keyof Events>(\n ev: K,\n args: Events[K],\n ) => void = (ev, args) => originalFireEvent(id, ev, args);\n\n const newMethods: TSingleMethodsMap<\n Methods,\n TMethodsMap<Methods>\n > = {} as TSingleMethodsMap<Methods, TMethodsMap<Methods>>;\n\n Object.entries(actualMethods).forEach(([name, method]) => {\n (newMethods[name as keyof typeof newMethods] as any) = (...args: any) =>\n (method as (id: TId, ...args: any) => unknown)(id, ...args);\n });\n\n return [\n newMethods,\n fireEvent,\n (props: ComponentProps) => <ImperativeComponent {...props} id={id} />,\n ];\n };\n}\n"],"names":[],"mappings":";;;;AAoBA,SAAwB,6BAGpB,GAAA;AACF,EAAA,OAAO,SAAS,yBAGd,CAAA;AAAA,IACA,YAAA;AAAA,IACA,OAAA;AAAA,IACA,SAAA;AAAA,GASA,EAAA;AACA,IAAA,MAAM,KAAK,QAAS,EAAA,CAAA;AAEpB,IAAA,MAAM,CAAC,aAAe,EAAA,iBAAA,EAAmB,mBAAmB,CAAA,GAC1D,yBAAkD,CAAA;AAAA,MAChD,YAAA;AAAA,MACA,OAAA;AAAA,MACA,SAAA;AAAA,KACD,CAAA,CAAA;AAEH,IAAA,MAAM,YAGM,CAAC,EAAA,EAAI,SAAS,iBAAkB,CAAA,EAAA,EAAI,IAAI,IAAI,CAAA,CAAA;AAExD,IAAA,MAAM,aAGF,EAAC,CAAA;AAEL,IAAO,MAAA,CAAA,OAAA,CAAQ,aAAa,CAAE,CAAA,OAAA,CAAQ,CAAC,CAAC,IAAA,EAAM,MAAM,CAAM,KAAA;AACxD,MAAC,UAAA,CAAW,IAA+B,CAAY,GAAA,CAAA,GAAI,SACxD,MAA8C,CAAA,EAAA,EAAI,GAAG,IAAI,CAAA,CAAA;AAAA,KAC7D,CAAA,CAAA;AAED,IAAO,OAAA;AAAA,MACL,UAAA;AAAA,MACA,SAAA;AAAA,MACA,CAAC,KAA0B,qBAAA,GAAA,CAAC,mBAAqB,EAAA,EAAA,GAAG,OAAO,EAAQ,EAAA,CAAA;AAAA,KACrE,CAAA;AAAA,GACF,CAAA;AACF;;;;"}
1
+ {"version":3,"file":"makeSingleImperativeComponent.js","sources":["../../src/imperative/makeSingleImperativeComponent.tsx"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-unsafe-argument */\r\n/* eslint-disable @typescript-eslint/no-explicit-any */\r\nimport { FC } from 'react';\r\nimport uniqueId from 'lodash-es/uniqueId';\r\nimport { TMap, TMethods, TMethodsMap } from './types';\r\nimport makeImperativeComponent from './makeImperativeComponent';\r\nimport { TId } from '../types';\r\n\r\ntype TSingleMethodsMap<\r\n Methods extends TMethods<any>,\r\n MethodsMap extends TMethodsMap<Methods>,\r\n> = {\r\n [Name in keyof MethodsMap]: MethodsMap[Name] extends (\r\n id: TId,\r\n ...args: infer Action\r\n ) => unknown\r\n ? (...args: Action) => unknown\r\n : never;\r\n};\r\n\r\nexport default function makeSingleImperativeComponent<\r\n ComponentProps extends TMap,\r\n Events extends TMap = TMap,\r\n>() {\r\n return function SingleImperativeComponent<\r\n State extends TMap,\r\n Methods extends TMethods<State>,\r\n >({\r\n initialState,\r\n methods,\r\n Component,\r\n }: {\r\n initialState?: State;\r\n methods?: Methods;\r\n Component: FC<Omit<ComponentProps, 'id'> & State>;\r\n }): [\r\n TSingleMethodsMap<Methods, TMethodsMap<Methods>>,\r\n <K extends keyof Events>(ev: K, args: Events[K]) => void,\r\n FC<ComponentProps>,\r\n ] {\r\n const id = uniqueId();\r\n\r\n const [actualMethods, originalFireEvent, ImperativeComponent] =\r\n makeImperativeComponent<ComponentProps, Events>()({\r\n initialState,\r\n methods,\r\n Component,\r\n });\r\n\r\n const fireEvent: <K extends keyof Events>(\r\n ev: K,\r\n args: Events[K],\r\n ) => void = (ev, args) => originalFireEvent(id, ev, args);\r\n\r\n const newMethods: TSingleMethodsMap<\r\n Methods,\r\n TMethodsMap<Methods>\r\n > = {} as TSingleMethodsMap<Methods, TMethodsMap<Methods>>;\r\n\r\n Object.entries(actualMethods).forEach(([name, method]) => {\r\n (newMethods[name as keyof typeof newMethods] as any) = (...args: any) =>\r\n (method as (id: TId, ...args: any) => unknown)(id, ...args);\r\n });\r\n\r\n return [\r\n newMethods,\r\n fireEvent,\r\n (props: ComponentProps) => <ImperativeComponent {...props} id={id} />,\r\n ];\r\n };\r\n}\r\n"],"names":[],"mappings":";;;;AAoBA,SAAwB,6BAGpB,GAAA;AACF,EAAA,OAAO,SAAS,yBAGd,CAAA;AAAA,IACA,YAAA;AAAA,IACA,OAAA;AAAA,IACA,SAAA;AAAA,GASA,EAAA;AACA,IAAA,MAAM,KAAK,QAAS,EAAA,CAAA;AAEpB,IAAA,MAAM,CAAC,aAAe,EAAA,iBAAA,EAAmB,mBAAmB,CAAA,GAC1D,yBAAkD,CAAA;AAAA,MAChD,YAAA;AAAA,MACA,OAAA;AAAA,MACA,SAAA;AAAA,KACD,CAAA,CAAA;AAEH,IAAA,MAAM,YAGM,CAAC,EAAA,EAAI,SAAS,iBAAkB,CAAA,EAAA,EAAI,IAAI,IAAI,CAAA,CAAA;AAExD,IAAA,MAAM,aAGF,EAAC,CAAA;AAEL,IAAO,MAAA,CAAA,OAAA,CAAQ,aAAa,CAAE,CAAA,OAAA,CAAQ,CAAC,CAAC,IAAA,EAAM,MAAM,CAAM,KAAA;AACxD,MAAC,UAAA,CAAW,IAA+B,CAAY,GAAA,CAAA,GAAI,SACxD,MAA8C,CAAA,EAAA,EAAI,GAAG,IAAI,CAAA,CAAA;AAAA,KAC7D,CAAA,CAAA;AAED,IAAO,OAAA;AAAA,MACL,UAAA;AAAA,MACA,SAAA;AAAA,MACA,CAAC,KAA0B,qBAAA,GAAA,CAAC,mBAAqB,EAAA,EAAA,GAAG,OAAO,EAAQ,EAAA,CAAA;AAAA,KACrE,CAAA;AAAA,GACF,CAAA;AACF;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sources":["../../src/imperative/types.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { createContext } from 'react';\nimport { TId } from '../types';\n\nexport type TMethod<CR> = CR extends (state: any, ...args: infer Action) => any\n ? (id: TId, ...args: Action) => unknown\n : () => unknown;\n\nexport type TMethods<State extends TMap, K extends any[] = any[]> = Record<\n string,\n (setState: TStateManager<State>, ...args: K) => void\n>;\n\nexport type TMethodsMap<OriginalMethods extends TMethods<any>> = {\n [Name in keyof OriginalMethods]: TMethod<OriginalMethods[Name]>;\n};\n\nexport type TEventsMap<OriginalEvents extends TMap> = {\n [Name in keyof OriginalEvents]: (args: OriginalEvents[Name]) => unknown;\n};\n\nexport type TEventsHandlers<OriginalEvents extends TMap> = Record<\n TId,\n {\n [Name in keyof OriginalEvents]?: {\n cb: (args?: OriginalEvents[Name]) => unknown;\n uniqueHookId: string;\n }[];\n }\n>;\n\nexport type TMap = Record<string, any>;\n\nexport type TStateManager<State> = (newState: Partial<State>) => void;\n\nexport type TUseEvents<Events extends TMap> = (\n handlers: Partial<TEventsMap<Events>>,\n) => void;\n\nexport const ImperativeComponentContext = createContext<{\n id: TId;\n eventsStore: TEventsHandlers<any>;\n}>(\n {} as {\n id: TId;\n eventsStore: TEventsHandlers<any>;\n },\n);\n\nexport type TFireEvent<Events extends TMap> = <K extends keyof Events>(\n id: TId,\n ev: K,\n args: Events[K] extends void ? undefined : Events[K],\n) => void;\n"],"names":[],"mappings":";;AAuCO,MAAM,0BAA6B,GAAA,aAAA;AAAA,EAIxC,EAAC;AAIH;;;;"}
1
+ {"version":3,"file":"types.js","sources":["../../src/imperative/types.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\r\nimport { createContext } from 'react';\r\nimport { TId } from '../types';\r\n\r\nexport type TMethod<CR> = CR extends (state: any, ...args: infer Action) => any\r\n ? (id: TId, ...args: Action) => unknown\r\n : () => unknown;\r\n\r\nexport type TMethods<State extends TMap, K extends any[] = any[]> = Record<\r\n string,\r\n (setState: TStateManager<State>, ...args: K) => void\r\n>;\r\n\r\nexport type TMethodsMap<OriginalMethods extends TMethods<any>> = {\r\n [Name in keyof OriginalMethods]: TMethod<OriginalMethods[Name]>;\r\n};\r\n\r\nexport type TEventsMap<OriginalEvents extends TMap> = {\r\n [Name in keyof OriginalEvents]: (args: OriginalEvents[Name]) => unknown;\r\n};\r\n\r\nexport type TEventsHandlers<OriginalEvents extends TMap> = Record<\r\n TId,\r\n {\r\n [Name in keyof OriginalEvents]?: {\r\n cb: (args?: OriginalEvents[Name]) => unknown;\r\n uniqueHookId: string;\r\n }[];\r\n }\r\n>;\r\n\r\nexport type TMap = Record<string, any>;\r\n\r\nexport type TStateManager<State> = (newState: Partial<State>) => void;\r\n\r\nexport type TUseEvents<Events extends TMap> = (\r\n handlers: Partial<TEventsMap<Events>>,\r\n) => void;\r\n\r\nexport const ImperativeComponentContext = createContext<{\r\n id: TId;\r\n eventsStore: TEventsHandlers<any>;\r\n}>(\r\n {} as {\r\n id: TId;\r\n eventsStore: TEventsHandlers<any>;\r\n },\r\n);\r\n\r\nexport type TFireEvent<Events extends TMap> = <K extends keyof Events>(\r\n id: TId,\r\n ev: K,\r\n args: Events[K] extends void ? undefined : Events[K],\r\n) => void;\r\n"],"names":[],"mappings":";;AAuCO,MAAM,0BAA6B,GAAA,aAAA;AAAA,EAIxC,EAAC;AAIH;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"useImperativeComponentEvents.js","sources":["../../src/imperative/useImperativeComponentEvents.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-unsafe-argument */\nimport { useCallback, useEffect, useMemo, useRef } from 'react';\nimport { TEventsMap, TMap } from './types';\nimport useImperativeComponentContext from './useImperativeIdentifierContext';\nimport uniqueId from 'lodash-es/uniqueId';\n\nconst useImperativeComponentEvents = <Events extends TMap = TMap>(\n handlers: Partial<TEventsMap<Events>>,\n) => {\n const uniqueHookId = useMemo(() => uniqueId('hook'), []);\n\n const { id, eventsStore } = useImperativeComponentContext<Events>();\n const hasRegistered = useRef(false);\n\n const registerEvents = useCallback(() => {\n Object.entries(handlers).forEach(([name, callback]) => {\n if (!eventsStore[id]) eventsStore[id] = {};\n if (!eventsStore[id][name])\n eventsStore[id][name as keyof (typeof eventsStore)[typeof id]] = [];\n\n eventsStore[id][name as keyof (typeof eventsStore)[typeof id]]?.push({\n cb: callback as (args?: Events[keyof Events] | undefined) => unknown,\n uniqueHookId: uniqueHookId,\n });\n });\n }, [eventsStore, handlers, id, uniqueHookId]);\n\n useEffect(() => {\n registerEvents();\n return () => {\n hasRegistered.current = false;\n Object.entries(handlers).forEach(([name]) => {\n eventsStore[id][name as keyof (typeof eventsStore)[typeof id]] = (\n eventsStore[id][name as keyof (typeof eventsStore)[typeof id]] ?? []\n ).filter((current) => current.uniqueHookId !== uniqueHookId);\n });\n };\n }, [eventsStore, handlers, id, registerEvents, uniqueHookId]);\n\n return uniqueHookId;\n};\n\nexport default useImperativeComponentEvents;\n"],"names":[],"mappings":";;;;AAMA,MAAM,4BAAA,GAA+B,CACnC,QACG,KAAA;AACH,EAAA,MAAM,eAAe,OAAQ,CAAA,MAAM,SAAS,MAAM,CAAA,EAAG,EAAE,CAAA,CAAA;AAEvD,EAAA,MAAM,EAAE,EAAA,EAAI,WAAY,EAAA,GAAI,6BAAsC,EAAA,CAAA;AAClE,EAAM,MAAA,aAAA,GAAgB,OAAO,KAAK,CAAA,CAAA;AAElC,EAAM,MAAA,cAAA,GAAiB,YAAY,MAAM;AACvC,IAAO,MAAA,CAAA,OAAA,CAAQ,QAAQ,CAAE,CAAA,OAAA,CAAQ,CAAC,CAAC,IAAA,EAAM,QAAQ,CAAM,KAAA;AACrD,MAAI,IAAA,CAAC,YAAY,EAAE,CAAA;AAAG,QAAY,WAAA,CAAA,EAAE,IAAI,EAAC,CAAA;AACzC,MAAA,IAAI,CAAC,WAAA,CAAY,EAAE,CAAA,CAAE,IAAI,CAAA;AACvB,QAAA,WAAA,CAAY,EAAE,CAAA,CAAE,IAA6C,CAAA,GAAI,EAAC,CAAA;AAEpE,MAAA,WAAA,CAAY,EAAE,CAAA,CAAE,IAA6C,CAAA,EAAG,IAAK,CAAA;AAAA,QACnE,EAAI,EAAA,QAAA;AAAA,QACJ,YAAA;AAAA,OACD,CAAA,CAAA;AAAA,KACF,CAAA,CAAA;AAAA,KACA,CAAC,WAAA,EAAa,QAAU,EAAA,EAAA,EAAI,YAAY,CAAC,CAAA,CAAA;AAE5C,EAAA,SAAA,CAAU,MAAM;AACd,IAAe,cAAA,EAAA,CAAA;AACf,IAAA,OAAO,MAAM;AACX,MAAA,aAAA,CAAc,OAAU,GAAA,KAAA,CAAA;AACxB,MAAA,MAAA,CAAO,QAAQ,QAAQ,CAAA,CAAE,QAAQ,CAAC,CAAC,IAAI,CAAM,KAAA;AAC3C,QAAA,WAAA,CAAY,EAAE,CAAE,CAAA,IAA6C,CAC3D,GAAA,CAAA,WAAA,CAAY,EAAE,CAAE,CAAA,IAA6C,CAAK,IAAA,IAClE,MAAO,CAAA,CAAC,OAAY,KAAA,OAAA,CAAQ,iBAAiB,YAAY,CAAA,CAAA;AAAA,OAC5D,CAAA,CAAA;AAAA,KACH,CAAA;AAAA,KACC,CAAC,WAAA,EAAa,UAAU,EAAI,EAAA,cAAA,EAAgB,YAAY,CAAC,CAAA,CAAA;AAE5D,EAAO,OAAA,YAAA,CAAA;AACT,CAAA,CAAA;AAEA,qCAAe,4BAAA;;;;"}
1
+ {"version":3,"file":"useImperativeComponentEvents.js","sources":["../../src/imperative/useImperativeComponentEvents.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-unsafe-argument */\r\nimport { useCallback, useEffect, useMemo, useRef } from 'react';\r\nimport { TEventsMap, TMap } from './types';\r\nimport useImperativeComponentContext from './useImperativeIdentifierContext';\r\nimport uniqueId from 'lodash-es/uniqueId';\r\n\r\nconst useImperativeComponentEvents = <Events extends TMap = TMap>(\r\n handlers: Partial<TEventsMap<Events>>,\r\n) => {\r\n const uniqueHookId = useMemo(() => uniqueId('hook'), []);\r\n\r\n const { id, eventsStore } = useImperativeComponentContext<Events>();\r\n const hasRegistered = useRef(false);\r\n\r\n const registerEvents = useCallback(() => {\r\n Object.entries(handlers).forEach(([name, callback]) => {\r\n if (!eventsStore[id]) eventsStore[id] = {};\r\n if (!eventsStore[id][name])\r\n eventsStore[id][name as keyof (typeof eventsStore)[typeof id]] = [];\r\n\r\n eventsStore[id][name as keyof (typeof eventsStore)[typeof id]]?.push({\r\n cb: callback as (args?: Events[keyof Events] | undefined) => unknown,\r\n uniqueHookId: uniqueHookId,\r\n });\r\n });\r\n }, [eventsStore, handlers, id, uniqueHookId]);\r\n\r\n useEffect(() => {\r\n registerEvents();\r\n return () => {\r\n hasRegistered.current = false;\r\n Object.entries(handlers).forEach(([name]) => {\r\n eventsStore[id][name as keyof (typeof eventsStore)[typeof id]] = (\r\n eventsStore[id][name as keyof (typeof eventsStore)[typeof id]] ?? []\r\n ).filter((current) => current.uniqueHookId !== uniqueHookId);\r\n });\r\n };\r\n }, [eventsStore, handlers, id, registerEvents, uniqueHookId]);\r\n\r\n return uniqueHookId;\r\n};\r\n\r\nexport default useImperativeComponentEvents;\r\n"],"names":[],"mappings":";;;;AAMA,MAAM,4BAAA,GAA+B,CACnC,QACG,KAAA;AACH,EAAA,MAAM,eAAe,OAAQ,CAAA,MAAM,SAAS,MAAM,CAAA,EAAG,EAAE,CAAA,CAAA;AAEvD,EAAA,MAAM,EAAE,EAAA,EAAI,WAAY,EAAA,GAAI,6BAAsC,EAAA,CAAA;AAClE,EAAM,MAAA,aAAA,GAAgB,OAAO,KAAK,CAAA,CAAA;AAElC,EAAM,MAAA,cAAA,GAAiB,YAAY,MAAM;AACvC,IAAO,MAAA,CAAA,OAAA,CAAQ,QAAQ,CAAE,CAAA,OAAA,CAAQ,CAAC,CAAC,IAAA,EAAM,QAAQ,CAAM,KAAA;AACrD,MAAI,IAAA,CAAC,YAAY,EAAE,CAAA;AAAG,QAAY,WAAA,CAAA,EAAE,IAAI,EAAC,CAAA;AACzC,MAAA,IAAI,CAAC,WAAA,CAAY,EAAE,CAAA,CAAE,IAAI,CAAA;AACvB,QAAA,WAAA,CAAY,EAAE,CAAA,CAAE,IAA6C,CAAA,GAAI,EAAC,CAAA;AAEpE,MAAA,WAAA,CAAY,EAAE,CAAA,CAAE,IAA6C,CAAA,EAAG,IAAK,CAAA;AAAA,QACnE,EAAI,EAAA,QAAA;AAAA,QACJ,YAAA;AAAA,OACD,CAAA,CAAA;AAAA,KACF,CAAA,CAAA;AAAA,KACA,CAAC,WAAA,EAAa,QAAU,EAAA,EAAA,EAAI,YAAY,CAAC,CAAA,CAAA;AAE5C,EAAA,SAAA,CAAU,MAAM;AACd,IAAe,cAAA,EAAA,CAAA;AACf,IAAA,OAAO,MAAM;AACX,MAAA,aAAA,CAAc,OAAU,GAAA,KAAA,CAAA;AACxB,MAAA,MAAA,CAAO,QAAQ,QAAQ,CAAA,CAAE,QAAQ,CAAC,CAAC,IAAI,CAAM,KAAA;AAC3C,QAAA,WAAA,CAAY,EAAE,CAAE,CAAA,IAA6C,CAC3D,GAAA,CAAA,WAAA,CAAY,EAAE,CAAE,CAAA,IAA6C,CAAK,IAAA,IAClE,MAAO,CAAA,CAAC,OAAY,KAAA,OAAA,CAAQ,iBAAiB,YAAY,CAAA,CAAA;AAAA,OAC5D,CAAA,CAAA;AAAA,KACH,CAAA;AAAA,KACC,CAAC,WAAA,EAAa,UAAU,EAAI,EAAA,cAAA,EAAgB,YAAY,CAAC,CAAA,CAAA;AAE5D,EAAO,OAAA,YAAA,CAAA;AACT,CAAA,CAAA;AAEA,qCAAe,4BAAA;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"useImperativeIdentifierContext.js","sources":["../../src/imperative/useImperativeIdentifierContext.ts"],"sourcesContent":["import { useContext } from 'react';\nimport { ImperativeComponentContext, TEventsHandlers, TMap } from './types';\nimport { TId } from '../types';\n\n/**\n * Permite el uso de eventos en herederos directos o no del imperativeComponent\n * más cercano.\n */\nexport default function useImperativeComponentContext<\n Events extends TMap = TMap,\n>() {\n const context = useContext(ImperativeComponentContext) as {\n id: TId;\n eventsStore: TEventsHandlers<Events>;\n };\n\n return context;\n}\n"],"names":[],"mappings":";;;AAQA,SAAwB,6BAEpB,GAAA;AACF,EAAM,MAAA,OAAA,GAAU,WAAW,0BAA0B,CAAA,CAAA;AAKrD,EAAO,OAAA,OAAA,CAAA;AACT;;;;"}
1
+ {"version":3,"file":"useImperativeIdentifierContext.js","sources":["../../src/imperative/useImperativeIdentifierContext.ts"],"sourcesContent":["import { useContext } from 'react';\r\nimport { ImperativeComponentContext, TEventsHandlers, TMap } from './types';\r\nimport { TId } from '../types';\r\n\r\n/**\r\n * Permite el uso de eventos en herederos directos o no del imperativeComponent\r\n * más cercano.\r\n */\r\nexport default function useImperativeComponentContext<\r\n Events extends TMap = TMap,\r\n>() {\r\n const context = useContext(ImperativeComponentContext) as {\r\n id: TId;\r\n eventsStore: TEventsHandlers<Events>;\r\n };\r\n\r\n return context;\r\n}\r\n"],"names":[],"mappings":";;;AAQA,SAAwB,6BAEpB,GAAA;AACF,EAAM,MAAA,OAAA,GAAU,WAAW,0BAA0B,CAAA,CAAA;AAKrD,EAAO,OAAA,OAAA,CAAA;AACT;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"formatMessage.js","sources":["../../src/labels/formatMessage.ts"],"sourcesContent":["/**\n * Da formato a un mensaje con tokens incrustados.\n *\n * @example\n *\n * // Dado el siguiente mensaje:\n * var msg = 'El campo <TOK1> es inválido.';\n *\n * console.log(formatMessage(msg, {\n * TOK1: 'nombre',\n * }));\n * // Imprime: El campo nombre es inválido.\n */\nexport const formatMessage = (\n str: string,\n obj: { [key: string]: string },\n): string => {\n let newStr = str;\n Object.entries(obj).forEach(([key, value]) => {\n const placeHolder = `<${key}>`;\n\n if (newStr?.includes(placeHolder)) {\n newStr = newStr.replace(placeHolder, value ?? '');\n }\n });\n return newStr;\n};\n"],"names":[],"mappings":"AAaa,MAAA,aAAA,GAAgB,CAC3B,GAAA,EACA,GACW,KAAA;AACX,EAAA,IAAI,MAAS,GAAA,GAAA,CAAA;AACb,EAAO,MAAA,CAAA,OAAA,CAAQ,GAAG,CAAE,CAAA,OAAA,CAAQ,CAAC,CAAC,GAAA,EAAK,KAAK,CAAM,KAAA;AAC5C,IAAM,MAAA,WAAA,GAAc,IAAI,GAAG,CAAA,CAAA,CAAA,CAAA;AAE3B,IAAI,IAAA,MAAA,EAAQ,QAAS,CAAA,WAAW,CAAG,EAAA;AACjC,MAAA,MAAA,GAAS,MAAO,CAAA,OAAA,CAAQ,WAAa,EAAA,KAAA,IAAS,EAAE,CAAA,CAAA;AAAA,KAClD;AAAA,GACD,CAAA,CAAA;AACD,EAAO,OAAA,MAAA,CAAA;AACT;;;;"}
1
+ {"version":3,"file":"formatMessage.js","sources":["../../src/labels/formatMessage.ts"],"sourcesContent":["/**\r\n * Da formato a un mensaje con tokens incrustados.\r\n *\r\n * @example\r\n *\r\n * // Dado el siguiente mensaje:\r\n * var msg = 'El campo <TOK1> es inválido.';\r\n *\r\n * console.log(formatMessage(msg, {\r\n * TOK1: 'nombre',\r\n * }));\r\n * // Imprime: El campo nombre es inválido.\r\n */\r\nexport const formatMessage = (\r\n str: string,\r\n obj: { [key: string]: string },\r\n): string => {\r\n let newStr = str;\r\n Object.entries(obj).forEach(([key, value]) => {\r\n const placeHolder = `<${key}>`;\r\n\r\n if (newStr?.includes(placeHolder)) {\r\n newStr = newStr.replace(placeHolder, value ?? '');\r\n }\r\n });\r\n return newStr;\r\n};\r\n"],"names":[],"mappings":"AAaa,MAAA,aAAA,GAAgB,CAC3B,GAAA,EACA,GACW,KAAA;AACX,EAAA,IAAI,MAAS,GAAA,GAAA,CAAA;AACb,EAAO,MAAA,CAAA,OAAA,CAAQ,GAAG,CAAE,CAAA,OAAA,CAAQ,CAAC,CAAC,GAAA,EAAK,KAAK,CAAM,KAAA;AAC5C,IAAM,MAAA,WAAA,GAAc,IAAI,GAAG,CAAA,CAAA,CAAA,CAAA;AAE3B,IAAI,IAAA,MAAA,EAAQ,QAAS,CAAA,WAAW,CAAG,EAAA;AACjC,MAAA,MAAA,GAAS,MAAO,CAAA,OAAA,CAAQ,WAAa,EAAA,KAAA,IAAS,EAAE,CAAA,CAAA;AAAA,KAClD;AAAA,GACD,CAAA,CAAA;AACD,EAAO,OAAA,MAAA,CAAA;AACT;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"getLabel.js","sources":["../../src/labels/getLabel.ts"],"sourcesContent":["import { formatMessage } from './formatMessage';\n\ninterface ILabelsContainer {\n labels: {\n [key: string]: {\n text: string;\n tooltip: string;\n };\n };\n}\n\n/**\n * Dado un nombre de etiqueta, devuelve el texto que esa etiqueta contiene en\n * el idioma actual. En este momento, lo único que hace realmente esta función\n * es devolver la variable del window con el mismo nombre que se está\n * pidiendo.\n *\n * La idea de implementar esta función, es que en un futuro la fuente de la\n * que provienen las labels pueda ser más diversa.\n *\n * Permite el pasaje de tokens para el reemplazo automático de los mismos.\n *\n * @example\n *\n * // Suponemos la etiqueta msgUsu = { text: 'Usuario <TOK1>', title: 'Usuario <TOK1>' }\n *\n * getLabel('msgUsu' , {\n * text: {\n * TOK1: 'admin',\n * },\n * title: {\n * TOK1: 'no disponible',\n * }\n * })\n */\nexport function getLabel(\n name: string,\n replaceTokens?: {\n text?: Record<string, string>;\n title?: Record<string, string>;\n },\n) {\n const label = {\n ...((window as unknown as ILabelsContainer).labels[name] ?? {\n text: `Not preloaded: ${name}`,\n tooltip: `Not preloaded: ${name}`,\n }),\n };\n\n if (replaceTokens?.text !== undefined)\n label.text = formatMessage(label.text, replaceTokens.text);\n if (replaceTokens?.title !== undefined)\n label.tooltip = formatMessage(label.tooltip, replaceTokens.title);\n\n return label;\n}\n"],"names":[],"mappings":";;AAmCgB,SAAA,QAAA,CACd,MACA,aAIA,EAAA;AACA,EAAA,MAAM,KAAQ,GAAA;AAAA,IACZ,GAAK,MAAA,CAAuC,MAAO,CAAA,IAAI,CAAK,IAAA;AAAA,MAC1D,IAAA,EAAM,kBAAkB,IAAI,CAAA,CAAA;AAAA,MAC5B,OAAA,EAAS,kBAAkB,IAAI,CAAA,CAAA;AAAA,KACjC;AAAA,GACF,CAAA;AAEA,EAAA,IAAI,eAAe,IAAS,KAAA,KAAA,CAAA;AAC1B,IAAA,KAAA,CAAM,IAAO,GAAA,aAAA,CAAc,KAAM,CAAA,IAAA,EAAM,cAAc,IAAI,CAAA,CAAA;AAC3D,EAAA,IAAI,eAAe,KAAU,KAAA,KAAA,CAAA;AAC3B,IAAA,KAAA,CAAM,OAAU,GAAA,aAAA,CAAc,KAAM,CAAA,OAAA,EAAS,cAAc,KAAK,CAAA,CAAA;AAElE,EAAO,OAAA,KAAA,CAAA;AACT;;;;"}
1
+ {"version":3,"file":"getLabel.js","sources":["../../src/labels/getLabel.ts"],"sourcesContent":["import { formatMessage } from './formatMessage';\r\n\r\ninterface ILabelsContainer {\r\n labels: {\r\n [key: string]: {\r\n text: string;\r\n tooltip: string;\r\n };\r\n };\r\n}\r\n\r\n/**\r\n * Dado un nombre de etiqueta, devuelve el texto que esa etiqueta contiene en\r\n * el idioma actual. En este momento, lo único que hace realmente esta función\r\n * es devolver la variable del window con el mismo nombre que se está\r\n * pidiendo.\r\n *\r\n * La idea de implementar esta función, es que en un futuro la fuente de la\r\n * que provienen las labels pueda ser más diversa.\r\n *\r\n * Permite el pasaje de tokens para el reemplazo automático de los mismos.\r\n *\r\n * @example\r\n *\r\n * // Suponemos la etiqueta msgUsu = { text: 'Usuario <TOK1>', title: 'Usuario <TOK1>' }\r\n *\r\n * getLabel('msgUsu' , {\r\n * text: {\r\n * TOK1: 'admin',\r\n * },\r\n * title: {\r\n * TOK1: 'no disponible',\r\n * }\r\n * })\r\n */\r\nexport function getLabel(\r\n name: string,\r\n replaceTokens?: {\r\n text?: Record<string, string>;\r\n title?: Record<string, string>;\r\n },\r\n) {\r\n const label = {\r\n ...((window as unknown as ILabelsContainer).labels[name] ?? {\r\n text: `Not preloaded: ${name}`,\r\n tooltip: `Not preloaded: ${name}`,\r\n }),\r\n };\r\n\r\n if (replaceTokens?.text !== undefined)\r\n label.text = formatMessage(label.text, replaceTokens.text);\r\n if (replaceTokens?.title !== undefined)\r\n label.tooltip = formatMessage(label.tooltip, replaceTokens.title);\r\n\r\n return label;\r\n}\r\n"],"names":[],"mappings":";;AAmCgB,SAAA,QAAA,CACd,MACA,aAIA,EAAA;AACA,EAAA,MAAM,KAAQ,GAAA;AAAA,IACZ,GAAK,MAAA,CAAuC,MAAO,CAAA,IAAI,CAAK,IAAA;AAAA,MAC1D,IAAA,EAAM,kBAAkB,IAAI,CAAA,CAAA;AAAA,MAC5B,OAAA,EAAS,kBAAkB,IAAI,CAAA,CAAA;AAAA,KACjC;AAAA,GACF,CAAA;AAEA,EAAA,IAAI,eAAe,IAAS,KAAA,KAAA,CAAA;AAC1B,IAAA,KAAA,CAAM,IAAO,GAAA,aAAA,CAAc,KAAM,CAAA,IAAA,EAAM,cAAc,IAAI,CAAA,CAAA;AAC3D,EAAA,IAAI,eAAe,KAAU,KAAA,KAAA,CAAA;AAC3B,IAAA,KAAA,CAAM,OAAU,GAAA,aAAA,CAAc,KAAM,CAAA,OAAA,EAAS,cAAc,KAAK,CAAA,CAAA;AAElE,EAAO,OAAA,KAAA,CAAA;AACT;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/number/index.ts"],"sourcesContent":["export interface ISetBoundary {\n number?: number | string;\n min?: number;\n max?: number;\n loop?: boolean;\n}\n\n/**\n * Añade límites a un número, impidiendo que sea\n * inferior o superior a los límites establecidos.\n *\n * Si se pasa loop en true, al llegar al valor maximo o minimo regresara al\n * minimo o maximo respectivamente.\n */\nexport function addBoundary(\n num: number,\n min: number,\n max?: number,\n loop?: boolean,\n): number;\nexport function addBoundary(definition: ISetBoundary): number;\nexport function addBoundary(\n definition: ISetBoundary | number,\n min?: number,\n max?: number,\n loop?: boolean,\n) {\n const actualNumber =\n typeof definition === 'number' ? definition : definition.number;\n const actualMin = typeof definition === 'number' ? min : definition.min;\n const actualMax = typeof definition === 'number' ? max : definition.max;\n const isActualLoop = typeof definition === 'number' ? loop : definition.loop;\n\n let newNumber = Number(actualNumber ?? 0);\n if (actualMin !== undefined && newNumber < actualMin) {\n if (actualMax !== undefined && isActualLoop) {\n newNumber = actualMax;\n } else {\n newNumber = actualMin;\n }\n }\n if (actualMax !== undefined && newNumber > actualMax) {\n if (actualMin !== undefined && isActualLoop) {\n newNumber = actualMin;\n } else {\n newNumber = actualMax;\n }\n }\n return newNumber;\n}\n\nconst sizeUnits = ['b', 'kb', 'mb', 'gb', 'tb'];\n/**\n * Esta función acepta un número y devuelve la representaciíon\n * en string de su tamaño en disco. Ej: 1024 => 1kb\n */\nexport function parseAsSize(num: number): string {\n let index = 0;\n let finalSize = num;\n\n if (finalSize === Infinity) return '1000GB';\n\n while (finalSize > 1024) {\n finalSize /= 1024;\n index++;\n }\n return `${Math.round(finalSize * 10) / 10}${sizeUnits[index]}`;\n}\n\n/**\n * Toma cualquier valor y devuelve siempre un número. En caso de que el valor\n * casteado con la función Number(value) de NaN, devuelve defaultReturn, que por\n * defecto es 0\n */\nexport function noNaN(number: unknown, defaultReturn = 0) {\n const returnNumber = Number(number);\n if (number === null || Number.isNaN(returnNumber)) return defaultReturn;\n return returnNumber;\n}\n"],"names":[],"mappings":"AAqBO,SAAS,WACd,CAAA,UAAA,EACA,GACA,EAAA,GAAA,EACA,IACA,EAAA;AACA,EAAA,MAAM,YACJ,GAAA,OAAO,UAAe,KAAA,QAAA,GAAW,aAAa,UAAW,CAAA,MAAA,CAAA;AAC3D,EAAA,MAAM,SAAY,GAAA,OAAO,UAAe,KAAA,QAAA,GAAW,MAAM,UAAW,CAAA,GAAA,CAAA;AACpE,EAAA,MAAM,SAAY,GAAA,OAAO,UAAe,KAAA,QAAA,GAAW,MAAM,UAAW,CAAA,GAAA,CAAA;AACpE,EAAA,MAAM,YAAe,GAAA,OAAO,UAAe,KAAA,QAAA,GAAW,OAAO,UAAW,CAAA,IAAA,CAAA;AAExE,EAAI,IAAA,SAAA,GAAY,MAAO,CAAA,YAAA,IAAgB,CAAC,CAAA,CAAA;AACxC,EAAI,IAAA,SAAA,KAAc,KAAa,CAAA,IAAA,SAAA,GAAY,SAAW,EAAA;AACpD,IAAI,IAAA,SAAA,KAAc,UAAa,YAAc,EAAA;AAC3C,MAAY,SAAA,GAAA,SAAA,CAAA;AAAA,KACP,MAAA;AACL,MAAY,SAAA,GAAA,SAAA,CAAA;AAAA,KACd;AAAA,GACF;AACA,EAAI,IAAA,SAAA,KAAc,KAAa,CAAA,IAAA,SAAA,GAAY,SAAW,EAAA;AACpD,IAAI,IAAA,SAAA,KAAc,UAAa,YAAc,EAAA;AAC3C,MAAY,SAAA,GAAA,SAAA,CAAA;AAAA,KACP,MAAA;AACL,MAAY,SAAA,GAAA,SAAA,CAAA;AAAA,KACd;AAAA,GACF;AACA,EAAO,OAAA,SAAA,CAAA;AACT,CAAA;AAEA,MAAM,YAAY,CAAC,GAAA,EAAK,IAAM,EAAA,IAAA,EAAM,MAAM,IAAI,CAAA,CAAA;AAKvC,SAAS,YAAY,GAAqB,EAAA;AAC/C,EAAA,IAAI,KAAQ,GAAA,CAAA,CAAA;AACZ,EAAA,IAAI,SAAY,GAAA,GAAA,CAAA;AAEhB,EAAA,IAAI,SAAc,KAAA,QAAA;AAAU,IAAO,OAAA,QAAA,CAAA;AAEnC,EAAA,OAAO,YAAY,IAAM,EAAA;AACvB,IAAa,SAAA,IAAA,IAAA,CAAA;AACb,IAAA,KAAA,EAAA,CAAA;AAAA,GACF;AACA,EAAO,OAAA,CAAA,EAAG,IAAK,CAAA,KAAA,CAAM,SAAY,GAAA,EAAE,IAAI,EAAE,CAAA,EAAG,SAAU,CAAA,KAAK,CAAC,CAAA,CAAA,CAAA;AAC9D,CAAA;AAOgB,SAAA,KAAA,CAAM,MAAiB,EAAA,aAAA,GAAgB,CAAG,EAAA;AACxD,EAAM,MAAA,YAAA,GAAe,OAAO,MAAM,CAAA,CAAA;AAClC,EAAA,IAAI,MAAW,KAAA,IAAA,IAAQ,MAAO,CAAA,KAAA,CAAM,YAAY,CAAA;AAAG,IAAO,OAAA,aAAA,CAAA;AAC1D,EAAO,OAAA,YAAA,CAAA;AACT;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../../src/number/index.ts"],"sourcesContent":["export interface ISetBoundary {\r\n number?: number | string;\r\n min?: number;\r\n max?: number;\r\n loop?: boolean;\r\n}\r\n\r\n/**\r\n * Añade límites a un número, impidiendo que sea\r\n * inferior o superior a los límites establecidos.\r\n *\r\n * Si se pasa loop en true, al llegar al valor maximo o minimo regresara al\r\n * minimo o maximo respectivamente.\r\n */\r\nexport function addBoundary(\r\n num: number,\r\n min: number,\r\n max?: number,\r\n loop?: boolean,\r\n): number;\r\nexport function addBoundary(definition: ISetBoundary): number;\r\nexport function addBoundary(\r\n definition: ISetBoundary | number,\r\n min?: number,\r\n max?: number,\r\n loop?: boolean,\r\n) {\r\n const actualNumber =\r\n typeof definition === 'number' ? definition : definition.number;\r\n const actualMin = typeof definition === 'number' ? min : definition.min;\r\n const actualMax = typeof definition === 'number' ? max : definition.max;\r\n const isActualLoop = typeof definition === 'number' ? loop : definition.loop;\r\n\r\n let newNumber = Number(actualNumber ?? 0);\r\n if (actualMin !== undefined && newNumber < actualMin) {\r\n if (actualMax !== undefined && isActualLoop) {\r\n newNumber = actualMax;\r\n } else {\r\n newNumber = actualMin;\r\n }\r\n }\r\n if (actualMax !== undefined && newNumber > actualMax) {\r\n if (actualMin !== undefined && isActualLoop) {\r\n newNumber = actualMin;\r\n } else {\r\n newNumber = actualMax;\r\n }\r\n }\r\n return newNumber;\r\n}\r\n\r\nconst sizeUnits = ['b', 'kb', 'mb', 'gb', 'tb'];\r\n/**\r\n * Esta función acepta un número y devuelve la representaciíon\r\n * en string de su tamaño en disco. Ej: 1024 => 1kb\r\n */\r\nexport function parseAsSize(num: number): string {\r\n let index = 0;\r\n let finalSize = num;\r\n\r\n if (finalSize === Infinity) return '1000GB';\r\n\r\n while (finalSize > 1024) {\r\n finalSize /= 1024;\r\n index++;\r\n }\r\n return `${Math.round(finalSize * 10) / 10}${sizeUnits[index]}`;\r\n}\r\n\r\n/**\r\n * Toma cualquier valor y devuelve siempre un número. En caso de que el valor\r\n * casteado con la función Number(value) de NaN, devuelve defaultReturn, que por\r\n * defecto es 0\r\n */\r\nexport function noNaN(number: unknown, defaultReturn = 0) {\r\n const returnNumber = Number(number);\r\n if (number === null || Number.isNaN(returnNumber)) return defaultReturn;\r\n return returnNumber;\r\n}\r\n"],"names":[],"mappings":"AAqBO,SAAS,WACd,CAAA,UAAA,EACA,GACA,EAAA,GAAA,EACA,IACA,EAAA;AACA,EAAA,MAAM,YACJ,GAAA,OAAO,UAAe,KAAA,QAAA,GAAW,aAAa,UAAW,CAAA,MAAA,CAAA;AAC3D,EAAA,MAAM,SAAY,GAAA,OAAO,UAAe,KAAA,QAAA,GAAW,MAAM,UAAW,CAAA,GAAA,CAAA;AACpE,EAAA,MAAM,SAAY,GAAA,OAAO,UAAe,KAAA,QAAA,GAAW,MAAM,UAAW,CAAA,GAAA,CAAA;AACpE,EAAA,MAAM,YAAe,GAAA,OAAO,UAAe,KAAA,QAAA,GAAW,OAAO,UAAW,CAAA,IAAA,CAAA;AAExE,EAAI,IAAA,SAAA,GAAY,MAAO,CAAA,YAAA,IAAgB,CAAC,CAAA,CAAA;AACxC,EAAI,IAAA,SAAA,KAAc,KAAa,CAAA,IAAA,SAAA,GAAY,SAAW,EAAA;AACpD,IAAI,IAAA,SAAA,KAAc,UAAa,YAAc,EAAA;AAC3C,MAAY,SAAA,GAAA,SAAA,CAAA;AAAA,KACP,MAAA;AACL,MAAY,SAAA,GAAA,SAAA,CAAA;AAAA,KACd;AAAA,GACF;AACA,EAAI,IAAA,SAAA,KAAc,KAAa,CAAA,IAAA,SAAA,GAAY,SAAW,EAAA;AACpD,IAAI,IAAA,SAAA,KAAc,UAAa,YAAc,EAAA;AAC3C,MAAY,SAAA,GAAA,SAAA,CAAA;AAAA,KACP,MAAA;AACL,MAAY,SAAA,GAAA,SAAA,CAAA;AAAA,KACd;AAAA,GACF;AACA,EAAO,OAAA,SAAA,CAAA;AACT,CAAA;AAEA,MAAM,YAAY,CAAC,GAAA,EAAK,IAAM,EAAA,IAAA,EAAM,MAAM,IAAI,CAAA,CAAA;AAKvC,SAAS,YAAY,GAAqB,EAAA;AAC/C,EAAA,IAAI,KAAQ,GAAA,CAAA,CAAA;AACZ,EAAA,IAAI,SAAY,GAAA,GAAA,CAAA;AAEhB,EAAA,IAAI,SAAc,KAAA,QAAA;AAAU,IAAO,OAAA,QAAA,CAAA;AAEnC,EAAA,OAAO,YAAY,IAAM,EAAA;AACvB,IAAa,SAAA,IAAA,IAAA,CAAA;AACb,IAAA,KAAA,EAAA,CAAA;AAAA,GACF;AACA,EAAO,OAAA,CAAA,EAAG,IAAK,CAAA,KAAA,CAAM,SAAY,GAAA,EAAE,IAAI,EAAE,CAAA,EAAG,SAAU,CAAA,KAAK,CAAC,CAAA,CAAA,CAAA;AAC9D,CAAA;AAOgB,SAAA,KAAA,CAAM,MAAiB,EAAA,aAAA,GAAgB,CAAG,EAAA;AACxD,EAAM,MAAA,YAAA,GAAe,OAAO,MAAM,CAAA,CAAA;AAClC,EAAA,IAAI,MAAW,KAAA,IAAA,IAAQ,MAAO,CAAA,KAAA,CAAM,YAAY,CAAA;AAAG,IAAO,OAAA,aAAA,CAAA;AAC1D,EAAO,OAAA,YAAA,CAAA;AACT;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"getValueByPath.js","sources":["../../src/objects/getValueByPath.ts"],"sourcesContent":["/**\n * Este método itera sobre un objeto hasta encontrar la ruta especificada\n *\n * @example\n *\n const obj = {\n a: {\n b: {\n c: {\n d: \"d\"\n }\n }\n }\n };\n\n console.log(getValueByPath(obj,'a.b.c')) // { d: 'd' }\n console.log(getValueByPath(obj,'a.b.c.d')) // 'd'\n *\n */\nexport function getValueByPath(\n obj: Record<string, unknown>,\n path: string | string[],\n separator = '.',\n): unknown {\n const actualPath = typeof path === 'string' ? path.split(separator) : path;\n if (typeof obj !== 'object' || !obj) {\n if (actualPath.length === 0) return obj;\n return undefined;\n }\n const currentStep = actualPath.shift() as string;\n if (actualPath.length === 0) return obj[currentStep];\n return getValueByPath(\n obj[currentStep] as Record<string, unknown>,\n actualPath,\n separator,\n );\n}\n"],"names":[],"mappings":"AAmBO,SAAS,cACd,CAAA,GAAA,EACA,IACA,EAAA,SAAA,GAAY,GACH,EAAA;AACT,EAAA,MAAM,aAAa,OAAO,IAAA,KAAS,WAAW,IAAK,CAAA,KAAA,CAAM,SAAS,CAAI,GAAA,IAAA,CAAA;AACtE,EAAA,IAAI,OAAO,GAAA,KAAQ,QAAY,IAAA,CAAC,GAAK,EAAA;AACnC,IAAA,IAAI,WAAW,MAAW,KAAA,CAAA;AAAG,MAAO,OAAA,GAAA,CAAA;AACpC,IAAO,OAAA,KAAA,CAAA,CAAA;AAAA,GACT;AACA,EAAM,MAAA,WAAA,GAAc,WAAW,KAAM,EAAA,CAAA;AACrC,EAAA,IAAI,WAAW,MAAW,KAAA,CAAA;AAAG,IAAA,OAAO,IAAI,WAAW,CAAA,CAAA;AACnD,EAAO,OAAA,cAAA;AAAA,IACL,IAAI,WAAW,CAAA;AAAA,IACf,UAAA;AAAA,IACA,SAAA;AAAA,GACF,CAAA;AACF;;;;"}
1
+ {"version":3,"file":"getValueByPath.js","sources":["../../src/objects/getValueByPath.ts"],"sourcesContent":["/**\r\n * Este método itera sobre un objeto hasta encontrar la ruta especificada\r\n *\r\n * @example\r\n *\r\n const obj = {\r\n a: {\r\n b: {\r\n c: {\r\n d: \"d\"\r\n }\r\n }\r\n }\r\n };\r\n\r\n console.log(getValueByPath(obj,'a.b.c')) // { d: 'd' }\r\n console.log(getValueByPath(obj,'a.b.c.d')) // 'd'\r\n *\r\n */\r\nexport function getValueByPath(\r\n obj: Record<string, unknown>,\r\n path: string | string[],\r\n separator = '.',\r\n): unknown {\r\n const actualPath = typeof path === 'string' ? path.split(separator) : path;\r\n if (typeof obj !== 'object' || !obj) {\r\n if (actualPath.length === 0) return obj;\r\n return undefined;\r\n }\r\n const currentStep = actualPath.shift() as string;\r\n if (actualPath.length === 0) return obj[currentStep];\r\n return getValueByPath(\r\n obj[currentStep] as Record<string, unknown>,\r\n actualPath,\r\n separator,\r\n );\r\n}\r\n"],"names":[],"mappings":"AAmBO,SAAS,cACd,CAAA,GAAA,EACA,IACA,EAAA,SAAA,GAAY,GACH,EAAA;AACT,EAAA,MAAM,aAAa,OAAO,IAAA,KAAS,WAAW,IAAK,CAAA,KAAA,CAAM,SAAS,CAAI,GAAA,IAAA,CAAA;AACtE,EAAA,IAAI,OAAO,GAAA,KAAQ,QAAY,IAAA,CAAC,GAAK,EAAA;AACnC,IAAA,IAAI,WAAW,MAAW,KAAA,CAAA;AAAG,MAAO,OAAA,GAAA,CAAA;AACpC,IAAO,OAAA,KAAA,CAAA,CAAA;AAAA,GACT;AACA,EAAM,MAAA,WAAA,GAAc,WAAW,KAAM,EAAA,CAAA;AACrC,EAAA,IAAI,WAAW,MAAW,KAAA,CAAA;AAAG,IAAA,OAAO,IAAI,WAAW,CAAA,CAAA;AACnD,EAAO,OAAA,cAAA;AAAA,IACL,IAAI,WAAW,CAAA;AAAA,IACf,UAAA;AAAA,IACA,SAAA;AAAA,GACF,CAAA;AACF;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"setValueByPath.js","sources":["../../src/objects/setValueByPath.ts"],"sourcesContent":["import clone from 'lodash-es/clone';\n\n/**\n * Permite escribir una propiedad en un objeto, en una ruta especificada. Si\n * dicha ruta no existe dentro del objeto la crea, siempre que sea posible. No\n * será posible en caso de que alguno de los elementos de la ruta contenga una\n * propiedad que no sea de tipo objeto.\n *\n * @param obj El objeto donde se desea escribir la propiedad\n * @param path La ruta en la que se va a escribir\n * @param value El valor que se va a escribir en la ruta especificada\n * @returns Un objeto idéntico del recibido pero co nlos cambios aplicados\n *\n * @throws { Error } En caso de que la ruta especificada contenga algún elemento que no puede ser escrito.\n *\n * @example\n *\n * const a = {\n * a: {}\n * };\n *\n * setValueByPath(a, 'a.b.c', 'Hello world');\n * /* Outputs:\n * {\n * a: {\n * b: {\n * c: 'Hello world'\n * }\n * }\n * }\n */\nexport function setValueByPath(\n obj: Record<string, unknown>,\n path: string,\n value: unknown,\n) {\n if (path === '') return value as Record<string, unknown>;\n\n const steps = path.split('.');\n if (steps.length === 0) {\n console.warn(`An empty path was provoided ${path}`);\n return null;\n }\n const originalClonedObject = clone(obj ?? {});\n let currentObj = originalClonedObject;\n for (let i = 0; i < steps.length - 1; i++) {\n if (!currentObj[steps[i]]) currentObj[steps[i]] = {};\n if (typeof currentObj[steps[i]] === 'object') {\n currentObj = currentObj[steps[i]] as Record<string, unknown>;\n } else {\n console.info({\n originalObject: obj,\n originalPath: path,\n currentObj,\n currentStep: steps[i],\n });\n throw new Error(\n `The provided path ${path} cannot be applied due to it is not an object's path.`,\n );\n }\n }\n currentObj[steps.pop() as string] = value;\n return originalClonedObject;\n}\n"],"names":[],"mappings":";;AA+BgB,SAAA,cAAA,CACd,GACA,EAAA,IAAA,EACA,KACA,EAAA;AACA,EAAA,IAAI,IAAS,KAAA,EAAA;AAAI,IAAO,OAAA,KAAA,CAAA;AAExB,EAAM,MAAA,KAAA,GAAQ,IAAK,CAAA,KAAA,CAAM,GAAG,CAAA,CAAA;AAC5B,EAAI,IAAA,KAAA,CAAM,WAAW,CAAG,EAAA;AACtB,IAAQ,OAAA,CAAA,IAAA,CAAK,CAA+B,4BAAA,EAAA,IAAI,CAAE,CAAA,CAAA,CAAA;AAClD,IAAO,OAAA,IAAA,CAAA;AAAA,GACT;AACA,EAAA,MAAM,oBAAuB,GAAA,KAAA,CAAM,GAAO,IAAA,EAAE,CAAA,CAAA;AAC5C,EAAA,IAAI,UAAa,GAAA,oBAAA,CAAA;AACjB,EAAA,KAAA,IAAS,IAAI,CAAG,EAAA,CAAA,GAAI,KAAM,CAAA,MAAA,GAAS,GAAG,CAAK,EAAA,EAAA;AACzC,IAAA,IAAI,CAAC,UAAA,CAAW,KAAM,CAAA,CAAC,CAAC,CAAA;AAAG,MAAA,UAAA,CAAW,KAAM,CAAA,CAAC,CAAC,CAAA,GAAI,EAAC,CAAA;AACnD,IAAA,IAAI,OAAO,UAAW,CAAA,KAAA,CAAM,CAAC,CAAC,MAAM,QAAU,EAAA;AAC5C,MAAa,UAAA,GAAA,UAAA,CAAW,KAAM,CAAA,CAAC,CAAC,CAAA,CAAA;AAAA,KAC3B,MAAA;AACL,MAAA,OAAA,CAAQ,IAAK,CAAA;AAAA,QACX,cAAgB,EAAA,GAAA;AAAA,QAChB,YAAc,EAAA,IAAA;AAAA,QACd,UAAA;AAAA,QACA,WAAA,EAAa,MAAM,CAAC,CAAA;AAAA,OACrB,CAAA,CAAA;AACD,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,qBAAqB,IAAI,CAAA,qDAAA,CAAA;AAAA,OAC3B,CAAA;AAAA,KACF;AAAA,GACF;AACA,EAAW,UAAA,CAAA,KAAA,CAAM,GAAI,EAAW,CAAI,GAAA,KAAA,CAAA;AACpC,EAAO,OAAA,oBAAA,CAAA;AACT;;;;"}
1
+ {"version":3,"file":"setValueByPath.js","sources":["../../src/objects/setValueByPath.ts"],"sourcesContent":["import clone from 'lodash-es/clone';\r\n\r\n/**\r\n * Permite escribir una propiedad en un objeto, en una ruta especificada. Si\r\n * dicha ruta no existe dentro del objeto la crea, siempre que sea posible. No\r\n * será posible en caso de que alguno de los elementos de la ruta contenga una\r\n * propiedad que no sea de tipo objeto.\r\n *\r\n * @param obj El objeto donde se desea escribir la propiedad\r\n * @param path La ruta en la que se va a escribir\r\n * @param value El valor que se va a escribir en la ruta especificada\r\n * @returns Un objeto idéntico del recibido pero co nlos cambios aplicados\r\n *\r\n * @throws { Error } En caso de que la ruta especificada contenga algún elemento que no puede ser escrito.\r\n *\r\n * @example\r\n *\r\n * const a = {\r\n * a: {}\r\n * };\r\n *\r\n * setValueByPath(a, 'a.b.c', 'Hello world');\r\n * /* Outputs:\r\n * {\r\n * a: {\r\n * b: {\r\n * c: 'Hello world'\r\n * }\r\n * }\r\n * }\r\n */\r\nexport function setValueByPath(\r\n obj: Record<string, unknown>,\r\n path: string,\r\n value: unknown,\r\n) {\r\n if (path === '') return value as Record<string, unknown>;\r\n\r\n const steps = path.split('.');\r\n if (steps.length === 0) {\r\n console.warn(`An empty path was provoided ${path}`);\r\n return null;\r\n }\r\n const originalClonedObject = clone(obj ?? {});\r\n let currentObj = originalClonedObject;\r\n for (let i = 0; i < steps.length - 1; i++) {\r\n if (!currentObj[steps[i]]) currentObj[steps[i]] = {};\r\n if (typeof currentObj[steps[i]] === 'object') {\r\n currentObj = currentObj[steps[i]] as Record<string, unknown>;\r\n } else {\r\n console.info({\r\n originalObject: obj,\r\n originalPath: path,\r\n currentObj,\r\n currentStep: steps[i],\r\n });\r\n throw new Error(\r\n `The provided path ${path} cannot be applied due to it is not an object's path.`,\r\n );\r\n }\r\n }\r\n currentObj[steps.pop() as string] = value;\r\n return originalClonedObject;\r\n}\r\n"],"names":[],"mappings":";;AA+BgB,SAAA,cAAA,CACd,GACA,EAAA,IAAA,EACA,KACA,EAAA;AACA,EAAA,IAAI,IAAS,KAAA,EAAA;AAAI,IAAO,OAAA,KAAA,CAAA;AAExB,EAAM,MAAA,KAAA,GAAQ,IAAK,CAAA,KAAA,CAAM,GAAG,CAAA,CAAA;AAC5B,EAAI,IAAA,KAAA,CAAM,WAAW,CAAG,EAAA;AACtB,IAAQ,OAAA,CAAA,IAAA,CAAK,CAA+B,4BAAA,EAAA,IAAI,CAAE,CAAA,CAAA,CAAA;AAClD,IAAO,OAAA,IAAA,CAAA;AAAA,GACT;AACA,EAAA,MAAM,oBAAuB,GAAA,KAAA,CAAM,GAAO,IAAA,EAAE,CAAA,CAAA;AAC5C,EAAA,IAAI,UAAa,GAAA,oBAAA,CAAA;AACjB,EAAA,KAAA,IAAS,IAAI,CAAG,EAAA,CAAA,GAAI,KAAM,CAAA,MAAA,GAAS,GAAG,CAAK,EAAA,EAAA;AACzC,IAAA,IAAI,CAAC,UAAA,CAAW,KAAM,CAAA,CAAC,CAAC,CAAA;AAAG,MAAA,UAAA,CAAW,KAAM,CAAA,CAAC,CAAC,CAAA,GAAI,EAAC,CAAA;AACnD,IAAA,IAAI,OAAO,UAAW,CAAA,KAAA,CAAM,CAAC,CAAC,MAAM,QAAU,EAAA;AAC5C,MAAa,UAAA,GAAA,UAAA,CAAW,KAAM,CAAA,CAAC,CAAC,CAAA,CAAA;AAAA,KAC3B,MAAA;AACL,MAAA,OAAA,CAAQ,IAAK,CAAA;AAAA,QACX,cAAgB,EAAA,GAAA;AAAA,QAChB,YAAc,EAAA,IAAA;AAAA,QACd,UAAA;AAAA,QACA,WAAA,EAAa,MAAM,CAAC,CAAA;AAAA,OACrB,CAAA,CAAA;AACD,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,qBAAqB,IAAI,CAAA,qDAAA,CAAA;AAAA,OAC3B,CAAA;AAAA,KACF;AAAA,GACF;AACA,EAAW,UAAA,CAAA,KAAA,CAAM,GAAI,EAAW,CAAI,GAAA,KAAA,CAAA;AACpC,EAAO,OAAA,oBAAA,CAAA;AACT;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"propsStore.js","sources":["../../src/propsStore/propsStore.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-dynamic-delete */\nimport cloneDeep from 'lodash-es/cloneDeep';\nimport {\n TProperties,\n TPropsSuscriptor,\n TUpdateFieldConfiguration,\n} from './types';\nimport { debugDispatcher } from '../debug';\nimport { TId } from '../types';\nimport { persistentStorage } from '../storage';\n\nconst propsLog = 'propsLog';\nexport const PropsSelectorUndefinedObject = {};\n\ninterface IPropsStoreConf {\n logCommands: {\n propsStore?: string;\n updateProp?: string;\n propsSuscriptors?: string;\n propsLog?: string;\n };\n}\n\nexport class PropsStore<\n PropsType extends Record<TId, unknown> = Record<TId, unknown>,\n> {\n log = persistentStorage[propsLog];\n\n fields: Record<TId, PropsType> = {};\n\n suscriptors: Record<TId, TPropsSuscriptor<PropsType>[]> = {};\n\n loggers: Record<string, (props: unknown[]) => void> = {\n propsLog: ([log]) => {\n this.log = log;\n persistentStorage[propsLog] = log;\n },\n propsStore: ([fieldId]) => {\n if (fieldId) console.info(this.fields[fieldId as TId]);\n else console.info(this.fields);\n },\n propsSuscriptors: ([fieldId]) => {\n if (fieldId) console.info(this.suscriptors[fieldId as TId]);\n else console.info(this.suscriptors);\n },\n updateProp: ([fieldId, newProps]) => {\n this.updateField(fieldId as TId, newProps as PropsType);\n },\n };\n\n constructor(private configuration?: IPropsStoreConf) {\n if (this.configuration) {\n if (this.configuration.logCommands.propsStore)\n debugDispatcher.on(\n this.configuration.logCommands.propsStore,\n this.loggers.propsStore,\n 'Muestra el contenido actual del propsStore',\n );\n if (this.configuration.logCommands.updateProp)\n debugDispatcher.on(\n this.configuration.logCommands.updateProp,\n this.loggers.updateProp,\n 'dd.updateProp(fieldId, newProps). El objeto newProps será mergeado sobre las props actuales',\n );\n if (this.configuration.logCommands.propsSuscriptors)\n debugDispatcher.on(\n this.configuration.logCommands.propsSuscriptors,\n this.loggers.propsSuscriptors,\n 'Muestra los suscriptores actuales del propsStore',\n );\n if (this.configuration.logCommands.propsLog)\n debugDispatcher.on(\n this.configuration.logCommands.propsLog,\n this.loggers.propsLog,\n 'Si se pasa como true, hace log de las acciones. Si se pasa como trace(fieldId), se hace log de todas las acciones y trace del campo especificado. Si se pasa trace(), hace log y trace de todas las acciones.',\n );\n }\n }\n\n destructor() {\n if (this.configuration) {\n if (this.configuration.logCommands.propsStore)\n debugDispatcher.off(\n this.configuration.logCommands.propsStore,\n this.loggers.propsStore,\n );\n if (this.configuration.logCommands.updateProp)\n debugDispatcher.off(\n this.configuration.logCommands.updateProp,\n this.loggers.updateProp,\n );\n if (this.configuration.logCommands.propsSuscriptors)\n debugDispatcher.off(\n this.configuration.logCommands.propsSuscriptors,\n this.loggers.propsSuscriptors,\n );\n if (this.configuration.logCommands.propsLog)\n debugDispatcher.off(\n this.configuration.logCommands.propsLog,\n this.loggers.propsLog,\n );\n }\n }\n\n getAllFields() {\n return cloneDeep(this.fields);\n }\n\n /**\n * Devuelve los props actuales de un campo.\n */\n getFieldProps<ParsedPropsType = PropsType>(fieldId: TId) {\n return this.fields[fieldId] as unknown as ParsedPropsType;\n }\n\n removeField(fieldId: TId) {\n this.suscriptors[fieldId] = [];\n delete this.fields[fieldId];\n if (this.log) console.info(`propsStore: removeNode ${fieldId}`);\n }\n\n /**\n * Permite establecer un suscriptor que será llamado\n * cada vez que las props del campo especificado cambien.\n */\n suscribe(fieldId: TId, callback: TPropsSuscriptor<PropsType>) {\n if (!this.suscriptors[fieldId]) this.suscriptors[fieldId] = [];\n\n this.suscriptors[fieldId].push(callback);\n\n callback(this.fields[fieldId] ?? PropsSelectorUndefinedObject);\n\n return () => {\n this.suscriptors[fieldId] = this.suscriptors[fieldId].filter(\n (current) => {\n return current !== callback;\n },\n );\n };\n }\n\n /**\n * Actualiza o crea las props de un campo.\n *\n * La tercera prop está relacionada\n */\n updateField<NewPropsType extends Record<TId, unknown> = Partial<PropsType>>(\n fieldId: TId,\n props: Partial<NewPropsType>,\n conf?: TUpdateFieldConfiguration,\n ) {\n if (fieldId === undefined) return;\n\n const { noEmit, isUrgent } = conf ?? {};\n const newProps = { ...this.fields[fieldId], ...props };\n this.fields[fieldId] = newProps;\n\n if (this.log === true || this.log === fieldId)\n console.info({ fieldId, props });\n if (this.log === 'trace') console.trace();\n else {\n const logId =\n typeof this.log === 'string' &&\n (this.log.match(/trace\\(([^)]+)\\)/) ?? [])[1];\n if (fieldId === logId) console.trace();\n }\n\n if (!noEmit) {\n this.suscriptors[fieldId]?.forEach((current) => {\n return current(newProps, isUrgent);\n });\n this.suscriptors.any?.forEach((current) => {\n return current({ ...newProps, fieldId }, isUrgent);\n });\n }\n }\n}\n\nexport const propsStore = new PropsStore<TProperties>({\n logCommands: {\n propsLog: 'propsLog',\n propsStore: 'propsStore',\n propsSuscriptors: 'propsSuscriptors',\n updateProp: 'updateProp',\n },\n});\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"propsStore.js","sources":["../../src/propsStore/propsStore.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-dynamic-delete */\r\nimport cloneDeep from 'lodash-es/cloneDeep';\r\nimport {\r\n TProperties,\r\n TPropsSuscriptor,\r\n TUpdateFieldConfiguration,\r\n} from './types';\r\nimport { debugDispatcher } from '../debug';\r\nimport { TId } from '../types';\r\nimport { persistentStorage } from '../storage';\r\n\r\nconst propsLog = 'propsLog';\r\nexport const PropsSelectorUndefinedObject = {};\r\n\r\ninterface IPropsStoreConf {\r\n logCommands: {\r\n propsStore?: string;\r\n updateProp?: string;\r\n propsSuscriptors?: string;\r\n propsLog?: string;\r\n };\r\n}\r\n\r\nexport class PropsStore<\r\n PropsType extends Record<TId, unknown> = Record<TId, unknown>,\r\n> {\r\n log = persistentStorage[propsLog];\r\n\r\n fields: Record<TId, PropsType> = {};\r\n\r\n suscriptors: Record<TId, TPropsSuscriptor<PropsType>[]> = {};\r\n\r\n loggers: Record<string, (props: unknown[]) => void> = {\r\n propsLog: ([log]) => {\r\n this.log = log;\r\n persistentStorage[propsLog] = log;\r\n },\r\n propsStore: ([fieldId]) => {\r\n if (fieldId) console.info(this.fields[fieldId as TId]);\r\n else console.info(this.fields);\r\n },\r\n propsSuscriptors: ([fieldId]) => {\r\n if (fieldId) console.info(this.suscriptors[fieldId as TId]);\r\n else console.info(this.suscriptors);\r\n },\r\n updateProp: ([fieldId, newProps]) => {\r\n this.updateField(fieldId as TId, newProps as PropsType);\r\n },\r\n };\r\n\r\n constructor(private configuration?: IPropsStoreConf) {\r\n if (this.configuration) {\r\n if (this.configuration.logCommands.propsStore)\r\n debugDispatcher.on(\r\n this.configuration.logCommands.propsStore,\r\n this.loggers.propsStore,\r\n 'Muestra el contenido actual del propsStore',\r\n );\r\n if (this.configuration.logCommands.updateProp)\r\n debugDispatcher.on(\r\n this.configuration.logCommands.updateProp,\r\n this.loggers.updateProp,\r\n 'dd.updateProp(fieldId, newProps). El objeto newProps será mergeado sobre las props actuales',\r\n );\r\n if (this.configuration.logCommands.propsSuscriptors)\r\n debugDispatcher.on(\r\n this.configuration.logCommands.propsSuscriptors,\r\n this.loggers.propsSuscriptors,\r\n 'Muestra los suscriptores actuales del propsStore',\r\n );\r\n if (this.configuration.logCommands.propsLog)\r\n debugDispatcher.on(\r\n this.configuration.logCommands.propsLog,\r\n this.loggers.propsLog,\r\n 'Si se pasa como true, hace log de las acciones. Si se pasa como trace(fieldId), se hace log de todas las acciones y trace del campo especificado. Si se pasa trace(), hace log y trace de todas las acciones.',\r\n );\r\n }\r\n }\r\n\r\n destructor() {\r\n if (this.configuration) {\r\n if (this.configuration.logCommands.propsStore)\r\n debugDispatcher.off(\r\n this.configuration.logCommands.propsStore,\r\n this.loggers.propsStore,\r\n );\r\n if (this.configuration.logCommands.updateProp)\r\n debugDispatcher.off(\r\n this.configuration.logCommands.updateProp,\r\n this.loggers.updateProp,\r\n );\r\n if (this.configuration.logCommands.propsSuscriptors)\r\n debugDispatcher.off(\r\n this.configuration.logCommands.propsSuscriptors,\r\n this.loggers.propsSuscriptors,\r\n );\r\n if (this.configuration.logCommands.propsLog)\r\n debugDispatcher.off(\r\n this.configuration.logCommands.propsLog,\r\n this.loggers.propsLog,\r\n );\r\n }\r\n }\r\n\r\n getAllFields() {\r\n return cloneDeep(this.fields);\r\n }\r\n\r\n /**\r\n * Devuelve los props actuales de un campo.\r\n */\r\n getFieldProps<ParsedPropsType = PropsType>(fieldId: TId) {\r\n return this.fields[fieldId] as unknown as ParsedPropsType;\r\n }\r\n\r\n removeField(fieldId: TId) {\r\n this.suscriptors[fieldId] = [];\r\n delete this.fields[fieldId];\r\n if (this.log) console.info(`propsStore: removeNode ${fieldId}`);\r\n }\r\n\r\n /**\r\n * Permite establecer un suscriptor que será llamado\r\n * cada vez que las props del campo especificado cambien.\r\n */\r\n suscribe(fieldId: TId, callback: TPropsSuscriptor<PropsType>) {\r\n if (!this.suscriptors[fieldId]) this.suscriptors[fieldId] = [];\r\n\r\n this.suscriptors[fieldId].push(callback);\r\n\r\n callback(this.fields[fieldId] ?? PropsSelectorUndefinedObject);\r\n\r\n return () => {\r\n this.suscriptors[fieldId] = this.suscriptors[fieldId].filter(\r\n (current) => {\r\n return current !== callback;\r\n },\r\n );\r\n };\r\n }\r\n\r\n /**\r\n * Actualiza o crea las props de un campo.\r\n *\r\n * La tercera prop está relacionada\r\n */\r\n updateField<NewPropsType extends Record<TId, unknown> = Partial<PropsType>>(\r\n fieldId: TId,\r\n props: Partial<NewPropsType>,\r\n conf?: TUpdateFieldConfiguration,\r\n ) {\r\n if (fieldId === undefined) return;\r\n\r\n const { noEmit, isUrgent } = conf ?? {};\r\n const newProps = { ...this.fields[fieldId], ...props };\r\n this.fields[fieldId] = newProps;\r\n\r\n if (this.log === true || this.log === fieldId)\r\n console.info({ fieldId, props });\r\n if (this.log === 'trace') console.trace();\r\n else {\r\n const logId =\r\n typeof this.log === 'string' &&\r\n (this.log.match(/trace\\(([^)]+)\\)/) ?? [])[1];\r\n if (fieldId === logId) console.trace();\r\n }\r\n\r\n if (!noEmit) {\r\n this.suscriptors[fieldId]?.forEach((current) => {\r\n return current(newProps, isUrgent);\r\n });\r\n this.suscriptors.any?.forEach((current) => {\r\n return current({ ...newProps, fieldId }, isUrgent);\r\n });\r\n }\r\n }\r\n}\r\n\r\nexport const propsStore = new PropsStore<TProperties>({\r\n logCommands: {\r\n propsLog: 'propsLog',\r\n propsStore: 'propsStore',\r\n propsSuscriptors: 'propsSuscriptors',\r\n updateProp: 'updateProp',\r\n },\r\n});\r\n"],"names":[],"mappings":"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"}