@apia/util 2.0.6 → 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.
- package/dist/animate/index.js.map +1 -1
- package/dist/array/arrayOrArray.js.map +1 -1
- package/dist/array/getIndex.js.map +1 -1
- package/dist/crypto/decrypt.js.map +1 -1
- package/dist/crypto/encrypt.js.map +1 -1
- package/dist/crypto/generateKey.js.map +1 -1
- package/dist/date/apiaDateToStandarFormat.js.map +1 -1
- package/dist/date/dateToApiaFormat.js.map +1 -1
- package/dist/date/getDateFormat.js.map +1 -1
- package/dist/debug/debugDispatcher.js.map +1 -1
- package/dist/debug/shortcutController.js.map +1 -1
- package/dist/documents/downloadStringAsDoc.js.map +1 -1
- package/dist/documents/downloadUrl.js.map +1 -1
- package/dist/documents/openAndReadFile.js.map +1 -1
- package/dist/dom/autoDisconnectMutationObserver.js.map +1 -1
- package/dist/dom/customEvents.js.map +1 -1
- package/dist/dom/enableChildrenFocus.js.map +1 -1
- package/dist/dom/findOffsetRelativeToScrollParent.js.map +1 -1
- package/dist/dom/findScrollContainer.js.map +1 -1
- package/dist/dom/getFocusSelector.js.map +1 -1
- package/dist/dom/getSpecificParent.js.map +1 -1
- package/dist/dom/isChild.js.map +1 -1
- package/dist/dom/scrollParentIntoElement.js.map +1 -1
- package/dist/dom/url.js.map +1 -1
- package/dist/dom/usePanAndZoom.js.map +1 -1
- package/dist/encoding/index.js.map +1 -1
- package/dist/events/EventEmitter.js.map +1 -1
- package/dist/events/StatefulEmitter.js.map +1 -1
- package/dist/focus/focusController.js +2 -2
- package/dist/focus/focusController.js.map +1 -1
- package/dist/focus/globalFocus.js +1 -1
- package/dist/focus/globalFocus.js.map +1 -1
- package/dist/history/History.js.map +1 -1
- package/dist/hooks/useCombinedRefs.js.map +1 -1
- package/dist/hooks/useDebouncedCallback.js.map +1 -1
- package/dist/hooks/useLatest.js.map +1 -1
- package/dist/hooks/useMount.js.map +1 -1
- package/dist/hooks/usePrevious.js.map +1 -1
- package/dist/hooks/useShallowMemo.js.map +1 -1
- package/dist/hooks/useStateRef.js.map +1 -1
- package/dist/hooks/useSubscription.js.map +1 -1
- package/dist/hooks/useUnmount.js.map +1 -1
- package/dist/hooks/useUpdateEffect.js.map +1 -1
- package/dist/imperative/makeImperativeComponent.js.map +1 -1
- package/dist/imperative/makeSingleImperativeComponent.js.map +1 -1
- package/dist/imperative/types.js.map +1 -1
- package/dist/imperative/useImperativeComponentEvents.js.map +1 -1
- package/dist/imperative/useImperativeIdentifierContext.js.map +1 -1
- package/dist/labels/formatMessage.js.map +1 -1
- package/dist/labels/getLabel.js.map +1 -1
- package/dist/number/index.js.map +1 -1
- package/dist/objects/getValueByPath.js.map +1 -1
- package/dist/objects/setValueByPath.js.map +1 -1
- package/dist/propsStore/propsStore.js.map +1 -1
- package/dist/propsStore/usePropsSelector.js.map +1 -1
- package/dist/screenLock/screenLocker.js +1 -1
- package/dist/screenLock/screenLocker.js.map +1 -1
- package/dist/states/useDebouncedState.js.map +1 -1
- package/dist/states/useDomState.js.map +1 -1
- package/dist/storage/StatefulStore.js +1 -1
- package/dist/storage/StatefulStore.js.map +1 -1
- package/dist/storage/persistentStorage.js.map +1 -1
- package/dist/storage/useLocalStorage.js.map +1 -1
- package/dist/string/alignment.js.map +1 -1
- package/dist/string/ucfirst.js.map +1 -1
- package/dist/typeGuards/toBoolean.js.map +1 -1
- package/dist/xml/parseXmlAsync.js.map +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usePropsSelector.js","sources":["../../src/propsStore/usePropsSelector.ts"],"sourcesContent":["import React, { useRef } from 'react';\nimport {\n PropsSelectorUndefinedObject,\n propsStore,\n PropsStore,\n} from './propsStore';\nimport {\n TProperties,\n TPropsComparator,\n TPropsConfiguration,\n TPropsSelector,\n} from './types';\nimport { TId } from '../types';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst defaultComparator: TPropsComparator<any> = (a, b) => {\n return a === b;\n};\nfunction getDefaultSelector<Selected, PropsType = TProperties>() {\n return (current: PropsType) => {\n return current as unknown as Selected;\n };\n}\n\nexport function isPropsConfigurationObject<\n Selected,\n PropsType extends Record<string, unknown> = TProperties,\n>(\n value?:\n | TPropsSelector<Selected, PropsType>\n | TPropsConfiguration<Selected, PropsType>,\n): value is TPropsConfiguration<Selected, PropsType> {\n return (\n typeof value === 'object' &&\n value &&\n ('selector' in value || 'comparator' in value || 'initialValue' in value)\n );\n}\n\n/**\n *\n * Este hook permite escuchar los cambios en las propiedades\n * de un campo en particular.\n *\n * @param configuration\n * Este objeto permite pasar las siguientes propiedades para ser\n * determinar el comportamiento del hook:\n *\n * **selector:** La función selectora es una función equivalente\n * a la que se utiliza en el useAppSelector de redux. Con ella\n * se puede seleccionar una porción de las props, evitando\n * re-renderizados innecesarios. Esto se debe a que el renderizado\n * solamente ocurrirá cuando la función selectora devuelva un valor\n * que sea distinto del anterior.\n *\n * El concepto de distinto es: si existe una función comparadora,\n * se determinará mediante la ejecución de dicha función, a la que\n * se le pasan como parámetros el objeto anterior y el nuevo.\n *\n * En caso de que no haya función comparadora, se comparará que\n * las props seleccionadas y las nuevas sean exactamente las mismas\n * (la referencia al mismo objeto).\n *\n * **comparator:** La función comparadora de la que estamos\n * hablando.\n *\n * **initialValue:** Un valor para setearlo al inicio, el mismo\n * solamente será seteado en caso de que ya no exista un valor\n * en el store.\n * @returns\n */\nexport function usePropsSelector<\n Selected = TProperties,\n PropsType extends Record<string, unknown> = TProperties,\n>(\n fieldId: TId,\n configuration?: TPropsConfiguration<Selected, PropsType>,\n): Selected;\n/**\n *\n * Este hook permite escuchar los cambios en las propiedades\n * de un campo en particular.\n *\n * @param selector La función selectora es una función equivalente\n * a la que se utiliza en el useAppSelector de redux. Con ella\n * se puede seleccionar una porción de las props, evitando\n * re-renderizados innecesarios. Esto se debe a que el renderizado\n * solamente ocurrirá cuando la función selectora devuelva un valor\n * que sea distinto del anterior.\n *\n * El concepto de distinto es: si existe una función comparadora,\n * se determinará mediante la ejecución de dicha función, a la que\n * se le pasan como parámetros el objeto anterior y el nuevo.\n *\n * En caso de que no haya función comparadora, se comparará que\n * las props seleccionadas y las nuevas sean exactamente las mismas\n * (la referencia al mismo objeto).\n *\n * @param comparator La función comparadora de la que estamos\n * hablando.\n *\n * @returns\n */\nexport function usePropsSelector<\n Selected = TProperties,\n PropsType extends Record<string, unknown> = TProperties,\n>(\n fieldId: TId,\n selector?:\n | TPropsSelector<Selected, PropsType>\n | TPropsConfiguration<Selected, PropsType>,\n comparator?: TPropsComparator<Selected>,\n anotherPropsStore?: PropsStore<PropsType>,\n): Selected;\nexport function usePropsSelector<\n Selected = TProperties,\n PropsType extends Record<string, unknown> = TProperties,\n>(\n fieldId: TId,\n par1?:\n | TPropsSelector<Selected, PropsType>\n | TPropsConfiguration<Selected, PropsType>,\n par2?: TPropsComparator<Selected>,\n par3?: PropsStore<PropsType>,\n): Selected {\n const selector = React.useMemo(\n () => {\n return isPropsConfigurationObject(par1) ? par1.selector : par1;\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [],\n );\n const comparator = React.useMemo(\n () => {\n return isPropsConfigurationObject(par1) ? par1.comparator : par2;\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [],\n );\n const initialValue = React.useMemo(\n () => {\n return isPropsConfigurationObject(par1) ? par1.initialValue : undefined;\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [],\n );\n const actualPropsStore = React.useMemo(\n () => {\n return (\n par3 ??\n (isPropsConfigurationObject(par1) ? par1.propsStore : propsStore) ??\n propsStore\n );\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [\n // eslint-disable-next-line react-hooks/exhaustive-deps\n par3 ??\n (isPropsConfigurationObject(par1) ? par1.propsStore : propsStore) ??\n propsStore,\n ],\n );\n\n const getCurrentProps = React.useCallback(() => {\n const currentProps = actualPropsStore.getFieldProps<PropsType>(fieldId);\n const willSetInitialValue =\n currentProps !== undefined && initialValue !== undefined;\n if (willSetInitialValue) {\n actualPropsStore.updateField(\n fieldId,\n initialValue as unknown as TProperties,\n );\n }\n return (selector ?? getDefaultSelector())(\n currentProps ?? (PropsSelectorUndefinedObject as PropsType),\n );\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const [props, setProps] = React.useState<Selected>(getCurrentProps);\n\n const prevProps = useRef(props);\n const prevFieldId = useRef(fieldId);\n\n React.useEffect(() => {\n const unsuscribe = actualPropsStore.suscribe(\n fieldId,\n (newProps, isUrgent) => {\n const newSelectedProps = (selector ?? getDefaultSelector())(\n newProps as unknown as PropsType,\n );\n\n if (\n !(comparator ?? defaultComparator)(\n prevProps.current,\n newSelectedProps,\n ) ||\n prevFieldId.current !== fieldId\n ) {\n if (isUrgent) setProps(newSelectedProps);\n else\n React.startTransition(() => {\n setProps(newSelectedProps);\n });\n }\n prevProps.current = newSelectedProps;\n },\n );\n\n return () => {\n unsuscribe();\n };\n }, [fieldId, actualPropsStore, selector, comparator]);\n\n return props;\n}\n"],"names":["React"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"usePropsSelector.js","sources":["../../src/propsStore/usePropsSelector.ts"],"sourcesContent":["import React, { useRef } from 'react';\r\nimport {\r\n PropsSelectorUndefinedObject,\r\n propsStore,\r\n PropsStore,\r\n} from './propsStore';\r\nimport {\r\n TProperties,\r\n TPropsComparator,\r\n TPropsConfiguration,\r\n TPropsSelector,\r\n} from './types';\r\nimport { TId } from '../types';\r\n\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\nconst defaultComparator: TPropsComparator<any> = (a, b) => {\r\n return a === b;\r\n};\r\nfunction getDefaultSelector<Selected, PropsType = TProperties>() {\r\n return (current: PropsType) => {\r\n return current as unknown as Selected;\r\n };\r\n}\r\n\r\nexport function isPropsConfigurationObject<\r\n Selected,\r\n PropsType extends Record<string, unknown> = TProperties,\r\n>(\r\n value?:\r\n | TPropsSelector<Selected, PropsType>\r\n | TPropsConfiguration<Selected, PropsType>,\r\n): value is TPropsConfiguration<Selected, PropsType> {\r\n return (\r\n typeof value === 'object' &&\r\n value &&\r\n ('selector' in value || 'comparator' in value || 'initialValue' in value)\r\n );\r\n}\r\n\r\n/**\r\n *\r\n * Este hook permite escuchar los cambios en las propiedades\r\n * de un campo en particular.\r\n *\r\n * @param configuration\r\n * Este objeto permite pasar las siguientes propiedades para ser\r\n * determinar el comportamiento del hook:\r\n *\r\n * **selector:** La función selectora es una función equivalente\r\n * a la que se utiliza en el useAppSelector de redux. Con ella\r\n * se puede seleccionar una porción de las props, evitando\r\n * re-renderizados innecesarios. Esto se debe a que el renderizado\r\n * solamente ocurrirá cuando la función selectora devuelva un valor\r\n * que sea distinto del anterior.\r\n *\r\n * El concepto de distinto es: si existe una función comparadora,\r\n * se determinará mediante la ejecución de dicha función, a la que\r\n * se le pasan como parámetros el objeto anterior y el nuevo.\r\n *\r\n * En caso de que no haya función comparadora, se comparará que\r\n * las props seleccionadas y las nuevas sean exactamente las mismas\r\n * (la referencia al mismo objeto).\r\n *\r\n * **comparator:** La función comparadora de la que estamos\r\n * hablando.\r\n *\r\n * **initialValue:** Un valor para setearlo al inicio, el mismo\r\n * solamente será seteado en caso de que ya no exista un valor\r\n * en el store.\r\n * @returns\r\n */\r\nexport function usePropsSelector<\r\n Selected = TProperties,\r\n PropsType extends Record<string, unknown> = TProperties,\r\n>(\r\n fieldId: TId,\r\n configuration?: TPropsConfiguration<Selected, PropsType>,\r\n): Selected;\r\n/**\r\n *\r\n * Este hook permite escuchar los cambios en las propiedades\r\n * de un campo en particular.\r\n *\r\n * @param selector La función selectora es una función equivalente\r\n * a la que se utiliza en el useAppSelector de redux. Con ella\r\n * se puede seleccionar una porción de las props, evitando\r\n * re-renderizados innecesarios. Esto se debe a que el renderizado\r\n * solamente ocurrirá cuando la función selectora devuelva un valor\r\n * que sea distinto del anterior.\r\n *\r\n * El concepto de distinto es: si existe una función comparadora,\r\n * se determinará mediante la ejecución de dicha función, a la que\r\n * se le pasan como parámetros el objeto anterior y el nuevo.\r\n *\r\n * En caso de que no haya función comparadora, se comparará que\r\n * las props seleccionadas y las nuevas sean exactamente las mismas\r\n * (la referencia al mismo objeto).\r\n *\r\n * @param comparator La función comparadora de la que estamos\r\n * hablando.\r\n *\r\n * @returns\r\n */\r\nexport function usePropsSelector<\r\n Selected = TProperties,\r\n PropsType extends Record<string, unknown> = TProperties,\r\n>(\r\n fieldId: TId,\r\n selector?:\r\n | TPropsSelector<Selected, PropsType>\r\n | TPropsConfiguration<Selected, PropsType>,\r\n comparator?: TPropsComparator<Selected>,\r\n anotherPropsStore?: PropsStore<PropsType>,\r\n): Selected;\r\nexport function usePropsSelector<\r\n Selected = TProperties,\r\n PropsType extends Record<string, unknown> = TProperties,\r\n>(\r\n fieldId: TId,\r\n par1?:\r\n | TPropsSelector<Selected, PropsType>\r\n | TPropsConfiguration<Selected, PropsType>,\r\n par2?: TPropsComparator<Selected>,\r\n par3?: PropsStore<PropsType>,\r\n): Selected {\r\n const selector = React.useMemo(\r\n () => {\r\n return isPropsConfigurationObject(par1) ? par1.selector : par1;\r\n },\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n [],\r\n );\r\n const comparator = React.useMemo(\r\n () => {\r\n return isPropsConfigurationObject(par1) ? par1.comparator : par2;\r\n },\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n [],\r\n );\r\n const initialValue = React.useMemo(\r\n () => {\r\n return isPropsConfigurationObject(par1) ? par1.initialValue : undefined;\r\n },\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n [],\r\n );\r\n const actualPropsStore = React.useMemo(\r\n () => {\r\n return (\r\n par3 ??\r\n (isPropsConfigurationObject(par1) ? par1.propsStore : propsStore) ??\r\n propsStore\r\n );\r\n },\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n [\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n par3 ??\r\n (isPropsConfigurationObject(par1) ? par1.propsStore : propsStore) ??\r\n propsStore,\r\n ],\r\n );\r\n\r\n const getCurrentProps = React.useCallback(() => {\r\n const currentProps = actualPropsStore.getFieldProps<PropsType>(fieldId);\r\n const willSetInitialValue =\r\n currentProps !== undefined && initialValue !== undefined;\r\n if (willSetInitialValue) {\r\n actualPropsStore.updateField(\r\n fieldId,\r\n initialValue as unknown as TProperties,\r\n );\r\n }\r\n return (selector ?? getDefaultSelector())(\r\n currentProps ?? (PropsSelectorUndefinedObject as PropsType),\r\n );\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n const [props, setProps] = React.useState<Selected>(getCurrentProps);\r\n\r\n const prevProps = useRef(props);\r\n const prevFieldId = useRef(fieldId);\r\n\r\n React.useEffect(() => {\r\n const unsuscribe = actualPropsStore.suscribe(\r\n fieldId,\r\n (newProps, isUrgent) => {\r\n const newSelectedProps = (selector ?? getDefaultSelector())(\r\n newProps as unknown as PropsType,\r\n );\r\n\r\n if (\r\n !(comparator ?? defaultComparator)(\r\n prevProps.current,\r\n newSelectedProps,\r\n ) ||\r\n prevFieldId.current !== fieldId\r\n ) {\r\n if (isUrgent) setProps(newSelectedProps);\r\n else\r\n React.startTransition(() => {\r\n setProps(newSelectedProps);\r\n });\r\n }\r\n prevProps.current = newSelectedProps;\r\n },\r\n );\r\n\r\n return () => {\r\n unsuscribe();\r\n };\r\n }, [fieldId, actualPropsStore, selector, comparator]);\r\n\r\n return props;\r\n}\r\n"],"names":["React"],"mappings":"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"}
|
|
@@ -15,7 +15,7 @@ var __privateAdd = (obj, member, value) => {
|
|
|
15
15
|
};
|
|
16
16
|
var __privateSet = (obj, member, value, setter) => {
|
|
17
17
|
__accessCheck(obj, member, "write to private field");
|
|
18
|
-
|
|
18
|
+
member.set(obj, value);
|
|
19
19
|
return value;
|
|
20
20
|
};
|
|
21
21
|
var __privateMethod = (obj, member, method) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"screenLocker.js","sources":["../../src/screenLock/screenLocker.ts"],"sourcesContent":["import { EventEmitter } from '../events/EventEmitter';\nclass ScreenLocker extends EventEmitter<{\n forcedStateChange: {\n hasReleasedFirstTime: boolean;\n isForced: boolean;\n };\n lockStateChange: {\n hasReleasedFirstTime: boolean;\n isLocked: boolean;\n lockName: string;\n };\n releaseForFirstTime: null;\n ready: null;\n}> {\n #hasReleasedFirstTime = false;\n\n #wasReleasedFirstTime = false;\n\n #isForced = false;\n\n #locks: Record<string, boolean> = {\n common: false,\n };\n\n get hasReleasedFirstTime() {\n return this.#hasReleasedFirstTime;\n }\n\n get isForced() {\n return this.#isForced;\n }\n\n /**\n * Permite saber si un bloqueo determinado está activo o si la clase tiene\n * forceLock activo.\n */\n isLocked(lockName = 'common') {\n return this.#locks[lockName] || this.#isForced;\n }\n\n constructor() {\n super();\n\n this.emit('ready', null);\n }\n\n #shoutLockState(lockName?: string) {\n if (this.#isForced || lockName === undefined) {\n this.emit('forcedStateChange', {\n isForced: this.#isForced,\n hasReleasedFirstTime: this.#hasReleasedFirstTime,\n });\n } else {\n if (\n lockName === 'common' &&\n !this.#wasReleasedFirstTime &&\n this.#hasReleasedFirstTime\n ) {\n this.emit('releaseForFirstTime', null);\n }\n\n this.emit('lockStateChange', {\n lockName,\n hasReleasedFirstTime: this.#hasReleasedFirstTime,\n isLocked: this.#locks[lockName],\n });\n }\n }\n\n lock(lockName = 'common') {\n this.#locks[lockName] = true;\n this.#shoutLockState(lockName);\n }\n\n unlock(lockName = 'common') {\n if (lockName === 'common') this.#hasReleasedFirstTime = true;\n this.#locks[lockName] = false;\n this.#shoutLockState(lockName);\n }\n\n force() {\n this.#isForced = true;\n this.#shoutLockState();\n }\n\n releaseForced() {\n this.#isForced = false;\n this.#shoutLockState();\n }\n}\n\n/**\n * Esta clase no implementa ninguna funcionalidad de bloqueo, sino solamente se\n * encarga de la lógica y de los eventos.\n *\n * El concepto es que hay n niveles de bloqueo y además existe el bloqueo\n * forzado. Cada uno de los niveles recibe un nombre, por defecto se realizan\n * operaciones contra el bloque 'common' si no se pasa ninguno, pero\n * podría utilizarse cualquier otro. Esto es así con el fin de implementar\n * varios bloqueos en la misma clase, ejemplos: el bloqueo común, el bloqueo\n * lineal de las tablas, bloque con pantalla blanca en el inicio de formularios,\n * o cualquier otro que se desee. Para los bloqueos estándar se utilizan los\n * métodos lock y unlock.\n *\n * El bloqueo forzado por otra parte es un estado general que se puede alterar\n * mediante los métodos force y releaseForced. Cada vez que se bloquee o\n * desbloquee la pantalla, se lanzará un evento lockStateChange sin lockName y\n * con forced = true.\n *\n * Además, provee un evento para saber cuándo se desbloquea la pantalla\n * efectivamente por primera vez para cada tipo de bloqueo. Es posible a su vez\n * resetear la clase para que este evento sea lanzado nuevamente en el próximo\n * desbloqueo mediante resetRefreshFirstTime.\n *\n * El evento releasForFirstTime se dispara únicamente para el bloqueo 'common'.\n * Esto es así ya que sino podría dar lugar a confusión en situaciones donde no\n * se controle el nombre del bloqueo.\n */\nconst screenLocker = new ScreenLocker();\n\nexport { screenLocker };\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"screenLocker.js","sources":["../../src/screenLock/screenLocker.ts"],"sourcesContent":["import { EventEmitter } from '../events/EventEmitter';\r\nclass ScreenLocker extends EventEmitter<{\r\n forcedStateChange: {\r\n hasReleasedFirstTime: boolean;\r\n isForced: boolean;\r\n };\r\n lockStateChange: {\r\n hasReleasedFirstTime: boolean;\r\n isLocked: boolean;\r\n lockName: string;\r\n };\r\n releaseForFirstTime: null;\r\n ready: null;\r\n}> {\r\n #hasReleasedFirstTime = false;\r\n\r\n #wasReleasedFirstTime = false;\r\n\r\n #isForced = false;\r\n\r\n #locks: Record<string, boolean> = {\r\n common: false,\r\n };\r\n\r\n get hasReleasedFirstTime() {\r\n return this.#hasReleasedFirstTime;\r\n }\r\n\r\n get isForced() {\r\n return this.#isForced;\r\n }\r\n\r\n /**\r\n * Permite saber si un bloqueo determinado está activo o si la clase tiene\r\n * forceLock activo.\r\n */\r\n isLocked(lockName = 'common') {\r\n return this.#locks[lockName] || this.#isForced;\r\n }\r\n\r\n constructor() {\r\n super();\r\n\r\n this.emit('ready', null);\r\n }\r\n\r\n #shoutLockState(lockName?: string) {\r\n if (this.#isForced || lockName === undefined) {\r\n this.emit('forcedStateChange', {\r\n isForced: this.#isForced,\r\n hasReleasedFirstTime: this.#hasReleasedFirstTime,\r\n });\r\n } else {\r\n if (\r\n lockName === 'common' &&\r\n !this.#wasReleasedFirstTime &&\r\n this.#hasReleasedFirstTime\r\n ) {\r\n this.emit('releaseForFirstTime', null);\r\n }\r\n\r\n this.emit('lockStateChange', {\r\n lockName,\r\n hasReleasedFirstTime: this.#hasReleasedFirstTime,\r\n isLocked: this.#locks[lockName],\r\n });\r\n }\r\n }\r\n\r\n lock(lockName = 'common') {\r\n this.#locks[lockName] = true;\r\n this.#shoutLockState(lockName);\r\n }\r\n\r\n unlock(lockName = 'common') {\r\n if (lockName === 'common') this.#hasReleasedFirstTime = true;\r\n this.#locks[lockName] = false;\r\n this.#shoutLockState(lockName);\r\n }\r\n\r\n force() {\r\n this.#isForced = true;\r\n this.#shoutLockState();\r\n }\r\n\r\n releaseForced() {\r\n this.#isForced = false;\r\n this.#shoutLockState();\r\n }\r\n}\r\n\r\n/**\r\n * Esta clase no implementa ninguna funcionalidad de bloqueo, sino solamente se\r\n * encarga de la lógica y de los eventos.\r\n *\r\n * El concepto es que hay n niveles de bloqueo y además existe el bloqueo\r\n * forzado. Cada uno de los niveles recibe un nombre, por defecto se realizan\r\n * operaciones contra el bloque 'common' si no se pasa ninguno, pero\r\n * podría utilizarse cualquier otro. Esto es así con el fin de implementar\r\n * varios bloqueos en la misma clase, ejemplos: el bloqueo común, el bloqueo\r\n * lineal de las tablas, bloque con pantalla blanca en el inicio de formularios,\r\n * o cualquier otro que se desee. Para los bloqueos estándar se utilizan los\r\n * métodos lock y unlock.\r\n *\r\n * El bloqueo forzado por otra parte es un estado general que se puede alterar\r\n * mediante los métodos force y releaseForced. Cada vez que se bloquee o\r\n * desbloquee la pantalla, se lanzará un evento lockStateChange sin lockName y\r\n * con forced = true.\r\n *\r\n * Además, provee un evento para saber cuándo se desbloquea la pantalla\r\n * efectivamente por primera vez para cada tipo de bloqueo. Es posible a su vez\r\n * resetear la clase para que este evento sea lanzado nuevamente en el próximo\r\n * desbloqueo mediante resetRefreshFirstTime.\r\n *\r\n * El evento releasForFirstTime se dispara únicamente para el bloqueo 'common'.\r\n * Esto es así ya que sino podría dar lugar a confusión en situaciones donde no\r\n * se controle el nombre del bloqueo.\r\n */\r\nconst screenLocker = new ScreenLocker();\r\n\r\nexport { screenLocker };\r\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useDebouncedState.js","sources":["../../src/states/useDebouncedState.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { SetStateAction, useCallback, useRef } from 'react';\nimport { useState } from 'react';\n\n/**\n * Permite manejar un estado que se actualizará únicamente siguiendo el\n * comportamiento esperado de un debounce\n */\nexport function useDebouncedState<T>(\n timeout: number,\n initialState?: T,\n): [T | undefined, (state: SetStateAction<T>, immediate?: boolean) => unknown] {\n const [state, innerSetState] = useState<T>(initialState as T);\n\n const t = useRef<number>(-1);\n\n const setState = useCallback<\n (state: SetStateAction<T>, immediate?: boolean) => unknown\n >(\n (newState, immediate?: boolean) => {\n clearTimeout(t.current);\n\n if (immediate) innerSetState(newState);\n else\n t.current = setTimeout(() => {\n innerSetState(newState);\n }, timeout) as any;\n },\n [timeout],\n );\n\n return [state, setState];\n}\n"],"names":[],"mappings":";;AAQgB,SAAA,iBAAA,CACd,SACA,YAC6E,EAAA;AAC7E,EAAA,MAAM,CAAC,KAAA,EAAO,aAAa,CAAA,GAAI,SAAY,YAAiB,CAAA,CAAA;AAE5D,EAAM,MAAA,CAAA,GAAI,OAAe,CAAE,CAAA,CAAA,CAAA;AAE3B,EAAA,MAAM,QAAW,GAAA,WAAA;AAAA,IAGf,CAAC,UAAU,SAAwB,KAAA;AACjC,MAAA,YAAA,CAAa,EAAE,OAAO,CAAA,CAAA;AAEtB,MAAI,IAAA,SAAA;AAAW,QAAA,aAAA,CAAc,QAAQ,CAAA,CAAA;AAAA;AAEnC,QAAE,CAAA,CAAA,OAAA,GAAU,WAAW,MAAM;AAC3B,UAAA,aAAA,CAAc,QAAQ,CAAA,CAAA;AAAA,WACrB,OAAO,CAAA,CAAA;AAAA,KACd;AAAA,IACA,CAAC,OAAO,CAAA;AAAA,GACV,CAAA;AAEA,EAAO,OAAA,CAAC,OAAO,QAAQ,CAAA,CAAA;AACzB;;;;"}
|
|
1
|
+
{"version":3,"file":"useDebouncedState.js","sources":["../../src/states/useDebouncedState.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\r\nimport { SetStateAction, useCallback, useRef } from 'react';\r\nimport { useState } from 'react';\r\n\r\n/**\r\n * Permite manejar un estado que se actualizará únicamente siguiendo el\r\n * comportamiento esperado de un debounce\r\n */\r\nexport function useDebouncedState<T>(\r\n timeout: number,\r\n initialState?: T,\r\n): [T | undefined, (state: SetStateAction<T>, immediate?: boolean) => unknown] {\r\n const [state, innerSetState] = useState<T>(initialState as T);\r\n\r\n const t = useRef<number>(-1);\r\n\r\n const setState = useCallback<\r\n (state: SetStateAction<T>, immediate?: boolean) => unknown\r\n >(\r\n (newState, immediate?: boolean) => {\r\n clearTimeout(t.current);\r\n\r\n if (immediate) innerSetState(newState);\r\n else\r\n t.current = setTimeout(() => {\r\n innerSetState(newState);\r\n }, timeout) as any;\r\n },\r\n [timeout],\r\n );\r\n\r\n return [state, setState];\r\n}\r\n"],"names":[],"mappings":";;AAQgB,SAAA,iBAAA,CACd,SACA,YAC6E,EAAA;AAC7E,EAAA,MAAM,CAAC,KAAA,EAAO,aAAa,CAAA,GAAI,SAAY,YAAiB,CAAA,CAAA;AAE5D,EAAM,MAAA,CAAA,GAAI,OAAe,CAAE,CAAA,CAAA,CAAA;AAE3B,EAAA,MAAM,QAAW,GAAA,WAAA;AAAA,IAGf,CAAC,UAAU,SAAwB,KAAA;AACjC,MAAA,YAAA,CAAa,EAAE,OAAO,CAAA,CAAA;AAEtB,MAAI,IAAA,SAAA;AAAW,QAAA,aAAA,CAAc,QAAQ,CAAA,CAAA;AAAA;AAEnC,QAAE,CAAA,CAAA,OAAA,GAAU,WAAW,MAAM;AAC3B,UAAA,aAAA,CAAc,QAAQ,CAAA,CAAA;AAAA,WACrB,OAAO,CAAA,CAAA;AAAA,KACd;AAAA,IACA,CAAC,OAAO,CAAA;AAAA,GACV,CAAA;AAEA,EAAO,OAAA,CAAC,OAAO,QAAQ,CAAA,CAAA;AACzB;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useDomState.js","sources":["../../src/states/useDomState.tsx"],"sourcesContent":["import React, { HTMLAttributes, HTMLProps } from 'react';\n\nfunction assignProps<T extends HTMLProps<HTMLElement>>(\n el: HTMLElement,\n { style, ...props }: T,\n) {\n if (style) {\n Object.entries(style).forEach(([name, value]) => {\n // eslint-disable-next-line no-param-reassign, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-assignment\n (el as any).style[name] = value;\n });\n }\n Object.assign(el, props);\n}\n\n/**\n * El hook useDomState permite aplicar propiedades a un\n * elemento del DOM de la forma más eficiente posible.\n *\n * Este hook no permite el uso de sx ya que por las características\n * del sx, el re-renderizado es necesario.\n *\n * @example\n *\n *\n * const TestComponent = () => {\n const { domProps, setDomProps } = useDomState<BoxProps>({\n style: {\n position: 'fixed',\n left: 0,\n top: 0,\n width: '150px',\n height: '150px',\n backgroundColor: '#ccc',\n },\n });\n const initialPosition = React.useRef({ boxX: 0, boxY: 0, x: 0, y: 0 });\n const isDragging = React.useRef(false);\n const [state, setState] = React.useState(1);\n\n React.useEffect(() => {\n const move = (ev: MouseEvent) => {\n if (isDragging.current) {\n const moveX = ev.clientX - initialPosition.current.x;\n const moveY = ev.clientY - initialPosition.current.y;\n const newLeft = initialPosition.current.boxX + moveX;\n const newTop = initialPosition.current.boxY + moveY;\n setDomProps({\n style: {\n left: `${newLeft}px`,\n top: `${newTop}px`,\n },\n });\n }\n };\n\n const removeSuscription = () => {\n isDragging.current = false;\n };\n\n document.addEventListener('mousemove', move);\n document.addEventListener('mouseup', removeSuscription);\n\n return () => {\n document.removeEventListener('mousemove', move);\n document.removeEventListener('mouseup', removeSuscription);\n };\n }, [setDomProps]);\n\n return (\n <Box\n {...domProps}\n onMouseDown={(ev) => {\n initialPosition.current = {\n boxX: Number.parseInt(domProps.style?.left as string, 10),\n boxY: Number.parseInt(domProps.style?.top as string, 10),\n x: ev.clientX,\n y: ev.clientY,\n };\n isDragging.current = true;\n }}\n >\n Esta caja es arrastrable. Renderizados: {state}\n <Button onClick={() => setState((current) => current + 1)}>\n Renderizar\n </Button>\n </Box>\n );\n};\n */\nexport function useDomState<T extends HTMLAttributes<HTMLElement>>(\n initialDomProps?: T,\n) {\n const domProps = React.useRef<T & { ref: (el: HTMLElement) => void }>({\n ...(initialDomProps ?? ({} as T)),\n ref: React.useCallback((el: HTMLElement) => {\n ref.current = el;\n assignProps(ref.current, domProps.current);\n }, []),\n });\n const ref = React.useRef<HTMLElement | null>(null);\n return {\n domProps: domProps.current,\n setDomProps: React.useCallback(({ style, ...newDomProps }: Partial<T>) => {\n if (style) {\n const newStyles = { ...domProps.current.style, ...style };\n domProps.current.style = newStyles;\n }\n Object.assign(domProps.current, newDomProps);\n if (ref.current) assignProps(ref.current, domProps.current);\n }, []),\n };\n}\n"],"names":["React"],"mappings":";;AAEA,SAAS,YACP,EACA,EAAA,EAAE,KAAO,EAAA,GAAG,OACZ,EAAA;AACA,EAAA,IAAI,KAAO,EAAA;AACT,IAAO,MAAA,CAAA,OAAA,CAAQ,KAAK,CAAE,CAAA,OAAA,CAAQ,CAAC,CAAC,IAAA,EAAM,KAAK,CAAM,KAAA;AAE/C,MAAC,EAAA,CAAW,KAAM,CAAA,IAAI,CAAI,GAAA,KAAA,CAAA;AAAA,KAC3B,CAAA,CAAA;AAAA,GACH;AACA,EAAO,MAAA,CAAA,MAAA,CAAO,IAAI,KAAK,CAAA,CAAA;AACzB,CAAA;AA6EO,SAAS,YACd,eACA,EAAA;AACA,EAAM,MAAA,QAAA,GAAWA,eAAM,MAA+C,CAAA;AAAA,IACpE,GAAI,mBAAoB,EAAC;AAAA,IACzB,GAAK,EAAAA,cAAA,CAAM,WAAY,CAAA,CAAC,EAAoB,KAAA;AAC1C,MAAA,GAAA,CAAI,OAAU,GAAA,EAAA,CAAA;AACd,MAAY,WAAA,CAAA,GAAA,CAAI,OAAS,EAAA,QAAA,CAAS,OAAO,CAAA,CAAA;AAAA,KAC3C,EAAG,EAAE,CAAA;AAAA,GACN,CAAA,CAAA;AACD,EAAM,MAAA,GAAA,GAAMA,cAAM,CAAA,MAAA,CAA2B,IAAI,CAAA,CAAA;AACjD,EAAO,OAAA;AAAA,IACL,UAAU,QAAS,CAAA,OAAA;AAAA,IACnB,WAAA,EAAaA,eAAM,WAAY,CAAA,CAAC,EAAE,KAAO,EAAA,GAAG,aAA8B,KAAA;AACxE,MAAA,IAAI,KAAO,EAAA;AACT,QAAA,MAAM,YAAY,EAAE,GAAG,SAAS,OAAQ,CAAA,KAAA,EAAO,GAAG,KAAM,EAAA,CAAA;AACxD,QAAA,QAAA,CAAS,QAAQ,KAAQ,GAAA,SAAA,CAAA;AAAA,OAC3B;AACA,MAAO,MAAA,CAAA,MAAA,CAAO,QAAS,CAAA,OAAA,EAAS,WAAW,CAAA,CAAA;AAC3C,MAAA,IAAI,GAAI,CAAA,OAAA;AAAS,QAAY,WAAA,CAAA,GAAA,CAAI,OAAS,EAAA,QAAA,CAAS,OAAO,CAAA,CAAA;AAAA,KAC5D,EAAG,EAAE,CAAA;AAAA,GACP,CAAA;AACF;;;;"}
|
|
1
|
+
{"version":3,"file":"useDomState.js","sources":["../../src/states/useDomState.tsx"],"sourcesContent":["import React, { HTMLAttributes, HTMLProps } from 'react';\r\n\r\nfunction assignProps<T extends HTMLProps<HTMLElement>>(\r\n el: HTMLElement,\r\n { style, ...props }: T,\r\n) {\r\n if (style) {\r\n Object.entries(style).forEach(([name, value]) => {\r\n // eslint-disable-next-line no-param-reassign, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-assignment\r\n (el as any).style[name] = value;\r\n });\r\n }\r\n Object.assign(el, props);\r\n}\r\n\r\n/**\r\n * El hook useDomState permite aplicar propiedades a un\r\n * elemento del DOM de la forma más eficiente posible.\r\n *\r\n * Este hook no permite el uso de sx ya que por las características\r\n * del sx, el re-renderizado es necesario.\r\n *\r\n * @example\r\n *\r\n *\r\n * const TestComponent = () => {\r\n const { domProps, setDomProps } = useDomState<BoxProps>({\r\n style: {\r\n position: 'fixed',\r\n left: 0,\r\n top: 0,\r\n width: '150px',\r\n height: '150px',\r\n backgroundColor: '#ccc',\r\n },\r\n });\r\n const initialPosition = React.useRef({ boxX: 0, boxY: 0, x: 0, y: 0 });\r\n const isDragging = React.useRef(false);\r\n const [state, setState] = React.useState(1);\r\n\r\n React.useEffect(() => {\r\n const move = (ev: MouseEvent) => {\r\n if (isDragging.current) {\r\n const moveX = ev.clientX - initialPosition.current.x;\r\n const moveY = ev.clientY - initialPosition.current.y;\r\n const newLeft = initialPosition.current.boxX + moveX;\r\n const newTop = initialPosition.current.boxY + moveY;\r\n setDomProps({\r\n style: {\r\n left: `${newLeft}px`,\r\n top: `${newTop}px`,\r\n },\r\n });\r\n }\r\n };\r\n\r\n const removeSuscription = () => {\r\n isDragging.current = false;\r\n };\r\n\r\n document.addEventListener('mousemove', move);\r\n document.addEventListener('mouseup', removeSuscription);\r\n\r\n return () => {\r\n document.removeEventListener('mousemove', move);\r\n document.removeEventListener('mouseup', removeSuscription);\r\n };\r\n }, [setDomProps]);\r\n\r\n return (\r\n <Box\r\n {...domProps}\r\n onMouseDown={(ev) => {\r\n initialPosition.current = {\r\n boxX: Number.parseInt(domProps.style?.left as string, 10),\r\n boxY: Number.parseInt(domProps.style?.top as string, 10),\r\n x: ev.clientX,\r\n y: ev.clientY,\r\n };\r\n isDragging.current = true;\r\n }}\r\n >\r\n Esta caja es arrastrable. Renderizados: {state}\r\n <Button onClick={() => setState((current) => current + 1)}>\r\n Renderizar\r\n </Button>\r\n </Box>\r\n );\r\n};\r\n */\r\nexport function useDomState<T extends HTMLAttributes<HTMLElement>>(\r\n initialDomProps?: T,\r\n) {\r\n const domProps = React.useRef<T & { ref: (el: HTMLElement) => void }>({\r\n ...(initialDomProps ?? ({} as T)),\r\n ref: React.useCallback((el: HTMLElement) => {\r\n ref.current = el;\r\n assignProps(ref.current, domProps.current);\r\n }, []),\r\n });\r\n const ref = React.useRef<HTMLElement | null>(null);\r\n return {\r\n domProps: domProps.current,\r\n setDomProps: React.useCallback(({ style, ...newDomProps }: Partial<T>) => {\r\n if (style) {\r\n const newStyles = { ...domProps.current.style, ...style };\r\n domProps.current.style = newStyles;\r\n }\r\n Object.assign(domProps.current, newDomProps);\r\n if (ref.current) assignProps(ref.current, domProps.current);\r\n }, []),\r\n };\r\n}\r\n"],"names":["React"],"mappings":";;AAEA,SAAS,YACP,EACA,EAAA,EAAE,KAAO,EAAA,GAAG,OACZ,EAAA;AACA,EAAA,IAAI,KAAO,EAAA;AACT,IAAO,MAAA,CAAA,OAAA,CAAQ,KAAK,CAAE,CAAA,OAAA,CAAQ,CAAC,CAAC,IAAA,EAAM,KAAK,CAAM,KAAA;AAE/C,MAAC,EAAA,CAAW,KAAM,CAAA,IAAI,CAAI,GAAA,KAAA,CAAA;AAAA,KAC3B,CAAA,CAAA;AAAA,GACH;AACA,EAAO,MAAA,CAAA,MAAA,CAAO,IAAI,KAAK,CAAA,CAAA;AACzB,CAAA;AA6EO,SAAS,YACd,eACA,EAAA;AACA,EAAM,MAAA,QAAA,GAAWA,eAAM,MAA+C,CAAA;AAAA,IACpE,GAAI,mBAAoB,EAAC;AAAA,IACzB,GAAK,EAAAA,cAAA,CAAM,WAAY,CAAA,CAAC,EAAoB,KAAA;AAC1C,MAAA,GAAA,CAAI,OAAU,GAAA,EAAA,CAAA;AACd,MAAY,WAAA,CAAA,GAAA,CAAI,OAAS,EAAA,QAAA,CAAS,OAAO,CAAA,CAAA;AAAA,KAC3C,EAAG,EAAE,CAAA;AAAA,GACN,CAAA,CAAA;AACD,EAAM,MAAA,GAAA,GAAMA,cAAM,CAAA,MAAA,CAA2B,IAAI,CAAA,CAAA;AACjD,EAAO,OAAA;AAAA,IACL,UAAU,QAAS,CAAA,OAAA;AAAA,IACnB,WAAA,EAAaA,eAAM,WAAY,CAAA,CAAC,EAAE,KAAO,EAAA,GAAG,aAA8B,KAAA;AACxE,MAAA,IAAI,KAAO,EAAA;AACT,QAAA,MAAM,YAAY,EAAE,GAAG,SAAS,OAAQ,CAAA,KAAA,EAAO,GAAG,KAAM,EAAA,CAAA;AACxD,QAAA,QAAA,CAAS,QAAQ,KAAQ,GAAA,SAAA,CAAA;AAAA,OAC3B;AACA,MAAO,MAAA,CAAA,MAAA,CAAO,QAAS,CAAA,OAAA,EAAS,WAAW,CAAA,CAAA;AAC3C,MAAA,IAAI,GAAI,CAAA,OAAA;AAAS,QAAY,WAAA,CAAA,GAAA,CAAI,OAAS,EAAA,QAAA,CAAS,OAAO,CAAA,CAAA;AAAA,KAC5D,EAAG,EAAE,CAAA;AAAA,GACP,CAAA;AACF;;;;"}
|
|
@@ -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
|
-
|
|
19
|
+
member.set(obj, value);
|
|
20
20
|
return value;
|
|
21
21
|
};
|
|
22
22
|
var _onUpdateCbs;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StatefulStore.js","sources":["../../src/storage/StatefulStore.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { useState } from 'react';\nimport { useMount } from '../hooks';\nimport { TId } from '../types';\n\nfunction upper(s: string) {\n return `${s.charAt(0).toUpperCase()}${s.slice(1)}`;\n}\n\ntype StatefulStoreUnsuscriber = () => void;\n\nexport type StatefulStoreUpdater<Props> = (currentProps: Props) => Props;\n\nexport type StatefulStoreUpdateProps<Props> =\n | StatefulStoreUpdater<Props>\n | Partial<Props>;\n\nfunction isUpdater<Props>(\n props: StatefulStoreUpdater<Props> | Partial<Props>,\n): props is StatefulStoreUpdater<Props> {\n return typeof props === 'function';\n}\n\n/**\n * Clase facilitadora del uso de StatefulStore. Es un pequeño almacen que\n * permite actualizar sus propiedades y sabe cómo sincronizarse con el store de\n * modo que los cambios se propaguen según corresponda.\n */\nexport abstract class BasicStoredElement<\n Props extends Record<string, unknown>,\n> {\n abstract getId(): TId;\n\n #onUpdateCbs: (() => void)[] = [];\n onUpdate(cb: () => void): StatefulStoreUnsuscriber {\n this.#onUpdateCbs.push(cb);\n\n return () => {\n this.#onUpdateCbs = this.#onUpdateCbs.filter((current) => current !== cb);\n };\n }\n\n props: Props = {} as Props;\n constructor(props: Props) {\n this.props = props;\n }\n\n protected shoutUpdates = () => {\n this.#onUpdateCbs.forEach((current) => current());\n };\n\n update(newProps: StatefulStoreUpdateProps<Props>) {\n const actualNewProps = isUpdater(newProps)\n ? newProps(this.props)\n : newProps;\n\n this.props = { ...this.props, ...actualNewProps };\n this.shoutUpdates();\n }\n\n useProps = () => {\n const [props, setState] = useState(this.props);\n\n useMount(() => {\n setState({ ...this.props });\n\n return this.onUpdate(() => {\n setState({ ...this.props });\n });\n });\n\n return props;\n };\n}\n\n/**\n * Son las acciones de adición del store.\n */\ntype AddActions<T extends Record<string, BasicStoredElement<any>>> = {\n [P in keyof T as `add${Capitalize<string & P>}`]: (el: T[P]) => void;\n};\n\n/**\n * Acciones de vaciado del store.\n */\ntype EmptyActions<T extends Record<string, BasicStoredElement<any>>> = {\n [P in keyof T as `empty${Capitalize<string & P>}`]: () => void;\n};\n\n/**\n * Acciones de removido del store.\n */\ntype RemoveActions<T extends Record<string, BasicStoredElement<any>>> = {\n [P in keyof T as `remove${Capitalize<string & P>}`]: (id: TId) => void;\n};\n\ntype UpdateListActions<T extends Record<string, BasicStoredElement<any>>> = {\n [P in keyof T as `update${Capitalize<string & P>}List`]: (\n newList: T[P],\n ) => void;\n};\n\n/**\n * Conjunto de acciones disponibles del store\n */\ntype ActionMethods<T extends Record<string, BasicStoredElement<any>>> = {\n actions: AddActions<T> &\n EmptyActions<T> &\n RemoveActions<T> &\n UpdateListActions<T>;\n};\n\n/**\n * Método que permite obtener el listado de elementos de un tipo.\n */\ntype GetStateActions<T extends Record<string, BasicStoredElement<any>>> = {\n [P in keyof T as `get${Capitalize<string & P>}State`]: () => T[P][];\n};\n\n/**\n * Método que permite conocer las propiedades de un elemento.\n */\ntype GetItemActions<T extends Record<string, BasicStoredElement<any>>> = {\n [P in keyof T as `get${Capitalize<string & P>}`]: (id: TId) => T[P];\n};\n\ntype UpdateItemActions<T extends Record<string, BasicStoredElement<any>>> = {\n [P in keyof T as `update${Capitalize<string & P>}`]: (\n id: TId,\n newProps: StatefulStoreUpdateProps<T[P]['props']>,\n ) => void;\n};\n\n/**\n * Conjunto de métodos que permiten acceder al estado en un momento\n * determinado.\n */\ntype StateMethods<T extends Record<string, BasicStoredElement<any>>> = {\n state: GetStateActions<T> & GetItemActions<T> & UpdateItemActions<T>;\n};\n\n/**\n * Es el hook encargado de permitir la escucha de listado de elementos y sus\n * propiedades.\n */\ntype HookUseState<T extends Record<string, BasicStoredElement<any>>> = {\n [P in keyof T as `use${Capitalize<string & P>}`]: () => T[P][];\n};\n\n/**\n * Es el hook encargado de permitir la escucha de listado de elementos\n */\ntype HookUseList<T extends Record<string, BasicStoredElement<any>>> = {\n [P in keyof T as `use${Capitalize<string & P>}List`]: () => T[P][];\n};\n\n/**\n * Es el hook encargado de permitir la escucha de propiedades de un elemento\n */\ntype HookUseStateById<T extends Record<string, BasicStoredElement<any>>> = {\n [P in keyof T as `use${Capitalize<string & P>}ById`]: /**\n * Cada hook permite conocer el listado de elementos, reflejando la\n * actualización sobre éstos en tiempo real.\n */ (id: TId) => T[P] | undefined;\n};\n\n/**\n * Conjunto de hooks del store.\n */\ntype HooksMethods<T extends Record<string, BasicStoredElement<any>>> = {\n hooks: HookUseState<T> & HookUseStateById<T> & HookUseList<T>;\n};\n\n/**\n * Es la suscripción encargada de permitir la escucha de propiedades de un\n * elemento\n */\ntype SuscribeById<T extends Record<string, BasicStoredElement<any>>> = {\n [P in keyof T as `change${Capitalize<string & P>}Element`]: (\n id: TId,\n cb: (props: T[P]) => unknown,\n ) => StatefulStoreUnsuscriber;\n};\n\n/**\n * Es la suscripción encaragada de permitir la escucha de cambios en la lista y\n * las propiedades de sus elementos.\n */\ntype SuscribeToListChange<T extends Record<string, BasicStoredElement<any>>> = {\n [P in keyof T as `change${Capitalize<string & P>}`]: (\n cb: (props: T[P][]) => unknown,\n ) => StatefulStoreUnsuscriber;\n};\n\n/**\n * Es la suscripción encaragada de permitir la escucha de cambios en la\n * cantidad de elementos de la lista, pero no en las propiedades de los\n * elementos.\n */\ntype SuscribeToListCountChange<\n T extends Record<string, BasicStoredElement<any>>,\n> = {\n [P in keyof T as `change${Capitalize<string & P>}Ammount`]: (\n cb: (props: T[P][]) => unknown,\n ) => StatefulStoreUnsuscriber;\n};\n\ntype SuscribeMethods<T extends Record<string, BasicStoredElement<any>>> = {\n on: SuscribeById<T> & SuscribeToListChange<T> & SuscribeToListCountChange<T>;\n};\n\ntype InitialStates<T extends Record<string, BasicStoredElement<any>>> = {\n [P in keyof T as `${string & P}State`]: T[P][];\n};\ntype TPeople = { name: string };\nclass People extends BasicStoredElement<TPeople> {\n getId(): TId {\n return this.props.name;\n }\n}\n\nconst r = makeStatefulStore({\n people: People.prototype,\n});\n\nr.actions.addPeople;\nr.actions.emptyPeople;\nr.actions.removePeople;\nr.actions.updatePeopleList;\nr.hooks.usePeople;\nr.hooks.usePeopleById;\nr.hooks.usePeopleList;\nr.on.changePeople;\nr.on.changePeopleAmmount;\nr.on.changePeopleElement;\nr.state.getPeople;\nr.state.getPeopleState;\nr.state.updatePeople;\n\n/**\n * Este store permite mantener `N` listados de objetos y por cada tipo de\n * objeto ofrece métodos para agregar, eliminar, obtener uno, obtener todos y\n * un hook para conocer el listado en tiempo real.\n * \n * **Métodos disponibles**\n * \n * - **action.addXXX**: Agrega un elemento de tipo XXX a la lista.\n * - **action.emptyXXX**: Vacía el listado de tipo XXX.\n * - **action.removeXXX**: Elimina un elemento de tipo XXX de la lista.\n * - **action.updateXXXList**: Permite actualizar toda la lista en una sola\n * acción. - **hooks.useXXX**: Permite conocer el listado de elementos y el\n * cambio\n * en sus propiedades en tiempo real. \n * - **hooks.useXXXById**: Permite conocer los cambios a un elemento de la\n * lista en tiempo real. \n * - **hooks.useXXXList**: Permite conocer el listado de\n * elementos pero no reacciona a los cambios en las propiedades de los\n * elementos. \n * - **on.changeXXX**: Permite suscribirse al listado de elementos y\n * cambios en sus propiedades.\n * - **on.changeXXXAmmount**: Permite suscribirse\n * al listado de elementos, sin tomar en cuenta el cambio en las propiedades\n * de sus items.\n * - **on.changeXXXElement**: Permite suscribirse al cambio de\n * propiedades de un ítem particular\n * - **state.getXXX**: Permite obtener el\n * esatdo de un elemento particular de la lista.\n * - **state.getXXXState**:\n * Permite obtener el estado del listado completo de un tipo de elementos.\n * - **state.updateXXX**: Es un atajo para state.getXXX(id).update\n * \n * La funcionalidad de actualización se implementa en el objeto almacenado y es\n * comunicada en forma automática al store, de forma que el store no conoce\n * solamente cuántos y cuáles elementos hay almacenados, sino que además refleja\n * en tiempo real el estado de sus propiedades.\n * \n * @example\n * \n type TPeople = { name: string };\n class People extends BasicStoredElement<TPeople> {\n getId(): TId {\n return this.props.name;\n }\n }\n\n class Schedule extends BasicStoredElement<{ day: string; task: string }>\n {\n getId() {\n return this.props.day;\n }\n }\n\n const r = makeStatefulStore(\n {\n people: People.prototype,\n schedules: Schedule.prototype,\n },\n {\n peopleState: [new People({ name: 'A' }), new People({ name: 'B' })],\n },\n );\n\n const p = r.hooks.usePeople();\n p[0].props.name;\n\n r.hooks.usePeople();\n\n r.actions.removePeople('asdf');\n\n r.actions.addPeople(new People({ name: 'asdf' }));\n r.actions.removePeople('asdf');\n\n r.state.getPeopleState();\n const pep = r.state.getPeople('asdf')\n\n const ph = r.hooks.usePeople();\n const sch = r.hooks.useSchedules();\n */\nexport function makeStatefulStore<\n T extends Record<string, BasicStoredElement<any>>,\n>(entries: T, initialStates?: Partial<InitialStates<T>>) {\n const hookUseState = {} as HookUseState<T>;\n const hookUseList = {} as HookUseList<T>;\n const hookUseStateById = {} as HookUseStateById<T>;\n\n const suscribeById = {} as SuscribeById<T>;\n const suscribeToList = {} as SuscribeToListChange<T>;\n const suscribeToListCount = {} as SuscribeToListCountChange<T>;\n\n const addActions = {} as AddActions<T>;\n const emptyActions = {} as EmptyActions<T>;\n const removeActions = {} as RemoveActions<T>;\n const updateListActions = {} as UpdateListActions<T>;\n\n const getItemActions = {} as GetItemActions<T>;\n const getStateActions = {} as GetStateActions<T>;\n const updateItemActions = {} as UpdateItemActions<T>;\n\n Object.keys(entries).forEach((name) => {\n /**\n * Make store\n */\n const initialStateKey = `${upper(name)}State` as keyof InitialStates<T>;\n let store = {} as Record<string, T[typeof name]>;\n const initialState = initialStates?.[initialStateKey] as T[typeof name][];\n initialState?.forEach((current) => {\n store[current.getId()] = current;\n });\n\n /** Make event handlers */\n let listStateChangeHandlers: (() => void)[] = [];\n /**\n * Este método avisa acerca de un cambio en la cantidad de elementos o de\n * un cambio en las propiedades de algún elemento.\n */\n function shoutListStateChange() {\n listStateChangeHandlers.forEach((current) => current());\n }\n\n const elementChangeHandlers: Record<TId, (() => void)[]> = {};\n /**\n * Este método avisa acerca de un cambio en las propiedades de un elemento.\n */\n function shoutListElementChange(id: TId) {\n elementChangeHandlers[id]?.forEach((current) => current());\n }\n\n let listCountChangeHandlers: (() => void)[] = [];\n /**\n * Este método avisa acerca de un cambio en la cantidad de elementos\n */\n function shoutListCountChange() {\n listCountChangeHandlers.forEach((current) => current());\n }\n\n const onUpdateElementSuscriptions: Record<string, () => void> = {};\n\n /**\n *\n * Make actions\n *\n **/\n\n const addKey = `add${upper(name)}` as keyof AddActions<T>;\n /**\n * La acción de agregado del store. Agrega elementos y notifica tanto a los\n * listeners específicos del elemento como a los que escuchan el listado de\n * elementos.\n */\n addActions[addKey] = ((newElement: T[typeof name]) => {\n let elId = newElement.getId();\n let lastProps = { ...newElement.props };\n store[elId] = newElement as T[typeof name];\n const suscription = newElement.onUpdate(() => {\n const id = newElement.getId();\n\n if (id !== elId) {\n if (store[id]) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n newElement.update(lastProps);\n throw new Error(\n `Cannot set new id ${id} because it already exists`,\n );\n }\n\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete store[elId];\n store[id] = newElement;\n\n elId = id;\n lastProps = newElement.props;\n }\n\n shoutListElementChange(id);\n shoutListStateChange();\n });\n onUpdateElementSuscriptions[newElement.getId()] = suscription;\n shoutListStateChange();\n shoutListCountChange();\n shoutListElementChange(elId);\n }) as AddActions<T>[typeof addKey];\n\n /**\n * Acción de borrado completo. Vacía el store y avisa a todos los\n * listeners, incluyendo los que escuchan las propiedades de un elemento\n * particular.\n */\n const emptyKey = `empty${upper(name)}` as keyof EmptyActions<T>;\n emptyActions[emptyKey] = (() => {\n Object.values(onUpdateElementSuscriptions).forEach((current) =>\n current(),\n );\n store = {};\n shoutListCountChange();\n shoutListStateChange();\n Object.keys(elementChangeHandlers).forEach((current) =>\n shoutListElementChange(current),\n );\n }) as EmptyActions<T>[typeof emptyKey];\n\n /**\n * Elimina un elemento y avisa al store general y particular.\n */\n const removeKey = `remove${upper(name)}` as keyof RemoveActions<T>;\n removeActions[removeKey] = ((id: TId) => {\n onUpdateElementSuscriptions[id]?.();\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete store[id];\n shoutListCountChange();\n shoutListStateChange();\n shoutListElementChange(id);\n }) as RemoveActions<T>[typeof removeKey];\n\n const updateListKey = `update${upper(\n name,\n )}List` as keyof UpdateListActions<T>;\n updateListActions[updateListKey] = ((list: T[typeof name]) => {\n store[name] = list;\n shoutListCountChange();\n shoutListStateChange();\n }) as UpdateListActions<T>[typeof updateListKey];\n\n /**\n * Permite obtener el estado del listado completo de un tipo de elementos.\n */\n const getStateKey = `get${upper(name)}State` as keyof GetStateActions<T>;\n getStateActions[getStateKey] = (() => {\n return Object.values(store) as T[typeof name][];\n }) as GetStateActions<T>[typeof getStateKey];\n const getState = getStateActions[getStateKey] as () => T[typeof name][];\n\n /**\n * Permite obtener el estado de un elemento en particular.\n */\n const getItemKey = `get${upper(name)}` as keyof GetItemActions<T>;\n getItemActions[getItemKey] = ((id: TId) => {\n return store[id] as T[typeof name];\n }) as GetItemActions<T>[typeof getItemKey];\n\n /**\n * Permite actualizar un elemento\n */\n const updateItemKey = `update${upper(name)}` as keyof UpdateItemActions<T>;\n updateItemActions[updateItemKey] = ((\n id: TId,\n newProps: StatefulStoreUpdateProps<T[typeof name]>,\n ) => {\n store[id].update(newProps);\n }) as UpdateItemActions<T>[typeof updateItemKey];\n\n const hookUseStateKey = `use${upper(name)}` as keyof HookUseState<T>;\n /**\n * Este hook permite conocer el estado de todos los elementos del listado\n * en tiempo real.\n */\n hookUseState[hookUseStateKey] = (() => {\n const [state, setState] = useState(getState() as T[typeof name][]);\n\n useMount(() => {\n setState(getState() as T[typeof name][]);\n\n const eventHandler = () => {\n setState(getState() as T[typeof name][]);\n };\n\n listStateChangeHandlers.push(eventHandler);\n\n return () => {\n listStateChangeHandlers = listStateChangeHandlers.filter(\n (current) => current !== eventHandler,\n );\n };\n });\n\n return state;\n }) as unknown as HookUseState<T>[typeof hookUseStateKey];\n\n const hookUseListKey = `use${upper(name)}List` as keyof HookUseList<T>;\n /**\n * Este hook permite conocer el listado de elementos en tiempo real, sin\n * preocuparse por el cambio de propiedades.\n */\n hookUseList[hookUseListKey] = (() => {\n const [state, setState] = useState(getState() as T[typeof name][]);\n\n useMount(() => {\n setState(getState() as T[typeof name][]);\n\n const eventHandler = () => {\n setState(getState() as T[typeof name][]);\n };\n\n listCountChangeHandlers.push(eventHandler);\n\n return () => {\n listCountChangeHandlers = listCountChangeHandlers.filter(\n (current) => current !== eventHandler,\n );\n };\n });\n\n return state;\n }) as unknown as HookUseList<T>[typeof hookUseListKey];\n\n const hookUseStateByIdKey = `use${upper(\n name,\n )}ById` as keyof HookUseStateById<T>;\n\n hookUseStateById[hookUseStateByIdKey] = ((id: TId) => {\n const [state, setState] = useState({ obj: store[id] });\n\n useMount(() => {\n setState({ obj: store[id] });\n\n const eventHandler = () => {\n setState({ obj: store[id] });\n };\n\n if (!elementChangeHandlers[id]) elementChangeHandlers[id] = [];\n elementChangeHandlers[id].push(eventHandler);\n\n return () => {\n elementChangeHandlers[id] = elementChangeHandlers[id].filter(\n (current) => current !== eventHandler,\n );\n };\n });\n\n return state.obj;\n }) as unknown as HookUseStateById<T>[typeof hookUseStateByIdKey];\n /**\n * Esta suscripción permite conocer el estado de un único elemento en\n * tiempo real.\n */\n const onChangeElementKey = `change${upper(\n name,\n )}Element` as keyof SuscribeById<T>;\n suscribeById[onChangeElementKey] = ((\n id: string,\n cb: (props: T[typeof name]) => unknown,\n ) => {\n if (!elementChangeHandlers[id]) elementChangeHandlers[id] = [];\n\n const innerCb = () => {\n cb(store[id]);\n };\n elementChangeHandlers[id].push(innerCb);\n\n return () => {\n elementChangeHandlers[id] = elementChangeHandlers[id].filter(\n (current) => current !== innerCb,\n );\n };\n }) as SuscribeById<T>[typeof onChangeElementKey];\n\n const onChangeListKey = `change${upper(\n name,\n )}` as keyof SuscribeToListChange<T>;\n /**\n * Esta suscripción permite conocer el estado de la lista en tiempo real,\n * incluyendo cambios en los elementos.\n */\n suscribeToList[onChangeListKey] = ((\n cb: (props: T[typeof name][]) => unknown,\n ) => {\n const innerCb = () => {\n cb(getState());\n };\n listStateChangeHandlers.push(innerCb);\n\n return () => {\n listStateChangeHandlers = listStateChangeHandlers.filter(\n (current) => current !== innerCb,\n );\n };\n }) as SuscribeToListChange<T>[typeof onChangeListKey];\n\n const onChangeListCountKey = `change${upper(\n name,\n )}Ammount` as keyof SuscribeToListCountChange<T>;\n /**\n * Esta suscripción permite conocer el estado de la lista en tiempo real,\n * sin incluir los cambios en los elementos.\n */\n suscribeToListCount[onChangeListCountKey] = ((\n cb: (props: T[typeof name][]) => unknown,\n ) => {\n const innerCb = () => {\n cb(getState());\n };\n listCountChangeHandlers.push(innerCb);\n\n return () => {\n listCountChangeHandlers = listCountChangeHandlers.filter(\n (current) => current !== innerCb,\n );\n };\n }) as SuscribeToListCountChange<T>[typeof onChangeListCountKey];\n });\n\n const actions = Object.assign(\n {},\n addActions,\n removeActions,\n emptyActions,\n updateListActions,\n ) as ActionMethods<T>['actions'];\n\n const hooks = Object.assign({}, hookUseState, hookUseStateById, hookUseList);\n\n const on = Object.assign(\n {},\n suscribeById,\n suscribeToList,\n suscribeToListCount,\n );\n\n const state = Object.assign(\n {},\n getStateActions,\n getItemActions,\n updateItemActions,\n );\n\n return Object.assign(\n {},\n { hooks },\n { actions },\n { state },\n { on },\n ) as ActionMethods<T> &\n HooksMethods<T> &\n StateMethods<T> &\n SuscribeMethods<T>;\n}\n"],"names":["state"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"StatefulStore.js","sources":["../../src/storage/StatefulStore.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\r\nimport { useState } from 'react';\r\nimport { useMount } from '../hooks';\r\nimport { TId } from '../types';\r\n\r\nfunction upper(s: string) {\r\n return `${s.charAt(0).toUpperCase()}${s.slice(1)}`;\r\n}\r\n\r\ntype StatefulStoreUnsuscriber = () => void;\r\n\r\nexport type StatefulStoreUpdater<Props> = (currentProps: Props) => Props;\r\n\r\nexport type StatefulStoreUpdateProps<Props> =\r\n | StatefulStoreUpdater<Props>\r\n | Partial<Props>;\r\n\r\nfunction isUpdater<Props>(\r\n props: StatefulStoreUpdater<Props> | Partial<Props>,\r\n): props is StatefulStoreUpdater<Props> {\r\n return typeof props === 'function';\r\n}\r\n\r\n/**\r\n * Clase facilitadora del uso de StatefulStore. Es un pequeño almacen que\r\n * permite actualizar sus propiedades y sabe cómo sincronizarse con el store de\r\n * modo que los cambios se propaguen según corresponda.\r\n */\r\nexport abstract class BasicStoredElement<\r\n Props extends Record<string, unknown>,\r\n> {\r\n abstract getId(): TId;\r\n\r\n #onUpdateCbs: (() => void)[] = [];\r\n onUpdate(cb: () => void): StatefulStoreUnsuscriber {\r\n this.#onUpdateCbs.push(cb);\r\n\r\n return () => {\r\n this.#onUpdateCbs = this.#onUpdateCbs.filter((current) => current !== cb);\r\n };\r\n }\r\n\r\n props: Props = {} as Props;\r\n constructor(props: Props) {\r\n this.props = props;\r\n }\r\n\r\n protected shoutUpdates = () => {\r\n this.#onUpdateCbs.forEach((current) => current());\r\n };\r\n\r\n update(newProps: StatefulStoreUpdateProps<Props>) {\r\n const actualNewProps = isUpdater(newProps)\r\n ? newProps(this.props)\r\n : newProps;\r\n\r\n this.props = { ...this.props, ...actualNewProps };\r\n this.shoutUpdates();\r\n }\r\n\r\n useProps = () => {\r\n const [props, setState] = useState(this.props);\r\n\r\n useMount(() => {\r\n setState({ ...this.props });\r\n\r\n return this.onUpdate(() => {\r\n setState({ ...this.props });\r\n });\r\n });\r\n\r\n return props;\r\n };\r\n}\r\n\r\n/**\r\n * Son las acciones de adición del store.\r\n */\r\ntype AddActions<T extends Record<string, BasicStoredElement<any>>> = {\r\n [P in keyof T as `add${Capitalize<string & P>}`]: (el: T[P]) => void;\r\n};\r\n\r\n/**\r\n * Acciones de vaciado del store.\r\n */\r\ntype EmptyActions<T extends Record<string, BasicStoredElement<any>>> = {\r\n [P in keyof T as `empty${Capitalize<string & P>}`]: () => void;\r\n};\r\n\r\n/**\r\n * Acciones de removido del store.\r\n */\r\ntype RemoveActions<T extends Record<string, BasicStoredElement<any>>> = {\r\n [P in keyof T as `remove${Capitalize<string & P>}`]: (id: TId) => void;\r\n};\r\n\r\ntype UpdateListActions<T extends Record<string, BasicStoredElement<any>>> = {\r\n [P in keyof T as `update${Capitalize<string & P>}List`]: (\r\n newList: T[P],\r\n ) => void;\r\n};\r\n\r\n/**\r\n * Conjunto de acciones disponibles del store\r\n */\r\ntype ActionMethods<T extends Record<string, BasicStoredElement<any>>> = {\r\n actions: AddActions<T> &\r\n EmptyActions<T> &\r\n RemoveActions<T> &\r\n UpdateListActions<T>;\r\n};\r\n\r\n/**\r\n * Método que permite obtener el listado de elementos de un tipo.\r\n */\r\ntype GetStateActions<T extends Record<string, BasicStoredElement<any>>> = {\r\n [P in keyof T as `get${Capitalize<string & P>}State`]: () => T[P][];\r\n};\r\n\r\n/**\r\n * Método que permite conocer las propiedades de un elemento.\r\n */\r\ntype GetItemActions<T extends Record<string, BasicStoredElement<any>>> = {\r\n [P in keyof T as `get${Capitalize<string & P>}`]: (id: TId) => T[P];\r\n};\r\n\r\ntype UpdateItemActions<T extends Record<string, BasicStoredElement<any>>> = {\r\n [P in keyof T as `update${Capitalize<string & P>}`]: (\r\n id: TId,\r\n newProps: StatefulStoreUpdateProps<T[P]['props']>,\r\n ) => void;\r\n};\r\n\r\n/**\r\n * Conjunto de métodos que permiten acceder al estado en un momento\r\n * determinado.\r\n */\r\ntype StateMethods<T extends Record<string, BasicStoredElement<any>>> = {\r\n state: GetStateActions<T> & GetItemActions<T> & UpdateItemActions<T>;\r\n};\r\n\r\n/**\r\n * Es el hook encargado de permitir la escucha de listado de elementos y sus\r\n * propiedades.\r\n */\r\ntype HookUseState<T extends Record<string, BasicStoredElement<any>>> = {\r\n [P in keyof T as `use${Capitalize<string & P>}`]: () => T[P][];\r\n};\r\n\r\n/**\r\n * Es el hook encargado de permitir la escucha de listado de elementos\r\n */\r\ntype HookUseList<T extends Record<string, BasicStoredElement<any>>> = {\r\n [P in keyof T as `use${Capitalize<string & P>}List`]: () => T[P][];\r\n};\r\n\r\n/**\r\n * Es el hook encargado de permitir la escucha de propiedades de un elemento\r\n */\r\ntype HookUseStateById<T extends Record<string, BasicStoredElement<any>>> = {\r\n [P in keyof T as `use${Capitalize<string & P>}ById`]: /**\r\n * Cada hook permite conocer el listado de elementos, reflejando la\r\n * actualización sobre éstos en tiempo real.\r\n */ (id: TId) => T[P] | undefined;\r\n};\r\n\r\n/**\r\n * Conjunto de hooks del store.\r\n */\r\ntype HooksMethods<T extends Record<string, BasicStoredElement<any>>> = {\r\n hooks: HookUseState<T> & HookUseStateById<T> & HookUseList<T>;\r\n};\r\n\r\n/**\r\n * Es la suscripción encargada de permitir la escucha de propiedades de un\r\n * elemento\r\n */\r\ntype SuscribeById<T extends Record<string, BasicStoredElement<any>>> = {\r\n [P in keyof T as `change${Capitalize<string & P>}Element`]: (\r\n id: TId,\r\n cb: (props: T[P]) => unknown,\r\n ) => StatefulStoreUnsuscriber;\r\n};\r\n\r\n/**\r\n * Es la suscripción encaragada de permitir la escucha de cambios en la lista y\r\n * las propiedades de sus elementos.\r\n */\r\ntype SuscribeToListChange<T extends Record<string, BasicStoredElement<any>>> = {\r\n [P in keyof T as `change${Capitalize<string & P>}`]: (\r\n cb: (props: T[P][]) => unknown,\r\n ) => StatefulStoreUnsuscriber;\r\n};\r\n\r\n/**\r\n * Es la suscripción encaragada de permitir la escucha de cambios en la\r\n * cantidad de elementos de la lista, pero no en las propiedades de los\r\n * elementos.\r\n */\r\ntype SuscribeToListCountChange<\r\n T extends Record<string, BasicStoredElement<any>>,\r\n> = {\r\n [P in keyof T as `change${Capitalize<string & P>}Ammount`]: (\r\n cb: (props: T[P][]) => unknown,\r\n ) => StatefulStoreUnsuscriber;\r\n};\r\n\r\ntype SuscribeMethods<T extends Record<string, BasicStoredElement<any>>> = {\r\n on: SuscribeById<T> & SuscribeToListChange<T> & SuscribeToListCountChange<T>;\r\n};\r\n\r\ntype InitialStates<T extends Record<string, BasicStoredElement<any>>> = {\r\n [P in keyof T as `${string & P}State`]: T[P][];\r\n};\r\ntype TPeople = { name: string };\r\nclass People extends BasicStoredElement<TPeople> {\r\n getId(): TId {\r\n return this.props.name;\r\n }\r\n}\r\n\r\nconst r = makeStatefulStore({\r\n people: People.prototype,\r\n});\r\n\r\nr.actions.addPeople;\r\nr.actions.emptyPeople;\r\nr.actions.removePeople;\r\nr.actions.updatePeopleList;\r\nr.hooks.usePeople;\r\nr.hooks.usePeopleById;\r\nr.hooks.usePeopleList;\r\nr.on.changePeople;\r\nr.on.changePeopleAmmount;\r\nr.on.changePeopleElement;\r\nr.state.getPeople;\r\nr.state.getPeopleState;\r\nr.state.updatePeople;\r\n\r\n/**\r\n * Este store permite mantener `N` listados de objetos y por cada tipo de\r\n * objeto ofrece métodos para agregar, eliminar, obtener uno, obtener todos y\r\n * un hook para conocer el listado en tiempo real.\r\n * \r\n * **Métodos disponibles**\r\n * \r\n * - **action.addXXX**: Agrega un elemento de tipo XXX a la lista.\r\n * - **action.emptyXXX**: Vacía el listado de tipo XXX.\r\n * - **action.removeXXX**: Elimina un elemento de tipo XXX de la lista.\r\n * - **action.updateXXXList**: Permite actualizar toda la lista en una sola\r\n * acción. - **hooks.useXXX**: Permite conocer el listado de elementos y el\r\n * cambio\r\n * en sus propiedades en tiempo real. \r\n * - **hooks.useXXXById**: Permite conocer los cambios a un elemento de la\r\n * lista en tiempo real. \r\n * - **hooks.useXXXList**: Permite conocer el listado de\r\n * elementos pero no reacciona a los cambios en las propiedades de los\r\n * elementos. \r\n * - **on.changeXXX**: Permite suscribirse al listado de elementos y\r\n * cambios en sus propiedades.\r\n * - **on.changeXXXAmmount**: Permite suscribirse\r\n * al listado de elementos, sin tomar en cuenta el cambio en las propiedades\r\n * de sus items.\r\n * - **on.changeXXXElement**: Permite suscribirse al cambio de\r\n * propiedades de un ítem particular\r\n * - **state.getXXX**: Permite obtener el\r\n * esatdo de un elemento particular de la lista.\r\n * - **state.getXXXState**:\r\n * Permite obtener el estado del listado completo de un tipo de elementos.\r\n * - **state.updateXXX**: Es un atajo para state.getXXX(id).update\r\n * \r\n * La funcionalidad de actualización se implementa en el objeto almacenado y es\r\n * comunicada en forma automática al store, de forma que el store no conoce\r\n * solamente cuántos y cuáles elementos hay almacenados, sino que además refleja\r\n * en tiempo real el estado de sus propiedades.\r\n * \r\n * @example\r\n * \r\n type TPeople = { name: string };\r\n class People extends BasicStoredElement<TPeople> {\r\n getId(): TId {\r\n return this.props.name;\r\n }\r\n }\r\n\r\n class Schedule extends BasicStoredElement<{ day: string; task: string }>\r\n {\r\n getId() {\r\n return this.props.day;\r\n }\r\n }\r\n\r\n const r = makeStatefulStore(\r\n {\r\n people: People.prototype,\r\n schedules: Schedule.prototype,\r\n },\r\n {\r\n peopleState: [new People({ name: 'A' }), new People({ name: 'B' })],\r\n },\r\n );\r\n\r\n const p = r.hooks.usePeople();\r\n p[0].props.name;\r\n\r\n r.hooks.usePeople();\r\n\r\n r.actions.removePeople('asdf');\r\n\r\n r.actions.addPeople(new People({ name: 'asdf' }));\r\n r.actions.removePeople('asdf');\r\n\r\n r.state.getPeopleState();\r\n const pep = r.state.getPeople('asdf')\r\n\r\n const ph = r.hooks.usePeople();\r\n const sch = r.hooks.useSchedules();\r\n */\r\nexport function makeStatefulStore<\r\n T extends Record<string, BasicStoredElement<any>>,\r\n>(entries: T, initialStates?: Partial<InitialStates<T>>) {\r\n const hookUseState = {} as HookUseState<T>;\r\n const hookUseList = {} as HookUseList<T>;\r\n const hookUseStateById = {} as HookUseStateById<T>;\r\n\r\n const suscribeById = {} as SuscribeById<T>;\r\n const suscribeToList = {} as SuscribeToListChange<T>;\r\n const suscribeToListCount = {} as SuscribeToListCountChange<T>;\r\n\r\n const addActions = {} as AddActions<T>;\r\n const emptyActions = {} as EmptyActions<T>;\r\n const removeActions = {} as RemoveActions<T>;\r\n const updateListActions = {} as UpdateListActions<T>;\r\n\r\n const getItemActions = {} as GetItemActions<T>;\r\n const getStateActions = {} as GetStateActions<T>;\r\n const updateItemActions = {} as UpdateItemActions<T>;\r\n\r\n Object.keys(entries).forEach((name) => {\r\n /**\r\n * Make store\r\n */\r\n const initialStateKey = `${upper(name)}State` as keyof InitialStates<T>;\r\n let store = {} as Record<string, T[typeof name]>;\r\n const initialState = initialStates?.[initialStateKey] as T[typeof name][];\r\n initialState?.forEach((current) => {\r\n store[current.getId()] = current;\r\n });\r\n\r\n /** Make event handlers */\r\n let listStateChangeHandlers: (() => void)[] = [];\r\n /**\r\n * Este método avisa acerca de un cambio en la cantidad de elementos o de\r\n * un cambio en las propiedades de algún elemento.\r\n */\r\n function shoutListStateChange() {\r\n listStateChangeHandlers.forEach((current) => current());\r\n }\r\n\r\n const elementChangeHandlers: Record<TId, (() => void)[]> = {};\r\n /**\r\n * Este método avisa acerca de un cambio en las propiedades de un elemento.\r\n */\r\n function shoutListElementChange(id: TId) {\r\n elementChangeHandlers[id]?.forEach((current) => current());\r\n }\r\n\r\n let listCountChangeHandlers: (() => void)[] = [];\r\n /**\r\n * Este método avisa acerca de un cambio en la cantidad de elementos\r\n */\r\n function shoutListCountChange() {\r\n listCountChangeHandlers.forEach((current) => current());\r\n }\r\n\r\n const onUpdateElementSuscriptions: Record<string, () => void> = {};\r\n\r\n /**\r\n *\r\n * Make actions\r\n *\r\n **/\r\n\r\n const addKey = `add${upper(name)}` as keyof AddActions<T>;\r\n /**\r\n * La acción de agregado del store. Agrega elementos y notifica tanto a los\r\n * listeners específicos del elemento como a los que escuchan el listado de\r\n * elementos.\r\n */\r\n addActions[addKey] = ((newElement: T[typeof name]) => {\r\n let elId = newElement.getId();\r\n let lastProps = { ...newElement.props };\r\n store[elId] = newElement as T[typeof name];\r\n const suscription = newElement.onUpdate(() => {\r\n const id = newElement.getId();\r\n\r\n if (id !== elId) {\r\n if (store[id]) {\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\r\n newElement.update(lastProps);\r\n throw new Error(\r\n `Cannot set new id ${id} because it already exists`,\r\n );\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\r\n delete store[elId];\r\n store[id] = newElement;\r\n\r\n elId = id;\r\n lastProps = newElement.props;\r\n }\r\n\r\n shoutListElementChange(id);\r\n shoutListStateChange();\r\n });\r\n onUpdateElementSuscriptions[newElement.getId()] = suscription;\r\n shoutListStateChange();\r\n shoutListCountChange();\r\n shoutListElementChange(elId);\r\n }) as AddActions<T>[typeof addKey];\r\n\r\n /**\r\n * Acción de borrado completo. Vacía el store y avisa a todos los\r\n * listeners, incluyendo los que escuchan las propiedades de un elemento\r\n * particular.\r\n */\r\n const emptyKey = `empty${upper(name)}` as keyof EmptyActions<T>;\r\n emptyActions[emptyKey] = (() => {\r\n Object.values(onUpdateElementSuscriptions).forEach((current) =>\r\n current(),\r\n );\r\n store = {};\r\n shoutListCountChange();\r\n shoutListStateChange();\r\n Object.keys(elementChangeHandlers).forEach((current) =>\r\n shoutListElementChange(current),\r\n );\r\n }) as EmptyActions<T>[typeof emptyKey];\r\n\r\n /**\r\n * Elimina un elemento y avisa al store general y particular.\r\n */\r\n const removeKey = `remove${upper(name)}` as keyof RemoveActions<T>;\r\n removeActions[removeKey] = ((id: TId) => {\r\n onUpdateElementSuscriptions[id]?.();\r\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\r\n delete store[id];\r\n shoutListCountChange();\r\n shoutListStateChange();\r\n shoutListElementChange(id);\r\n }) as RemoveActions<T>[typeof removeKey];\r\n\r\n const updateListKey = `update${upper(\r\n name,\r\n )}List` as keyof UpdateListActions<T>;\r\n updateListActions[updateListKey] = ((list: T[typeof name]) => {\r\n store[name] = list;\r\n shoutListCountChange();\r\n shoutListStateChange();\r\n }) as UpdateListActions<T>[typeof updateListKey];\r\n\r\n /**\r\n * Permite obtener el estado del listado completo de un tipo de elementos.\r\n */\r\n const getStateKey = `get${upper(name)}State` as keyof GetStateActions<T>;\r\n getStateActions[getStateKey] = (() => {\r\n return Object.values(store) as T[typeof name][];\r\n }) as GetStateActions<T>[typeof getStateKey];\r\n const getState = getStateActions[getStateKey] as () => T[typeof name][];\r\n\r\n /**\r\n * Permite obtener el estado de un elemento en particular.\r\n */\r\n const getItemKey = `get${upper(name)}` as keyof GetItemActions<T>;\r\n getItemActions[getItemKey] = ((id: TId) => {\r\n return store[id] as T[typeof name];\r\n }) as GetItemActions<T>[typeof getItemKey];\r\n\r\n /**\r\n * Permite actualizar un elemento\r\n */\r\n const updateItemKey = `update${upper(name)}` as keyof UpdateItemActions<T>;\r\n updateItemActions[updateItemKey] = ((\r\n id: TId,\r\n newProps: StatefulStoreUpdateProps<T[typeof name]>,\r\n ) => {\r\n store[id].update(newProps);\r\n }) as UpdateItemActions<T>[typeof updateItemKey];\r\n\r\n const hookUseStateKey = `use${upper(name)}` as keyof HookUseState<T>;\r\n /**\r\n * Este hook permite conocer el estado de todos los elementos del listado\r\n * en tiempo real.\r\n */\r\n hookUseState[hookUseStateKey] = (() => {\r\n const [state, setState] = useState(getState() as T[typeof name][]);\r\n\r\n useMount(() => {\r\n setState(getState() as T[typeof name][]);\r\n\r\n const eventHandler = () => {\r\n setState(getState() as T[typeof name][]);\r\n };\r\n\r\n listStateChangeHandlers.push(eventHandler);\r\n\r\n return () => {\r\n listStateChangeHandlers = listStateChangeHandlers.filter(\r\n (current) => current !== eventHandler,\r\n );\r\n };\r\n });\r\n\r\n return state;\r\n }) as unknown as HookUseState<T>[typeof hookUseStateKey];\r\n\r\n const hookUseListKey = `use${upper(name)}List` as keyof HookUseList<T>;\r\n /**\r\n * Este hook permite conocer el listado de elementos en tiempo real, sin\r\n * preocuparse por el cambio de propiedades.\r\n */\r\n hookUseList[hookUseListKey] = (() => {\r\n const [state, setState] = useState(getState() as T[typeof name][]);\r\n\r\n useMount(() => {\r\n setState(getState() as T[typeof name][]);\r\n\r\n const eventHandler = () => {\r\n setState(getState() as T[typeof name][]);\r\n };\r\n\r\n listCountChangeHandlers.push(eventHandler);\r\n\r\n return () => {\r\n listCountChangeHandlers = listCountChangeHandlers.filter(\r\n (current) => current !== eventHandler,\r\n );\r\n };\r\n });\r\n\r\n return state;\r\n }) as unknown as HookUseList<T>[typeof hookUseListKey];\r\n\r\n const hookUseStateByIdKey = `use${upper(\r\n name,\r\n )}ById` as keyof HookUseStateById<T>;\r\n\r\n hookUseStateById[hookUseStateByIdKey] = ((id: TId) => {\r\n const [state, setState] = useState({ obj: store[id] });\r\n\r\n useMount(() => {\r\n setState({ obj: store[id] });\r\n\r\n const eventHandler = () => {\r\n setState({ obj: store[id] });\r\n };\r\n\r\n if (!elementChangeHandlers[id]) elementChangeHandlers[id] = [];\r\n elementChangeHandlers[id].push(eventHandler);\r\n\r\n return () => {\r\n elementChangeHandlers[id] = elementChangeHandlers[id].filter(\r\n (current) => current !== eventHandler,\r\n );\r\n };\r\n });\r\n\r\n return state.obj;\r\n }) as unknown as HookUseStateById<T>[typeof hookUseStateByIdKey];\r\n /**\r\n * Esta suscripción permite conocer el estado de un único elemento en\r\n * tiempo real.\r\n */\r\n const onChangeElementKey = `change${upper(\r\n name,\r\n )}Element` as keyof SuscribeById<T>;\r\n suscribeById[onChangeElementKey] = ((\r\n id: string,\r\n cb: (props: T[typeof name]) => unknown,\r\n ) => {\r\n if (!elementChangeHandlers[id]) elementChangeHandlers[id] = [];\r\n\r\n const innerCb = () => {\r\n cb(store[id]);\r\n };\r\n elementChangeHandlers[id].push(innerCb);\r\n\r\n return () => {\r\n elementChangeHandlers[id] = elementChangeHandlers[id].filter(\r\n (current) => current !== innerCb,\r\n );\r\n };\r\n }) as SuscribeById<T>[typeof onChangeElementKey];\r\n\r\n const onChangeListKey = `change${upper(\r\n name,\r\n )}` as keyof SuscribeToListChange<T>;\r\n /**\r\n * Esta suscripción permite conocer el estado de la lista en tiempo real,\r\n * incluyendo cambios en los elementos.\r\n */\r\n suscribeToList[onChangeListKey] = ((\r\n cb: (props: T[typeof name][]) => unknown,\r\n ) => {\r\n const innerCb = () => {\r\n cb(getState());\r\n };\r\n listStateChangeHandlers.push(innerCb);\r\n\r\n return () => {\r\n listStateChangeHandlers = listStateChangeHandlers.filter(\r\n (current) => current !== innerCb,\r\n );\r\n };\r\n }) as SuscribeToListChange<T>[typeof onChangeListKey];\r\n\r\n const onChangeListCountKey = `change${upper(\r\n name,\r\n )}Ammount` as keyof SuscribeToListCountChange<T>;\r\n /**\r\n * Esta suscripción permite conocer el estado de la lista en tiempo real,\r\n * sin incluir los cambios en los elementos.\r\n */\r\n suscribeToListCount[onChangeListCountKey] = ((\r\n cb: (props: T[typeof name][]) => unknown,\r\n ) => {\r\n const innerCb = () => {\r\n cb(getState());\r\n };\r\n listCountChangeHandlers.push(innerCb);\r\n\r\n return () => {\r\n listCountChangeHandlers = listCountChangeHandlers.filter(\r\n (current) => current !== innerCb,\r\n );\r\n };\r\n }) as SuscribeToListCountChange<T>[typeof onChangeListCountKey];\r\n });\r\n\r\n const actions = Object.assign(\r\n {},\r\n addActions,\r\n removeActions,\r\n emptyActions,\r\n updateListActions,\r\n ) as ActionMethods<T>['actions'];\r\n\r\n const hooks = Object.assign({}, hookUseState, hookUseStateById, hookUseList);\r\n\r\n const on = Object.assign(\r\n {},\r\n suscribeById,\r\n suscribeToList,\r\n suscribeToListCount,\r\n );\r\n\r\n const state = Object.assign(\r\n {},\r\n getStateActions,\r\n getItemActions,\r\n updateItemActions,\r\n );\r\n\r\n return Object.assign(\r\n {},\r\n { hooks },\r\n { actions },\r\n { state },\r\n { on },\r\n ) as ActionMethods<T> &\r\n HooksMethods<T> &\r\n StateMethods<T> &\r\n SuscribeMethods<T>;\r\n}\r\n"],"names":["state"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"persistentStorage.js","sources":["../../src/storage/persistentStorage.ts"],"sourcesContent":["const persistentStorage = new Proxy<{\n remove(prop: string): unknown;\n [key: string]: unknown;\n}>(\n {\n remove(prop) {\n localStorage.removeItem(prop);\n },\n },\n {\n get(_, prop) {\n try {\n const value = localStorage.getItem(String(prop));\n if (!value) return undefined;\n return JSON.parse(value) as unknown;\n } catch {\n return undefined;\n }\n },\n set(_, prop, value) {\n localStorage.setItem(String(prop), JSON.stringify(value));\n return true;\n },\n },\n);\n\ndeclare global {\n interface Window {\n persistentStorage: typeof persistentStorage;\n }\n}\n\nwindow.persistentStorage = persistentStorage;\n\nexport default persistentStorage;\n"],"names":[],"mappings":"AAAA,MAAM,oBAAoB,IAAI,KAAA;AAAA,EAI5B;AAAA,IACE,OAAO,IAAM,EAAA;AACX,MAAA,YAAA,CAAa,WAAW,IAAI,CAAA,CAAA;AAAA,KAC9B;AAAA,GACF;AAAA,EACA;AAAA,IACE,GAAA,CAAI,GAAG,IAAM,EAAA;AACX,MAAI,IAAA;AACF,QAAA,MAAM,KAAQ,GAAA,YAAA,CAAa,OAAQ,CAAA,MAAA,CAAO,IAAI,CAAC,CAAA,CAAA;AAC/C,QAAA,IAAI,CAAC,KAAA;AAAO,UAAO,OAAA,KAAA,CAAA,CAAA;AACnB,QAAO,OAAA,IAAA,CAAK,MAAM,KAAK,CAAA,CAAA;AAAA,OACjB,CAAA,MAAA;AACN,QAAO,OAAA,KAAA,CAAA,CAAA;AAAA,OACT;AAAA,KACF;AAAA,IACA,GAAA,CAAI,CAAG,EAAA,IAAA,EAAM,KAAO,EAAA;AAClB,MAAA,YAAA,CAAa,QAAQ,MAAO,CAAA,IAAI,GAAG,IAAK,CAAA,SAAA,CAAU,KAAK,CAAC,CAAA,CAAA;AACxD,MAAO,OAAA,IAAA,CAAA;AAAA,KACT;AAAA,GACF;AACF,CAAA,CAAA;AAQA,MAAA,CAAO,iBAAoB,GAAA,iBAAA,CAAA;AAE3B,0BAAe,iBAAA;;;;"}
|
|
1
|
+
{"version":3,"file":"persistentStorage.js","sources":["../../src/storage/persistentStorage.ts"],"sourcesContent":["const persistentStorage = new Proxy<{\r\n remove(prop: string): unknown;\r\n [key: string]: unknown;\r\n}>(\r\n {\r\n remove(prop) {\r\n localStorage.removeItem(prop);\r\n },\r\n },\r\n {\r\n get(_, prop) {\r\n try {\r\n const value = localStorage.getItem(String(prop));\r\n if (!value) return undefined;\r\n return JSON.parse(value) as unknown;\r\n } catch {\r\n return undefined;\r\n }\r\n },\r\n set(_, prop, value) {\r\n localStorage.setItem(String(prop), JSON.stringify(value));\r\n return true;\r\n },\r\n },\r\n);\r\n\r\ndeclare global {\r\n interface Window {\r\n persistentStorage: typeof persistentStorage;\r\n }\r\n}\r\n\r\nwindow.persistentStorage = persistentStorage;\r\n\r\nexport default persistentStorage;\r\n"],"names":[],"mappings":"AAAA,MAAM,oBAAoB,IAAI,KAAA;AAAA,EAI5B;AAAA,IACE,OAAO,IAAM,EAAA;AACX,MAAA,YAAA,CAAa,WAAW,IAAI,CAAA,CAAA;AAAA,KAC9B;AAAA,GACF;AAAA,EACA;AAAA,IACE,GAAA,CAAI,GAAG,IAAM,EAAA;AACX,MAAI,IAAA;AACF,QAAA,MAAM,KAAQ,GAAA,YAAA,CAAa,OAAQ,CAAA,MAAA,CAAO,IAAI,CAAC,CAAA,CAAA;AAC/C,QAAA,IAAI,CAAC,KAAA;AAAO,UAAO,OAAA,KAAA,CAAA,CAAA;AACnB,QAAO,OAAA,IAAA,CAAK,MAAM,KAAK,CAAA,CAAA;AAAA,OACjB,CAAA,MAAA;AACN,QAAO,OAAA,KAAA,CAAA,CAAA;AAAA,OACT;AAAA,KACF;AAAA,IACA,GAAA,CAAI,CAAG,EAAA,IAAA,EAAM,KAAO,EAAA;AAClB,MAAA,YAAA,CAAa,QAAQ,MAAO,CAAA,IAAI,GAAG,IAAK,CAAA,SAAA,CAAU,KAAK,CAAC,CAAA,CAAA;AACxD,MAAO,OAAA,IAAA,CAAA;AAAA,KACT;AAAA,GACF;AACF,CAAA,CAAA;AAQA,MAAA,CAAO,iBAAoB,GAAA,iBAAA,CAAA;AAE3B,0BAAe,iBAAA;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useLocalStorage.js","sources":["../../src/storage/useLocalStorage.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo, useState } from 'react';\nimport { EventEmitter } from '../events/EventEmitter';\n\nconst localStorageController =\n new (class LocalSctorageController extends EventEmitter<{\n update: {\n prop: string;\n value: unknown;\n };\n }> {})();\n\n/**\n * @param prop este nombre define el nombre del localStorage, las modificaciones a este parametro no van a tener efecto.\n */\nexport function useLocalStorage<T>(\n prop: string,\n defaultValue?: T,\n): [T, (newValue: T) => void] {\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const actualProp = useMemo(() => prop, []);\n const storageValue = useMemo(\n () => localStorage.getItem(actualProp) as string,\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [],\n );\n\n const [value, setValue] = useState<T>(\n storageValue ? (JSON.parse(storageValue) as T) : (defaultValue as T),\n );\n useEffect(() => {\n setValue(JSON.parse(storageValue) as T);\n return localStorageController.on('update', (ev) => {\n if (ev.prop === actualProp) {\n setValue(ev.value as T);\n localStorage.setItem(actualProp, JSON.stringify(ev.value));\n }\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return [\n value,\n useCallback(\n (newValue: T) => {\n localStorageController.emit('update', {\n prop: actualProp,\n value: newValue,\n });\n },\n [actualProp],\n ),\n ];\n}\n"],"names":[],"mappings":";;;AAGA,MAAM,sBACJ,GAAA,IAAK,MAAM,uBAAA,SAAgC,YAKxC,CAAA;AAAC,CAAG,EAAA,CAAA;AAKO,SAAA,eAAA,CACd,MACA,YAC4B,EAAA;AAE5B,EAAA,MAAM,UAAa,GAAA,OAAA,CAAQ,MAAM,IAAA,EAAM,EAAE,CAAA,CAAA;AACzC,EAAA,MAAM,YAAe,GAAA,OAAA;AAAA,IACnB,MAAM,YAAa,CAAA,OAAA,CAAQ,UAAU,CAAA;AAAA;AAAA,IAErC,EAAC;AAAA,GACH,CAAA;AAEA,EAAM,MAAA,CAAC,KAAO,EAAA,QAAQ,CAAI,GAAA,QAAA;AAAA,IACxB,YAAgB,GAAA,IAAA,CAAK,KAAM,CAAA,YAAY,CAAW,GAAA,YAAA;AAAA,GACpD,CAAA;AACA,EAAA,SAAA,CAAU,MAAM;AACd,IAAS,QAAA,CAAA,IAAA,CAAK,KAAM,CAAA,YAAY,CAAM,CAAA,CAAA;AACtC,IAAA,OAAO,sBAAuB,CAAA,EAAA,CAAG,QAAU,EAAA,CAAC,EAAO,KAAA;AACjD,MAAI,IAAA,EAAA,CAAG,SAAS,UAAY,EAAA;AAC1B,QAAA,QAAA,CAAS,GAAG,KAAU,CAAA,CAAA;AACtB,QAAA,YAAA,CAAa,QAAQ,UAAY,EAAA,IAAA,CAAK,SAAU,CAAA,EAAA,CAAG,KAAK,CAAC,CAAA,CAAA;AAAA,OAC3D;AAAA,KACD,CAAA,CAAA;AAAA,GAEH,EAAG,EAAE,CAAA,CAAA;AAEL,EAAO,OAAA;AAAA,IACL,KAAA;AAAA,IACA,WAAA;AAAA,MACE,CAAC,QAAgB,KAAA;AACf,QAAA,sBAAA,CAAuB,KAAK,QAAU,EAAA;AAAA,UACpC,IAAM,EAAA,UAAA;AAAA,UACN,KAAO,EAAA,QAAA;AAAA,SACR,CAAA,CAAA;AAAA,OACH;AAAA,MACA,CAAC,UAAU,CAAA;AAAA,KACb;AAAA,GACF,CAAA;AACF;;;;"}
|
|
1
|
+
{"version":3,"file":"useLocalStorage.js","sources":["../../src/storage/useLocalStorage.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo, useState } from 'react';\r\nimport { EventEmitter } from '../events/EventEmitter';\r\n\r\nconst localStorageController =\r\n new (class LocalSctorageController extends EventEmitter<{\r\n update: {\r\n prop: string;\r\n value: unknown;\r\n };\r\n }> {})();\r\n\r\n/**\r\n * @param prop este nombre define el nombre del localStorage, las modificaciones a este parametro no van a tener efecto.\r\n */\r\nexport function useLocalStorage<T>(\r\n prop: string,\r\n defaultValue?: T,\r\n): [T, (newValue: T) => void] {\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n const actualProp = useMemo(() => prop, []);\r\n const storageValue = useMemo(\r\n () => localStorage.getItem(actualProp) as string,\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n [],\r\n );\r\n\r\n const [value, setValue] = useState<T>(\r\n storageValue ? (JSON.parse(storageValue) as T) : (defaultValue as T),\r\n );\r\n useEffect(() => {\r\n setValue(JSON.parse(storageValue) as T);\r\n return localStorageController.on('update', (ev) => {\r\n if (ev.prop === actualProp) {\r\n setValue(ev.value as T);\r\n localStorage.setItem(actualProp, JSON.stringify(ev.value));\r\n }\r\n });\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n return [\r\n value,\r\n useCallback(\r\n (newValue: T) => {\r\n localStorageController.emit('update', {\r\n prop: actualProp,\r\n value: newValue,\r\n });\r\n },\r\n [actualProp],\r\n ),\r\n ];\r\n}\r\n"],"names":[],"mappings":";;;AAGA,MAAM,sBACJ,GAAA,IAAK,MAAM,uBAAA,SAAgC,YAKxC,CAAA;AAAC,CAAG,EAAA,CAAA;AAKO,SAAA,eAAA,CACd,MACA,YAC4B,EAAA;AAE5B,EAAA,MAAM,UAAa,GAAA,OAAA,CAAQ,MAAM,IAAA,EAAM,EAAE,CAAA,CAAA;AACzC,EAAA,MAAM,YAAe,GAAA,OAAA;AAAA,IACnB,MAAM,YAAa,CAAA,OAAA,CAAQ,UAAU,CAAA;AAAA;AAAA,IAErC,EAAC;AAAA,GACH,CAAA;AAEA,EAAM,MAAA,CAAC,KAAO,EAAA,QAAQ,CAAI,GAAA,QAAA;AAAA,IACxB,YAAgB,GAAA,IAAA,CAAK,KAAM,CAAA,YAAY,CAAW,GAAA,YAAA;AAAA,GACpD,CAAA;AACA,EAAA,SAAA,CAAU,MAAM;AACd,IAAS,QAAA,CAAA,IAAA,CAAK,KAAM,CAAA,YAAY,CAAM,CAAA,CAAA;AACtC,IAAA,OAAO,sBAAuB,CAAA,EAAA,CAAG,QAAU,EAAA,CAAC,EAAO,KAAA;AACjD,MAAI,IAAA,EAAA,CAAG,SAAS,UAAY,EAAA;AAC1B,QAAA,QAAA,CAAS,GAAG,KAAU,CAAA,CAAA;AACtB,QAAA,YAAA,CAAa,QAAQ,UAAY,EAAA,IAAA,CAAK,SAAU,CAAA,EAAA,CAAG,KAAK,CAAC,CAAA,CAAA;AAAA,OAC3D;AAAA,KACD,CAAA,CAAA;AAAA,GAEH,EAAG,EAAE,CAAA,CAAA;AAEL,EAAO,OAAA;AAAA,IACL,KAAA;AAAA,IACA,WAAA;AAAA,MACE,CAAC,QAAgB,KAAA;AACf,QAAA,sBAAA,CAAuB,KAAK,QAAU,EAAA;AAAA,UACpC,IAAM,EAAA,UAAA;AAAA,UACN,KAAO,EAAA,QAAA;AAAA,SACR,CAAA,CAAA;AAAA,OACH;AAAA,MACA,CAAC,UAAU,CAAA;AAAA,KACb;AAAA,GACF,CAAA;AACF;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"alignment.js","sources":["../../src/string/alignment.ts"],"sourcesContent":["/**\n * Calculates the alignment distance between two strings using the Levenshtein\n * distance algorithm. This distance is defined as the minimum number of\n * single-character edits (insertions, deletions, or substitutions) required to\n * change one string into the other. The function implements a dynamic\n * programming approach to efficiently compute this metric.\n *\n * @param {string} a - The first string to compare.\n * @param {string} b - The second string to compare.\n * @returns {number} The alignment distance between the two strings. This is a non-negative integer where\n * a value of 0 indicates that the strings are identical, and a larger value\n * indicates a greater degree of difference.\n *\n * @example\n * // returns 3\n * alignment(\"kitten\", \"sitting\");\n *\n * @example\n * // returns 2\n * alignment(\"flaw\", \"lawn\");\n */\nexport function alignment(a: string, b: string) {\n const m = a.length;\n const n = b.length;\n const dp = Array.from({ length: m + 1 }, () => Array<number>(n + 1).fill(0));\n\n // Initialize the first column and the first row of the matrix\n for (let i = 0; i <= m; i++) dp[i][0] = i;\n for (let j = 0; j <= n; j++) dp[0][j] = j;\n\n // Fill dp matrix\n for (let i = 1; i <= m; i++) {\n for (let j = 1; j <= n; j++) {\n const cost = a[i - 1] === b[j - 1] ? 0 : 1;\n dp[i][j] = Math.min(\n dp[i - 1][j] + 1, // deletion\n dp[i][j - 1] + 1, // insertion\n dp[i - 1][j - 1] + cost, // substitution\n );\n }\n }\n\n // Return the value in the bottom right corner\n return dp[m][n];\n}\n"],"names":[],"mappings":"AAqBgB,SAAA,SAAA,CAAU,GAAW,CAAW,EAAA;AAC9C,EAAA,MAAM,IAAI,CAAE,CAAA,MAAA,CAAA;AACZ,EAAA,MAAM,IAAI,CAAE,CAAA,MAAA,CAAA;AACZ,EAAA,MAAM,EAAK,GAAA,KAAA,CAAM,IAAK,CAAA,EAAE,QAAQ,CAAI,GAAA,CAAA,EAAK,EAAA,MAAM,MAAc,CAAI,GAAA,CAAC,CAAE,CAAA,IAAA,CAAK,CAAC,CAAC,CAAA,CAAA;AAG3E,EAAS,KAAA,IAAA,CAAA,GAAI,CAAG,EAAA,CAAA,IAAK,CAAG,EAAA,CAAA,EAAA;AAAK,IAAG,EAAA,CAAA,CAAC,CAAE,CAAA,CAAC,CAAI,GAAA,CAAA,CAAA;AACxC,EAAS,KAAA,IAAA,CAAA,GAAI,CAAG,EAAA,CAAA,IAAK,CAAG,EAAA,CAAA,EAAA;AAAK,IAAG,EAAA,CAAA,CAAC,CAAE,CAAA,CAAC,CAAI,GAAA,CAAA,CAAA;AAGxC,EAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAK,IAAA,CAAA,EAAG,CAAK,EAAA,EAAA;AAC3B,IAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAK,IAAA,CAAA,EAAG,CAAK,EAAA,EAAA;AAC3B,MAAM,MAAA,IAAA,GAAO,EAAE,CAAI,GAAA,CAAC,MAAM,CAAE,CAAA,CAAA,GAAI,CAAC,CAAA,GAAI,CAAI,GAAA,CAAA,CAAA;AACzC,MAAA,EAAA,CAAG,CAAC,CAAA,CAAE,CAAC,CAAA,GAAI,IAAK,CAAA,GAAA;AAAA,QACd,EAAG,CAAA,CAAA,GAAI,CAAC,CAAA,CAAE,CAAC,CAAI,GAAA,CAAA;AAAA;AAAA,QACf,EAAG,CAAA,CAAC,CAAE,CAAA,CAAA,GAAI,CAAC,CAAI,GAAA,CAAA;AAAA;AAAA,QACf,GAAG,CAAI,GAAA,CAAC,CAAE,CAAA,CAAA,GAAI,CAAC,CAAI,GAAA,IAAA;AAAA;AAAA,OACrB,CAAA;AAAA,KACF;AAAA,GACF;AAGA,EAAO,OAAA,EAAA,CAAG,CAAC,CAAA,CAAE,CAAC,CAAA,CAAA;AAChB;;;;"}
|
|
1
|
+
{"version":3,"file":"alignment.js","sources":["../../src/string/alignment.ts"],"sourcesContent":["/**\r\n * Calculates the alignment distance between two strings using the Levenshtein\r\n * distance algorithm. This distance is defined as the minimum number of\r\n * single-character edits (insertions, deletions, or substitutions) required to\r\n * change one string into the other. The function implements a dynamic\r\n * programming approach to efficiently compute this metric.\r\n *\r\n * @param {string} a - The first string to compare.\r\n * @param {string} b - The second string to compare.\r\n * @returns {number} The alignment distance between the two strings. This is a non-negative integer where\r\n * a value of 0 indicates that the strings are identical, and a larger value\r\n * indicates a greater degree of difference.\r\n *\r\n * @example\r\n * // returns 3\r\n * alignment(\"kitten\", \"sitting\");\r\n *\r\n * @example\r\n * // returns 2\r\n * alignment(\"flaw\", \"lawn\");\r\n */\r\nexport function alignment(a: string, b: string) {\r\n const m = a.length;\r\n const n = b.length;\r\n const dp = Array.from({ length: m + 1 }, () => Array<number>(n + 1).fill(0));\r\n\r\n // Initialize the first column and the first row of the matrix\r\n for (let i = 0; i <= m; i++) dp[i][0] = i;\r\n for (let j = 0; j <= n; j++) dp[0][j] = j;\r\n\r\n // Fill dp matrix\r\n for (let i = 1; i <= m; i++) {\r\n for (let j = 1; j <= n; j++) {\r\n const cost = a[i - 1] === b[j - 1] ? 0 : 1;\r\n dp[i][j] = Math.min(\r\n dp[i - 1][j] + 1, // deletion\r\n dp[i][j - 1] + 1, // insertion\r\n dp[i - 1][j - 1] + cost, // substitution\r\n );\r\n }\r\n }\r\n\r\n // Return the value in the bottom right corner\r\n return dp[m][n];\r\n}\r\n"],"names":[],"mappings":"AAqBgB,SAAA,SAAA,CAAU,GAAW,CAAW,EAAA;AAC9C,EAAA,MAAM,IAAI,CAAE,CAAA,MAAA,CAAA;AACZ,EAAA,MAAM,IAAI,CAAE,CAAA,MAAA,CAAA;AACZ,EAAA,MAAM,EAAK,GAAA,KAAA,CAAM,IAAK,CAAA,EAAE,QAAQ,CAAI,GAAA,CAAA,EAAK,EAAA,MAAM,MAAc,CAAI,GAAA,CAAC,CAAE,CAAA,IAAA,CAAK,CAAC,CAAC,CAAA,CAAA;AAG3E,EAAS,KAAA,IAAA,CAAA,GAAI,CAAG,EAAA,CAAA,IAAK,CAAG,EAAA,CAAA,EAAA;AAAK,IAAG,EAAA,CAAA,CAAC,CAAE,CAAA,CAAC,CAAI,GAAA,CAAA,CAAA;AACxC,EAAS,KAAA,IAAA,CAAA,GAAI,CAAG,EAAA,CAAA,IAAK,CAAG,EAAA,CAAA,EAAA;AAAK,IAAG,EAAA,CAAA,CAAC,CAAE,CAAA,CAAC,CAAI,GAAA,CAAA,CAAA;AAGxC,EAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAK,IAAA,CAAA,EAAG,CAAK,EAAA,EAAA;AAC3B,IAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAK,IAAA,CAAA,EAAG,CAAK,EAAA,EAAA;AAC3B,MAAM,MAAA,IAAA,GAAO,EAAE,CAAI,GAAA,CAAC,MAAM,CAAE,CAAA,CAAA,GAAI,CAAC,CAAA,GAAI,CAAI,GAAA,CAAA,CAAA;AACzC,MAAA,EAAA,CAAG,CAAC,CAAA,CAAE,CAAC,CAAA,GAAI,IAAK,CAAA,GAAA;AAAA,QACd,EAAG,CAAA,CAAA,GAAI,CAAC,CAAA,CAAE,CAAC,CAAI,GAAA,CAAA;AAAA;AAAA,QACf,EAAG,CAAA,CAAC,CAAE,CAAA,CAAA,GAAI,CAAC,CAAI,GAAA,CAAA;AAAA;AAAA,QACf,GAAG,CAAI,GAAA,CAAC,CAAE,CAAA,CAAA,GAAI,CAAC,CAAI,GAAA,IAAA;AAAA;AAAA,OACrB,CAAA;AAAA,KACF;AAAA,GACF;AAGA,EAAO,OAAA,EAAA,CAAG,CAAC,CAAA,CAAE,CAAC,CAAA,CAAA;AAChB;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ucfirst.js","sources":["../../src/string/ucfirst.ts"],"sourcesContent":["export function ucfirst(word: string) {\n return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();\n}\n"],"names":[],"mappings":"AAAO,SAAS,QAAQ,IAAc,EAAA;AACpC,EAAO,OAAA,IAAA,CAAK,MAAO,CAAA,CAAC,CAAE,CAAA,WAAA,KAAgB,IAAK,CAAA,KAAA,CAAM,CAAC,CAAA,CAAE,WAAY,EAAA,CAAA;AAClE;;;;"}
|
|
1
|
+
{"version":3,"file":"ucfirst.js","sources":["../../src/string/ucfirst.ts"],"sourcesContent":["export function ucfirst(word: string) {\r\n return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();\r\n}\r\n"],"names":[],"mappings":"AAAO,SAAS,QAAQ,IAAc,EAAA;AACpC,EAAO,OAAA,IAAA,CAAK,MAAO,CAAA,CAAC,CAAE,CAAA,WAAA,KAAgB,IAAK,CAAA,KAAA,CAAM,CAAC,CAAA,CAAE,WAAY,EAAA,CAAA;AAClE;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toBoolean.js","sources":["../../src/typeGuards/toBoolean.ts"],"sourcesContent":["/**\n * Toma un valor y devuelve true o false según las\n * siguientes condiciones:\n *\n * Si es string, ['',\n * 'false'].includes(value.toLowerCase()) => false, todo lo\n * demás => true.\n *\n * Si es array, [] => false, [...] => true.\n *\n * Todo lo demás !!value\n *\n * @example\n *\n * toBoolean('true') // true\n * toBoolean('TrUE') // true\n * toBoolean('FAlSe') // false\n * toBoolean(0) // false\n * toBoolean(1) // true\n * toBoolean([0]) // true\n * toBoolean([]) // false\n */\nexport function toBoolean(value: unknown): boolean {\n if (typeof value === 'string') {\n return !['false', ''].includes(value.toLowerCase());\n }\n\n if (Array.isArray(value)) return value.length > 0;\n\n return !!value;\n}\n"],"names":[],"mappings":"AAsBO,SAAS,UAAU,KAAyB,EAAA;AACjD,EAAI,IAAA,OAAO,UAAU,QAAU,EAAA;AAC7B,IAAO,OAAA,CAAC,CAAC,OAAS,EAAA,EAAE,EAAE,QAAS,CAAA,KAAA,CAAM,aAAa,CAAA,CAAA;AAAA,GACpD;AAEA,EAAI,IAAA,KAAA,CAAM,QAAQ,KAAK,CAAA;AAAG,IAAA,OAAO,MAAM,MAAS,GAAA,CAAA,CAAA;AAEhD,EAAA,OAAO,CAAC,CAAC,KAAA,CAAA;AACX;;;;"}
|
|
1
|
+
{"version":3,"file":"toBoolean.js","sources":["../../src/typeGuards/toBoolean.ts"],"sourcesContent":["/**\r\n * Toma un valor y devuelve true o false según las\r\n * siguientes condiciones:\r\n *\r\n * Si es string, ['',\r\n * 'false'].includes(value.toLowerCase()) => false, todo lo\r\n * demás => true.\r\n *\r\n * Si es array, [] => false, [...] => true.\r\n *\r\n * Todo lo demás !!value\r\n *\r\n * @example\r\n *\r\n * toBoolean('true') // true\r\n * toBoolean('TrUE') // true\r\n * toBoolean('FAlSe') // false\r\n * toBoolean(0) // false\r\n * toBoolean(1) // true\r\n * toBoolean([0]) // true\r\n * toBoolean([]) // false\r\n */\r\nexport function toBoolean(value: unknown): boolean {\r\n if (typeof value === 'string') {\r\n return !['false', ''].includes(value.toLowerCase());\r\n }\r\n\r\n if (Array.isArray(value)) return value.length > 0;\r\n\r\n return !!value;\r\n}\r\n"],"names":[],"mappings":"AAsBO,SAAS,UAAU,KAAyB,EAAA;AACjD,EAAI,IAAA,OAAO,UAAU,QAAU,EAAA;AAC7B,IAAO,OAAA,CAAC,CAAC,OAAS,EAAA,EAAE,EAAE,QAAS,CAAA,KAAA,CAAM,aAAa,CAAA,CAAA;AAAA,GACpD;AAEA,EAAI,IAAA,KAAA,CAAM,QAAQ,KAAK,CAAA;AAAG,IAAA,OAAO,MAAM,MAAS,GAAA,CAAA,CAAA;AAEhD,EAAA,OAAO,CAAC,CAAC,KAAA,CAAA;AACX;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parseXmlAsync.js","sources":["../../src/xml/parseXmlAsync.ts"],"sourcesContent":["import xml2js, { ParserOptions } from 'xml2js';\nimport { parseBooleans, parseNumbers } from 'xml2js/lib/processors';\nimport {\n TApiaFieldPropsObj,\n TFieldScriptEvents,\n TFieldServerEvents,\n TNotificationMessage,\n} from '../types';\n\nexport const processAjaxEventTagNames = (name: string): string => {\n return name;\n};\n\nexport const processAjaxEventAttrNames = (name: string): string => {\n return name;\n};\n\nexport interface TSessionExceptions {\n exception: {\n content: string;\n text: string;\n };\n}\n\nexport const processAjaxEventResponse = (\n value: unknown,\n name: string,\n): string | unknown => {\n if (name === 'v' && value === 'T') return true;\n if (name === 'v' && value === 'F') return false;\n return value;\n};\n\nexport const getJSObjfromXML = (\n xml: XMLDocument | string,\n): Record<string, unknown> => {\n let objJS: TNotificationMessage | null = null;\n\n const parser = new xml2js.Parser({\n trim: true,\n normalize: true,\n explicitRoot: false,\n mergeAttrs: true,\n explicitArray: false,\n charkey: 'content',\n attrValueProcessors: [\n parseBooleans,\n processStringObj,\n processAjaxEventResponse,\n ],\n tagNameProcessors: [processAjaxEventTagNames],\n attrNameProcessors: [processAjaxEventAttrNames],\n } as ParserOptions);\n\n parser.parseString(\n xml,\n (err: Error | null, result: Record<string, unknown>) => {\n if (err) {\n console.warn('Error Parsing XML data', err);\n } else {\n objJS = result;\n }\n },\n );\n if (objJS) {\n return objJS;\n }\n return {};\n};\n\nexport const processStringObj = (\n value: string,\n key: string,\n):\n | TApiaFieldPropsObj\n | string\n | number\n | TFieldScriptEvents\n | TFieldServerEvents => {\n /*\n\n * ESTAS ENTRADAS VAN A SER NECESARIAS CUANDO SE INCORPORE MODULO DE\n * EJECUCION AL MONOREPO\n\n if (key === 'properties') {\n return parseFieldPropertiesObj(jsonDecode(value)) as TApiaFieldPropsObj;\n }\n if (key === 'scriptEvents') {\n return JSON.parse(value) as TFieldScriptEvents;\n }\n if (key === 'serverEvents') {\n return JSON.parse(value) as TFieldServerEvents;\n }\n if (key === 'gridXml') {\n return getJSObjfromXML(he.decode(value).replaceAll('&', '&'));\n } */\n if (key === 'value' && typeof value === 'number' && Number.isNaN(value)) {\n return '';\n }\n if (key === 'valueType' && typeof value === 'string' && value === 'null') {\n return '';\n }\n if (\n (key === 'cols' ||\n key === 'rows' ||\n key === 'x' ||\n key === 'y' ||\n key === 'length') &&\n typeof value === 'string'\n ) {\n return parseNumbers(value);\n }\n return value;\n};\n\nexport const parseXmlAsync = async <T>(xml: string): Promise<T> => {\n const parser = new xml2js.Parser({\n trim: true,\n normalize: true,\n explicitRoot: false,\n mergeAttrs: true,\n explicitArray: false,\n charkey: 'content',\n attrValueProcessors: [\n parseBooleans,\n processStringObj,\n processAjaxEventResponse,\n ],\n tagNameProcessors: [processAjaxEventTagNames],\n attrNameProcessors: [processAjaxEventAttrNames],\n } as ParserOptions);\n\n const result = await new Promise<T>((resolve, reject) => {\n parser.parseString(xml, (err: Error | null, innerResult: T) => {\n if (err) reject(err);\n else {\n resolve(innerResult);\n }\n });\n });\n\n return result;\n};\n"],"names":[],"mappings":";;;AASa,MAAA,wBAAA,GAA2B,CAAC,IAAyB,KAAA;AAChE,EAAO,OAAA,IAAA,CAAA;AACT,EAAA;AAEa,MAAA,yBAAA,GAA4B,CAAC,IAAyB,KAAA;AACjE,EAAO,OAAA,IAAA,CAAA;AACT,EAAA;AASa,MAAA,wBAAA,GAA2B,CACtC,KAAA,EACA,IACqB,KAAA;AACrB,EAAI,IAAA,IAAA,KAAS,OAAO,KAAU,KAAA,GAAA;AAAK,IAAO,OAAA,IAAA,CAAA;AAC1C,EAAI,IAAA,IAAA,KAAS,OAAO,KAAU,KAAA,GAAA;AAAK,IAAO,OAAA,KAAA,CAAA;AAC1C,EAAO,OAAA,KAAA,CAAA;AACT,EAAA;AAuCa,MAAA,gBAAA,GAAmB,CAC9B,KAAA,EACA,GAMwB,KAAA;AAkBxB,EAAI,IAAA,GAAA,KAAQ,WAAW,OAAO,KAAA,KAAU,YAAY,MAAO,CAAA,KAAA,CAAM,KAAK,CAAG,EAAA;AACvE,IAAO,OAAA,EAAA,CAAA;AAAA,GACT;AACA,EAAA,IAAI,QAAQ,WAAe,IAAA,OAAO,KAAU,KAAA,QAAA,IAAY,UAAU,MAAQ,EAAA;AACxE,IAAO,OAAA,EAAA,CAAA;AAAA,GACT;AACA,EAAA,IAAA,CACG,GAAQ,KAAA,MAAA,IACP,GAAQ,KAAA,MAAA,IACR,GAAQ,KAAA,GAAA,IACR,GAAQ,KAAA,GAAA,IACR,GAAQ,KAAA,QAAA,KACV,OAAO,KAAA,KAAU,QACjB,EAAA;AACA,IAAA,OAAO,aAAa,KAAK,CAAA,CAAA;AAAA,GAC3B;AACA,EAAO,OAAA,KAAA,CAAA;AACT,EAAA;AAEa,MAAA,aAAA,GAAgB,OAAU,GAA4B,KAAA;AACjE,EAAM,MAAA,MAAA,GAAS,IAAI,MAAA,CAAO,MAAO,CAAA;AAAA,IAC/B,IAAM,EAAA,IAAA;AAAA,IACN,SAAW,EAAA,IAAA;AAAA,IACX,YAAc,EAAA,KAAA;AAAA,IACd,UAAY,EAAA,IAAA;AAAA,IACZ,aAAe,EAAA,KAAA;AAAA,IACf,OAAS,EAAA,SAAA;AAAA,IACT,mBAAqB,EAAA;AAAA,MACnB,aAAA;AAAA,MACA,gBAAA;AAAA,MACA,wBAAA;AAAA,KACF;AAAA,IACA,iBAAA,EAAmB,CAAC,wBAAwB,CAAA;AAAA,IAC5C,kBAAA,EAAoB,CAAC,yBAAyB,CAAA;AAAA,GAC9B,CAAA,CAAA;AAElB,EAAA,MAAM,SAAS,MAAM,IAAI,OAAW,CAAA,CAAC,SAAS,MAAW,KAAA;AACvD,IAAA,MAAA,CAAO,WAAY,CAAA,GAAA,EAAK,CAAC,GAAA,EAAmB,WAAmB,KAAA;AAC7D,MAAI,IAAA,GAAA;AAAK,QAAA,MAAA,CAAO,GAAG,CAAA,CAAA;AAAA,WACd;AACH,QAAA,OAAA,CAAQ,WAAW,CAAA,CAAA;AAAA,OACrB;AAAA,KACD,CAAA,CAAA;AAAA,GACF,CAAA,CAAA;AAED,EAAO,OAAA,MAAA,CAAA;AACT;;;;"}
|
|
1
|
+
{"version":3,"file":"parseXmlAsync.js","sources":["../../src/xml/parseXmlAsync.ts"],"sourcesContent":["import xml2js, { ParserOptions } from 'xml2js';\r\nimport { parseBooleans, parseNumbers } from 'xml2js/lib/processors';\r\nimport {\r\n TApiaFieldPropsObj,\r\n TFieldScriptEvents,\r\n TFieldServerEvents,\r\n TNotificationMessage,\r\n} from '../types';\r\n\r\nexport const processAjaxEventTagNames = (name: string): string => {\r\n return name;\r\n};\r\n\r\nexport const processAjaxEventAttrNames = (name: string): string => {\r\n return name;\r\n};\r\n\r\nexport interface TSessionExceptions {\r\n exception: {\r\n content: string;\r\n text: string;\r\n };\r\n}\r\n\r\nexport const processAjaxEventResponse = (\r\n value: unknown,\r\n name: string,\r\n): string | unknown => {\r\n if (name === 'v' && value === 'T') return true;\r\n if (name === 'v' && value === 'F') return false;\r\n return value;\r\n};\r\n\r\nexport const getJSObjfromXML = (\r\n xml: XMLDocument | string,\r\n): Record<string, unknown> => {\r\n let objJS: TNotificationMessage | null = null;\r\n\r\n const parser = new xml2js.Parser({\r\n trim: true,\r\n normalize: true,\r\n explicitRoot: false,\r\n mergeAttrs: true,\r\n explicitArray: false,\r\n charkey: 'content',\r\n attrValueProcessors: [\r\n parseBooleans,\r\n processStringObj,\r\n processAjaxEventResponse,\r\n ],\r\n tagNameProcessors: [processAjaxEventTagNames],\r\n attrNameProcessors: [processAjaxEventAttrNames],\r\n } as ParserOptions);\r\n\r\n parser.parseString(\r\n xml,\r\n (err: Error | null, result: Record<string, unknown>) => {\r\n if (err) {\r\n console.warn('Error Parsing XML data', err);\r\n } else {\r\n objJS = result;\r\n }\r\n },\r\n );\r\n if (objJS) {\r\n return objJS;\r\n }\r\n return {};\r\n};\r\n\r\nexport const processStringObj = (\r\n value: string,\r\n key: string,\r\n):\r\n | TApiaFieldPropsObj\r\n | string\r\n | number\r\n | TFieldScriptEvents\r\n | TFieldServerEvents => {\r\n /*\r\n\r\n * ESTAS ENTRADAS VAN A SER NECESARIAS CUANDO SE INCORPORE MODULO DE\r\n * EJECUCION AL MONOREPO\r\n\r\n if (key === 'properties') {\r\n return parseFieldPropertiesObj(jsonDecode(value)) as TApiaFieldPropsObj;\r\n }\r\n if (key === 'scriptEvents') {\r\n return JSON.parse(value) as TFieldScriptEvents;\r\n }\r\n if (key === 'serverEvents') {\r\n return JSON.parse(value) as TFieldServerEvents;\r\n }\r\n if (key === 'gridXml') {\r\n return getJSObjfromXML(he.decode(value).replaceAll('&', '&'));\r\n } */\r\n if (key === 'value' && typeof value === 'number' && Number.isNaN(value)) {\r\n return '';\r\n }\r\n if (key === 'valueType' && typeof value === 'string' && value === 'null') {\r\n return '';\r\n }\r\n if (\r\n (key === 'cols' ||\r\n key === 'rows' ||\r\n key === 'x' ||\r\n key === 'y' ||\r\n key === 'length') &&\r\n typeof value === 'string'\r\n ) {\r\n return parseNumbers(value);\r\n }\r\n return value;\r\n};\r\n\r\nexport const parseXmlAsync = async <T>(xml: string): Promise<T> => {\r\n const parser = new xml2js.Parser({\r\n trim: true,\r\n normalize: true,\r\n explicitRoot: false,\r\n mergeAttrs: true,\r\n explicitArray: false,\r\n charkey: 'content',\r\n attrValueProcessors: [\r\n parseBooleans,\r\n processStringObj,\r\n processAjaxEventResponse,\r\n ],\r\n tagNameProcessors: [processAjaxEventTagNames],\r\n attrNameProcessors: [processAjaxEventAttrNames],\r\n } as ParserOptions);\r\n\r\n const result = await new Promise<T>((resolve, reject) => {\r\n parser.parseString(xml, (err: Error | null, innerResult: T) => {\r\n if (err) reject(err);\r\n else {\r\n resolve(innerResult);\r\n }\r\n });\r\n });\r\n\r\n return result;\r\n};\r\n"],"names":[],"mappings":";;;AASa,MAAA,wBAAA,GAA2B,CAAC,IAAyB,KAAA;AAChE,EAAO,OAAA,IAAA,CAAA;AACT,EAAA;AAEa,MAAA,yBAAA,GAA4B,CAAC,IAAyB,KAAA;AACjE,EAAO,OAAA,IAAA,CAAA;AACT,EAAA;AASa,MAAA,wBAAA,GAA2B,CACtC,KAAA,EACA,IACqB,KAAA;AACrB,EAAI,IAAA,IAAA,KAAS,OAAO,KAAU,KAAA,GAAA;AAAK,IAAO,OAAA,IAAA,CAAA;AAC1C,EAAI,IAAA,IAAA,KAAS,OAAO,KAAU,KAAA,GAAA;AAAK,IAAO,OAAA,KAAA,CAAA;AAC1C,EAAO,OAAA,KAAA,CAAA;AACT,EAAA;AAuCa,MAAA,gBAAA,GAAmB,CAC9B,KAAA,EACA,GAMwB,KAAA;AAkBxB,EAAI,IAAA,GAAA,KAAQ,WAAW,OAAO,KAAA,KAAU,YAAY,MAAO,CAAA,KAAA,CAAM,KAAK,CAAG,EAAA;AACvE,IAAO,OAAA,EAAA,CAAA;AAAA,GACT;AACA,EAAA,IAAI,QAAQ,WAAe,IAAA,OAAO,KAAU,KAAA,QAAA,IAAY,UAAU,MAAQ,EAAA;AACxE,IAAO,OAAA,EAAA,CAAA;AAAA,GACT;AACA,EAAA,IAAA,CACG,GAAQ,KAAA,MAAA,IACP,GAAQ,KAAA,MAAA,IACR,GAAQ,KAAA,GAAA,IACR,GAAQ,KAAA,GAAA,IACR,GAAQ,KAAA,QAAA,KACV,OAAO,KAAA,KAAU,QACjB,EAAA;AACA,IAAA,OAAO,aAAa,KAAK,CAAA,CAAA;AAAA,GAC3B;AACA,EAAO,OAAA,KAAA,CAAA;AACT,EAAA;AAEa,MAAA,aAAA,GAAgB,OAAU,GAA4B,KAAA;AACjE,EAAM,MAAA,MAAA,GAAS,IAAI,MAAA,CAAO,MAAO,CAAA;AAAA,IAC/B,IAAM,EAAA,IAAA;AAAA,IACN,SAAW,EAAA,IAAA;AAAA,IACX,YAAc,EAAA,KAAA;AAAA,IACd,UAAY,EAAA,IAAA;AAAA,IACZ,aAAe,EAAA,KAAA;AAAA,IACf,OAAS,EAAA,SAAA;AAAA,IACT,mBAAqB,EAAA;AAAA,MACnB,aAAA;AAAA,MACA,gBAAA;AAAA,MACA,wBAAA;AAAA,KACF;AAAA,IACA,iBAAA,EAAmB,CAAC,wBAAwB,CAAA;AAAA,IAC5C,kBAAA,EAAoB,CAAC,yBAAyB,CAAA;AAAA,GAC9B,CAAA,CAAA;AAElB,EAAA,MAAM,SAAS,MAAM,IAAI,OAAW,CAAA,CAAC,SAAS,MAAW,KAAA;AACvD,IAAA,MAAA,CAAO,WAAY,CAAA,GAAA,EAAK,CAAC,GAAA,EAAmB,WAAmB,KAAA;AAC7D,MAAI,IAAA,GAAA;AAAK,QAAA,MAAA,CAAO,GAAG,CAAA,CAAA;AAAA,WACd;AACH,QAAA,OAAA,CAAQ,WAAW,CAAA,CAAA;AAAA,OACrB;AAAA,KACD,CAAA,CAAA;AAAA,GACF,CAAA,CAAA;AAED,EAAO,OAAA,MAAA,CAAA;AACT;;;;"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@apia/util",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.8",
|
|
4
4
|
"sideEffects": false,
|
|
5
5
|
"author": "Alexis Leite <alexisleite@live.com>",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
"timers-browserify": "^2.0.12",
|
|
40
40
|
"xml2js": "^0.5.0"
|
|
41
41
|
},
|
|
42
|
-
"gitHead": "
|
|
42
|
+
"gitHead": "7081b9e9d30efe218f23e835d29737aab3c89824",
|
|
43
43
|
"repository": {
|
|
44
44
|
"type": "git",
|
|
45
45
|
"url": "http://corp-gitlab-01.domst.st.net/products/apia/ApiaNPMPackages.git",
|